Skip to content

Local media nodes DO run headlessly — say what each one needs - #5

Open
mikkel wants to merge 1 commit into
mainfrom
fix/headless-media-truth
Open

Local media nodes DO run headlessly — say what each one needs#5
mikkel wants to merge 1 commit into
mainfrom
fix/headless-media-truth

Conversation

@mikkel

@mikkel mikkel commented Jul 29, 2026

Copy link
Copy Markdown
Member

What breaks today

references/graph-format.md marks 6 node types LOCAL, browser-only and then says:

the rows marked LOCAL/browser-only (resize, vframes, combine, soundtrack, trim, extractaudio) are browser-only media processing — the executors load such graphs with a warning and fail fast at run with UnsupportedNodeError, before any network call.

That is false. SKILL.md line 248 in the same skill already said the opposite, so the skill contradicted itself. An agent that reads the reference file drops a whole class of workflow it could actually build and run.

The truth, read off the executors

  • nanoodle-js/src/local-media.mjs implements the ops headlessly. It runs a pure-JS path first (PNG resize via its own PNG codec, PCM-WAV trim, MP4CAT lossless mp4 concat) and shells out to ffmpeg/ffprobe on PATH for everything else.
  • nanoodle-py/src/nanoodle/local_media.py has no pure path. Every one of the 6 node types shells out to ffmpeg.
  • Neither library marks any node type unsupported. nanoodle-py's graph.UNSUPPORTED_TYPES evaluates to the empty tuple; nanoodle-js's graph.mjs has no equivalent flag and lists all 6 as local: true.
  • UnsupportedNodeError is raised only for an unknown node type (nanoodle-js/src/workflow.mjs:183-188, nanoodle-py/src/nanoodle/workflow.py:208-215). The retired draw type is the live example.

What the change does

references/graph-format.md gets a per-node, per-language table:

node Node CLI Python CLI
resize pure JS for a PNG source, else ffmpeg ffmpeg
trim pure JS for a PCM WAV source, else ffmpeg ffmpeg
combine pure JS lossless mp4 remux when every clip is mp4 with matching stream parameters, else ffmpeg ffmpeg
vframes ffmpeg ffmpeg
soundtrack ffmpeg ffmpeg
extractaudio ffmpeg ffmpeg

The "refused up front, before any network call" sentence stays, narrowed to the case where it is true: an unknown node type.

The table cells lose the browser-only half of their (LOCAL, browser-only) tag and read (LOCAL media).

SKILL.md loses one imprecise clause. A missing-ffmpeg error does not arrive "before any paid call" — it arrives when that node's turn comes, so paid nodes upstream have already spent. The page now says so and tells the reader to prove the setup with a media-only graph first.

No node type was added or removed. The draw retirement is already complete in this repo.

…eeds

references/graph-format.md told an agent that resize, vframes, combine,
soundtrack, trim and extractaudio are "browser-only media processing", and that
the executors load such graphs with a warning and fail fast at run with
UnsupportedNodeError. That is false, and SKILL.md line 248 already said the
opposite in the same skill.

The truth, read off the executors:

- nanoodle-js src/local-media.mjs implements a pure-JS path (PNG resize,
  PCM-WAV trim, MP4CAT lossless mp4 concat) and shells out to ffmpeg/ffprobe on
  PATH for everything else.
- nanoodle-py src/nanoodle/local_media.py has no pure path at all: every one of
  the 6 node types shells out to ffmpeg.
- Neither library marks any node type unsupported. In nanoodle-py,
  graph.UNSUPPORTED_TYPES evaluates to the empty tuple; nanoodle-js has no
  equivalent flag. UnsupportedNodeError is raised only for an UNKNOWN node type.

A false "not supported" costs an agent a capability it has. The fix states the
truth per node and per language, and keeps the up-front-refusal sentence where
it belongs: unknown types only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant