{"slug": "downbeat-stop-copy-pasting-between-your-ai-terminals", "title": "downbeat: stop copy-pasting between your AI terminals", "summary": "A developer built downbeat, a local, filesystem-backed message broker for parallel AI coding sessions on the same machine. The tool eliminates manual copy-pasting between terminals by allowing sessions to pass tasks and replies directly, with human-in-the-loop control and no cloud or network dependency. It is available on PyPI via `uv tool install downbeat`.", "body_md": "I run more than one AI coding session at a time (Claude Code, in my case). One is usually the planner: it holds the architecture, decides what to do, splits the work. The others are executors, and each takes a chunk and grinds through it.\n\nThe problem is that these sessions cannot talk to each other. Every terminal is its own island, so I became the message bus. I copied a plan out of the planning session and pasted it into an executor. I copied the result back. I re-explained context that one session had and another needed. Every handoff went through me, by hand, one clipboard trip at a time.\n\n**TL;DR:** `downbeat`\n\nis a small, local, human-in-the-loop message bus that lets parallel AI coding sessions on one machine hand tasks to each other and read the replies back. No cloud, no account, no network. It is on PyPI now: `uv tool install downbeat`\n\n.\n\nTwo sessions and a clipboard works fine. Four sessions is chaos. I lost track of which executor had which version of the plan, I pasted stale context, and I spent more attention shuttling text between terminals than on the actual work.\n\nI wanted the sessions to pass messages directly, on my machine, with me still in the loop but no longer doing the typing. No cloud service, nothing leaving the terminal.\n\n`downbeat`\n\nis a local, filesystem-backed message broker for AI coding sessions running on the same machine. A CLI, a terminal UI, and a bundled agent skill. No server, no account, no network.\n\nThe model is simple:\n\nThe part I care about most: **nothing auto-executes.** Every watcher notifies you, nothing runs on the parent side on its own, and a child only acts because you told it to at registration time. Human-in-the-loop is the default you would have to work to turn off.\n\nUnderneath, a message is a JSON file in the recipient's inbox directory. That is the whole transport. It turns out you can build a surprisingly capable little queue out of a directory and a hook.\n\nThe whole runtime installs in two commands:\n\n```\nuv tool install downbeat     # or: pipx install downbeat\ndownbeat init                # one command installs the WHOLE runtime\n```\n\n`downbeat init`\n\nis the single source of truth for the setup. It bootstraps the data dirs, installs the agent **skill**, drops the bundled **hooks** and **slash commands**, and registers the hooks in your settings idempotently (backed up, atomic, and it never clobbers hooks you already have). It is safe to re-run.\n\nThen the loop itself:\n\n```\ndownbeat register parent --role parent\ndownbeat register child  --role child\ndownbeat send child \"task\" \"do the thing\"\ndownbeat inbox --peer child\ndownbeat reply <msg_id> \"done\"\ndownbeat tui                 # full management UI\n```\n\nIf you want to see it before installing anything, the repo has a five-command walkthrough in `examples/parent-child-handoff/`\n\nwith a recorded demo.\n\nTwo constraints shaped it.\n\nIt had to be **local and dependency-free.** My sessions already run on one laptop. Reaching for Kafka or a hosted queue to pass a sentence between two terminals is absurd. The filesystem is already there, it is already durable, and a rename is already atomic.\n\nIt had to be **reliable enough to trust.** Early on it was fire-and-forget, and it quietly lost messages: a file got marked handled the instant it was read, even if the session never acted on it. So it grew a proper delivery state machine (delivered, then acknowledged, with anything unconfirmed re-queued instead of dropped), a TUI to watch the traffic, session identity that survives a `/clear`\n\n, and an event-driven file watcher so it reacts instantly instead of polling.\n\nNone of that was planned up front. It started as a hack to stop copy-pasting, and each rough edge I hit in daily use turned into the next piece.\n\nIf you drive more than one AI coding session at once, or you have ever found yourself relaying instructions between terminals by hand, this is for that. It is deliberately small and single-machine. It does one thing: let sessions on your box hand work to each other and report back, with you still holding the wheel.\n\nI am open-sourcing it because it became genuinely useful to me and it might help someone with the same workflow. It is early and opinionated. Issues, ideas, and \"why on earth did you do it this way\" questions are all welcome.\n\nThe interesting parts to build were the ones I did not expect. Over the next few posts I want to dig into a handful of them:\n\n`/clear`\n\nIf any of that sounds familiar from your own tools, I would like to hear how you solved it.", "url": "https://wpnews.pro/news/downbeat-stop-copy-pasting-between-your-ai-terminals", "canonical_source": "https://dev.to/nazarii-ahapevych/downbeat-stop-copy-pasting-between-your-ai-terminals-3ae4", "published_at": "2026-07-09 07:26:47+00:00", "updated_at": "2026-07-09 07:41:25.855364+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["downbeat", "Claude Code", "PyPI"], "alternates": {"html": "https://wpnews.pro/news/downbeat-stop-copy-pasting-between-your-ai-terminals", "markdown": "https://wpnews.pro/news/downbeat-stop-copy-pasting-between-your-ai-terminals.md", "text": "https://wpnews.pro/news/downbeat-stop-copy-pasting-between-your-ai-terminals.txt", "jsonld": "https://wpnews.pro/news/downbeat-stop-copy-pasting-between-your-ai-terminals.jsonld"}}