Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) | `<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 |

Expand Down
2 changes: 2 additions & 0 deletions guide/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ <h2>Elsewhere</h2>
<li><a href="https://github.com/nanoodlecom/nanoodle" target="_blank" rel="noopener">github.com/nanoodlecom/nanoodle</a> — the site's source (MIT).</li>
<li><a href="https://github.com/nanoodlecom/nanoodle-js" target="_blank" rel="noopener">nanoodle-js</a> and
<a href="https://github.com/nanoodlecom/nanoodle-py" target="_blank" rel="noopener">nanoodle-py</a> — headless executors (npm / PyPI, both named <code>nanoodle</code>).</li>
<li><a href="https://github.com/nanoodlecom/awesome-noodles" target="_blank" rel="noopener">awesome-noodles</a> — the workflow gallery behind the editor's 📚 Examples panel: one graph file per entry.</li>
<li><a href="https://github.com/nanoodlecom/built-with-nanoodle" target="_blank" rel="noopener">built-with-nanoodle</a> — 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.</li>
<li><a href="/llms.txt">/llms.txt</a> — a machine-readable summary of the site for LLMs.</li>
<li><a href="/legal">Terms, Privacy &amp; FAQ</a>.</li>
</ul>
Expand Down
11 changes: 11 additions & 0 deletions guide/share-links.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ <h2>Shortening — first-party too</h2>
flow re-encodes the preview smaller or drops it — and tells you it did — rather than
failing silently.</p>

<h2>Where shared apps end up</h2>
<p>A share link is the whole distribution step: there is nothing to host and nothing to
publish. If you want an audience for one,
<a href="https://github.com/nanoodlecom/built-with-nanoodle" target="_blank" rel="noopener">built-with-nanoodle</a>
is the public showcase — every entry is a <code>#a=</code> 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, <a href="https://github.com/nanoodlecom/awesome-noodles" target="_blank" rel="noopener">awesome-noodles</a>.</p>

<h2>For recipients</h2>
<p>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
Expand Down
16 changes: 15 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,11 @@ <h2>📚 Examples</h2>
<div id="communitytop" data-no-i18n hidden></div>
<div id="communitymore" data-no-i18n hidden></div>
</div>
<div id="examplesnote">loading replaces your current workflow — it’s autosaved, and ↺ Undo brings it back. <span>these come from</span> <a href="https://github.com/nanoodlecom/awesome-noodles" target="_blank" rel="noopener" data-no-i18n>awesome-noodles</a><span> — remix one and send us yours.</span></div>
<div id="examplesnote">loading replaces your current workflow — it’s autosaved, and ↺ Undo brings it back. <span>these come from</span> <a href="https://github.com/nanoodlecom/awesome-noodles" target="_blank" rel="noopener" data-no-i18n>awesome-noodles</a><span> — remix one and send us yours.</span>
<!-- second link, second question: the gallery answers "what can I start from", the showcase
answers "does this make anything real". Same sentence shape as the line above, so the
text nodes around the (untranslated) repo name stay their own i18n keys. -->
<span>Made an app from one?</span> <a href="https://github.com/nanoodlecom/built-with-nanoodle" target="_blank" rel="noopener" data-no-i18n>built-with-nanoodle</a><span> — the showcase. Every app on it is still one of ours; make yours the first that isn’t. One line.</span></div>
</div>
</div>

Expand Down Expand Up @@ -1679,6 +1683,8 @@ <h3 class="rf-title" id="refueltitle">Top up to keep running</h3>
"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.",
"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.",
Expand Down Expand Up @@ -2192,6 +2198,8 @@ <h3 class="rf-title" id="refueltitle">Top up to keep running</h3>
"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.",
"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.",
Expand Down Expand Up @@ -2705,6 +2713,8 @@ <h3 class="rf-title" id="refueltitle">Top up to keep running</h3>
"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.",
"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.",
Expand Down Expand Up @@ -3218,6 +3228,8 @@ <h3 class="rf-title" id="refueltitle">Top up to keep running</h3>
"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.",
"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.",
Expand Down Expand Up @@ -3731,6 +3743,8 @@ <h3 class="rf-title" id="refueltitle">Top up to keep running</h3>
"paste AI-sounding text, get it back human":"AIっぽい文章を貼ると、人間らしい文章が返る",
"these come from":"出典は",
"— remix one and send us yours.":"— リミックスして、あなたの作品もぜひ送ってください。",
"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 キーで。",
Expand Down
2 changes: 1 addition & 1 deletion llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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) | `<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 |

Expand Down
5 changes: 5 additions & 0 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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. 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

- 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.
Expand Down
19 changes: 19 additions & 0 deletions play.html
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -490,6 +495,17 @@
<a data-soc="facebook" target="_blank" rel="noopener">Facebook</a>
<a data-soc="email">Email</a>
</div>

<!-- The showcase nudge sits LAST, after the link exists and the sharing options are done —
the one moment the reader already has the #a= link on their clipboard, which is the
only thing a showcase entry needs. Hidden for share-link recipients (body.recipient):
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. -->
<p class="sm-note" id="sm-showcase">Proud of it? <a href="https://github.com/nanoodlecom/built-with-nanoodle" target="_blank" rel="noopener">add your app to the showcase ↗</a> <span>— it needs the full link, not a shortened one.</span></p>
</div>
<div id="shareback" hidden></div>

Expand Down Expand Up @@ -5419,6 +5435,9 @@ <h2>Open a workflow from the editor</h2>
"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 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:"✨ 気に入りましたか? 自分のものに — このアプリをカスタマイズするかエクスポートしましょう。"},
Expand Down
Loading