From 08926856c1f2981b7cedef93833e89327ee3d2b2 Mon Sep 17 00:00:00 2001 From: Mikkel Garcia Date: Tue, 28 Jul 2026 21:52:52 -0600 Subject: [PATCH 1/5] Link the built-with-nanoodle showcase from the product The showcase had no inbound link from nanoodle.com. Its only mention in this repo was one row of the README ecosystem table, which no visitor reads. The best proof that the app builder makes shippable things sold nothing to anybody. Two in-product links, at the 2 moments where they do work. 1. play.html share popover, last line, after the link and the share targets. That is the one moment the reader already holds the #a= link a showcase entry needs. The line is owner-only: body.recipient hides it, because a recipient did not build the app they are re-sharing. The popover is the same one the editor's Create app modal embeds, so the create-app moment is covered by the same element. 2. index.html Examples panel note, beside the existing awesome-noodles link. The gallery answers "what can I start from". The showcase answers "does this make anything real". Both new strings go through i18n like their neighbours: 2 PLAY_I18N_B keys and 2 index.html keys, each in all 5 languages. Verified in a real browser in en, de and ja. Also indexed for readers who are not in the app: - llms.txt gains an Examples section naming both the gallery and the showcase. - guide/index.html "Elsewhere" and guide/share-links.html get the same 2 links. - llms-full.txt is regenerated. It is generated, never hand-edited, and it had drifted: it was missing the whole Ecosystem table (where the showcase row lives), and it still listed the retired Draw node. Co-Authored-By: Claude Opus 5 (1M context) --- guide/index.html | 2 + guide/share-links.html | 8 +++ index.html | 16 ++++- llms-full.txt | 148 +++++++++++++++++++++++++++++++++++------ llms.txt | 5 ++ play.html | 13 ++++ 6 files changed, 169 insertions(+), 23 deletions(-) diff --git a/guide/index.html b/guide/index.html index 9a9c9cd..ce7f9e3 100644 --- a/guide/index.html +++ b/guide/index.html @@ -95,6 +95,8 @@

Elsewhere

  • github.com/nanoodlecom/nanoodle — the site's source (MIT).
  • nanoodle-js and nanoodle-py — headless executors (npm / PyPI, both named nanoodle).
  • +
  • awesome-noodles — the workflow gallery behind the editor's 📚 Examples panel: one graph file per entry.
  • +
  • built-with-nanoodle — finished apps people shipped. Every entry opens and runs in your browser; adding yours takes one line.
  • /llms.txt — a machine-readable summary of the site for LLMs.
  • Terms, Privacy & FAQ.
  • diff --git a/guide/share-links.html b/guide/share-links.html index 724b997..1ab6e1e 100644 --- a/guide/share-links.html +++ b/guide/share-links.html @@ -106,6 +106,14 @@

    Shortening — first-party too

    flow re-encodes the preview smaller or drops it — and tells you it did — rather than failing silently.

    +

    Where shared apps end up

    +

    A share link is the whole distribution step: there is nothing to host and nothing to + publish. If you want an audience for one, + built-with-nanoodle + is the public showcase — every entry is a #a= link like yours, and adding one + is a single line in a README. The workflow gallery behind the editor's 📚 Examples panel is + its sibling, awesome-noodles.

    +

    For recipients

    Treat shared apps as untrusted, like any web page. Shared apps run sandboxed and never carry the sharer's key; review what an app does before connecting your own key and diff --git a/index.html b/index.html index 2d778e4..5198222 100644 --- a/index.html +++ b/index.html @@ -1012,7 +1012,11 @@

    📚 Examples

    -
    loading replaces your current workflow — it’s autosaved, and ↺ Undo brings it back. these come from awesome-noodles — remix one and send us yours.
    +
    loading replaces your current workflow — it’s autosaved, and ↺ Undo brings it back. these come from awesome-noodles — remix one and send us yours. + + Want to see finished apps built from graphs like these? built-with-nanoodle — the showcase, and it takes one line to add yours.
    @@ -1679,6 +1683,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"pega texto que suena a IA y recupéralo humano", "these come from":"estos vienen de", "— remix one and send us yours.":"— remezcla uno y envíanos el tuyo.", + "Want to see finished apps built from graphs like these?":"¿Quieres ver apps terminadas creadas a partir de flujos como estos?", + "— the showcase, and it takes one line to add yours.":"— la vitrina, y añadir la tuya cuesta una línea.", "Use in your agent":"Úsalo en tu agente", "nanoodle in your coding agent":"nanoodle en tu agente de código", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Un solo comando enseña a tu agente a diseñar y ejecutar flujos de nanoodle — desde tu terminal, con tu propia clave de NanoGPT.", @@ -2192,6 +2198,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"collez un texte qui sent l'IA, récupérez-le humain", "these come from":"ils viennent de", "— remix one and send us yours.":"— remixez-en un et envoyez-nous le vôtre.", + "Want to see finished apps built from graphs like these?":"Envie de voir des apps finies construites à partir de flux comme ceux-ci ?", + "— the showcase, and it takes one line to add yours.":"— la vitrine, et ajouter la vôtre tient en une ligne.", "Use in your agent":"Utiliser dans votre agent", "nanoodle in your coding agent":"nanoodle dans votre agent de code", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Une seule commande apprend à votre agent à concevoir et exécuter des flux nanoodle — depuis votre terminal, avec votre propre clé NanoGPT.", @@ -2705,6 +2713,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"KI-Text einfügen, menschlich zurückbekommen", "these come from":"diese stammen aus", "— remix one and send us yours.":"— remixe eins und schick uns deins.", + "Want to see finished apps built from graphs like these?":"Willst du fertige Apps sehen, die aus solchen Workflows entstanden sind?", + "— the showcase, and it takes one line to add yours.":"— die Galerie, und deine hinzuzufügen kostet eine Zeile.", "Use in your agent":"In deinem Agenten nutzen", "nanoodle in your coding agent":"nanoodle in deinem Coding-Agenten", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Ein Befehl bringt deinem Agenten bei, nanoodle-Workflows zu entwerfen und auszuführen — direkt im Terminal, mit deinem eigenen NanoGPT-Schlüssel.", @@ -3218,6 +3228,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"cole um texto com cara de IA e receba-o humano", "these come from":"estes vêm de", "— remix one and send us yours.":"— remixe um e mande o seu.", + "Want to see finished apps built from graphs like these?":"Quer ver apps prontos feitos a partir de fluxos como estes?", + "— the showcase, and it takes one line to add yours.":"— a vitrine, e adicionar o seu leva uma linha.", "Use in your agent":"Use no seu agente", "nanoodle in your coding agent":"nanoodle no seu agente de código", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Um único comando ensina o seu agente a criar e executar fluxos do nanoodle — do seu terminal, com a sua própria chave NanoGPT.", @@ -3731,6 +3743,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"AIっぽい文章を貼ると、人間らしい文章が返る", "these come from":"出典は", "— remix one and send us yours.":"— リミックスして、あなたの作品もぜひ送ってください。", + "Want to see finished apps built from graphs like these?":"こういうワークフローから生まれた完成アプリを見てみませんか?", + "— the showcase, and it takes one line to add yours.":"— ショーケースです。あなたの作品も1行で追加できます。", "Use in your agent":"エージェントで使う", "nanoodle in your coding agent":"コーディングエージェントで nanoodle", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"コマンド1つで、エージェントが nanoodle ワークフローを設計・実行できるようになります — ターミナルから、自分の NanoGPT キーで。", diff --git a/llms-full.txt b/llms-full.txt index be9863d..435cdc3 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -23,7 +23,8 @@ self-contained `.html` file. ### Privacy architecture -nanoodle is three static HTML pages. There is no backend, and that is the +nanoodle is a folder of static HTML pages — three core pages plus a +changelog, guides and landing pages. There is no backend, and that is the design, not a limitation: - **No analytics, no tracking, no third-party scripts.** Nothing phones home. @@ -97,6 +98,16 @@ Replace the code with your own (or delete the parameter and use bare [patchling](https://github.com/255BITS/patchling), share via `#a=` link, or export a self-contained `.html`. - **`legal.html`** — terms, privacy, FAQ (`/legal`). +- **`changelog.html`** — release notes (`/changelog`), generated from + `updates.json` by `scripts/gen-changelog.mjs`, plus an Atom feed + (`feed.xml`). +- **`guide/`** — static docs (`/guide/`): the `noodle-graph.json` format, + running workflows headlessly, self-hosting, and how share links work. + Zero scripts, zero network. +- 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/`). ### Run workflows from code @@ -116,6 +127,27 @@ const result = await wf.run({ Text: "a cozy ramen shop on a rainy night" }); await result.get("Image").save("ramen.png"); ``` +### Ecosystem + +Everything lives under the [nanoodlecom](https://github.com/nanoodlecom) GitHub org: + +| Repo | What it is | +| --- | --- | +| [nanoodle](https://github.com/nanoodlecom/nanoodle) | The playground — editor, app builder, the whole site (this repo) | +| [nanoodle-js](https://github.com/nanoodlecom/nanoodle-js) | Zero-dependency JS executor — use when running saved graphs from Node or the CLI | +| [nanoodle-py](https://github.com/nanoodlecom/nanoodle-py) | Zero-dependency Python executor — use when your scripts speak Python | +| [nanoodle-mcp](https://github.com/nanoodlecom/nanoodle-mcp) | MCP server exposing saved graphs as tools — use when an AI agent should run your workflows | +| [run-noodle-action](https://github.com/nanoodlecom/run-noodle-action) | GitHub Action — use when a graph should run in CI | +| [nanoodle-skill](https://github.com/nanoodlecom/nanoodle-skill) | One agent skill that teaches an agent to build any graph — use when the agent should author workflows itself | +| [noodle-skills](https://github.com/nanoodlecom/noodle-skills) | Prebuilt one-task agent skills — use when you want a ready-made skill, no graph editing | +| [awesome-noodles](https://github.com/nanoodlecom/awesome-noodles) | Gallery of ready-to-open graphs — use when you want examples to start from | +| [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle) | Showcase of apps people shipped — use when you want to see (or show) what nanoodle makes | +| [noodle-embed](https://github.com/nanoodlecom/noodle-embed) | `` web component — use when a page should render a workflow read-only | +| [mp4cat](https://github.com/nanoodlecom/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`. + ### Development No build step. Edit the HTML files, refresh the browser. @@ -126,6 +158,24 @@ 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`](https://github.com/nanoodlecom/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 @@ -137,7 +187,7 @@ JSON by hand anytime; `scripts/check-updates.mjs` keeps it valid. ## Node types in the editor -The editor registers 27 node types. Titles and one-line descriptions below are taken verbatim from the node registry in index.html (the same text the in-editor quick-add menu shows); the `key` is the type identifier used in noodle-graph.json and in the executor libraries' supported-node tables. +The editor registers 26 node types. Titles and one-line descriptions below are taken verbatim from the node registry in index.html (the same text the in-editor quick-add menu shows); the `key` is the type identifier used in noodle-graph.json and in the executor libraries' supported-node tables. ### Inputs @@ -155,7 +205,6 @@ The editor registers 27 node types. Titles and one-line descriptions below are t ### Image - `image` — 🖼 Image: Text → image -- `draw` — 🎨 Draw: Prompt (+ images) → image — Gemini omni: reasons, then draws or edits - `edit` — ✂️ Edit: Image(s) + text → image - `inpaint` — 🩹 Inpaint: Brush a region of an image → repaint just that area - `resize` — 📐 Resize / crop: Image → image — scale, crop, fit an aspect @@ -223,6 +272,8 @@ npx nanoodle --help # or run the CLI without installing import { Workflow } from "nanoodle"; const wf = await Workflow.load("noodle-graph.json"); // key from NANOGPT_API_KEY +// …or load any nanoodle share link — the URL is the package: +// const wf = await Workflow.load("https://nanoodle.com/#g=…"); const result = await wf.run({ Text: "a cozy ramen shop on a rainy night" }); await result.get("Image").save("ramen.png"); // media: MediaRef (url + bytes()/save()) console.log(result.costUsd, result.remainingBalance); @@ -232,39 +283,66 @@ With the app’s starter graph (text → LLM prompt-writer → image), that’s ### Quickstart (CLI) -Inspect first — offline; shows inputs, outputs, and settings: +No graph yet? Scaffold the starter (text → LLM prompt-writer → image) and +inspect it — both offline, no key needed: ```bash -npx nanoodle inspect graph.json +npx nanoodle init # writes ./noodle-graph.json +npx nanoodle inspect noodle-graph.json # shows inputs, outputs, settings ``` Then run (calls NanoGPT and spends from your balance): ```bash export NANOGPT_API_KEY=... # or --key K, or --env-file .env -npx nanoodle run graph.json --input Text="a cozy ramen shop" --out ./out -npx nanoodle run graph.json --input n2.system=@style.txt --set n3.size=1k --json +npx nanoodle run noodle-graph.json --input Text="a cozy ramen shop on a rainy night" +npx nanoodle run graph.json --input n2.system=@style.txt --set n3.size=1k --out ./renders ``` -- `--env-file path` — load `NANOGPT_API_KEY` from a `.env`-style file (`--key` wins if both are set) +Media outputs are saved under `--out` (default `./noodle-out`, created only +when there is media to save); a JSON run summary always goes to stdout, +progress lines to stderr; exit code `0` on success, `1` on failure. + - `--input k=@path` — read a file (media as media; `.txt` / `.md` / `.json` as text) -- `--out dir` — save media outputs to disk -- `--json` — machine-readable result +- `--set k=v` — override a setting (`n3.model=flux-pro`) +- `--out dir` — where media outputs land (default `./noodle-out`) +- `--timeout ms` — overall run timeout +- `--json` — quiet mode: skip the stderr progress lines (the JSON summary is printed either way) +- `--env-file path` — load `NANOGPT_API_KEY` from a `.env`-style file (`--key` wins if both are set) + +#### The URL is the package + +Every nanoodle share link is a runnable artifact — paste one straight from a +README, a chat, or a tweet, wherever a `graph.json` path is accepted: + +```bash +npx nanoodle inspect "https://nanoodle.com/#g=..." # what does it need? (offline) +npx nanoodle run "https://nanoodle.com/play.html#a=..." --input Text=hi # run it +``` + +Workflow links (`#g=`/`#j=`) and app links (`#a=`, graph only — the app shell +stays in the browser) both work, as do da.gd/TinyURL short links (resolved by +reading redirect headers; no credentials are ever sent). Direct links decode +fully offline. Quote the URL — `#` starts a comment in most shells. + +Links mangled in transit (a character flipped or dropped by a chat app or a +copy/paste) are recovered best-effort: the graph's nodes and wires are salvaged +and a warning is printed. Only damage inside the graph itself makes a link +unrecoverable. ### Supported nodes | runs | node types | |---|---| | local | text, upload (image/audio/video), choice, join, comment | -| NanoGPT | llm (incl. vision + audio input), image, draw, edit, inpaint*, vision, tvideo, ivideo, vedit, lipsync, music, remix, tts, transcribe | -| **not supported** (browser-only media processing) | resize, vframes, combine, soundtrack, trim, extractaudio | +| local media† | resize, vframes, combine, soundtrack, trim, extractaudio | +| NanoGPT | llm (incl. vision + audio input), image, edit, inpaint*, vision, tvideo, ivideo, vedit, lipsync, music, remix, tts, transcribe | -Workflows with unsupported node types load with a warning and fail fast at -`run()` with `UnsupportedNodeError` — before any network call. +† **local media** prefers a pure-JS path that matches the browser (lossless mp4 remux, PCM-WAV trim, PNG resize). **ffmpeg** on `PATH` is the fallback for everything else (soft dependency — not an npm package); clear error if it’s required and missing. -\* **inpaint:** the browser app composites the mask onto black at the source -pixel size; this library passes your mask through verbatim. Supply a -black/white mask matching the source dimensions. +\* **inpaint:** the mask is composited onto black at the source image’s pixel +size before send (same as the browser app) — white = repaint, black = keep. +Brush-style white-on-transparent masks and plain B/W masks both work. ## nanoodle-py — run workflows from Python @@ -278,6 +356,7 @@ your own key. Zero runtime dependencies (stdlib only). Library + CLI in one install. Looking for JavaScript / Node? → **[nanoodle-js](https://github.com/nanoodlecom/nanoodle-js)** +Running graphs in GitHub CI → [run-noodle-action](https://github.com/nanoodlecom/run-noodle-action) · saved graphs as AI-agent tools → [nanoodle-mcp](https://github.com/nanoodlecom/nanoodle-mcp) · Agent Skills → [nanoodle-skill](https://github.com/nanoodlecom/nanoodle-skill) / [noodle-skills](https://github.com/nanoodlecom/noodle-skills) ### At a glance @@ -299,6 +378,9 @@ pip install nanoodle export NANOGPT_API_KEY=... # nano-gpt.com API key (or OAuth access token) ``` +Requires **0.2.0+** for share-link loading, the local media nodes +(resize/vframes/combine/soundtrack/trim/extractaudio), and x402 `--pay`. + ### Quickstart (library) ```python @@ -306,12 +388,34 @@ from nanoodle import Workflow wf = Workflow.load("noodle-graph.json") result = wf.run({"Text": "a cozy ramen shop on a rainy night"}) -result["Image"].save("ramen.png") # media: MediaRef (url + bytes()/save()) +img = result["Image"] # media: MediaRef (url + bytes()/save()) +img.save("ramen." + img.suggested_extension()) # extension matches the actual MIME (often jpg) print(result.cost_usd, result.remaining_balance) ``` With the app’s starter graph (text → LLM prompt-writer → image), that’s the whole program. +#### The URL is the package + +Every nanoodle share link is a runnable artifact. Anywhere a `graph.json` path +is accepted — `Workflow.load` or the CLI — a share link works just as well: + +```python +wf = Workflow.load("https://nanoodle.com/#g=...") # workflow link +wf = Workflow.load("https://nanoodle.com/play.html#a=...") # app link (graph only) +``` + +Workflow links (`#g=`/`#j=`) and app links (`#a=`, graph only — the app shell +stays in the browser) both decode, as do `da.gd`/TinyURL short links (resolved +by reading redirect headers; no credentials are ever sent). Direct fragment +links decode **fully offline** — zero network I/O, stdlib only. Paste one +straight from a README, a chat, or a tweet. + +Links mangled in transit (a character flipped or dropped by a chat app or a +copy/paste) are recovered best-effort: the graph's nodes and wires are salvaged +and a warning is surfaced on `wf.warnings`. Only damage inside the graph itself +makes a link unrecoverable. + #### Discover a workflow’s interface ```python @@ -364,6 +468,7 @@ nanoodle-py inspect graph.json nanoodle-py run graph.json --input Text="a cozy ramen shop" --set n3.size=1k --out ./out nanoodle-py run graph.json --input n2.system=@style.txt --json nanoodle-py run graph.json --env-file .env --input Text="hello" # NANOGPT_API_KEY from a .env file +nanoodle-py inspect "https://nanoodle.com/#g=..." # a share link works too (quote it — # is a shell comment) ``` - `--out DIR` — save media outputs to files @@ -375,11 +480,10 @@ nanoodle-py run graph.json --env-file .env --input Text="hello" # NANOGPT_API_ | runs | node types | |---|---| | local | text, upload (image/audio/video), choice, join, comment | -| NanoGPT | llm (incl. vision + audio input), image, draw, edit, inpaint*, vision, tvideo, ivideo, vedit, lipsync, music, remix, tts, transcribe | -| **not supported** (browser-only media processing) | resize, vframes, combine, soundtrack, trim, extractaudio | +| local media† | resize, vframes, combine, soundtrack, trim, extractaudio | +| NanoGPT | llm (incl. vision + audio input), image, edit, inpaint*, vision, tvideo, ivideo, vedit, lipsync, music, remix, tts, transcribe | -Workflows with unsupported node types load with a warning and fail fast at -`run()` with `UnsupportedNodeError` — before any network call. +† **local media** needs **ffmpeg** on `PATH` (soft dependency — not a PyPI package). Same behaviour as the browser app; clear error if ffmpeg is missing. \* **inpaint:** the browser app composites the mask onto black at the source pixel size; this library passes your mask through verbatim. Supply a diff --git a/llms.txt b/llms.txt index 79cf1f2..9e6e6d1 100644 --- a/llms.txt +++ b/llms.txt @@ -18,6 +18,11 @@ Everything is MIT-licensed under the nanoodlecom GitHub org. Naming note: the in - [nanoodle-js](https://github.com/nanoodlecom/nanoodle-js): zero-dependency Node.js (≥ 20) library + CLI that re-runs saved graphs headlessly. Install: `npm install nanoodle` - [nanoodle-py](https://github.com/nanoodlecom/nanoodle-py): stdlib-only Python (≥ 3.9) library + CLI, same graphs and same semantics as the JS package. Install: `pip install nanoodle` +## Examples + +- [awesome-noodles](https://github.com/nanoodlecom/awesome-noodles): the workflow gallery. One committed `noodle-graph.json` per entry plus an editor share link. The Examples panel in the editor is this repository, one card per graph. Start here when you want a graph to open, run, or remix. +- [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle): the app showcase. Each entry is a `#a=` share link that opens a finished, runnable app in the browser. Start here when you want to see what a finished nanoodle app looks like, or to add one you shipped. + ## Formats - noodle-graph.json: the portable graph format. Save it from the editor (💾), load it back, or execute it headlessly with the `nanoodle` npm / PyPI package. diff --git a/play.html b/play.html index be10681..760c5b8 100644 --- a/play.html +++ b/play.html @@ -197,6 +197,11 @@ background:var(--panel2); border:1px solid var(--line); border-radius:.45rem; padding:.4rem .5rem; } .sm-copy{ flex:none; } .sm-note{ font-size:.74rem; color:var(--faint); margin:.4rem .15rem .1rem; line-height:1.4; } + /* the showcase nudge is owner-only: a recipient sharing someone else's app has nothing of + their own to submit. display:none can never reveal a hidden element, so no [hidden] guard + is needed here (see scripts/check-hidden-css.mjs). */ + #sm-showcase{ margin-top:.7rem; } + body.recipient #sm-showcase{ display:none; } .sm-warn{ font-size:.74rem; color:var(--dim); margin:.15rem .15rem .35rem; line-height:1.45; border-left:2px solid var(--accent-line); padding:.1rem .5rem; } .sm-svc, .sm-social:not([hidden]){ display:flex; gap:.4rem; flex-wrap:wrap; } /* :not([hidden]) — a bare display rule would defeat the hidden attr when the social row is blanked */ @@ -490,6 +495,12 @@ Facebook Email + + +

    Proud of it? add your app to the showcase ↗

    @@ -5419,6 +5430,8 @@

    Open a workflow from the editor

    "not signed in":{es:"sin iniciar sesión",fr:"non connecté",de:"nicht angemeldet",pt:"não conectado",ja:"サインインしていません"}, "✱ edits aren’t shared":{es:"✱ los cambios no se comparten",fr:"✱ les modifications ne sont pas partagées",de:"✱ Änderungen werden nicht geteilt",pt:"✱ as edições não são compartilhadas",ja:"✱ 編集は共有されません"}, "The whole app lives in this link — nothing hits a server when someone opens it. That's why it can get long.":{es:"Toda la app vive en este enlace — nada llega a un servidor cuando alguien lo abre. Por eso puede quedar largo.",fr:"Toute l’app tient dans ce lien — rien n’atteint un serveur quand quelqu’un l’ouvre. C’est pourquoi il peut devenir long.",de:"Die ganze App steckt in diesem Link — beim Öffnen wird kein Server kontaktiert. Deshalb kann er lang werden.",pt:"O app inteiro vive neste link — nada chega a um servidor quando alguém o abre. Por isso ele pode ficar longo.",ja:"アプリ全体がこのリンクに含まれています — 誰かが開いてもサーバーには何も送られません。だからリンクは長くなることがあります。"}, + "Proud of it?":{es:"¿Orgulloso del resultado?",fr:"Fier du résultat ?",de:"Stolz darauf?",pt:"Orgulhoso do resultado?",ja:"自信作ですか?"}, + "add your app to the showcase ↗":{es:"añade tu app a la vitrina ↗",fr:"ajoutez votre app à la vitrine ↗",de:"füge deine App zur Galerie hinzu ↗",pt:"adicione seu app à vitrine ↗",ja:"あなたのアプリをショーケースに追加 ↗"}, "This shared-app link looks incomplete or damaged — ask the sender for a fresh one. Shortened links survive messengers better.":{es:"Este enlace de app compartida parece incompleto o dañado — pídele al remitente uno nuevo. Los enlaces acortados aguantan mejor en los mensajeros.",fr:"Ce lien d’app partagée semble incomplet ou endommagé — demandez-en un nouveau à l’expéditeur. Les liens raccourcis résistent mieux aux messageries.",de:"Dieser geteilte App-Link scheint unvollständig oder beschädigt — bitte den Absender um einen neuen. Gekürzte Links überstehen Messenger besser.",pt:"Este link de app compartilhado parece incompleto ou danificado — peça um novo ao remetente. Links encurtados resistem melhor aos mensageiros.",ja:"この共有アプリのリンクは不完全か壊れているようです — 送信者に新しいリンクをもらってください。短縮リンクの方がメッセンジャーで壊れにくいです。"}, "Dismiss":{es:"Descartar",fr:"Fermer",de:"Schließen",pt:"Dispensar",ja:"閉じる"}, "✨ Like it? Make it yours — customize this app or export it.":{es:"✨ ¿Te gusta? Hazla tuya — personaliza esta app o expórtala.",fr:"✨ Ça vous plaît ? Faites-la vôtre — personnalisez cette app ou exportez-la.",de:"✨ Gefällt sie dir? Mach sie zu deiner — passe diese App an oder exportiere sie.",pt:"✨ Gostou? Torne-a sua — personalize este app ou exporte-o.",ja:"✨ 気に入りましたか? 自分のものに — このアプリをカスタマイズするかエクスポートしましょう。"}, From d46e9a191971e19a2eb8213ce0fc72d8f7847e9f Mon Sep 17 00:00:00 2001 From: Mikkel Garcia Date: Tue, 28 Jul 2026 22:27:42 -0600 Subject: [PATCH 2/5] Say what the showcase actually is, and fix the German word for it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two copy defects in the previous commit. - The in-product copy sold the showcase as work other people shipped ("finished apps people shipped", "Want to see finished apps built from graphs like these?"). Every entry there is a team demo, and the showcase README says so. A reader who clicked through from the editor landed on our own seed apps. The Examples note, the guide's ecosystem list and the share-links guide now say the entries are still all ours, and turn that into the invitation it is: yours would be the first from outside. - German translated "showcase" as "Galerie" (gallery), the word the same sentence already uses for awesome-noodles — one word for two repos. Both German strings now say "Schaufenster", matching es "vitrina", fr/pt "vitrine" and ja "ショーケース". The 2 new Examples-note keys replace the 2 old ones in all 5 language maps. Co-Authored-By: Claude Opus 5 (1M context) --- guide/index.html | 2 +- guide/share-links.html | 5 +++-- index.html | 22 +++++++++++----------- play.html | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/guide/index.html b/guide/index.html index ce7f9e3..7b484b3 100644 --- a/guide/index.html +++ b/guide/index.html @@ -96,7 +96,7 @@

    Elsewhere

  • nanoodle-js and nanoodle-py — headless executors (npm / PyPI, both named nanoodle).
  • awesome-noodles — the workflow gallery behind the editor's 📚 Examples panel: one graph file per entry.
  • -
  • built-with-nanoodle — finished apps people shipped. Every entry opens and runs in your browser; adding yours takes one line.
  • +
  • built-with-nanoodle — the showcase of finished apps. Every entry opens and runs in your browser. They are all ours so far, so yours would be the first from outside, and adding it takes one line.
  • /llms.txt — a machine-readable summary of the site for LLMs.
  • Terms, Privacy & FAQ.
  • diff --git a/guide/share-links.html b/guide/share-links.html index 1ab6e1e..7633814 100644 --- a/guide/share-links.html +++ b/guide/share-links.html @@ -110,8 +110,9 @@

    Where shared apps end up

    A share link is the whole distribution step: there is nothing to host and nothing to publish. If you want an audience for one, built-with-nanoodle - is the public showcase — every entry is a #a= link like yours, and adding one - is a single line in a README. The workflow gallery behind the editor's 📚 Examples panel is + is the public showcase — every entry is a #a= link like yours. They are all + ours so far, so yours would be the first from outside, and adding it is a single line in a + README. The workflow gallery behind the editor's 📚 Examples panel is its sibling, awesome-noodles.

    For recipients

    diff --git a/index.html b/index.html index 5198222..d257cbf 100644 --- a/index.html +++ b/index.html @@ -1016,7 +1016,7 @@

    📚 Examples

    - Want to see finished apps built from graphs like these? built-with-nanoodle — the showcase, and it takes one line to add yours. + Made an app from one? built-with-nanoodle — the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line. @@ -1683,8 +1683,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"pega texto que suena a IA y recupéralo humano", "these come from":"estos vienen de", "— remix one and send us yours.":"— remezcla uno y envíanos el tuyo.", - "Want to see finished apps built from graphs like these?":"¿Quieres ver apps terminadas creadas a partir de flujos como estos?", - "— the showcase, and it takes one line to add yours.":"— la vitrina, y añadir la tuya cuesta una línea.", + "Made an app from one?":"¿Hiciste una app con uno?", + "— the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.":"— la vitrina. Todas las apps que hay siguen siendo nuestras; haz que la tuya sea la primera que no lo sea. Una línea.", "Use in your agent":"Úsalo en tu agente", "nanoodle in your coding agent":"nanoodle en tu agente de código", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Un solo comando enseña a tu agente a diseñar y ejecutar flujos de nanoodle — desde tu terminal, con tu propia clave de NanoGPT.", @@ -2198,8 +2198,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"collez un texte qui sent l'IA, récupérez-le humain", "these come from":"ils viennent de", "— remix one and send us yours.":"— remixez-en un et envoyez-nous le vôtre.", - "Want to see finished apps built from graphs like these?":"Envie de voir des apps finies construites à partir de flux comme ceux-ci ?", - "— the showcase, and it takes one line to add yours.":"— la vitrine, et ajouter la vôtre tient en une ligne.", + "Made an app from one?":"Vous en avez fait une app ?", + "— the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.":"— la vitrine. Toutes les apps qui s’y trouvent sont encore les nôtres ; faites de la vôtre la première qui ne l’est pas. Une ligne.", "Use in your agent":"Utiliser dans votre agent", "nanoodle in your coding agent":"nanoodle dans votre agent de code", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Une seule commande apprend à votre agent à concevoir et exécuter des flux nanoodle — depuis votre terminal, avec votre propre clé NanoGPT.", @@ -2713,8 +2713,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"KI-Text einfügen, menschlich zurückbekommen", "these come from":"diese stammen aus", "— remix one and send us yours.":"— remixe eins und schick uns deins.", - "Want to see finished apps built from graphs like these?":"Willst du fertige Apps sehen, die aus solchen Workflows entstanden sind?", - "— the showcase, and it takes one line to add yours.":"— die Galerie, und deine hinzuzufügen kostet eine Zeile.", + "Made an app from one?":"Daraus eine App gebaut?", + "— the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.":"— das Schaufenster. Alle Apps darin sind noch unsere eigenen; mach deine zur ersten, die es nicht ist. Eine Zeile.", "Use in your agent":"In deinem Agenten nutzen", "nanoodle in your coding agent":"nanoodle in deinem Coding-Agenten", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Ein Befehl bringt deinem Agenten bei, nanoodle-Workflows zu entwerfen und auszuführen — direkt im Terminal, mit deinem eigenen NanoGPT-Schlüssel.", @@ -3228,8 +3228,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"cole um texto com cara de IA e receba-o humano", "these come from":"estes vêm de", "— remix one and send us yours.":"— remixe um e mande o seu.", - "Want to see finished apps built from graphs like these?":"Quer ver apps prontos feitos a partir de fluxos como estes?", - "— the showcase, and it takes one line to add yours.":"— a vitrine, e adicionar o seu leva uma linha.", + "Made an app from one?":"Fez um app a partir de um deles?", + "— the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.":"— a vitrine. Todos os apps nela ainda são nossos; faça o seu ser o primeiro que não é. Uma linha.", "Use in your agent":"Use no seu agente", "nanoodle in your coding agent":"nanoodle no seu agente de código", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"Um único comando ensina o seu agente a criar e executar fluxos do nanoodle — do seu terminal, com a sua própria chave NanoGPT.", @@ -3743,8 +3743,8 @@

    Top up to keep running

    "paste AI-sounding text, get it back human":"AIっぽい文章を貼ると、人間らしい文章が返る", "these come from":"出典は", "— remix one and send us yours.":"— リミックスして、あなたの作品もぜひ送ってください。", - "Want to see finished apps built from graphs like these?":"こういうワークフローから生まれた完成アプリを見てみませんか?", - "— the showcase, and it takes one line to add yours.":"— ショーケースです。あなたの作品も1行で追加できます。", + "Made an app from one?":"そこからアプリを作りましたか?", + "— the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.":"— ショーケースです。今あるアプリはまだ全部わたしたちのもの。最初の1つは、あなたのアプリに。追加は1行です。", "Use in your agent":"エージェントで使う", "nanoodle in your coding agent":"コーディングエージェントで nanoodle", "One command teaches your agent to design and run nanoodle workflows — from your terminal, on your own NanoGPT key.":"コマンド1つで、エージェントが nanoodle ワークフローを設計・実行できるようになります — ターミナルから、自分の NanoGPT キーで。", diff --git a/play.html b/play.html index 760c5b8..00dbdee 100644 --- a/play.html +++ b/play.html @@ -5431,7 +5431,7 @@

    Open a workflow from the editor

    "✱ edits aren’t shared":{es:"✱ los cambios no se comparten",fr:"✱ les modifications ne sont pas partagées",de:"✱ Änderungen werden nicht geteilt",pt:"✱ as edições não são compartilhadas",ja:"✱ 編集は共有されません"}, "The whole app lives in this link — nothing hits a server when someone opens it. That's why it can get long.":{es:"Toda la app vive en este enlace — nada llega a un servidor cuando alguien lo abre. Por eso puede quedar largo.",fr:"Toute l’app tient dans ce lien — rien n’atteint un serveur quand quelqu’un l’ouvre. C’est pourquoi il peut devenir long.",de:"Die ganze App steckt in diesem Link — beim Öffnen wird kein Server kontaktiert. Deshalb kann er lang werden.",pt:"O app inteiro vive neste link — nada chega a um servidor quando alguém o abre. Por isso ele pode ficar longo.",ja:"アプリ全体がこのリンクに含まれています — 誰かが開いてもサーバーには何も送られません。だからリンクは長くなることがあります。"}, "Proud of it?":{es:"¿Orgulloso del resultado?",fr:"Fier du résultat ?",de:"Stolz darauf?",pt:"Orgulhoso do resultado?",ja:"自信作ですか?"}, - "add your app to the showcase ↗":{es:"añade tu app a la vitrina ↗",fr:"ajoutez votre app à la vitrine ↗",de:"füge deine App zur Galerie hinzu ↗",pt:"adicione seu app à vitrine ↗",ja:"あなたのアプリをショーケースに追加 ↗"}, + "add your app to the showcase ↗":{es:"añade tu app a la vitrina ↗",fr:"ajoutez votre app à la vitrine ↗",de:"füge deine App dem Schaufenster hinzu ↗",pt:"adicione seu app à vitrine ↗",ja:"あなたのアプリをショーケースに追加 ↗"}, "This shared-app link looks incomplete or damaged — ask the sender for a fresh one. Shortened links survive messengers better.":{es:"Este enlace de app compartida parece incompleto o dañado — pídele al remitente uno nuevo. Los enlaces acortados aguantan mejor en los mensajeros.",fr:"Ce lien d’app partagée semble incomplet ou endommagé — demandez-en un nouveau à l’expéditeur. Les liens raccourcis résistent mieux aux messageries.",de:"Dieser geteilte App-Link scheint unvollständig oder beschädigt — bitte den Absender um einen neuen. Gekürzte Links überstehen Messenger besser.",pt:"Este link de app compartilhado parece incompleto ou danificado — peça um novo ao remetente. Links encurtados resistem melhor aos mensageiros.",ja:"この共有アプリのリンクは不完全か壊れているようです — 送信者に新しいリンクをもらってください。短縮リンクの方がメッセンジャーで壊れにくいです。"}, "Dismiss":{es:"Descartar",fr:"Fermer",de:"Schließen",pt:"Dispensar",ja:"閉じる"}, "✨ Like it? Make it yours — customize this app or export it.":{es:"✨ ¿Te gusta? Hazla tuya — personaliza esta app o expórtala.",fr:"✨ Ça vous plaît ? Faites-la vôtre — personnalisez cette app ou exportez-la.",de:"✨ Gefällt sie dir? Mach sie zu deiner — passe diese App an oder exportiere sie.",pt:"✨ Gostou? Torne-a sua — personalize este app ou exporte-o.",ja:"✨ 気に入りましたか? 自分のものに — このアプリをカスタマイズするかエクスポートしましょう。"}, From 57cfd3da75405e34f853a60c48b02d59ec6e20e2 Mon Sep 17 00:00:00 2001 From: Mikkel Garcia Date: Tue, 28 Jul 2026 23:03:14 -0600 Subject: [PATCH 3/5] Say what the showcase is in the README ecosystem table too The table row still read "Showcase of apps people shipped". No third-party app has landed there yet, and the showcase README says so itself. This is the same overclaim this branch already removed from the in-product copy, the guide and llms.txt, so the last place it survived now matches: the apps are all still ours, and the row invites the reader to add the first one that is not. llms-full.txt is regenerated from the README, so it carries the same one-line change and nothing else. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 2 +- llms-full.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f3230e8..e2c77b8 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Everything lives under the [nanoodlecom](https://github.com/nanoodlecom) GitHub | [nanoodle-skill](https://github.com/nanoodlecom/nanoodle-skill) | One agent skill that teaches an agent to build any graph — use when the agent should author workflows itself | | [noodle-skills](https://github.com/nanoodlecom/noodle-skills) | Prebuilt one-task agent skills — use when you want a ready-made skill, no graph editing | | [awesome-noodles](https://github.com/nanoodlecom/awesome-noodles) | Gallery of ready-to-open graphs — use when you want examples to start from | -| [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle) | Showcase of apps people shipped — use when you want to see (or show) what nanoodle makes | +| [built-with-nanoodle](https://github.com/nanoodlecom/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](https://github.com/nanoodlecom/noodle-embed) | `` web component — use when a page should render a workflow read-only | | [mp4cat](https://github.com/nanoodlecom/mp4cat) | Lossless mp4 concat, browser or Node — use when you just need to join clips, no ffmpeg | diff --git a/llms-full.txt b/llms-full.txt index 435cdc3..594781d 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -141,7 +141,7 @@ Everything lives under the [nanoodlecom](https://github.com/nanoodlecom) GitHub | [nanoodle-skill](https://github.com/nanoodlecom/nanoodle-skill) | One agent skill that teaches an agent to build any graph — use when the agent should author workflows itself | | [noodle-skills](https://github.com/nanoodlecom/noodle-skills) | Prebuilt one-task agent skills — use when you want a ready-made skill, no graph editing | | [awesome-noodles](https://github.com/nanoodlecom/awesome-noodles) | Gallery of ready-to-open graphs — use when you want examples to start from | -| [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle) | Showcase of apps people shipped — use when you want to see (or show) what nanoodle makes | +| [built-with-nanoodle](https://github.com/nanoodlecom/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](https://github.com/nanoodlecom/noodle-embed) | `` web component — use when a page should render a workflow read-only | | [mp4cat](https://github.com/nanoodlecom/mp4cat) | Lossless mp4 concat, browser or Node — use when you just need to join clips, no ffmpeg | From 3cfd075832911189c1d0c446df8576d2cacf4885 Mon Sep 17 00:00:00 2001 From: Mikkel Garcia Date: Wed, 29 Jul 2026 01:18:54 -0600 Subject: [PATCH 4/5] Say which link form the showcase takes, next to the shorten button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The share popover reads top to bottom: copy the link, "Make it shorter — optional", share to a social site, then this branch's showcase invite. A contributor who works down that list clicks nanolink first, and setShareUrl() replaces the link box with the short link. The showcase decodes the app out of the #a= fragment, so a shortened entry is rejected — the popover walked the reader straight into the one link form the showcase cannot take. Name the form in the invite itself, before the copy happens: "it needs the full link, not a shortened one". Own text node, own PLAY_I18N_B key, all 5 languages, exactly like its neighbours. guide/share-links.html says the same thing in its showcase paragraph, which also sits right under a shortening section. Co-Authored-By: Claude Opus 5 (1M context) --- guide/share-links.html | 8 +++++--- play.html | 10 ++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/guide/share-links.html b/guide/share-links.html index 7633814..f47ea15 100644 --- a/guide/share-links.html +++ b/guide/share-links.html @@ -110,9 +110,11 @@

    Where shared apps end up

    A share link is the whole distribution step: there is nothing to host and nothing to publish. If you want an audience for one, built-with-nanoodle - is the public showcase — every entry is a #a= link like yours. They are all - ours so far, so yours would be the first from outside, and adding it is a single line in a - README. The workflow gallery behind the editor's 📚 Examples panel is + is the public showcase — every entry is a #a= link like yours. Send the full + link, not a shortened one: the showcase reads the app straight out of the fragment, and a + short link hides it. They are all ours so far, so yours would be the first from outside, + and adding it is a single line in a README. The workflow gallery behind the editor's + 📚 Examples panel is its sibling, awesome-noodles.

    For recipients

    diff --git a/play.html b/play.html index 00dbdee..e89ce29 100644 --- a/play.html +++ b/play.html @@ -499,8 +499,13 @@ -

    Proud of it? add your app to the showcase ↗

    + they didn't build this app, so it isn't theirs to submit. + The trailing clause is load-bearing, not decoration: "Make it shorter" sits a few lines + above, and a click there calls setShareUrl(short), so the box now holds a short link. The + showcase decodes the #a= payload out of the fragment and rejects a shortened entry, so a + reader who works down the popover would submit exactly the link that fails. Say which + form it takes, here, before they copy the wrong one. Own text node = own i18n key. --> +

    Proud of it? add your app to the showcase ↗ — it needs the full link, not a shortened one.

    @@ -5432,6 +5437,7 @@

    Open a workflow from the editor

    "The whole app lives in this link — nothing hits a server when someone opens it. That's why it can get long.":{es:"Toda la app vive en este enlace — nada llega a un servidor cuando alguien lo abre. Por eso puede quedar largo.",fr:"Toute l’app tient dans ce lien — rien n’atteint un serveur quand quelqu’un l’ouvre. C’est pourquoi il peut devenir long.",de:"Die ganze App steckt in diesem Link — beim Öffnen wird kein Server kontaktiert. Deshalb kann er lang werden.",pt:"O app inteiro vive neste link — nada chega a um servidor quando alguém o abre. Por isso ele pode ficar longo.",ja:"アプリ全体がこのリンクに含まれています — 誰かが開いてもサーバーには何も送られません。だからリンクは長くなることがあります。"}, "Proud of it?":{es:"¿Orgulloso del resultado?",fr:"Fier du résultat ?",de:"Stolz darauf?",pt:"Orgulhoso do resultado?",ja:"自信作ですか?"}, "add your app to the showcase ↗":{es:"añade tu app a la vitrina ↗",fr:"ajoutez votre app à la vitrine ↗",de:"füge deine App dem Schaufenster hinzu ↗",pt:"adicione seu app à vitrine ↗",ja:"あなたのアプリをショーケースに追加 ↗"}, + "— it needs the full link, not a shortened one.":{es:"— necesita el enlace completo, no uno acortado.",fr:"— il lui faut le lien complet, pas un lien raccourci.",de:"— dafür braucht es den vollständigen Link, keinen gekürzten.",pt:"— ele precisa do link completo, não de um encurtado.",ja:"— 必要なのは短縮リンクではなく完全なリンクです。"}, "This shared-app link looks incomplete or damaged — ask the sender for a fresh one. Shortened links survive messengers better.":{es:"Este enlace de app compartida parece incompleto o dañado — pídele al remitente uno nuevo. Los enlaces acortados aguantan mejor en los mensajeros.",fr:"Ce lien d’app partagée semble incomplet ou endommagé — demandez-en un nouveau à l’expéditeur. Les liens raccourcis résistent mieux aux messageries.",de:"Dieser geteilte App-Link scheint unvollständig oder beschädigt — bitte den Absender um einen neuen. Gekürzte Links überstehen Messenger besser.",pt:"Este link de app compartilhado parece incompleto ou danificado — peça um novo ao remetente. Links encurtados resistem melhor aos mensageiros.",ja:"この共有アプリのリンクは不完全か壊れているようです — 送信者に新しいリンクをもらってください。短縮リンクの方がメッセンジャーで壊れにくいです。"}, "Dismiss":{es:"Descartar",fr:"Fermer",de:"Schließen",pt:"Dispensar",ja:"閉じる"}, "✨ Like it? Make it yours — customize this app or export it.":{es:"✨ ¿Te gusta? Hazla tuya — personaliza esta app o expórtala.",fr:"✨ Ça vous plaît ? Faites-la vôtre — personnalisez cette app ou exportez-la.",de:"✨ Gefällt sie dir? Mach sie zu deiner — passe diese App an oder exportiere sie.",pt:"✨ Gostou? Torne-a sua — personalize este app ou exporte-o.",ja:"✨ 気に入りましたか? 自分のものに — このアプリをカスタマイズするかエクスポートしましょう。"}, From f2a5c4e1efd53fdb7e44a09a070785d976f60963 Mon Sep 17 00:00:00 2001 From: Mikkel Garcia Date: Wed, 29 Jul 2026 10:47:06 -0600 Subject: [PATCH 5/5] Say in llms.txt too that every showcase entry is still ours MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The other four places this branch touches — the Examples note, the guide's Elsewhere list, the share-links guide and the README ecosystem row — all say that every app on the showcase is still a nanoodle-team demo, and all but the README also say the entry needs the full link. llms.txt said neither. llms.txt is the agent-facing index, so an agent reading only that file would describe the showcase as a collection of third-party apps, and would hand a reader the shortened link the showcase cannot decode. Say both there too. scripts/gen-llms-full.mjs does not read llms.txt, so llms-full.txt is byte-identical after this commit and the merge with #372 is unaffected. Co-Authored-By: Claude Opus 5 (1M context) --- llms.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llms.txt b/llms.txt index 9e6e6d1..e71651a 100644 --- a/llms.txt +++ b/llms.txt @@ -21,7 +21,7 @@ Everything is MIT-licensed under the nanoodlecom GitHub org. Naming note: the in ## Examples - [awesome-noodles](https://github.com/nanoodlecom/awesome-noodles): the workflow gallery. One committed `noodle-graph.json` per entry plus an editor share link. The Examples panel in the editor is this repository, one card per graph. Start here when you want a graph to open, run, or remix. -- [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle): the app showcase. Each entry is a `#a=` share link that opens a finished, runnable app in the browser. Start here when you want to see what a finished nanoodle app looks like, or to add one you shipped. +- [built-with-nanoodle](https://github.com/nanoodlecom/built-with-nanoodle): the app showcase. Each entry is a `#a=` share link that opens a finished, runnable app in the browser. Every entry is still one of ours, so an app you add would be the first from outside. Use the full link, not a shortened one — the showcase reads the app out of the fragment. Start here when you want to see what a finished nanoodle app looks like, or to add one you shipped. ## Formats