Reusable AI apps for NanoGPT users. Sign in with your NanoGPT account,
connect text, image, video, audio and LLM steps into a workflow, and run
it on your own NanoGPT balance. Turn a workflow you want to use again into
an app, share its link, or export it as one self-contained .html file.
Try it now: nanoodle.com — sign in with NanoGPT using OAuth. No separate nanoodle account or install; live model calls use your NanoGPT balance. Pasting an API key is also supported.
Open an example, change its input, and run it. Choose Create app to keep the inputs and outputs together for next time, then share or export it.
- Visual node editor — drag ports together, compatible inputs glow and snap by type; disconnected groups run in parallel.
- Any graph becomes an app — auto-generated inputs → Run → outputs,
shareable as a URL or exported as one self-contained
.htmlfile. - Browser-based editor and app runtime — no nanoodle model proxy, analytics, or tracking; model requests go directly to NanoGPT.
- Six UI languages — EN/ES/FR/DE/PT/JA, auto-detected with a switcher.
nanoodle is a folder of static HTML pages — three core pages plus a changelog, guides and landing pages. The editor and its apps run in the browser; model generation happens at NanoGPT:
- No analytics, no tracking, no third-party scripts.
The only dependency that isn't hand-written is vendored into
vendor/and served from the same origin — no CDNs, no external gateways. - Model calls go directly from your browser to NanoGPT using your OAuth token or API key. NanoGPT receives the inputs and credentials needed for those calls; there is no nanoodle backend in that path receiving your prompts, outputs, or credentials.
- Your key and your workflows live in your browser's localStorage. Sign in via NanoGPT OAuth (PKCE) or paste an API key; either way the credential is stored on your device and used to authenticate requests to NanoGPT.
- Exported apps are self-contained files with no key inside. The person
you send one to signs in with NanoGPT or supplies their own key. Share
links (
#g=/#a=) encode the graph in the URL fragment, which browsers omit from requests to the hosting server. Anyone you give the full link to can read its graph and any included inputs or samples. - A per-path Content-Security-Policy (
_headers) pins which origins each page may talk to, so "no tracking" is enforced by the browser, not just promised in a README.
These promises describe the browser editor and its apps. The separate
hosted service at mcp.nanoodle.com receives the inputs for tools called
there; see its own documentation before using it. The privacy page at
/legal describes the browser path in plain terms.
Share a workflow you use with NanoGPT, or report a workflow problem. Tell us the task, what happened, and whether you have used it again. Cost is useful if you know it. These are voluntary public GitHub submissions; remove API keys, OAuth tokens, and private inputs or media before posting. Nothing is submitted from the editor automatically.
Hosted: https://nanoodle.com serves exactly the files in this repo as a
static site (Cloudflare Pages / Workers assets — see wrangler.jsonc,
_headers, _redirects, sw.js). There is no server-side code; hosting
adds nothing but HTTPS and the CSP headers.
Self-hosted: serve the folder with any static file server:
python3 -m http.server 8000
# http://localhost:8000/ → the editor
# http://localhost:8000/play.html → the app builderNotes for self-hosting:
- OAuth sign-in needs an
http(s)origin; pasting an API key also works from plainfile://. _headersand_redirectsare Cloudflare conventions. On another host, reproduce the CSP headers yourself or skip them (the app works without, you just lose the browser-enforced guarantee).- Exported
.htmlapps are standalone and need no hosting at all.
The default config routes 10% of usage as referral credits to the maintainer. If you self-host, swap the key. Concretely, two things carry a referral code:
invitation_codein the OAuth authorize URL (index.html,play.html, search forinvitation_code)- the "create an account" links to
nano-gpt.com/r/...
This costs you nothing — NanoGPT pays it out of their side, and per their
program, signing up through a referral link gives you a 5% discount. It
does credit the maintainer for accounts and usage originating here.
Replace the code with your own (or delete the parameter and use bare
nano-gpt.com links) if you'd rather not.
index.html— the editor (site root,/app). A NanoGPT workflow canvas: Text, Join, LLM, Image, Edit, Vision, video, music, speech and more. Drag port to port (compatible inputs glow and snap by type), run disconnected groups in parallel, share a graph via URL, save/load JSON. UI in six languages (EN/ES/FR/DE/PT/JA), auto-detected with a switcher.play.html— the app builder (/play, or ✨ Create app in the editor). Turns any workflow into a standalone app: auto-generated inputs → Run → outputs. Restyle it with patchling, share via#a=link, or export a self-contained.html.legal.html— terms, privacy, FAQ (/legal).changelog.html— release notes (/changelog), generated fromupdates.jsonbyscripts/gen-changelog.mjs, plus an Atom feed (feed.xml).guide/— static docs (/guide/): thenoodle-graph.jsonformat, running workflows headlessly, self-hosting, share links, the Custom endpoint localhost contract, and a how-to for every reviewed gallery workflow (/guide/examples/). Zero scripts; same-origin images and media only.- The rest is landing pages: comparisons (
nanoodle-vs-comfyui.html,nanoodle-vs-n8n.html,comfyui-alternative.html,comfyui-alternative-no-gpu.html) and localized home pages (es/,fr/,de/,pt/,ja/).
A saved graph (noodle-graph.json) — or any share link — doesn't need the
browser: two zero-dependency sibling libraries re-execute it headlessly —
nanoodle-js
(npm install nanoodle 0.8.0, Node ≥ 20) and
nanoodle-py
(pip install nanoodle 0.5.0, stdlib-only). Same graphs, same results;
useful for scripts, servers, and agent skills. Walkthrough:
Run workflows headlessly.
import { Workflow } from "nanoodle";
const wf = await Workflow.load("https://nanoodle.com/#g=…"); // or noodle-graph.json
const result = await wf.run({ Text: "NIGHT RIDE" });
await result.get("Image").save("night-ride.png");npx nanoodle inspect "https://nanoodle.com/#g=..." # offline, no key
npx nanoodle run "https://nanoodle.com/#g=..." --out ./outEverything lives under the nanoodlecom GitHub org:
| Repo | What it is |
|---|---|
| nanoodle | NanoGPT workflow editor, app builder, and site (this repo) |
| nanoodle-js | Zero-dependency JS executor — use when running saved graphs from Node or the CLI |
| nanoodle-py | Zero-dependency Python executor — use when your scripts speak Python |
| nanoodle-mcp | MCP server exposing saved graphs as tools — use when an AI agent should run your workflows |
| run-noodle-action | GitHub Action — use when a graph should run in CI |
| nanoodle-skill | One agent skill that teaches an agent to build any graph — use when the agent should author workflows itself |
| noodle-skills | Prebuilt one-task agent skills — use when you want a ready-made skill, no graph editing |
| awesome-noodles | Gallery of ready-to-open graphs — use when you want examples to start from |
| built-with-nanoodle | Showcase of finished apps, every one still ours — use when you want to see what nanoodle makes, or to put yours on the list |
| noodle-embed | <noodle-embed> web component — use when a page should render a workflow read-only |
| mp4cat | Lossless mp4 concat, browser or Node — use when you just need to join clips, no ffmpeg |
Naming note: the package is nanoodle on both registries while the repos are
nanoodle-js / nanoodle-py — so it's npm install nanoodle and pip install nanoodle.
No build step. Edit the HTML files, refresh the browser.
scripts/check-*.mjs are offline pre-commit checks (wired via
.githooks/, git config core.hooksPath .githooks) covering the export
bundler, the OAuth flow, run-engine compatibility, pricing, i18n coverage
and more. They spend no API credits — everything runs against recorded
fixtures.
scripts/check-js-parity.mjs dual-runs the same graphs through play.html’s
RUNTIME_JS and the sibling nanoodle-js
package and asserts identical NanoGPT request bodies — the safety net for
eventually replacing the inlined processor with the package. Skips if
nanoodle-js isn’t checked out next to this repo (or set NANOODLE_JS).
play.html also embeds a generated bundle of that package (the njs-engine
script block, scripts/gen-js-engine.mjs, freshness-checked pre-commit)
and routes network nodes through it by default — ?engine=play (or
localStorage.njs_engine = "0") opts back into the built-in runners;
scripts/check-njs-delegation.mjs asserts the delegated path produces
byte-identical requests. Exported apps carry the bundle too, so the same
flag works there. The editor honors the same flag: index.html lazy-loads
the same bundle as vendor/njs-engine.js (emitted by the same generator),
and known library gaps are vetoed back to the built-in runners per run;
scripts/check-njs-editor-delegation.mjs pins that path to the built-in
runners byte-for-byte.
updates.json is the in-app changelog behind the 📣 button. It's opt-in
per commit: add an Update: one polished line to a commit message and the
post-commit hook folds it in. Commits without one stay silent. Edit the
JSON by hand anytime; scripts/check-updates.mjs keeps it valid.
MIT.
