November 14, 2026
DyskOS — AI Coding Agent Dashboard.
Desktop · Backend · FrontendA local dashboard that commands several AI coding agents (Claude Code, Gemini CLI, OpenCode and Hermes) from one place, in the browser on a Mac or a phone, with git worktrees, a shared quota view, a real terminal and a pixel-art office.
Description
DyskOS is a local dashboard for running several AI coding agents from one place: Claude Code, Gemini CLI, OpenCode and Hermes. It is a Fastify server with a React interface that opens in the browser on the Mac or on a phone, and the agents keep working when the tab is closed. All data stays on the Mac in SQLite.
Background
I use more than one coding agent, and each one has its own terminal, its own quota and its own sessions, so switching between them gets messy. I wanted one interface in front of all of them, reachable from the phone too, where a task can be handed from one agent to another when a quota runs out.
Goal
Build a local-first dashboard to command multiple agents from anywhere, including a phone, while keeping the code, the sessions and the credentials on the Mac.
Features
- Chat: streaming answers, agent steps (“Working 1m 41s · 3 steps · 1 file”), cards for parallel subagents, permission cards, a message queue and a stop button.
- Composer: pick the worker, see the remaining quota, voice dictation, file attachments, pasted images and drag and drop, model and effort, and the permission mode.
- Four workers: Claude through the Claude Agent SDK, and Gemini CLI, OpenCode and Hermes through the Agent Client Protocol (ACP).
- Git: sessions can run in a separate worktree, with a changes panel and diff, undo per file, commit, push and merge back to the source branch.
- Quota: Claude’s 5-hour and 7-day limits, daily usage per worker, an Auto mode that picks a worker by how heavy the task is, and Hand over to… when a quota runs out.
- Term: a real zsh terminal in the browser that stays alive when the browser closes.
- Town: a pixel-art office where each session is a character: typing when working, standing with a “!” when it needs permission, and heading to the fridge, ping-pong or arcade when idle, with an office cat and lights that follow the real time.
- From the phone: Tailscale Serve over HTTPS, installable as a PWA, with a bottom navigation bar.
Technologies
- Fastify and WebSocket on Node.js 22+, with SQLite (better-sqlite3) and node-pty
- React 19, Vite and Tailwind CSS 4, with xterm.js for the terminal
- Claude Agent SDK and the Agent Client Protocol SDK to drive the agents
How to Run
DyskOS runs on macOS with Node.js 22 or later. Install the agents you want to use and sign in to them, then run npm install and npm start, and open http://localhost:8140. The first time, create a PIN. ./scripts/autostart.sh on starts it at login.
Technical Decisions
The server only listens on 127.0.0.1, and phone access goes through Tailscale inside the tailnet rather than the public internet, with the PIN still required. Sessions run in git worktrees on aos/<title>-<id> branches, so the main folder is untouched until you merge. Idle agent processes are closed after 20 minutes and resumed automatically when a new message arrives.
What I Learned
Driving four different agents taught me how much their protocols differ: the Claude Agent SDK streams rich events, while the other three speak ACP, so a shared event model had to sit between them. Keeping a process alive after the browser closes, and resuming it later, also showed me how much of a “chat” is really session and process management.
Notes
Formerly named Agent OS. The repository is private, the interface is in Indonesian, and it is tested on macOS with Node.js 22 or later.

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.