From voxcaster
Run and manage long-running, background, or interactive processes via the Voxcaster MCP tools (pty_spawn / pty_write / pty_read / pty_wait / pty_list / pty_kill) instead of the blocking Bash tool. Use this skill for any command that doesn't just run once and return — anything that stays alive, runs in the background, waits for typed input, or should notify when it finishes. Trigger it when the user wants to: start a dev server (vite, npm run dev, flask, cargo run) and keep working; run a file-watcher that reruns on save (cargo watch, jest --watch, tsc -w, nodemon); kick off a slow build or test suite and be pinged the moment it exits while doing other work; tail or monitor logs in the background and flag matching lines; or drive an interactive session that prompts for input (ssh, psql, REPLs, sudo password). Also reach for it when a command "froze the terminal" because it never exits, or the user says "keep it running", "in the background", "let me know when it's done", "watch the tests", "tail the logs", or "it'll ask me for a password". Skip it only for quick one-shot commands that return immediately (ls, git status, a single lint or build run).
How this skill is triggered — by the user, by Claude, or both
Slash command
/voxcaster:voxcasterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Voxcaster gives you **real pseudo-terminal sessions** that outlive a single tool
Voxcaster gives you real pseudo-terminal sessions that outlive a single tool
call. Unlike the Bash tool — which blocks for the lifetime of the command,
gives no interactive stdin, and offers no TTY — a Voxcaster session keeps running
in the background. You spawn it, then read its output, send it input, wait for it
to finish, or kill it, across many turns.
Use Voxcaster when a process lives over time:
npm run dev, cargo run, flask run, vite) you want up while you keep workingcargo watch, jest --watch, tsc -w, nodemon)python, node, irb), ssh, psql, gdb, anything with a prompt& and then poll with sleep + re-check — Voxcaster replaces that anti-patternKeep using the plain Bash tool for quick, one-shot commands that return
promptly (ls, git status, grep, a fast build). Voxcaster's value is
persistence and interactivity; don't add its overhead to a command that finishes
in a second.
| Tool | Use it for |
|---|---|
pty_spawn | Start a process. command + args array (never a shell string). Returns a pty_<id>. |
pty_read | Read the scrollback (offset/limit by line, pattern to glob-filter, raw for ANSI, format:"json" to parse). |
pty_write | Send stdin to a running session (answer a prompt, type a REPL command — include \n). |
pty_wait | Block until the process exits or timeout_seconds elapses; returns exit code. The guaranteed completion path. |
pty_list | Enumerate sessions and their status (running / exited / killed). |
pty_kill | Stop a session (cleanup:true also frees its buffer). |
Every tool takes an optional format: "text" | "json". Use json when you want
to parse fields (exit code, line counts, status) reliably; text is the readable
default.
Start something and keep working. Spawn it, then move on. Read its output
later with pty_read when you need to check progress.
pty_spawn(command="npm", args=["run","dev"], title="dev server")
# ... do other work ...
pty_read(id="pty_…", pattern="*Local:*") # find the URL it printed
Run a job and learn when it's done — hands-free. Set notify_on_exit: true.
If the session was launched with Claude Code channels enabled (e.g. via the
verity launcher), Voxcaster pushes a <channel source="voxcaster" exit_code=…>
event into your session when the process exits, so you react without polling.
When channels aren't active, this is silently skipped — so for guaranteed
completion, use pty_wait.
pty_spawn(command="cargo", args=["test"], notify_on_exit=true, title="tests")
# either wait for the <channel> exit event, OR:
pty_wait(id="pty_…", timeout_seconds=300)
Never sleep-and-poll. If you want to block on completion, call pty_wait —
don't spawn then loop sleep + pty_read. pty_wait returns the moment the
process exits (or your timeout hits).
Interactive input. Drive a REPL or answer a prompt with pty_write (remember
the newline), then pty_read the response.
pty_spawn(command="python", args=["-i"], title="repl")
pty_write(id="pty_…", data="import sys; print(sys.version)\n")
pty_read(id="pty_…", limit=5)
Find something in noisy output. pty_read(pattern="*error*") glob-filters the
scrollback instead of returning thousands of lines.
pty_spawn takes a command + args array.
To use shell features (pipes, &&, redirection) run them through a shell:
command="bash", args=["-c","make && ./run"] (or cmd /C … on Windows).VOXCASTER_POLICY — don't try to route around it; tell the user.pty_… id from a previous session still exists;
pty_list to confirm.offset/limit), ANSI is
stripped by default (raw:true to keep it).pty_wait a sensible timeout and don't assume an
instant exit.If you're about to run something with the Bash tool and you think "this will keep
running" or "I'll need to send it input" or "I want to be told when it finishes"
— stop and use pty_spawn instead.
npx claudepluginhub lunarlaurus/voxcaster --plugin voxcasterCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.