atc

Every Claude Code session on every machine, answered from pal

palupdated 2026-10-30IntegrationIn pal's registry󱔓Menu bar: Sessions󰌹3 deep links

Open in pal

In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.

atc: Every session on every machine atc lists: the ones that need you first, with what each is doing or asking to run
Every session on every machine atc lists: the ones that need you first, with what each is doing or asking to run
atc: The pane: what a finished turn ended on, summed up by atc, then your message and the reply; its page and what it spent below
The pane: what a finished turn ended on, summed up by atc, then your message and the reply; its page and what it spent below
atc: Enter opens the chat: the conversation live, the command it asks to run with cmd+y to allow and cmd+. to say no, a field to reply
Enter opens the chat: the conversation live, the command it asks to run with cmd+y to allow and cmd+. to say no, a field to reply
atc: New Session: a folder on any machine, the first message typed after Tab
New Session: a folder on any machine, the first message typed after Tab
atc: ⌘K on a session: allow, say no, open it in a terminal or atc's page, its outputs, pin, park, rename, stop
⌘K on a session: allow, say no, open it in a terminal or atc's page, its outputs, pin, park, rename, stop
1 of 5

What it does

Your Claude Code sessions on every machine, through atc (github.com/zcag/atc): see which ones need you, answer them in a live chat or their own terminal, and start, resume or stop them without leaving pal.

  • Every session on every machine your atc server lists, the ones that need you first, with what each is doing or asking to run
  • A finished turn read in one line: atc's summary of the reply on the row, its gist and overview in the pane and the chat, the statuses in the bar's tooltip
  • A chat per session that follows it live: read the conversation, type a message, cmd+y allows a prompt, cmd+. says no or interrupts
  • A session's own terminal inside pal (cmd+o): Claude Code's screen live in the panel's colours, to type into, scroll and answer anything
  • A bar item counting sessions by state, an alarm while one needs you, the plan's limit once it runs high; its popover answers them without opening pal
  • Start Claude in a folder on any machine, in a new worktree, or from one of atc's presets, with the first message typed in the bar
  • Earlier conversations from every machine, read or resumed in the background
  • The pages a session published, the servers, files and links it made, one Enter from open; what each session spent; the clipboard attached with cmd+shift+v
  • Built on atc (github.com/zcag/atc), a small server for Claude Code's background sessions; a machine where atc login was run needs no setup

Palettes 6

  • Sessionssessionslive

    Every session atc lists, the ones that need you first: the machine, folder and branch, what it is doing or asking to run, or what its turn ended on in one line; the pane leads with atc's summary of the reply, then your last message, the reply itself, its pages and what it spent.

    • ↵Open the chat (Tab, a message, Enter sends it first)
    • ⌘YAllow what it asks to run
    • ⌘.Say no, or interrupt a working turn
    • ⌘OOpen its terminal in pal
    • ⌘⇧TOpen in a terminal app (atc attach)
    • ⌘⇧OOpen in atc's web page
    • ⌘UOutputs: the servers, files and links it made
    • ⌘LOpen its published page (several: its outputs)
    • ⌘⇧RResume a stopped session
    • ⌘⇧PPin or unpin
    • ⌘⇧ERename
    • ⌘CCopy the resume command
    • ⌘DStop the session (asks first)
  • Chatchatview

    One session as a chat that follows it live: the conversation, a finished turn's long reply summed up under it, what it is doing now, a permission prompt with its two keys, its published pages, and a message field. Opened bare, the session that needs you most.

    • ↵Send the message (a stopped session is resumed first)
    • ⌘YAllow
    • ⌘.Say no, or interrupt
    • ⌘⇧VAttach the clipboard: text into the message, a picture or files uploaded with it
    • ⌘OOpen its terminal in pal
    • ⌘UOutputs
    • ⌘LOpen its published page
    • ⌘⇧CCopy the last reply
    • ⌘[Older messages
  • Terminalterminalview

    A session's own terminal inside pal, Claude Code's screen as atc attach shows it, in the panel's colours: type into it, scroll it, answer any prompt. A stopped session is resumed first. Opened bare, the session that needs you most.

    • ⌘.Send Escape (ctrl+[ too): interrupt, say no; Escape itself goes back
    • ⌘⇧FFit the terminal to this window
  • New Sessionnewlive

    Start Claude Code from one of atc's presets (a folder with standing instructions) or in a folder on any machine atc lists: the folders you used lately, then those under atc's roots; Tab to type the first message and a name.

    • ↵Start a session there
    • ⌘↵Start it in a new git worktree
  • Earlier Conversationshistorylistrefreshes every 5 min

    Past conversations on every machine, newest first, found by title, folder or what you asked: read one, or resume it in the background.

    • ↵Read it (a message typed after Tab resumes it)
    • ⌘↵Resume
    • ⌘CCopy the resume command
  • Outputsoutputslive

    What your running sessions made: the pages they published first, with a preview, then the servers they started, the files they wrote or read, the links they gave.

    • ↵Open
    • ⌘CCopy the address or path

Settings

Extension, [extensions.atc]

url
empty text

The address of your atc server. Empty uses the one atc login saved on this machine.

token
empty secret

What atc token prints on the server. Empty uses the one atc login saved; a server that trusts your tailnet needs none. Kept in the OS keychain.

open
Auto select

Where Open in a terminal app goes. Auto runs atc attach in a terminal when the atc command is on this machine, and opens atc's web page otherwise. One of auto, terminal, browser.

terminal
Auto select

Which terminal atc attach opens in; Auto takes the first one installed. One of auto, kitty, Ghostty, iTerm2, Terminal, Alacritty.

Defaults shown. Change them in pal's settings window or in the config file.

The README

Everything atc does, key by key, from the extension's own README.md

atc

Every Claude Code session you run, on every machine, from pal: which ones need you, a live chat and the real terminal for each, and new ones started in any folder on any machine.

This is pal's side of atc, a small server that keeps Claude Code's background sessions running on your machines and lists them in one place, with a web page, a terminal client and an Android app of its own. atc knows each session's state from Claude Code's own background service, so nothing here is guessed: a session needs you, it is your turn, it is working, or it stopped.

For the sessions of one machine without a server, read from the agents' own files, the Sessions extension is the one to use.

Setup

  1. Run atc on the machines where your sessions live: install and run it as a service.
  2. On the machine with pal, atc login <server> <token> (or set atc server and Token under Settings › Extensions › atc).

That is all: the extension uses what atc login saved (client.json in atc's config folder, ATC_CONFIG_DIR or ~/.config/atc). A server that trusts your tailnet takes no token. A server behind a private CA (Caddy's tls internal) works when this machine trusts that CA, as a browser would.

Palettes

Sessions (atc-sessions): every session, the ones that need you first, then your turn, working, stopped, parked last. The row is the title, then what it is doing or asking, or for a finished turn what it ended on in one line (below), with the machine (when atc lists several), folder and branch; the state, the context it holds and the age on the right. The pane is what it asks, or atc's summary of its reply (the status, a line per topic, the overview by kind), then your last message and the reply itself; the machine, folder, branch, model, context, permission mode, times, its published pages and what it spent (tokens, the cost at API prices, how long Claude worked). Filters: All, Needs you, Running, Pinned. Tab on a row types a message; Enter sends it and opens the chat.

Chat (atc-chat): one session as a chat that follows it live. The conversation (prompts, replies drawn as markdown, tool calls one line each), what it is doing now, and when it needs you a card saying what it asks. The search row is the message field the whole time: type and Enter sends. A stopped or past session is resumed in the background first. Opened bare (its root row, a hotkey), it shows the session that needs you most.

key what
enter Send the message
cmd+y Allow what it asks to run, or approve its plan
cmd+. Say no, keep planning, dismiss a question, or interrupt a working turn
cmd+shift+v Attach the clipboard: text goes into the message, a picture or files are uploaded and named in it
cmd+o Open its terminal in pal (Terminal, below)
cmd+shift+o Open in atc's web page
cmd+u Outputs
cmd+l Open its published page
cmd+shift+c Copy the last reply
cmd+[ Older messages

Terminal (atc-terminal): the session's own terminal inside pal, Claude Code's screen as atc attach shows it, drawn by xterm.js in the panel's colours: type into it, scroll it, answer any prompt there, questions included. A stopped session is resumed first. Escape leaves the level as everywhere in pal, so the Escape Claude Code wants is ctrl+[ (what a terminal sends for it anyway) or cmd+.; cmd+shift+f makes this window the one whose size the terminal takes. The page reaches nothing but its own folder: the extension holds the websocket to atc and relays the bytes both ways. A hidden terminal keeps its connection for a minute. ./xterm.sh vendors xterm.js into surface/vendor/, pinned and checked.

New Session (atc-new): atc's presets first (a folder with standing instructions, presets.json in atc's config folder; started on their own machine), then the folders you used lately on every machine, then those under atc's roots. Tab types the first message and a name; Enter starts the session there and opens its chat, cmd+enter starts it in a new git worktree. Another folder… is a form for any folder on any machine.

Earlier Conversations (atc-history): past conversations on every machine, newest first, found by title, folder or branch. Enter reads one (a message typed after Tab resumes it), cmd+enter resumes it.

Outputs (atc-outputs): what the running sessions made: the pages they published first (links matching atc's ATC_FEATURED, by their title, with the page's preview), then the servers they the files they wrote or read (opened through atc's signed links), the links they gave. From a session's row or chat it lists that session's alone.

What a turn ended on

When a session finishes a turn, atc has a model read its final reply and sum it up at three lengths: a status line ("Done: the changelog, two entries need your call"), a line per topic, and for a long reply an overview by kind ("Found:", "Open:"). The extension shows it wherever the session does: the row's subtitle, the popover row (the ring's row adds the lines), the bar's tooltip, the top of the pane, and a card under the reply in the chat, since the panel opens at the reply's end. A summary is only ever for the reply the session holds now, so a working session shows none; until it arrives the start of the reply stands in, and "Summarize the reply again" asks for a new one. A short reply is its own summary. A server with summaries turned off (ATC_SUMMARY=off) sends none, and the rows show the reply's start.

How a prompt is answered

A message goes through atc's POST /send, which pastes it into the session's prompt and submits it. A key is different: atc has no route for one, so Allow and Say no join the session's terminal over atc's websocket (as atc's own voice mode does), take the size the terminal already has so a session open on another screen is not resized, and write Enter or Escape.

What a session asks decides what is offered. A permission prompt and a plan take both keys. A question (AskUserQuestion) takes only Escape: Enter would pick its first answer unread, so it is answered where its options show (cmd+o, its terminal in pal). A session open in a terminal (not one of atc's background sessions) is read here and answered in its terminal.

The bar item

sessions: a count per state in its colour, red needs you, amber your turn, blue working, and the plan's fullest limit (a gauge and its percent) once atc warns about it; an alarm while one needs you (the needs rule); hidden with nothing running. The tooltip names the session that needs you and what it asks, and what the finished turns ended on. The popover lists every session by state, the plan's limits (the session's five hours and the week) under them:

key what
enter, r Open its chat in the popover
y Allow (or approve the plan)
i Say no, or interrupt
o Open its terminal (in the popover)
a / w Open in a terminal app (atc attach) / atc's web page
u Outputs
x Stop the session (asks first)
n New session
h Earlier conversations
p Open Sessions in pal

It follows atc's event stream (/api/events), so a session that starts to need you shows within a couple of seconds; a render every 30 s is the safety net. It publishes atc/needs_you, atc/your_turn, atc/working and atc/week_used (the week's share of the plan, in percent; asked every two minutes).

route params
pal://atc/open session (an id, a background id or words of its title; absent: the one that needs you most)
pal://atc/send session, text, file (repeat for several; uploaded and named in the message)
pal://atc/new dir or preset, prompt, name, host, worktree

Settings

id default what
url empty the atc server; empty uses atc login's
token empty its token (keychain); empty uses atc login's, or none
open Auto where Open in a terminal app goes: Auto runs atc attach in a terminal when the atc command is here, else atc's web page
terminal Auto which terminal atc attach opens in