Repository navigation
Releases: kondaurovDev/procdeck
Release list
v2.0.1
Changelog
- 00d3dd1: Release 2.0.1: the cask stops stripping the quarantine (Claude Opus 5.5 noreply@anthropic.com)
v2.0.1-rc.1
Changelog
- fd8f8a2: Accept both Go versions' wording of a JSON type error (Claude Opus 5.5 noreply@anthropic.com)
- 1f4b75c: Keep the output of a process that exits at once (Claude Opus 5.5 noreply@anthropic.com)
- adfd028: Move to pnpm 12 (Claude Opus 5.5 noreply@anthropic.com)
- 8b4d4cf: Pin actions to commit SHAs (Claude Opus 5.5 noreply@anthropic.com)
- 277c990: Sign and notarize the darwin binaries (Claude Opus 5.5 noreply@anthropic.com)
v2.0.0
Changelog
- 8cd4637: Release the tag that triggered the run (@kondaurovDev)
v2.0.0-rc.1
Changelog
- 8e3f0d3: Install channels beyond npm: Homebrew cask, install.sh, deb and rpm (@kondaurovDev)
- 245e69f: Merge origin/main (1.1.1 release notes) into go (@kondaurovDev)
- ed17da7: Move the UI to Effect 4.0 stable and foldkit 0.168 (@kondaurovDev)
- c1a0400: Observer forwards x-forwarded-* and propagates aborts (@kondaurovDev)
- 965364b: Port procdeck to Go: one binary with the UI embedded (@kondaurovDev)
- 5bea0dc: Publish to npm through trusted publishing, no token (@kondaurovDev)
- a38f937: Read env files natively, follow proc logs, rotate the deck log (@kondaurovDev)
- 32daac9: Release pipeline for 2.0: GoReleaser, npm launcher, release candidates (@kondaurovDev)
- 234c4c6: chore: release packages (@github-actions[bot])
procdeck@1.1.1
Patch Changes
-
c1a0400: HTTP observer forwards standard proxy headers and propagates connection failures faithfully:
x-forwarded-hostnow carries the original Host (an outer proxy's value wins), so frameworks that CSRF-check Origin against the forwarded host — Next.js Server Actions — no longer reject mutating requests.x-forwarded-protoandx-forwarded-forare set too.- A client abort (closed tab, cancelled fetch) now destroys the upstream request instead of letting it stream to completion unseen.
- An upstream dying mid-body truncates the client response by cutting the connection, instead of hanging the client or corrupting the payload with an appended error note.
procdeck@1.1.0
Minor Changes
- dace5bb: A proc can pin its assigned
${port}to a fixed public number:port: 8787
on the spec. The public side stays exactly that number — dotenv files, mobile
simulators and teammates' scripts keep their hardcodedlocalhost:8787—
while an observed proc still binds a hidden internal port behind the HTTP
observer, so the traffic gets captured with no wiring changes anywhere.
Conflicting pins (duplicate, on the UI's port, or on a proc that never uses
${port}) are config errors; a pin whose port is already taken parks just
that proc inblocked— naming the port and the likely holder — while the
rest of the deck runs, and Start retries the bind. A pinned proc with no
urlalso gets its UI link derived from the pin.
procdeck@1.0.0
Major Changes
-
2364ad0: procdeck 1.0.0. Nothing breaks in this release — the version says the surface
is settled and will not move under you without a major bump.What 1.0 promises to keep stable:
- The config, both formats: every field of the schema (and therefore
schema.json), the${port}/${port:id}templating,needs/
readyWhenreadiness,preflight,alerts,observe, and the
defineConfigexport. - The CLI: the verbs (
up,down,restart,status,ls,open,
init,logs,mark,wait-for,errors,http,agents,mcp),
their flags, and the shape of every--jsonpayload.wait-forkeeps exit
2 for a timeout. - The MCP tools: names and parameters of
deck_status,get_logs,
get_http,get_errors,set_mark,wait_for,timeline, and the
--mutationstrio. - The addresses:
<id>.localhost:<ui-port>for every proc, the UI on
4820 by default, loopback-only unlesshostsays otherwise.
Internals stay internal: the deck's HTTP API, the registry files under
~/.procdeck/, the SSE event shapes and everything undersrc/are free to
change.The readme is now the pitch and the docs live in
docs/— config reference,
the agent harness, the traffic observer and the architecture notes. - The config, both formats: every field of the schema (and therefore
Minor Changes
- 6ef989d:
procdeck restart --allrestarts every deck on this machine — stop, then detach again
from each deck's own registry entry (foreground decks are skipped). The version a deck
actually runs now shows instatus,lsand the UI's deck switcher, andstatus/up
say so out loud when it differs from the CLI — the answer to "did my update reach this
deck?".
procdeck@0.5.0
Minor Changes
- 10b557f: procdeck is now a harness for coding agents, not just a dashboard for humans.
New CLI verbs, all bounded and--json-able:status --jsongrows an
attentionlist (crashed / blocked / alerting procs with reasons — the
cheapest first question);logs [proc]returns pane output as plain
timestamped lines (ANSI stripped,\rprogress bars keep only their final
state), filterable with--grep,--since,--lines— no proc means every
proc interleaved with[id]prefixes, and the old daemon-log behaviour moved
tologs --self [-f];mark [name]drops a named marker in every proc's
stream and--since-markshows only what happened after it — the verify
loop (mark → edit → restart → check) in four commands;wait-for <proc> [--pattern RE]blocks until a listening port or a matching line, failing
fast with the log tail if the proc crashes instead (exit 2 on timeout);
errors [proc]parses stack traces out of recent output and deduplicates
them by signature ("same TypeError, 41×, last 3s ago");restart <proc>
restarts a single process.procdeck mcpserves the same verbs over MCP
(stdio) —claude mcp add procdeck -- procdeck mcponce, globally, and the
instance registry finds the right deck per project; read-only by default,
--mutationsadds restart/stop/start, plussince_lastcursors and a
timelinetool.procdeck agents(andprocdeck init) plant the discovery:
a## procdecksection in CLAUDE.md / AGENTS.md and a Claude Code skill
teaching the loop. - 10b557f: procdeck sees the traffic now, not just the logs. Procs that use
${port}
get an HTTP observer interposed on their assigned port: the proc binds a
hidden internal port, procdeck listens on the public one and forwards — so
requests between processes (${port:api}) and into them are captured
transparently, statuses and bodies included, with zero app changes
("observe": falseopts a proc out; the*.localhostproxy captures for
opted-out procs). WebSocket connections are captured per-message with
direction and text — compression is stripped at the handshake so frames stay
readable. Bodies are text-only and truncated (16 KB);authorization,
cookieand friends are redacted before anything is stored. Three surfaces
over the same per-proc rings:procdeck http [proc] [--status 5xx|422|error] [--path RE] [--since-mark] [--ws] [--body] [--digest] [--json]—--digest
groups 4xx/5xx by route with path params collapsed (/users/:id); a
get_httpMCP tool withsince_lastcursors (andtimelinenow carries
the window's exchanges); and a traffic view in the UI — the ⇄ position of
the layout switch — with kind/proc/errors filters, click-to-expand bodies,
pause and clear. Marks span both streams, so mark → act →
http --since-markshows exactly which requests a change caused and what
they returned.
procdeck@0.4.0
Minor Changes
- 8e4b627: procdeck runs in the background now.
procdeck up(and bareprocdeck) starts the
deck detached, opens the UI and returns — no terminal tab kept hostage;up --fgis
the old foreground mode. New commands, all working from anywhere inside the project:
down(terminates every process tree),restart,status,ls(every running deck
on the machine),openandlogs [-f]. Running decks register in
~/.procdeck/instances/(stale entries pruned by pid;PROCDECK_HOMErelocates it);
a detached deck's own output goes to~/.procdeck/logs/.uprefuses a port already
held by another deck — naming it — or simply busy, before anything spawns; a bad
config is reported in the terminal, not in a log file. In the UI: ⏻ shuts the deck
down (with a confirm), the page says so instead of "reconnecting" and revives itself
whenprocdeck upruns again; the deck name in the bar lists the other running decks
as links. The CLI moved toeffect/unstable/cli—--helpper command, shell
completions via--completions. - f2abc61: Three things for the first real release. Loopback only: the server binds
127.0.0.1by default — the UI types into real terminals, so it is not something to
put on the LAN by accident;"host": "0.0.0.0"in the config opens it up for
devcontainers and VMs. Per-proc backlog: each proc keeps its last 256 KB of output
and a new tab gets every pane's history plus asyncedmarker before live events — a
chatty ticker can no longer evict a quiet server's startup lines, a deck that has run
for days still opens with every pane populated, the UI knows exactly which chunks are
news, and a reconnect replays into freshly reset panes instead of appending history to
itself.procdeck init: writes a firstprocdeck.config.jsonfrom what is already there —
a Procfile, workspace packages withdevscripts (via the package manager your lockfile
points at), plainbackend/+frontend/subdirectories (each its own package.json or
a Django / Go / Rust / Rails / compose project, withcwdset), or the root itself.
Patch Changes
-
9f944e5: The deck tells you when it needs you. Procs that crashed, are blocked on a preflight,
carry an alert or have unread error lines count into the tab title ((2) garage · procdeck) and put a red dot on the favicon — visible from the tab strip and the Dock.
A bell in the global bar turns on system notifications: a crash, a block or a new alert
while the tab is hidden or the window unfocused shows one (click brings the deck back);
replayed history on reconnect never notifies. The bell state persists with the UI state;
the browser permission is asked for on the first click. -
1db7f78: Grid pinning. Pin a proc (📌 in its pane header or sidebar row, ⌥P on the active one) and
the grid shows only pinned procs; the rest collapse into a tray strip under the tiles —
status dot, id, badges — where a click peeks at one and the pin puts it back. Nothing
pinned = everyone tiled, as before. ⌥Z zooms the active tile in and out of single. The
grid now sizes its columns from the tile count (near-square, at most 4) so the deck fits
the screen when it can and scrolls only when tiles would drop under 180 px. Pins persist
with the rest of the UI state. -
e90a08c: Polish before publishing, part one.
- URLs in pane output are clickable (
Local: http://localhost:5173/from every dev
server opens in a new tab). - Exit status reads like a human wrote it:
exit 1 · 2m ago,killed (SIGTERM) · 5s ago
— signal names instead of numbers, and no moresignal 0on a plain non-zero exit.
Running procs that were respawned show a restart count (↻3), so crash loops are
visible from the status line. The sidebar shows the same exit summary where uptime sits
while running. - Grid tile headers keep the
*.localhostaddress whole instead of clipping it to:61:
compact tiles show only the primary address (raw ports in its tooltip) and the status
text is what gives way first. - The assigned port no longer also counts as "internal" when it lands in the ephemeral
range.
- URLs in pane output are clickable (
-
a85d537: Light theme. A System · Light · Dark switch in the global bar; System follows the OS
(prefers-color-scheme) and tracks it live. The terminals switch palette too — light gets
its own ANSI set (GitHub Light), since xterm's defaults are unreadable on white. The choice
is stored with the rest of the UI state and painted before the first frame, so there is
no flash on reload. -
512e814: The UI remembers itself across reloads, and says when it has lost the server.
Layout (single/grid) and the selected pane are kept in localStorage — per origin, so per
deck — and restored on the next load; a stored pane that is no longer in the config falls
back to the first one. While the event stream is down (aprocdeck restart, a killed
server) a "reconnecting" banner sits over the panes instead of the UI silently showing
stale state; when the stream is back the proc snapshot is refetched so statuses that
changed in the meantime catch up. A stream the browser gave up on (server answered with
something other than an event stream) is retried every 2 s.
procdeck@0.3.0
Minor Changes
-
a1ced2e: Cut the install from 116 MB to 1.8 MB, and remove every reason for it to fail.
node-ptyis replaced by@lydell/node-pty— the same upstream sources and the same API,
but the binaries ship as per-platform optional dependencies instead of one tarball carrying
every platform's prebuilds. Upstream runs an install script and has no Linux prebuild at
all, so Linux users needed a C++ toolchain and pnpm ≥ 10 / Bun users needed
pnpm approve-builds(ortrustedDependencies) on every platform or spawning failed at
runtime. The replacement runs no install script and compiles nothing, anywhere — which also
retires the startup hack that repaired the darwinspawn-helperexecute bit.effectis no longer installed either: it is bundled into the CLI, where tree-shaking takes
it from 48 MB on disk to under 1 MB of shipped code. The package's public entry point
(defineConfigand the config types) is now a standalone module with no effect types in its
declarations, so aprocdeck.config.tstypechecks against a package that has none of
procdeck's own dependencies installed.