Smalti

Smalti is the control surface for a software factory: the coding agents, machines, checks and forge that together turn intent into shipped, verified changes. It is built so that one person can direct that work, see what needs them, and check the results, from a desk or from a phone.

The macOS app works today, built from source until the first release is published. It puts Claude Code sessions, terminals, browsers and notes on one canvas, indexes every session on the machine, and watches the resources the agents use.

macOS 15 or later. Windows, iPhone and iPad versions are in development.

The Smalti icon: a rounded tablet of dark grout set with ultramarine and cobalt glass tiles, with an S laid in gold-leaf tiles, seen at an angle.

In use

Screenshots from the apps, taken with demo data.

What needs you, on any screen

Agents stop for three reasons: they need permission, they have a question, or they are done. Smalti collects those into one list, most urgent first. On the Mac it is the Needs you list and ⌘J. On the phone it is the first tab, and a permission request can be approved or denied from it, with the exact command shown first.

macOS: the list and ⌘J. iPhone (in development): the list, approve and deny.

Smalti on macOS: the Needs you list in the sidebar and a Claude session waiting for permission to run a test command, with an amber ring around its panel.
Smalti on iPhone: an approval sheet showing the command an agent wants to run, with Deny and Approve buttons.

How a project was steered

The decision timeline lays out every goal, redirect, interrupt, approval and answer across a project's sessions, with the files and commits that followed each one. A diff shows what changed; the timeline shows the instructions that led to it.

macOS. Decision timeline

The decision timeline on macOS: one lane per session, with goals, redirects and approvals placed in time.

The machine stays up

The governor measures each terminal's whole process tree. Under memory pressure it holds new agents in a queue, and at critical pressure it pauses the largest runaway build or test (never the agent) and asks whether to resume or kill it.

macOS. Resource governor

The governor on macOS: a paused process with Resume and Kill buttons, and the memory chip at the bottom of the canvas.

Everything from the keyboard

One palette finds every command, panel, session, file and SSH host, and shows each command's shortcut beside it. Every Smalti chord includes ⌘ on Apple platforms (Ctrl+Shift on Windows), so Ctrl, Alt and Esc always reach the shell, vim, tmux and Claude Code.

macOS; Windows in development. Keyboard reference

The command palette open over the canvas, listing commands with their shortcuts, panels and sessions.

One agent that runs the others

The Conductor turns a request into a mission: a goal, a short plan of tasks, and a card for each task showing its agent, machine, branch and last check. It uses the same tools you have, within a policy you set, logs every action, and asks one clear question when it needs you. Its page is served from your own machine and works the same on a desk or a phone.

In development: a prototype with this web view, shown in the Mac app's Mission panel. How it works today

The Conductor's mission view: the goal, a plan of five tasks with their agents, task cards with branch and host, an activity log, and a question asking to approve a read-only git command.
The Conductor on a phone: the factory overview with three machines, one mission waiting on you, and the Conductor's question with an Approve button.

Several machines, three platforms

The same panels, sidebar and graph on macOS and Windows, and a phone app that shows every machine's load, its running and waiting agents, and the sessions on it. Machines are reached over SSH through Tailscale; nothing goes through a Smalti server.

macOS now; Windows, iPhone and iPad in development.

Smalti on Windows: the canvas with terminals, a session graph and a browser, and the sidebar with the inbox, files and sessions.
Smalti on iPhone: three machines with CPU, memory and disk use and their running and waiting agents.

What a software factory needs from one person

Agents do most of the typing. The person sets goals and constraints, answers questions, approves risky actions, and decides when work is actually done. Today that job is spread across terminal tabs, tmux sessions, forge pages, Activity Monitor and chat. Smalti puts it in one place. The table shows what exists now and what is still being built.

PartWhat it doesStatus
CanvasTerminals, browsers, notes, session graphs and CI runs as panels on one zoomable canvas, all reachable from the keyboard and a command palette.macOS
Session indexEvery Claude Code session on the machine, by project, linked to the terminal it runs in.macOS
GovernorMeasures each panel's whole process tree, holds new agent launches when memory is short, and pauses a runaway build rather than letting the machine swap to a halt.macOS
CommitwellA CI panel that shows runs from the Commitwell forge next to the sessions that produced them.macOS
Decision timelineEvery goal, redirect, interrupt, approval and answer in a project's sessions, in order, with the files and commits that followed each one.macOS
InboxOne list of what needs you: sessions waiting on an answer, finished sessions and failed CI runs, with one key to jump to the next.macOS
Remote hostsThe phone and tablet reach your machines over SSH and Tailscale and reattach to their terminals through tmux.in development
smaltidOne small daemon per machine that indexes sessions, tracks attention, measures resources and serves one API to every app.in development
Done means verifiedA session is shown as done only after the project's checks pass, not when the agent says so.in development
ConductorOne orchestration agent that you talk to, which starts, steers and checks the others within a policy you set. A prototype runs from the command line; the Mac app shows its missions in a panel and takes messages from a one-line bar (⌘I).in development
Agent libraryReusable agents that propose changes to their own instructions after each run, which you accept as diffs. Claude Code subagents can be imported, and Codex runs through an adapter. Part of the Conductor prototype.in development
FleetSessions placed on, and moved between, machines by available memory, CPU and GPU. smaltid can already move a stopped session, with its branch and transcript, to another machine.in development

Concepts and terms

Panels

There are six kinds of panel. Any panel can be moved, resized, snapped against its neighbours and selected together with others. The layout is saved to disk and restored at launch.

TERMTerminal

A login shell in a pseudo-terminal, drawn with SwiftTerm. Once a second Smalti checks the terminal's foreground process. If it is claude, the panel shows a claude badge, finds the matching transcript, and takes the session's title.

GRAPHSession graph

A force-directed graph with three kinds of node: projects, sessions and files. A session is connected to its project and to every file it edited. Files that more than one session touched end up between them, which shows where work overlapped.

WEBBrowser

A WebKit view with back, forward, reload and an address field. localhost:3000 is loaded as typed, so a development server can sit next to the session that is changing it. The Web Inspector is available.

NOTENote

A plain-text editor that saves to its file 0.6 seconds after the last keystroke. Opening a text file from the sidebar creates a note; opening HTML, PDF, images or video creates a browser panel instead.

CICI runs

Recent Commitwell runs for the panel's repository, read through the cw command line tool every 30 seconds. A failed latest run puts the panel in the Needs you list.

MISSIONConductor

The Conductor's web view, shown when smalti-conductor serve is running on the machine, with a badge counting its open questions. ⌘I opens a one-line bar that sends it a message.

Sessions

Smalti scans ~/.claude/projects every four seconds. For each transcript it records the working directory, a title (Claude Code's generated title, or else the first prompt), the number of messages, and the files the session edited or read. Results are cached, so a transcript is parsed again only when its size or modification time changes.

The sidebar lists sessions by project, newest first. A green dot marks a session that is running in a terminal panel or whose transcript changed in the last 90 seconds. Clicking a session focuses the terminal it is running in, or resumes it with claude --resume in a new one.

How sessions are read

Data

There is no account, no Smalti server and no telemetry. The Mac app reads ~/.claude/projects but never writes to it, and keeps its own state in ~/Library/Application Support/Smalti. It opens no network connections of its own (apart from a local one to smaltid, if running); traffic comes from pages loaded in browser panels, commands run in terminals, and the Commitwell CLI when a CI panel is open.

Privacy policy

Platforms

macOS 15+available

Native AppKit and SwiftUI. Build it with SwiftPM; release builds are coming.

Windowscoming soon

A native WPF port with the same panels, sidebar and graph, reading the same transcript format.

iPhone and iPadcoming soon

Connects to your own computers over SSH, normally through Tailscale, and attaches to their terminals inside tmux so a dropped connection resumes where it left off.

Download

The mark

Smalti are the small glass tiles used in fine mosaics since Byzantium; each one is cut by hand and set at a slight angle so the surface catches light. Many small pieces, set together into one picture. Just like a software factory.