Lotus

Limited beta · macOS

Draw how your agents work together. Lotus runs it.

A local desktop workbench where the graph is the work: agents hand off, a critic can close the gate on bad output, and a human gate holds the run until you answer.

Watch the 90-second demo

Work email, please — the beta is small. You get a short build log every two weeks, and an invite when macOS signing lands. One-click unsubscribe. Privacy.

~/work/payments-api4 cells2 running1 waiting
Fleet
api-refactor04:12
claude · worktree/refactor
running
db-migration18:03
claude · worktree/migrate
waiting on you
test-backfill01:44
codex · worktree/tests
running
docs-sweep31:57
claude · 6 files changed
idle
db-migrationclaudewaiting 18m
Read schema.sql — 3 candidate indexes to drop.orders_status_idx — superseded, safe, dropped.orders_email_idx — unused in 90d of query logs, dropped.orders_pkey — referenced by 4 foreign keys. Not mine to call.

Claude wants to run a command.

psql −c 'DROP INDEX orders_pkey'

Also sent to your phone — answer from either.

/fleet dispatchBridge — routes to cells

Mockup stand-in for the hero asset — the real one is decided in issues/07.

02Capabilities

A terminal tab tells you a process is alive. It won't tell you who is waiting.

The work went parallel; the window didn't. Seven things Lotus does that a grid of terminals cannot — each one a mechanism, not a benefit.

01

One canvas, not tabs

Agents, terminals, live browser panes, notes and diagrams are nodes on an infinite surface you arrange like a workspace. Position is memory: the layout itself records how you think about the work.

02

Agents that command agents

Lotus exposes itself to the agents running inside it over MCP — 46 tools. An agent can spawn a cell, hand work to a teammate, then block until it reports back. Orchestration becomes something you delegate, not something you perform.lotus_spawn_celllotus_dispatch_to_celllotus_wait_cell_idle

03

Review and approval are nodes, not habits

Wire a critic downstream of an agent and it runs like one — reading the upstream output and emitting a verdict. A FAIL closes the gate, so the work stops instead of flowing on. Put a human gate beside it and the run pauses until you approve or reject, with the question waiting on the canvas where you left it.

04

State reported, not scraped

Guessing a session's phase from terminal text is a heuristic, and heuristics fail exactly when it matters. Lotus reads state from the agent CLI's own hooks, so “waiting on you” is a fact the agent declared — not a pattern match on scrollback.

05

Every agent in its own worktree

Parallel agents editing one checkout collide. Lotus gives a cell its own git worktree, so four agents touch four trees and you review four diffs instead of untangling one.

06

Draw on a live page, hand it to an agent

A browser node is a real browser. Mark the broken element, and the annotation — cropped screenshot and all — is delivered to the terminal node it is wired to, as the next attachment that agent reads. The visual bug never has to be described in words.

07

The blocked agent can reach your phone

A permission request carries the exact command it wants to run, and it can be answered from a phone paired to the same machine — the same authoritative signal that turns a cell amber here, routed to a second screen instead of waiting on the first.

03Built

Numbers you can check, not benefits you have to believe.

RustNative Tauri backend. PTY, process and filesystem work runs compiled — not inside a bundled browser.tauri 2 · no electron
46MCP tools Lotus exposes to the agents inside it — fleet, canvas, browser, memory, tasks.apps/desktop/scripts/lotus-mcp-server.mjs
32Concurrent PTY sessions per window. The real ceiling in the source, not a marketing number.apps/desktop/src-tauri/src/pty.rs
0Servers to run, accounts to create, seats to buy.no backend
04Two surfaces

One project. Two ways to hold it.

The same repository, the same running agents — addressed either as a dense workspace or as a graph. You switch surface, not project.

CodeSpacepanes · bridge

Terminals, diffs, editor context and browser panes in one tiled workspace — driven from the Bridge composer. One prompt either answers you itself or becomes a Fleet Command that routes the work to cells.

  • Before it sends anything the composer already holds the file you have open, whether it is unsaved, your working directory, and every cell in the fleet — and it shows you that payload as chips. Nothing is dispatched behind your back.
  • It reads the work back, too: the orchestrator taps the output of the cells it dispatched to, so it is not blind to what it started.
CodeCanvasgraph · nodes

The same work as a graph. An agent node carries identity — name, model, skills, run history — and wires to its neighbours with handoff edges. Critics, human gates and shared context buses are nodes too, so who hands what to whom, and what must be approved before it moves, is drawn rather than remembered.

  • The graph is not a drawing of the work — it is the work. A run moves through it and the board says where it is: running, waiting, approved, rejected.
  • You can also just say it. Arranging the board, spawning a cell, focusing an agent and switching project are matched locally, which costs no model tokens at all.

The distinction the graph draws is real: an agent node is a reusable definition with a name, a model, skills and its own run history, while a terminal node is a bare shell with no identity at all. Both are cells you can dispatch to — only one of them remembers who it is between runs.

05What it costs to run

Bring your own subscription. No second bill to reason about.

Lotus drives the agent CLIs you already installed and pay for — Claude Code and Codex first-class, anything else through a custom runner. There is no per-token markup between you and your provider, and nothing to reconcile at the end of the month.

The same choice keeps you portable. When a better model ships next month you point Lotus at it; the workbench is not the thing you would have to leave.

06Build log

Every two weeks: what shipped, what broke.

The same log that goes out by mail. Invites open when macOS signing and notarization land — you will read it here first.

In progress

Signing and notarization: not done yet

Builds are unsigned today, and that is the single thing standing between this list and an invite. Stated plainly because it is the honest answer to “when do I get in”.

Shipped

Permission requests reach a paired phone

A stopped agent now surfaces the exact command it wants to run, and answering it remotely releases the turn on the desktop canvas.

Fixed

Reattached terminals no longer garble

Scrollback replay raced the live stream on reattach. Output is now ordered against a single ring buffer per session.