Lab

ccx

Daily driver

Every Claude Code session runs in its own Docker container, per account, so sessions never share credentials.

Sessions

0 needs you Admin + New session
  • docs-sitedone
    personaldocsfinished just now
  • api-refactorworking
    workcode8 min
  • payments-spikedone
    workcodefinished 1 h ago
api-refactorcontainer ccx-a1f3live
Renamed 14 handlers across 3 files.
Running the tests, 2 of 3 files done.
working
docs-sitecontainer ccx-7c2elive
Drafted the new landing page copy.
> Publish the docs site now?
1. Yes
2. No, keep it as a draft
waiting for you
> 1
published, session done
The sessions page: one row per session with its status and account, and a live terminal for the one that needs an answer. Mockup with sample data.
0 needs you / 2 done / 1 working

Notices

1 session is waiting for an answer.
A login is about to expire: work account, 3 days left.

Sessions

api-refactordone
docs-siteworking
payments-spikedone
+ Start a session
The menu bar popover: counts first, then notices, then the sessions. It is the same compact page the browser serves. Mockup with sample data.

Admin

Sessions

Shared credentials

NameKeyExpires
registry-tokensk-....7f2ain 41 days
docs-deploysk-....c09din 3 days

Account logins

personalsigned in, 22 daysRenew
worksigned in, 30 daysRenew
$ claude login
Open this link to sign in:
https://login.example.invalid/device
signed in
The admin page: shared credentials with masked keys and expiry dates, and a renew button that runs the real login in a terminal on the page. Mockup with sample data.

How it works

Browserlive terminals Menu bar appcounts, notices ccx servernode-pty containerpersonal account containerwork account containerwork account
  1. I start a session. I pick an account, a folder and a mode, docs or code, and the server starts a fresh Docker container for it.
  2. The container holds one account. Only that account's credentials are mounted, and the folder is mounted as docs or as code, so sessions never share logins.
  3. The browser shows a live terminal. node-pty runs Claude Code in the container and xterm.js streams it over a websocket.
  4. Notices tell me when to look. A session that needs an answer or a login about to expire shows on the page, in the menu bar count and as a macOS banner that carries counts only.
  5. The menu bar app is a small window onto the same page. It signs in with a one-time link, keeps the cookie in memory only, and I reach the server from my phone through Tailscale Serve behind a secret path and an owner check.

Built with

Decisions