Alpha: unsigned macOS snapshot. Features and data structures may still change. v0.1.0-rc.6

Persistent AI teammates,
organized by conversation,
on your own Mac.

Bots have names, duties and boundaries. They chat one to one, join groups, get @mentioned and hand work to each other; every job reads as a flow, and every turn can say why it ran on the model it did. The window, runtime, sessions and shared workspace live on your Mac; you plug in the model endpoints and MCP tools.

Runs locally pnpm install && pnpm dev

Scroll to watch the full flow

From an empty roster to a delivered report.md, in one pass

The window on the right operates itself as you scroll. It is a reconstruction of the current app; every step maps to a feature that exists today, not a concept sketch.

Settings double as the setup wizard: one local folder as the shared workspace, plus at least one OpenAI-compatible endpoint. Each enabled model on an endpoint is its own row, with strengths, thinking levels and price; click a row to make it the default. From then on an agent picks the model and thinking level for each turn — and leaves a reason — instead of asking you every time.

The API key goes in this field only. Never in chat.

Name, duties and boundaries are all required. The avatar is generated from the name. On save, one more face appears on the roster row and a direct chat opens. The roster has no cap and does not include you.

The roster is the row of avatars at the top of the sidebar.

Tell Coordinator who you need. It uses built-in tools to create Researcher and Writer, opens the group "Research" and pulls all three in. Creating bots, groups and configuration is one sentence in a chat.

Bots can create bots, groups, endpoints and MCP servers.

Send a message without @ and every bot present decides to join or pass; passing never enters the transcript. An @mention makes joining mandatory. The app does not arbitrate who speaks and has no turn-count breaker. The one who joins has the model its turn runs on beside its name.

Judgement: Researcher joins, the others pass.

Researcher wants an MCP server to fetch web pages. Adding MCP, adding endpoints, reading or writing outside the workspace and outbound network all wait for you; adding MCP can never be set to Always allow. Calls to configured tools run directly. What waits on you is marked on the conversation in the sidebar; there is no separate notifications page.

Allow once or deny. Secrets never enter the transcript.

Researcher runs a script to check the figures; its output scrolls under that line while it runs, then folds to one line. Done, it writes @Writer into its message and Writer wakes up to continue. Files written during the turn attach to the reply automatically; there is no separate artifact store.

It folds to one line: command · exit code · how long.

Open report.md and the main column splits off a pane for it, in a tab named "Research's artifacts": the files this job touched on the left, a Monaco editor on the right with line numbers, find, folding, and Markdown switching between rendered and source. Edit and press ⌘S to write back to the same path. A conversation has one preview; opening another file turns it to that one.

It writes a real file on disk.

The conversation pane is narrow now, so its header actions fold into ⋯. Pick Trace and the job is drawn by who woke whom: a card per turn, with the files it handed over on the card. Under each Bot card is the model, thinking level and message kind its turn ran on, picked by an agent before the turn; click it for why, and how many hops it took. The review at the end of a correction lands here too, and only a verdict against the model becomes that Bot's experience.

The model each turn ran on, and why, sits on its card.

Right-click anywhere in a pane to split it up, down, left or right; the new empty pane offers New terminal, Workspace and Routines. Start a terminal and run pnpm dev: it is your own shell, it needs no approval, and no Bot can touch it. The current pane is framed in the accent colour; the layout is remembered on this Mac, and Quit and reopen brings back the split and the terminal.

Closing a terminal tab leaves it running; reattach from "+".

The window hides in the tray, and running turns and the pnpm dev in the terminal carry on. When Coordinator finishes its check, a macOS banner opens straight to that conversation, and the Dock badge counts only what you have not seen plus what is still waiting on you. Stop in a direct chat ends the current turn immediately; only Cmd+Q or Quit in the tray ends the window and the daemon.

Closing hides. It does not quit.

A paired phone reaches this Mac through a relay you deploy yourself: conversations, approvals, the workspace and your terminals are all there, encrypted end to end between the two, with the relay passing along ciphertext it cannot read. Ask @Writer for one more section from the phone and it is still the Writer on the Mac doing the work; read it on the phone and the Mac's Dock badge clears too. Pairing happens once: the Mac's settings hand out a one-time code, you paste it on the phone, check that the fingerprints match, and approve at the Mac. It is an experimental feature, off by default, and a release build cannot pair yet.

Set it up →

Your own relay serves the page; messages are end-to-end encrypted.

What is live, what is being built, what we will not do

"Live" means the code exists. It does not mean every model, tool combination or full task path has been accepted in a real environment.

Live In progress Not doing
Runtime LivemacOS window, resident daemon, local shared workspace, SQLite state; closing the window stops nothing, and the daemon holds your own terminal sessions too In progressLong-running stability in complex real-world scenarios Not doingCloud VMs, cloud billing, multi-user SaaS
Desktop workbench LiveSplit the main column any way; tabs hold a conversation, a terminal, the routine calendar or the workspace; one flow per job; what waits on you marked on the conversation list, with macOS banners and a Dock badge In progressWith several conversations on screen only the current one reports presence, so the others can still post a banner once Not doingMultiple window processes, split panes on a phone
Bots LivePersistent roster, direct chats, multi-bot groups, @mentions, judgement, async handoffs; a review at the end of a correction, kept as that bot's experience In progressMeasuring whether reused experience actually picks better and finishes faster Not doingDisposable chat boxes, a central dispatcher, turn-count breakers
Models and tools LiveMultiple OpenAI-compatible endpoints; stdio and Streamable HTTP MCP; an agent picks the model and thinking level before each turn and says why, with rules as the fallback, kept on that turn's card in the flow In progressAgent-led choice of tools and collaboration, decided before the turn too Not doingVendor lock-in, a provider catalogue, pretending every implementation is compatible
Safety and permissions LiveApproval cards for dangerous actions, Keychain secrets, Always allow rules, Stop in direct chats In progressFiner-grained MCP permission policies Not doingTreating bots as security sandboxes, pretending full autonomy is safe
Managing the app by chat LiveBots edit profiles and skills, create bots and groups, configure endpoints, model lists and MCP through tools In progressConversational coverage of every operation, including first-run setup Not doingDeep menus for everyday configuration
Remote access LiveA default-off experimental prototype: a self-hosted relay and end-to-end Noise encryption; a paired phone reads and answers conversations, handles approvals, browses the workspace and uses your terminals; integration testing runs from source In progressIndependent security review, and real-device home-screen WebAuthn and Web Push; public pairing stays off until then Not doingA project-run cloud relay, passing a prototype off as working remote access

See the Roadmap for direction; CONTEXT.md is the source of truth for vocabulary.

Download, or run from source

Open source under MIT. The alpha snapshot is macOS only and unsigned; Windows and Linux are out of scope.

Requires macOS, Node.js 22+, pnpm 12.3.4, Bun 1.2+, Rust / Cargo and the Tauri macOS prerequisites (including Xcode Command Line Tools).

  1. Pick a local folder as the shared workspace, ideally outside the source checkout; missing folders are created.
  2. In Settings, choose a workspace folder, then enter an OpenAI-compatible endpoint URL and API key, then the model list and default model.
  3. Create the first bot from the sidebar with a name, duties and boundaries, and open a direct chat.
  4. Ask it to create other bots, form groups or propose MCP configuration; approve dangerous actions in the app.

Download the alpha snapshot

v0.1.0-rc.6

The latest GitHub Release ships .dmg files for Apple silicon and Intel. The build is unsigned: if Gatekeeper blocks the first launch, right-click and choose Open, or run (full FAQ: docs/gatekeeper.md; expensive actions still ask first):

xattr -dr com.apple.quarantine "/Applications/Deskfolk.app"
Go to the latest release
zsh — deskfolk
# Clone and install
$ git clone https://github.com/Blackman99/deskfolk.git
$ cd deskfolk
$ pnpm install

# Start the daemon and the desktop window in parallel
$ pnpm dev