A node-graph playground for AI models that runs entirely in your browser.
Wire text, image, video, audio and LLM nodes into a workflow, run it, turn
it into a standalone app, share it as a URL, or export it as a single
self-contained .html file.
Try it now: nanoodle.com — no account, no install; bring a NanoGPT key.
- 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. - 100% in your browser — no backend, no analytics, no tracking; your key and workflows never leave your machine.
- Six UI languages — EN/ES/FR/DE/PT/JA, auto-detected with a switcher.
nanoodle is three static HTML pages. There is no backend, and that is the design, not a limitation:
- No analytics, no tracking, no third-party scripts. Nothing phones home.
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 on your own API key. nanoodle never sees your prompts, your outputs, or your key — there is no server to send them to.
- 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 stays on your machine.
- Exported apps are self-contained files with no key inside. The person
you send one to brings their own key. Share links (
#g=/#a=) encode the graph in the URL fragment, which never reaches any server. - 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.
The privacy page at /legal states the same things in plain terms; this
repo is the proof.
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 ComfyUI-style node 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).
A saved graph (noodle-graph.json) doesn't need the browser: two
zero-dependency sibling libraries re-execute it headlessly —
nanoodle-js
(npm install nanoodle, Node ≥ 20) and
nanoodle-py
(pip install nanoodle, stdlib-only). Same graphs, same results; useful
for scripts, servers, and agent skills.
import { Workflow } from "nanoodle";
const wf = await Workflow.load("noodle-graph.json"); // key from NANOGPT_API_KEY
const result = await wf.run({ Text: "a cozy ramen shop on a rainy night" });
await result.get("Image").save("ramen.png");Everything lives under the nanoodlecom GitHub org:
| Repo | What it is |
|---|---|
| nanoodle | The playground — editor, app builder, the whole site (this repo) |
| nanoodle-js | Zero-dependency JS executor — run saved noodle graphs from Node |
| nanoodle-py | Zero-dependency Python executor — same graphs, same results |
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.
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.
