Example Apps — Curation Spec
Status: draft, 2026-07-26. Companion to
applications-canonical.md T11. Scope: which of the
36 shipped templates in packages/base-nodes/nodetool/examples/nodetool-base/
get a shipped example app (an ApplicationBundle, T12), and what each app
contains. No code.
Today every template gets a generated app from the CURATION table in
scripts/generate-template-apps.mjs — 36 variations of one form. This spec
replaces that with 11 curated apps binding 23 workflows; the remaining 13
templates ship as workflows only.
Selection criteria
Applied in priority order, recorded per app as C1/C2/C3:
- C1 — a real person wants the app, not the graph. A form, dashboard, or gallery is the natural interface for this job.
- C2 — it exercises the platform. Several workflows behind one surface, variables carrying state between operations, streaming, live property bindings.
- C3 — it runs on a fresh install, or degrades legibly. Keyless, local, or an explicit note naming the key and the cost.
The apps
| App | Workflows bound | Operations | Key widgets | Criteria | Needs |
|---|---|---|---|---|---|
| Photo Studio | Image Enhance, Photo Enhancement Suite | enhance, batch |
ImageInput, 5 Sliders, Image, Table | C1 C2 C3 | none for enhance; FAL key for batch |
| Meeting Room | Transcribe Audio, Meeting Transcript Summarizer, Private Assistant | transcribe, summarize, ask |
AudioInput, Markdown, Table, TextInput | C1 C2 | FAL (Whisper) + OpenAI; ask needs Ollama |
| Concept Studio | Concept Art Iteration Board, Pokemon Maker, Image Enhance | concepts, creatures, polish |
Select, Slider, Image gallery, Button | C1 C2 | OpenAI + FAL; polish keyless |
| Research Desk | Research Agent, Hacker News Agent, Summarize RSS | brief, pulse, digest |
TextInput, Markdown ×3, Progress | C1 C2 | OpenAI (+ web search tool) |
| Ask Your Documents | Chat With Your Documents, Private Assistant | ask, askLocal |
TextInput, Switch, Markdown ×2 | C1 C2 C3 | Ollama (embeddings, askLocal); OpenAI for ask |
| Brand & Social | Brand Asset Generator, Hook & Thumbnail Factory, Social Media Calendar Filler | kit, thumbnails, calendar |
ColorInput, Image, Table, Columns | C1 C2 | OpenAI + FAL |
| Product Launch Kit | Product Mockup Generator, Product Video Generator | mockups, video |
ImageInput, Slider, Image, Video | C1 C2 C3 | OpenAI + FAL; Gemini (Veo) for video, cost note |
| Film Studio | Script to Screen, Directed Film to Timeline, Movie Posters | produce, cut, poster |
TextInput, Select, Progress, Video, Image | C1 C2 C3 | OpenAI + FAL + Gemini (Veo) + Replicate; cost note |
| Study Buddy | Flashcard Generator, Prompt Template | cards, explain |
NumberInput, Table, Markdown | C1 C2 | OpenAI |
| Model Arena | Model Arena | compare |
TextInput, Columns, Markdown ×3 | C1 C2 | OpenAI + Anthropic + Gemini keys |
| Dataset Builder | Data Generator | generate |
TextInput, NumberInput, Table | C1 | OpenAI |
Nine of eleven bind more than one workflow. Two are usable with no cloud key
(Photo Studio’s enhance, Ask Your Documents in local mode).
Per-app detail
Output names below are the ones in the shipped graphs. Names marked † come
from the Output-augmentation table in generate-template-apps.mjs; T12 must
bake those Output nodes into the bundled graphs (see Prerequisites).
1. Photo Studio
Generate-free, refine-heavy: the flagship for live property bindings.
enhance— Image Enhance. Inputs:imagefrom an ImageInput widget; five node properties bound to sliders —denoise-node.radius,tone-node.brightness,tone-node.contrast,color-node.saturation,sharpen-node.amount, allpace: "release". Policyreplace. Outputenhanced_image† → display.batch— Photo Enhancement Suite. Inputs:photos(ImageListInput),brightness_adjust/color_boostsliders. Outputenhanced_photos† → variablebatchResults, rendered as a grid.- Variables:
sourceImage(instance) shared by both operations so the single photo and the batch use the same drop zone. - Degradation:
enhanceis pure GPU filters (lib.image.*) and runs with no keys;batchadds a FALImageToImagegrade pass and says so in a note.
2. Meeting Room
Recording in, minutes out, then question the transcript — the transcribe → summarize → interrogate chain across three workflows.
transcribe— Transcribe Audio. Inputaudiofrom an AudioInput widget, event onchange(auto-run on upload). Outputtranscript† → variabletranscript. Policyreplace.summarize— Meeting Transcript Summarizer. InputTranscriptfrom variabletranscript(the graph’sIsEmpty/Ifpair already skips its own ASR branch when a transcript is supplied). OutputsSummary→ Markdown,Action Items→ Table (it emits a dataframe),Transcriptunused.ask— Private Assistant. Inputsdocumentfrom variabletranscript,questionfrom a TextInput,tonefrom a Select. Outputanswer→ Markdown. Local Ollama, so the follow-up Q&A costs nothing and works offline once the transcript exists.- Variables:
transcript(instance) is the whole point — one value written by op 1 and read by ops 2 and 3.
3. Concept Studio
Generate a gallery, pick one, polish it. The creative iteration loop.
concepts— Concept Art Iteration Board. Inputscreative_brief,art_style,mood_keywords(TextInput/Select),variations(Slider 1–8). OutputConcept Art→ append-disposition gallery.creatures— Pokemon Maker. Inputsanimals(TextInput),style(Select fed from the graph’s existingSelectInputoptions: cel-shaded, 3D render, watercolor, 16-bit, holographic). Outputpokemon† → the same gallery.polish— Image Enhance, bound a second time with different mappings: inputimagefrom variablepicked, sliders as in Photo Studio. Policyreplace.- Variables:
picked(instance) — the gallery selection feedspolish. - Both generators use
ListGenerator→TextToImage, so results stream in one at a time; a Progress widget shows the batch filling.
4. Research Desk
One topic, three sources, three streamed briefings side by side — the case where a dashboard beats a chat box.
brief— Research Agent. Inputstopic(variabletopic),audience(Select: engineers / executives / general). Outputbrief→ Markdown, streams as the agent works.pulse— Hacker News Agent. Inputtopicfrom the same variable. Outputanalysis→ Markdown.digest— Summarize RSS. Inputfeed_url(TextInput with a shipped default). Outputsummary† → Markdown.- All three run
parallelfrom one Button, each into its own panel with its own Progress label.
5. Ask Your Documents
RAG with a legible offline fallback.
ask— Chat With Your Documents. Inputsquestion,search, and the three document text areasdoc_specs/doc_charging/doc_warranty(shipped with the bundled Aurora sample text). OutputsAnswer→ Markdown,Retrieved Passages→ Markdown (the citation panel).askLocal— Private Assistant. Inputsdocumentfrom variablepastedDoc,questionfrom the same question variable. Outputanswer→ Markdown.- Widgets: a Switch bound to variable
localOnlydecides which operation the Run button triggers, andvisibleWhenswaps the results panel. - Note: the vector collection embeds with Ollama
nomic-embed-text, soaskneeds Ollama running and an OpenAI key;askLocalneeds only Ollama. The app note must say this — it is the one place a user can be surprised.
6. Brand & Social
The marketing dashboard: one brand identity drives three deliverables.
kit— Brand Asset Generator. Inputsbrand_name,brand_description,tagline(TextInputs, written into variables),primary_color(ColorInput). Outputssocial_assets→ Image grid,brand_brief→ Markdown.thumbnails— Hook & Thumbnail Factory. InputsVideo Topic(TextInput),Target Audiencefrom variableaudience,Number of Hooks(Slider 3–8). Outputthumbnail_gallery→ gallery.calendar— Social Media Calendar Filler. Inputsbrand_name,target_audience,brand_voicefrom variables;monthly_themeTextInput;posts_per_weekSlider. Outputscontent_calendar→ Table (dataframe),post_images† → gallery,captions† → Markdown.- Variables:
brandName,audience,voice(user-scoped,persist: true) — fill them once, every operation reuses them across sessions.
7. Product Launch Kit
Photo in, mockups and a launch video out; the expensive step is opt-in.
mockups— Product Mockup Generator. Inputsproduct_image(ImageInput → variableproductPhoto),product_name,product_description,target_audience,num_scenes(Slider 1–6). Outputsmockup† → gallery,scene† → Markdown shot list.video— Product Video Generator. Inputsimage_input_1from variableproductPhoto,campaign_brief,target_audience(shared variable),key_features. Outputproduct_video† → Video. Its own Button with a cost note; policyqueue,timeoutMsgenerous — Veo runs are long.- Runs
mockupson a fresh install without touching Veo, so the app is useful at the FAL tier alone.
8. Film Studio
The showcase run: brief → direction → storyboard → cut → key art.
produce— Script to Screen. InputsBrief(variablebrief),Visual Style(Select),Shot Count(Slider 3–8). Outputsdirection→ Markdown,storyboard→ gallery,film→ Video.cut— Directed Film to Timeline. InputBrieffrom the same variable. Outputfilm→ Video, presented as “the editable rough cut”.poster— Movie Posters. InputsMovie Title,Genre,Visual Style(shared Select). OutputPoster→ Image.- Progress widget per operation; policy
queuethroughout; a standing note that this app spends real money (Veo 3.1 + Replicate MusicGen) and should be run once, deliberately.
9. Study Buddy
Structured data an app renders better than a graph does.
cards— Flashcard Generator. Inputstopic(variabletopic),num_cards(NumberInput). OutputFlashcards→ Table, with front/back columns; the graph persists them in SQLite, so re-opening the app shows the stored set.explain— Prompt Template. InputsTopicfrom the same variable,Audience(Select). OutputExplanation→ Markdown, shown beside the cards as “the concept behind this deck”.- Variables:
topic(user-scoped, persisted) is the study session.
10. Model Arena
Single workflow, but the app is the point: three answers in three columns is unreadable on a canvas.
compare— Model Arena. Inputsbrief,context(TextInputs). Outputsopenai,anthropic,gemini→ three Markdown panels inside a Columns layout, each streaming independently with its own Progress label.- Degradation: a missing provider key fails one column, not the run. The note names all three keys.
11. Dataset Builder
generate— Data Generator. Inputstopic(TextInput),row_count(NumberInput 5–50). Outputgenerated_data→ Table.- The smallest app in the set, kept because a table view of a dataframe is a genuinely better surface than a Preview node, and it is the reference for the Table widget.
Templates that stay workflow-only
13 templates ship without an app:
| Template | Reason |
|---|---|
| Ad Creative Factory | Terminal nodes are Previews, not Outputs — nothing for widgets to bind; the video matrix is also the most expensive run in the catalog. |
| Audio To Image | One input, one image; the template card already tells the whole story. |
| Cold Outreach Co-Pilot | Preview-only terminals, and the structured draft fields need an app-side email composer this spec does not define. |
| Color Boost Video | Per-frame grading of an uploaded video is minutes long with one slider — a bad first-run experience; the sliders belong in the editor. |
| Conditional Logic Engine | Teaching example. Its value is the graph. |
| Image To Audio Story | One image in, one audio clip out — a Run button with extra steps. |
| Image to Video Animation | Text-to-image → Veo; it has no image input, so it cannot be the “animate this” step of any gallery app (see Findings). |
| Movie Trailer Generator | Overlaps Film Studio’s produce at higher cost and with a weaker output set. |
| Music Video Visualizer | Strong candidate deferred: one upload, one long paid run, one video. Revisit once a Podcast/Audio app justifies the surface. |
| Podcast Repurposing Studio | Preview-only terminals; needs Output nodes and structured quote-card output before an app can render it. |
| Research Paper Summarizer | Overlaps Research Desk’s brief; its 22-node fetch/filter chain is the interesting part and lives in the editor. |
| SEO Content Engine | Preview-only terminals; the typed article fields want a per-article editor, not a results panel. |
| Workflow As A Tool | Composition demo for graph authors. An app hides exactly what it teaches. |
Prerequisites and findings
Things T12 must handle, found while reading the graphs:
- Output augmentation must move into the graphs. Eight bound workflows have
no Output node today and rely on the
AUGMENTtable ingenerate-template-apps.mjs: Transcribe Audio, Summarize RSS, Pokemon Maker, Image Enhance, Photo Enhancement Suite, Product Mockup Generator, Product Video Generator, Social Media Calendar Filler (2 of its 3 outputs). Bundles carry graphs, not a generator, so those nodes must be committed to the example JSON. - Preview-only templates cannot back an app. Ad Creative Factory, Cold
Outreach Co-Pilot, Podcast Repurposing Studio, and SEO Content Engine end in
nodetool.workflows.base_node.Previewwith zero Outputs. All four are in the workflow-only list for that reason; promoting any of them later is a graph change first. - Image to Video Animation has no image input. The obvious “animate the
concept I picked” operation for Concept Studio is not buildable against the
shipped graph (
TextToImage→ImageToVideo). Concept Studio uses Image Enhance for its second step instead; adding an ImageInput to that template is a separate, small change if the animate step is wanted. - Chat With Your Documents needs Ollama even in “cloud” mode. Its
vector.Collectionembeds withnomic-embed-texton Ollama while the answer agent is OpenAIgpt-5-mini. Either the app note says both, or the template switches to a cloud embedding model. - Multi-binding is real here. Image Enhance is bound by two apps (Photo
Studio, Concept Studio) and Private Assistant by two (Meeting Room, Ask Your
Documents) — with different input mappings each time. The bundle format’s
workflows[].keyindirection covers this; the installer must not create duplicate workflow rows when both bundles are installed. - Marketing impact.
/apps/*drops from 36 generated pages to 11 curated ones. Every retired slug needs a redirect to the app that absorbed it (or to its/templates/<slug>page, which survives) — the redirect map is T13 work, but the mapping is this table.