ace

Using Ace.

The main flows of the app, in the order you meet them. Ace runs on your machine; these screens are the desktop app, and the same app runs in a browser on your tailnet. In a browser, ⌘ is Ctrl on Windows and Linux.

01Open a project

A project is a folder with a Git repository. On first launch the window offers Open folder… ⌘O; press ⌘O or choose File → Open Folder… and pick your repo. Opening a folder adds a project. It doesn’t start a channel, and it doesn’t need a model key yet.

In a browser there’s no folder picker, so a dialog asks for a path such as ~/code/project.

SCREENSHOTA fresh window with no projects: the empty state with Open folder… ⌘O centred.

02Initialize Git, if the folder needs it

Agents work in lanes, which are Git worktrees, so a folder without a commit shows Initialize Git. It runs git init, writes a .gitignore that leaves out secrets, dependencies and build output, and commits the rest. If the folder already has a .gitignore, Ace leaves the first commit to you.

A project you have on GitHub but haven’t checked out on this machine shows Set up on this Mac, which clones it and opens it.

SCREENSHOTThe Dashboard for a folder without Git: the card with a branch icon, its explanation and the Initialize Git button.

03Start a channel

The Dashboard (⌘1) asks what you’d like to work on, with a project chip above and a composer below. Type a request and send it: Ace creates a channel in that project and hands your words to its agent. New channel makes an empty one. Pick back up lists the project’s channels with their summaries and your open pull requests and assigned issues, and Team pulse shows what teammates are working on. With cloud compute on, choose This Mac or Run in cloud before you send.

A new channel gets a random name. The agent renames it once it knows what the work is, and keeps a short summary up to date. Fork channel, from a channel’s menu, starts a sibling channel from its summary and lane.

SCREENSHOTThe Dashboard for a real project: the project chip, the greeting, a request typed in the composer, and a few channels under Pick back up.

04Ask the agent, and watch it work

A channel opens on its Chat tab. The composer has two modes. Ace asks the agent. Chat posts to the room without starting a run, unless you mention @ace. Press Esc to switch to Chat, and Esc twice to come back.

While the agent works, its tool calls collect into groups. A fast model captions each group as it runs, and the finished turn folds into a short recap. Stop response ends the run; the chat stays usable. A message sent while the agent is busy waits above the composer and steers the run. Stopping hands any queued messages back to their authors as drafts, and the timeline says who stopped the run. A failed run offers Try again, switching to Automatic when the model was the problem.

An agent can stop and ask the chat a question, with options to pick or a written answer; you can also skip it. Attach files by dropping or pasting them: images, text files and PDFs, which are sent as their text. Dictate into the composer with the microphone. You can edit or delete your own messages, and anyone can react to a message.

When a run finishes while Ace isn’t focused, macOS shows Agent finished or Agent run failed, and an @mention of you notifies you, including ones that arrived while you were away. In the channel, a line marks where unread messages start and mentions of you are highlighted.

SCREENSHOTThe Chat tab mid-run: your message, the agent’s reply with two or three captioned tool groups (one still running), and the composer in Ace mode with the stop button.

05Choose a model, and add your keys

In Ace mode the composer has a model picker: Automatic, plus every model from the providers you’ve set up. Models that support it get an effort picker, from Minimal to Max. The choice applies to that run.

Keys live in your system keychain and never reach the app’s UI. Add them under Settings → Providers with Add key, then Check and save. Settings → General → Default model sets the model for a chat’s first run; new channels from the Dashboard start on your last pick. If a provider rejects a saved key, Settings says so. The usage indicator by the composer shows how full the context is, tokens and estimated cost.

SCREENSHOTThe composer with the model menu open: search, Automatic, models by provider, and the effort picker.
SCREENSHOTSettings on Providers: one saved in Keychain, one with Add key.

06Work in tabs: Chat, Diff, Terminal

Each channel has a tab strip. + adds a Diff or a Terminal, and Split right and Split down put panes side by side. Drag tabs between panes; right-click one to rename or close it. When the agent first changes files, a Diff tab opens behind Chat.

The terminal is a real shell in the chat’s current lane, on the channel’s host, so a teammate’s channel doesn’t offer one. A multi-line paste asks first, since the shell would run each line.

SCREENSHOTA wide window: Chat on the left; on the right, Diff above and a Terminal running the tests below.

07Review the diff

The Diff tab compares the chat’s current lane against its base, the branch the lane started from, and refreshes while it’s open. It’s exactly what a pull request into that base would contain. Switch between split and unified views, expand or collapse every file, and show or hide the file tree.

Each piece of work gets its own lane: an isolated worktree and branch the agent starts with its lane tool, so parallel work never shares a checkout. Lanes are made with lane, Luke Edwards’ copy-on-write worktrees, so a new one starts with its dependencies already in place.

SCREENSHOTThe Diff tab full width: the file tree with changed files and counts, one file open in split view, and base → lane in the header.

08Land it as a pull request

Ask the agent to open a pull request. The details sidebar, from the toggle at the right of the header, shows the channel’s summary, its changes, the branch and its newest pull request with check status. It also lists subagents, links, the host, the model and what the channel has cost.

The Diff header offers the next Git step, carried out by asking the chat’s agent: Commit, Push, Rebase, Create PR, Update PR, Address review, Ready for review, Merge or Close PR. Failed checks show up in the chat, with an offer to fix them.

Issues (⌘3) and PRs (⌘4) list the project’s GitHub items, and only appear for a project with a GitHub repository. Open in a channel starts a channel whose agent picks up that issue or continues that pull request.

SCREENSHOTA channel with the details sidebar open: summary, changes (+120 −30), the branch, and a pull request row with Checks passed.

09Work with your team

Your tailnet is your team: everyone on it who runs Ace, with no accounts to create. The Channels sidebar (⌘2) lists your channels, then a section for each teammate across all their hosts. Open a teammate’s channel and it works like your own; its tab reads channel · host. You see teammates’ channels in projects you can access: GitHub projects your login can read, or ones shared with you. Share project…, in the Channels sidebar’s menu, shares one with the team or a person.

On your own channels, Agent access decides whether teammates can ask the agent, or only read along and post. It starts off for a new channel, and turning it on asks first: agents run on your machine with your permissions, so only let people you’d trust with the machine onto your tailnet. Channel desktop tools, in the same header, lets agents operate this Mac’s apps; it also starts off.

With a team directory, faces on each channel row and beside the project show who’s here; people without Ace focused are dimmed as away. The chat shows who’s typing, and @ suggests the channel’s members. A teammate’s run names who asked for it and whose Mac and key ran it. Agents can hand work to another channel on the same host, and the message shows which channel sent it.

A phone or another computer opens the web app and connects to your host by its tailnet address; Settings → Ace Helper shows it as a QR code.

SCREENSHOTThe Channels sidebar with a teammate’s section, one channel busy, and that teammate’s channel open, its tab reading name · host.

10 · OPTIONALRun a channel in the cloud

NEEDS SERVICES YOUR TEAM HOSTS‡

A cloud channel, in beta, lives in your team’s account and runs its tools in a container there, so it keeps working while your Mac sleeps. Choose Run in cloud when you start a channel in a GitHub project, or Move to cloud workspace from an idle channel’s menu: its agent commits and pushes each lane first, and the channel can’t move back. Its menu offers Stop compute, which checkpoints the workspace and removes the container, and Start compute, which restores it; its tab reads channel · cloud or channel · stopped. Set it up under get started.

Ace no longer moves channels to a hosted channel service. A channel moved there before keeps working, and ace move <channel> --local brings it back to your Mac.

11Archive when you’re done

Hover a channel and choose Archive channel, or right-click it to pin, rename, see its info or move it. Archive inactive on the Channels header archives this host’s channels with no activity for six hours; those fold into an Inactive group on their own. Pinned channels stay at the top in their own group.

Archived channels keep their whole history, and you can open and read them. To work in one again, choose Unarchive channel. To remove one for good, choose Delete channel on the archived row; ace backup keeps a copy first, and ace restore brings one back as a new channel.

SCREENSHOTThe sidebar with a channel’s right-click menu open, and the Inactive and Archived groups below.

12Settings and Ace Helper

Open settings with ⌘,. General has theme and default model; Providers has keys; Team creates, joins or leaves your team’s directory and lists its hosts; Beta turns on cloud compute. Under This Mac, Ace Helper shows the helper, Tailscale and tool checks, the QR code and installs the ace command; Computer use grants the permissions desktop tools need; Updates switches between Stable and Canary. In a browser, Ace Helper reads Host.

Ace Helper keeps hosting your channels after the window closes, so teammates can still reach them.

SCREENSHOTSettings on Ace Helper: the helper running, Tailscale connected, the QR code, and tools available.

13Keyboard shortcuts

APP

⌘OOpen a folder as a project
⌘NNew window, with its own navigation and layout
⌘KSearch channels, tabs and actions (outside the composer)
⌘1 ⌘2 ⌘3 ⌘4Dashboard, Channels, Issues, Pull requests
⌘B / ⌘⇧BToggle navigation / the channels sidebar
⌘,Settings

COMPOSER

Enter / Shift EnterSend / new line
↑ ↓Step through messages you’ve sent
Esc / Esc EscSwitch to Chat mode / back to Ace mode
⌘KInsert or edit a link
⌘B ⌘I ⌘U ⌘E ⌘⇧SBold, italic, underline, inline code, strikethrough
⌘⌥7 ⌘⌥8 ⌘⇧.Numbered list, bulleted list, quote
⌘⌥` / ⌘EnterCode block / leave it

TABS

← → Home EndMove between tabs in a pane
DeleteClose the focused tab (not Chat)

‡ Cloud channels need Cloudflare Workers and Containers for now. A deployed directory runs on Cloudflare Workers, Fly.io, or celld on machines your team runs. Other providers may follow, and you can add one by forking Ace or sending a pull request.