stream
Skill1 starsChanged 2 months agoApache-2.0View on GitHub
Stream live updates and visualizations to the Helix Stream dashboard — a watch-first browser surface where the agent pushes status tiles and a feed of rich cards during autonomous sessions; the user watches, drops steering notes, holds the brake, and answers rare inline questions. Use when the user says "/helix-stream", "open a stream", "stream this session", or wants to watch long autonomous work (feature builds, test runs, incident monitoring, refactors, /loop sessions) from the browser. Sibling of helix-canvas (deciding) and helix-loop (gauntlet); Stream is for watching.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- nnawar706/fluentotheir own version, first seen Nov 8, 2026
- GetStream/agent-skillstheir own version, first seen Nov 5, 2026
- simota/agent-skillstheir own version, first seen Oct 23, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- simota/agent-skills★ 96same name
- GetStream/agent-skills★ 21same name
- nnawar706/fluento★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
7 rules. 0 are common, 2 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 11
If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console.
- Very specific: line 13
Use the normal helix <surface> up, push, state, and wait commands.
- Very specific: line 14
Do not start local servers or Fleet, open a browser, curl localhost, use --local, log in, or change profiles/projects.
- Distinctive: line 69
Before proposing anything, read the rails that bind this project on this surface:
- Distinctive: line 116
No threadId anywhere. Unknown types render as a raw-payload fallback.
- Very specific: line 127
Drain between steps: run wait with a short timeout between work chunks (or check after each push — the push response cursor tells you …
- Very specific: line 148
Only when genuinely blocked.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Helix Stream
Orchestrator cloud context (check before setup)
If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console. This section takes precedence over local setup and browser instructions below.
- First call the plugin's
bin/helix orchestrator-protocol(Windows:bin/helix.cmd orchestrator-protocol). It must print1. Otherwise stop with an actionable request to update the Helix plugin/CLI; never run an older binary's setup commands. - Use the normal
helix <surface> up, push, state, and wait commands. The CLI selects cloud transport and the assigned project automatically. Keep the same slug within this task. - Do not start local servers or Fleet, open a browser, curl localhost, use
--local, log in, or change profiles/projects. Do not read or print the credential file. Do not remove the injected environment variables. upreturns the Console session URL. Use that URL wherever the local instructions request Board/Fleet links. Events go to Console; human responses and gate approvals still come from the person through the normal wait protocol.- On cloud or compatibility errors, report the error. Never fall back to local mode. Outside this context, follow the local behavior below unchanged.
The work is autonomous; dialogue is the exception. You stream tiles and feed cards; the user watches, may drop a note anytime, holds the brake, and answers your rare inline questions. The append-only event log is the record. Boundary (ratified): Stream = nothing is asked of the user by default · Canvas = the dialogue is the work · Loop = the human holds the bar.
Setup
Three verbs, never more:
# start server, open browser; auto-restarts stale servers on the same port
${CLAUDE_PLUGIN_ROOT}/bin/helix stream up --stream <slug> --agent <name> --model <model-id> [--dir <projectDir>] [--no-open]
# --agent: your product name, lowercase (claude, codex, …)
# --model: your exact model id (e.g. claude-fable-5) — Fleet shows and filters by these
# card JSON on stdin -> {cardId, cursor}; existing id -> update
${CLAUDE_PLUGIN_ROOT}/bin/helix stream push --stream <slug> [--dir] # card JSON (one object, or an array of them) on stdin
# exit 0 delta, 3 timeout, 4 no-viewer, 5 down
# --wake-on user returns only when a human acted
${CLAUDE_PLUGIN_ROOT}/bin/helix stream wait --stream <slug> --since <cursor> [--timeout <s>] [--card <id>] [--dir] [--wake-on user]On Windows, ${CLAUDE_PLUGIN_ROOT}\bin\helix.cmd in place of bin/helix; the
rest of the command is the same.
upopens the browser itself, from inside the binary.--no-openis for headless or scripted runs — never a way around a permission prompt. If a prompt is declined, hand the user! open <url>and carry on.upalso brings up Fleet (mission control) when it is down, and returnsfleet: {url, started}. Hand the user both links in one line —Board: <url> · Fleet: <fleet.url>— so they know the overview is there.upnever opens Fleet in the browser; the user follows the link.
Data: ~/.helix/stream/<project>/<slug>/ (SQLite event log + server.json)
— one home for the whole machine, never inside a repo.
Streams are per-session: one task, one stream — pick a fresh slug per
session (e.g. the task's short name). Always pass --dir with the
project root in scripts/background sessions (cwd is not reliable).
Snapshot: curl -s http://127.0.0.1:<port>/api/state.
Shell discipline (same as siblings): always call the binary by its full
path — a shell variable or function holding it stops the skill's
pre-approval from matching, and every call then prompts. Heredocs
(<<'EOF') for push payloads, never echo.
Rails first
Before proposing anything, read the rails that bind this project on this surface:
${CLAUDE_PLUGIN_ROOT}/bin/helix rails for --surface streamWhat comes back is not advice — it is the standard the work is held to. Cite
rail ids when you act on them; full text with helix rails get <id>. Details
in the helix-rails skill.
What you push
Re-pushing an existing id updates in place. status is a singleton
(the server forces id: "status").
Tiles — pinned dashboard, update in place, keep them honest all session:
| type | payload |
status | {text, phase?} — what you are doing RIGHT NOW |
progress | {label, done, total} |
metric | {tiles:[{label, value, unit?, delta?, tone?:"good"|"bad"|"neutral"}]} |
tasks | {items:[{label, state?:"pending"|"active"|"done"}]} — read-only plan |
chart | canvas chart payload + "zone":"tile" to pin (charts default to feed) |
Feed — chronological cards; payloads identical to Helix Canvas types:
update ({markdown}), code, diff, terminal, test-report, api,
commit, image, chart, table, diagram, plus:
milestone{label}— section break; push one when a phase completes.question/options— the escape hatch (see below).artifact{path, status?:"forming"|"stable"|"done"}— a deliverable (report, doc, generated file). Write the file with Write/Edit; the stream watches it live. Shows in the feed AND collects under the artifacts tab. Advance status with update pushes.- Any feed card may carry
payload.tone: "good"|"bad"|"neutral"— usebadfor failures,goodfor wins; it colors the card edge. delete{cardId}works; there are no threads and no edges.
Actions — native toolbar/tabs, never a bare link in prose:
action{label, url, preview?:boolean}— withpreview: trueit becomes a tab embedding the URL (dev servers, dashboards); without, a ↗ toolbar button opening a new browser tab (docs, PRs). Push one the moment a dev server is up. Re-push same id to update;deleteremoves the button/tab when the server goes away.
No threadId anywhere. Unknown types render as a raw-payload fallback.
The rhythm
upwith a fresh slug; pushstatus+tasks(the plan) immediately — the user's first glance must answer "what is it doing and what's the plan".- Work. Push an
update/code/test-report/... at every meaningful step — a feed the user reads after 20 minutes away should tell the story without them asking. Pushmilestonebetween phases. Updatestatus,progress, andmetrictiles as you go; a stale status tile is a bug. - Drain between steps: run
waitwith a short timeout between work chunks (or check after each push — the push response cursor tells you nothing about user events; alwayswait --sinceyour last drained cursor). React to every user event within one cycle. - Exit 4 (no-viewer) is fine — Stream is ambient; keep working and keep pushing. Do NOT stop streaming because nobody is watching; the feed is also the record they read later.
User events in your delta (origin:"user")
note.added {text, cardId?}— a steering note; acknowledge it in the feed (anupdatereferencing it) and obey it. Notes are the primary steering channel.brake {action:"pause"|"resume"|"stop"}— architecture, not a suggestion: onpause, finish the current atomic step, push a status update saying you're holding, andwaituntilresumeorstop; onstop, wind down cleanly and summarize.response.added— an answer to an inline question.
Inline questions (the escape hatch — use sparingly)
Only when genuinely blocked. Push a question/options card with
payload.default (what you'll do if unanswered) and payload.windowS.
Then KEEP WORKING on other parts; check with
wait --card <id> --timeout <s> between chunks. When the window closes
unanswered, proceed with the default and say so in an update. Never
push rounds of questions — that's a Canvas session; if real collaboration
is needed, say so and suggest switching.
Server operations
- A stale server restarts on the same port when you run
${CLAUDE_PLUGIN_ROOT}/bin/helix stream upagain. The event log survives restarts. - App render failures arrive in your delta as
client.error— fix them. - Kill by pid, never by name.
pkill -f "helix stream serve"matches every stream server on the machine — other projects, other people's sessions, runs in the middle of their work. It looks local and is not. Read the pid instead:kill "$(sed -n 's/.*"pid": *\([0-9]*\).*/\1/p' ~/.helix/stream/<project>/<slug>/server.json)".
End of session — linger, don't vanish
- Push a final
milestone("done") + closingupdatewith the summary, setstatusto idle, mark alltasksdone/skipped. Outcomes become surfaces:actioncards for anything running (preview tab for the dev server),artifactcards for anything written (report, doc). - Then keep a wait armed — indefinitely. The user often reads the
finished feed and reacts — a note arriving after "done" is a request,
not noise. Quiet cycles and no-viewer results do NOT end the session:
the last tool call of every turn, "done" included, is an endless wait
launched with
run_in_background, so any late note, brake, or answer re-invokes you. NEVER end the session with an undrained delta.
# LAST tool call of the turn — Bash with run_in_background: true
${CLAUDE_PLUGIN_ROOT}/bin/helix stream wait --stream <slug> --dir <projectDir> --since <cursor> --timeout 3600 --wake-on user--wake-on user holds through viewer churn and a closed tab, returning only
when a human acted. Exit 0 wakes you with the delta; 5 means the server died —
restart it on the same port and re-arm. 3 is a quiet hour, not an ending.
Bake $SLUG, $PROJECT, and the last drained $CURSOR into the
command — background calls share no shell state. The session ends only
when the user says so (a stop brake or an explicit done in the
terminal); only then stop re-arming.
3. The stream stays reopenable via up with the same slug; say so in
the terminal summary.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

