Agent skill

Nodetool App Builder

by nodetool-ai in nodetool-ai/nodetool

Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources.

AGPL-3.0Auto-check passedMedia & Creative

Install Nodetool App Builder

skills CLI
$ npx skills add nodetool-ai/nodetool --skill nodetool-app-builder -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install nodetool-ai/nodetool nodetool-app-builder --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/system-skills/nodetool-app-builder .claude/skills/nodetool-app-builder && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
nodetool-app-builder
GitHub stars
560
Token cost
~3.4k tokens
SKILL.md length
1,872 words
Files
1
Skills in repo
127
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources.

  • Works in 4 steps: Anything the user changes needs an Input… → Anything the user sees needs an Output… → Every input needs a default, so the… → …
  • The deliverable is a screen a person runs
  • SKILL.md covers The workflow decides what the…, The loop, Four verdict failures that are… and Three warnings that only bite…, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Nodetool App Builder is an agent skill from nodetool-ai/nodetool. Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources. Use when the deliverable is a screen a person runs, not a graph.

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Media & Creative. The repository describes itself as: Agent-first Creative Workspace. The licence is AGPL-3.0.

When your agent uses it

  • The deliverable is a screen a person runs

Example prompts

  • “/nodetool-app-builder”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Anything the user changes needs an Input node. The exception is a node
  2. Anything the user sees needs an Output node. A graph that ends without
  3. Every input needs a default, so the first run is one click.
  4. Run the workflow on its own first (nodetool debug, or run_workflow).

What it can do on your machine

Read from SKILL.md and the folder at commit 58765d3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Nodetool App Builder loads about 3.4k tokens when it runs. Until then it costs about 44 tokens; SKILL.md has 1,872 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~44
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from nodetool-ai/nodetool at commit 58765d3, republished under its AGPL-3.0 licence (© nodetool-ai). 1,872 words, ~3,413 tokens.

Download SKILL.mdSave it as .claude/skills/nodetool-app-builder/SKILL.md (or your agent's skills folder).
name
nodetool-app-builder
description
Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources. Use when the deliverable is a screen a person runs, not a graph.
featured
true

Build NodeTool mini apps

A mini app is a screen over one or more workflows: widgets bound to Input and Output nodes, a run trigger, and the variables that hold what the app remembers. The graph stays the graph. The app is a second document (ApplicationDocument) that names it.

Use this skill when the user wants something to click. Use nodetool-workflow-builder when the deliverable is the graph itself, and fix the graph there first: an app over a broken workflow only reports that the app is broken.

The workflow decides what the app can do

Before placing a widget, confirm the bound workflow satisfies all four. Each one is a wiring failure the app surface cannot work around.

  1. Anything the user changes needs an Input node. The exception is a node setting, reachable through an op:<id>/prop:<nodeId>#<prop> binding.
  2. Anything the user sees needs an Output node. A graph that ends without one produces nothing an app can display.
  3. Every input needs a default, so the first run is one click.
  4. Run the workflow on its own first (nodetool debug, or run_workflow).

The loop

  1. Find or create the app. list_apps, then get_app. New app: create_app {name, description, project_id?, from_workflow_id?}. from_workflow_id binds the first operation, so there is something to run the moment a widget lands.
  2. Read the editor. edit_app {application_id, steps: []} with no steps returns the tool catalog and the app's current state. Do this before the first edit in a session rather than guessing a schema.
  3. Declare the operations. One operation is one workflow plus its wiring (ui_app_add_operation). An app with several modes has several operations, each with its own state.
  4. Read the bindable surface. ui_app_get_binding_targets lists the inputs, outputs, node settings and variables that exist. Bindings point at node ids, so a rename in the graph editor never breaks the app. Never invent a binding string.
  5. Place and wire the widgets. ui_app_add_component / ui_app_update_component, plus ui_app_declare_variable for anything the app remembers and ui_app_add_resource for a document it reads or edits. Read Mini app contract below for the widget catalog, binding forms, actions, conditions and format filters.
  6. Check the wiring. debug_app {application_id, run: false}. Free, instant, and the only thing that catches a binding pointing at nothing. Run it after every edit pass.
  7. Run it. debug_app {application_id, interact: [...]} executes the real workflows and spends real money. Run it to confirm the app works, not to explore. A long run takes minutes: pass poll: true for a session id and read GET /api/debug/sessions/<id> until it settles.
  8. Report the app id, its operations, and the verdict. Do not claim an app works on a run: false check alone.

edit_app applies its steps in order against the saved document and writes once at the end. Pass base_updated_at to refuse the save if the app changed underneath. With the app open in a browser, the same tools are callable directly as ui_app_* against the live document.

Four verdict failures that are not about the graph

debug_app reports these, and each one is an app-layer mistake with a fixed remedy.

VerdictWhat it meansFix
Binding references a missing input/output/variableThe widget points at a node the workflow no longer hasRe-read ui_app_get_binding_targets and rebind
No run triggerNothing in the app can start an operationAdd a Button with a run action, or a change event
Display widget never receives a valueThe bound output produced nothing on a completed runCheck the Output node is connected in the graph
Output mapped to an undeclared variableAn operation writes a variable that does not existui_app_declare_variable first

Three warnings that only bite a real user

Structural checks pass and the app still fails the person using it. Fix these before handing an app over.

  • A run button with no disabledWhen on op:<id>/exec#running. No policy refuses the second click, so the user drives a race: the run is cancelled and restarted, stacked, or started alongside, depending on the operation's concurrency rule.
  • An operation with nothing bound to exec#error. The run fails and the app looks idle. Bind a Text or Markdown widget to the error field.
  • A media input widget with no default behind an unguarded run trigger. Image, Sketch Pad, Camera Capture, Audio, Audio Recorder, Video and Document all let the run start with the input unset, which is a paid call the user never got to fill in. Guard the trigger with a notEmpty condition. A Workflow Form is exempt: it renders every input of its operation, so there is no single binding to guard.

What the headless check does not simulate

Layout, styling, focus and scroll. Stored resource collections: a run never reads the database, so seed one with {"seedResource": {"id": "<binding>", "items": [...]}} as an interaction step or a resource:<binding> key in params. openResource has no editor to open. The report lists all of this under notSimulated — read it before reporting a green verdict.

Shipping

  • nodetool apps export-bundle <id> -o my.app.json packages the app plus the full graph of every workflow it binds. apps import-bundle recreates both and rewrites the bundle-local workflow keys to real ids.
  • Publish takes a snapshot: it saves the current screen as a version and locks in the current graph of every workflow the app runs, so a released app keeps working while the drafts keep moving. A spending limit caps what it may cost, and every run counts against it (applications.publish, released, budget, usage on tRPC).
  • Shipped examples: GET /api/applications/examples, installed with POST /api/applications/examples/:slug/install.
  • nodetool app build "<prompt>" -p <provider> -m <model> runs the whole spec → plan → author → check → run → judge loop and emits a verified bundle. It is a batch build for the CLI and the eval suite. There is no build_app agent tool: an agent builds an app the way a person does, with create_app, edit_app and debug_app.

Reference

Mini app contract below carries the widgets, bindings, actions, conditions, format filters and document shape.

In a NodeTool checkout, these repository sources go further:

  • docs/mini-apps-guide.md — eleven worked recipes, from a one-shot form to a chat app.
  • docs/mini-apps-reference.md — every widget and setting in full.
  • docs/harnesses.md § nodetool app debug — the harness, its bundle layout, and the build loop.

Mini app contract

The parts an app is assembled from. A checkout's docs/mini-apps-reference.md carries every widget and setting in full.

Tools

Every tool takes application_id. A workflow id is never accepted: the workflows an app runs are named by target_workflow_id on its operations.

AreaTools
Layoutui_app_get_snapshot, ui_app_list_component_types, ui_app_add_component, ui_app_update_component, ui_app_remove_component, ui_app_select_component, ui_app_set_title
Operationsui_app_list_operations, ui_app_add_operation, ui_app_update_operation, ui_app_remove_operation
Variablesui_app_list_variables, ui_app_declare_variable, ui_app_update_variable, ui_app_remove_variable
Resourcesui_app_list_resources, ui_app_add_resource, ui_app_remove_resource
Bindingsui_app_get_binding_targets

Headless, each is a step in edit_app {application_id, steps: [{tool, input}]}. The ui_app_ prefix is optional in a step. With the app open in a browser they are callable directly.

Show full SKILL.md (743 more words)Show less
Bindings
BindingPoints at
op:<opId>/in:<nodeId>An input of one of the app's workflows
op:<opId>/out:<nodeId>An output of one of the app's workflows
op:<opId>/prop:<nodeId>#<prop>A node setting, driven by a widget
op:<opId>/exec#<field>Run status: running, progress, error, activity, transcript (agent text and tool calls, for an Agent Activity widget)
var:<variableId>A value the app remembers
view:<componentId>#<prop>State belonging to one widget, never saved

Two legacy forms still resolve: node:<nodeId>#<prop> against the default operation, and a bare name looked up in the live graph. A name matching nothing is an error, not a silent no-op. Prefer the id forms for anything new.

Actions

A widget event runs one action. There is nowhere to write code.

ActionSettings
runoperationId
canceloperationId, optional invocationId
setVariablevariableId, and a value or the widget's own value
toggleVariablevariableId
resourceCommandresourceBindingId, command: read, create, update, delete, upload
openResourceresourceBindingId

Events fire on click (buttons) or change (everything the user edits). A change event has a pace: live, release (only on controls that commit), or debounce.

Conditions

visibleWhen and disabledWhen each hold a binding, an operator and a comparison value typed as text and converted to match. Operators: notEmpty, empty, eq, neq, gt, gte, lt, lte, contains. A condition whose binding points at nothing is treated as no condition, so broken wiring never silently hides a widget.

Format templates

format replaces {binding} tokens, optionally through one filter: {op:main/out:n1|truncate:80}. Filters: number, date, upper, lower, join, truncate. An unknown filter or a dead binding renders as nothing.

Widgets

Show something: Heading, Text, Markdown (the right choice for streamed prose), Image, Audio, Video, Sketch, Timeline, Storyboard, Storyboard Preview, JSON, Table, Output, Progress, Agent Activity (an agent's text and tool calls, live), Gallery, Image Compare.

Sketch, Timeline, and the two storyboard widgets take a document reference, such as {type: "sketch", id}, which is what the nodes producing them emit. Storyboard shows the shot cards. Storyboard Preview plays the board as one cut, with clips in shot order and stills for shots without a clip. Binding a reference to Image or Video shows nothing: a reference is not a media URL.

Take input: Workflow Form, Workflow Input, Text Input, Number Input, Slider, Switch, Select, Image Input, Sketch Pad, Audio Input, Audio Recorder, Video Input, Camera Capture, Document Input, Color Input, Resource Picker, Resource Gallery, Storyboard Scenes.

A Workflow Form renders every input of one operation in graph order, so an Input node added later shows up with no app edit. Place inputs one by one when the layout matters. Audio Recorder and Camera Capture write the same {type, uri, asset_id} ref an upload writes. The Sketch Pad flattens each stroke to a PNG travelling inline as a data URI, so keep it near its 512×384 default rather than the 2048px ceiling.

Chat: Chat Thread (binding is the conversation, streamBinding the reply arriving from the current run), Chat Composer, Model Select. The thread folds a settled reply into the conversation variable, which only happens when binding is a variable and streamBinding is an output.

Buttons and layout: Button, Panel, Columns (left and right slots), Divider.

Panel, Columns and Accordion take visibleWhen, so one condition shows or hides a whole group, such as one step of a Guided Steps flow. Panel's variant is panel, card (a small raised card for one item) or plain (no frame), and columns lays its children in a grid. Columns' layout: "main-aside" gives the left slot the free width and sizes the right slot to its content. A Button with fullWidth: false fits its label, and align: "end" puts it at the right. Heading takes a subtitle, Text a tone (muted or hint), Text Input a hint, and Image an aspectRatio, a width and a caption.

Document shape
ts
interface ApplicationDocument {
  schemaVersion: number;      // 3
  ui: PuckData;               // { root, content, zones }
  operations: OperationBinding[];
  resources: ResourceBinding[];
  variables: VariableDeclaration[];
  theme?: { id: string };
}

A resource is a handle to a real document the app may read or edit: {id, name, kind: "asset" | "timeline" | "storyboard" | "sketch", scope, operations}.

A bundle is the app plus the full graph of every workflow it runs, with each operation's workflowId holding a bundle-local key that import swaps for a real id.

Runtime state, keyed
GroupKeyed byHolds
inputsopId:nodeId, or opId:nodeId#prop{value, dirty, revision}
outputsopId:nodeId{value, invocationId, status, revision}
variablesvariable idThe current value
viewcomponentId:propOne widget's own state
invocationsjob id{id, operationId, status, progress, error, startedAt}

Output status is empty, pending, streaming or done. Streamed values accumulate: text joins, structured items collect into a list. An output slot is cleared at the start of every run.

© nodetool-ai, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in packages/system-skills/nodetool-app-builder of nodetool-ai/nodetool.

Open the folder on GitHubat commit 58765d3

Compare with similar skills

Nodetool App Builder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Nodetool App Builder compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Nodetool App Builder this skillnodetool-ai/nodetool560—~3.4kAutomated safety check: PassAGPL-3.0
Guizang Social Cardsop7418/guizang-social-card-skill7.4k1 repos~7.8kAutomated safety check: PassAGPL-3.0
Weekly Changelog Videoheygen-com/hyperframes59k—~3.3kAutomated safety check: PassApache-2.0
Anthropic Brand Stylinganthropics/skills180k30 repos~559Automated safety check: PassApache-2.0
MoneyPrinterTurbo Video Generatorharry0703/MoneyPrinterTurbo129k—~2.1kAutomated safety check: WarnMIT
Brag Slim Launch Video Makerlatent-spaces/brag14k1 repos~1.9kAutomated safety check: PassMIT

Similar skills

  • Guizang Social Cards

    op7418/guizang-social-card-skill

    Produces social card sets for Xiaohongshu and WeChat: carousels, Live Photo motion cards and puzzle layouts, and WeChat cover pairs, rendered from single-file HTML.

    7.4k GitHub starsUsed in 1 repo~7.8k tokens
    Media & CreativeAuto-check passed
  • Weekly Changelog Video

    heygen-com/hyperframes

    Turns a weekly changelog markdown file into a branded HyperFrames video with voiceover, animated mock-UI scenes and captions, using fonts, background and scripts bundled in the skill.

    59k GitHub stars~3.3k tokensUpdated today
    Media & CreativeAuto-check passed
  • Anthropic Brand Styling

    anthropics/skills

    Official

    Applies Anthropic's brand colors and fonts to artifacts such as PowerPoint slides, using fixed hex values for text and accents, Poppins headings and Lora body text.

    180k GitHub starsUsed in 30 repos~559 tokens
    Media & CreativeAuto-check passed
  • MoneyPrinterTurbo Video Generator

    harry0703/MoneyPrinterTurbo

    Installs and runs MoneyPrinterTurbo to turn a topic or script into a finished short video with voice-over, subtitles, stock footage and music.

    129k GitHub stars~2.1k tokensUpdated today
    Media & CreativeAuto-check: warnings
  • Builds a short, shareable launch video with music and motion from a project directory or a website URL, using only tools already on the machine.

    14k GitHub starsUsed in 1 repo~1.9k tokens
    Media & CreativeAuto-check passed
  • HyperFrames Media Use

    heygen-com/hyperframes

    Finds, generates and edits media for HyperFrames video projects: music, sound effects, images, icons, logos, voiceovers, captions and color grades.

    59k GitHub stars~2.4k tokensUpdated today
    Media & CreativeAuto-check passed

More from nodetool-ai/nodetool

All 127 skills in this repo
  • Beat Sync Editing

    nodetool-ai/nodetool

    Cut a NodeTool timeline to music and shape its pacing — detect the beat grid, place cuts on phrases, pick a cut type, build speed ramps with time remap, and give the piece an arc.

    560 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Caption Titles

    nodetool-ai/nodetool

    Add and animate a consistent text layer on an existing NodeTool timeline.

    560 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Color Motion

    nodetool-ai/nodetool

    Choose and animate colour on a NodeTool timeline, including shape and text gradients, colour grades, 3D LUTs, and dither.

    560 GitHub stars~2.3k tokensUpdated today
    Auto-check passed
  • Commercial Beat Sheet

    nodetool-ai/nodetool

    Write a shootable, precisely timed commercial beat sheet and store it as a NodeTool storyboard, with a consistent entity roster behind every shot.

    560 GitHub stars~4.6k tokensUpdated today
    Auto-check passed
  • Elevenlabs Audio Prompting

    nodetool-ai/nodetool

    Direct ElevenLabs speech, dialogue, sound effects and music — the bracketed audio tags v3 acts on and why the voice decides whether a tag lands, stability as the delivery dial, punctuation instead…

    560 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Frame Composition

    nodetool-ai/nodetool

    Stage the frame on a NodeTool timeline — grids, focal placement, safe areas per aspect ratio, depth layers and parallax, camera moves, and where elements enter and leave.

    560 GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Questions about Nodetool App Builder

What does Nodetool App Builder do?

Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources. Nodetool App Builder is an agent skill from nodetool-ai/nodetool. Build or repair a NodeTool mini app: operations, widgets, bindings, variables, resources.

When should I use Nodetool App Builder?

Nodetool App Builder fits situations like: the deliverable is a screen a person runs.

How do I install Nodetool App Builder in Claude Code?

Run `npx skills add nodetool-ai/nodetool --skill nodetool-app-builder -a claude-code`. Or copy the skill folder (packages/system-skills/nodetool-app-builder in nodetool-ai/nodetool) into .claude/skills/nodetool-app-builder in your project. Claude Code loads it when a task matches its description.

How do I install Nodetool App Builder in Codex?

Run `npx skills add nodetool-ai/nodetool --skill nodetool-app-builder -a codex`. Or copy the skill folder (packages/system-skills/nodetool-app-builder in nodetool-ai/nodetool) into .agents/skills/nodetool-app-builder in your project. Codex loads it when a task matches its description.

Can I use Nodetool App Builder in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nodetool-ai/nodetool --skill nodetool-app-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nodetool-app-builder, .gemini/skills/nodetool-app-builder, .github/skills/nodetool-app-builder and .opencode/skills/nodetool-app-builder in your project.

What does Nodetool App Builder need to run?

SKILL.md names no scripts, command-line tools or credentials: Nodetool App Builder is instructions for the agent only.

Does Nodetool App Builder access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Nodetool App Builder safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Nodetool App Builder use?

Nodetool App Builder is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Nodetool App Builder use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Nodetool App Builder?

Skills that share tags, products or a category with Nodetool App Builder: Guizang Social Cards (op7418/guizang-social-card-skill, 7.4k stars), Weekly Changelog Video (heygen-com/hyperframes, 59k stars), Anthropic Brand Styling (anthropics/skills, 180k stars) and MoneyPrinterTurbo Video Generator (harry0703/MoneyPrinterTurbo, 129k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Nodetool App Builder?

nodetool-ai (a GitHub organization) maintains it in nodetool-ai/nodetool, which has 560 GitHub stars. The repository holds 127 skills in this directory. The repository was last updated on October 9, 2026.

Source: nodetool-ai/nodetool on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.