Loom

The weave

A window that holds everything.

Loom is a desktop workspace for AI chat and agents. The conversation, a real terminal, an editor with git, and the files they are working on — with the model’s reasoning kept in the transcript, where it happened.

Download for WindowsSee what it doesWindows 10 or 11, 64-bit · free · MIT licensed

Parts

Eight parts, holding each other.

Every panel is a real tool rather than a view of one. The terminal is a pty, the editor is Monaco, and git goes through your own git — so your credential manager, your hooks and your signing keys all keep working.

Terminal

A real pty — colours, resize, arrow keys, full-screen programs, and all sixteen ANSI colours defined per theme.

Editor

Monaco, with changed files opened as exact diffs rather than as patch text.

Git

Driven through your own git binary, so credentials, hooks, aliases and signing all keep working.

Files

The workspace tree, with changed-file marks that match the git panel beside it.

Chat

The conversation itself: reasoning, tool calls and the reply, in the order they happened.

Chats

Every conversation, grouped by the folder it belongs to.

Runs

Commands that outlived their turn, still streaming to a log, each with a stop button.

Goal

The objective and the live task list the model keeps checked off as it goes.

And the parts that are not panels: a quick-ask overlay on Ctrl+Shift+Space that summons a chat from anywhere in Windows, voice mode on Ctrl+Shift+V — which has no button, so the shortcut sheet is the only place its keys exist — IDE mode, which swaps the dock’s centre for a file tree, an editor and a slim chat column, and an updater that verifies a signature before it applies anything.

Terminal
A real pty — ConPTY on Windows — so colours, interactive prompts, resizing and full-screen programs all work. All sixteen ANSI colours are Loom’s own rather than xterm’s stock palette. And the terminal is yours: pty_write is not an agent tool and is not advertised to the model, because a live shell has no permission card in front of it and the only safe arrangement is that the agent cannot type into one.
Editor
Monaco, in a theme derived from the application's own stylesheet. A changed file opens as an exact diff in a real diff editor rather than as patch text — a description of a change is not the change.
Autosave
On by default, and only safe because every write carries the SHA-256 of what it loaded. If the file moved on underneath it, the write is refused and you get a conflict rather than a silent overwrite.
Runs
A command that outlives its turn is adopted rather than killed. It keeps streaming to a log on disk, gets a Stop button, and at most eight are tracked at once so processes cannot pile up invisibly.
Why one window
The dock, the agent and the editor share one shell deliberately. A second application window would have reimplemented the docking, the shortcuts and the theme, and then drifted from them.

Where they meet

Where your judgement meets its own.

The mode decides what the model is willing to do. It is set per chat and per turn, and the two read-only modes refuse the write and command tools rather than asking for permission — which is the difference between a mode and a preference.

A permission system is only worth having if refusing is cheaper than allowing.

Plan

Researches, asks questions, proposes.

Reads the workspace and the web, then hands you a plan. Refuses the write and command tools outright rather than asking and being refused — so there is no path by which a planning turn touches a file.

Review

Findings, ranked, with a file and a line.

Reads a diff or a directory and reports severity-ranked issues with the location of each, plus a proposed fix. The findings are the deliverable; it changes nothing.

Build

Does the work.

Edits files, runs commands, reads the failures and iterates. What it may do without asking is a separate control — the permission mode — because it answers a different question.

Atelier

Everything Build does, plus Loom itself.

Additionally exposes the tools that edit Loom's own configuration — personas, prompts, skills, MCP servers, providers, settings. Every write snapshots first. It is the one mode that runs its own removals without a card, and it is deliberately per-chat with no way to make it the default.

Table 1 — what each permission level runs without asking
LevelRuns without askingStill asks
AskReads within the workspace.Every write, every command, every path change.
Auto read-onlyReads, grep, the git tools, the semantic index.Writes and commands, which still card.
Auto run allReads, writes and commands.Deletes the risk check flags — Atelier’s exemption is deliberately not inherited at this level.

There is no level that runs a delete without a card, and no way to turn the card off globally. The one exemption is a property of a single mode, chosen per chat, and it is stated plainly below rather than buried here.

Narrowing

A field of possibilities, narrowed in order.

Not a tour. This is one turn of the agent, in the order its parts arrived: something asked, something thought, something run, something written back. A transcript that reorders these is showing you a summary, not a turn.

Loom · one turn412 tests · 1 failing
  1. You

    The rename left four call sites behind. Fix them, and prove the fallback still resolves.

  2. Thinking

    Two of the four are copy-paste rather than renames, so repointing the import alone would leave the duplication in place. The fallback in presetById looks like defensive coding, but something depends on it — check the tests before changing its behaviour.

  3. Read0.4s

    src/lib/background.ts

  4. Grep0.1s

    "presetById" → 6 matches

  5. Edit

    src/lib/background.ts +4 −2

  6. Run4.1s

    bun run test · exit 1

  7. Loom

    Six failures, all from the same rename. Three more call sites used the string literal, and one test asserted the old id. Fixing those and re-running.

4
agent modes
8
tracked commands, at most
5 MB
per command log
0
calls to any server of ours

The one mode worth reading twice is Atelier, because it is the only place in Loom where a model can remove something without being asked first. What that costs is precise: the harness removals are recoverable from ~/.loom/backups, but a deleted workspace path and a deleted scheduled job are not backed up by anything. It is never accepted as the global default, for exactly this reason — and scheduling a job still cards even in Atelier, because a standing commitment to act while nobody is watching is not a removal and should not be treated as one.

Ground truth

Nothing leaves the machine except to your provider.

No analytics, no crash reporting, no account, no installation identifier. The source is public, so this is a claim you can check rather than one you have to take on faith.

Keys
Windows Credential Manager, one entry per provider. Never in a config file, never in a log, never uploaded.
Conversations
~/.loom/loom.db — SQLite, on your own disk, twelve migrations deep.
Command output
~/.loom/logs, one file per tracked command, each capped at 5 MB.
Config snapshots
~/.loom/backups, taken before every change the model makes to Loom’s own configuration. The ten newest are kept.
Leaves the machine
Your prompts, the files you attach, and whatever a tool asks to read — to the provider you selected, under their terms. Then update checks to GitHub, with the manifest's signature verified before anything is applied.
Nothing else
No telemetry, no feature flags, no remote configuration, and no identifier generated to recognise an installation. There is no code path that reports to us, because no such path was built.

Run a local model with the index off, and Loom makes no outbound request at all — except the update check, which can also be turned off.

Set LOOM_HOME to move all of it. There is no sync and no export that uploads anything.

Table 2 — where the models come from
RouteNotes
Twelve presetsOpenAI, Anthropic, OpenRouter, DeepSeek, Z.ai, Groq, xAI, Google, OpenCode Go, OpenCode Zen, Ollama, LM Studio.
Any endpointAny OpenAI-compatible or Anthropic-compatible base URL, with your own headers. A preset can be added twice, so two plans for one vendor each keep their own key.
Per chatOne conversation can run a local model for a quick question while another works through a repository with a frontier model. Neither has to be reconfigured.
UsageLive vendor limits wherever the provider exposes them, plus a local table of tokens and list-price cost built from your own database.

Command output is logged whether or not you are watching the command, which is worth knowing before running something that might print a secret. The cap is per command rather than in total, so eight long-running commands can hold 40 MB between them — in the clear, on your disk. Uninstalling leaves ~/.loom in place, because deleting your conversations as a side effect of removing a binary would be hostile; deleting that folder is the whole deletion process, and it is yours to run.

Install

Then it is yours.

One portable installer with the application embedded. No runtime to install first, no framework, and nothing to configure beyond adding a provider key.

Download for WindowsWindows 10 or 11, 64-bit · the current release

Before you install

Is it really free?

Yes, and there is nothing to unlock. No paid tier, no account, no licence key. You pay your provider directly for the tokens you use, and that bill never passes through this project. A local model through Ollama or LM Studio costs nothing at all.

Why does Windows say the publisher is unknown?

Because the installer is not code-signed yet. A certificate is a recurring cost, and until one is in place SmartScreen shows the same generic warning for any installer that lacks it. That is separate from the updater: release payloads are signed with minisign and the application verifies that signature before applying anything, so an update cannot be tampered with in transit — but that is not the same as proving who built the installer. The download page publishes the SHA-256 of the file and tells you how to check it.

Does it work on macOS or Linux?

Not yet, and the Windows-specific parts are not incidental. Loom is built on Tauri, which is cross-platform, but computer use is built on UI Automation and Win32 input, the credential store is Windows Credential Manager, the terminal uses ConPTY, and launch-at-login is a registry entry. This page will say so plainly when another platform is real rather than planned.

What does it do with my code?

It reads the folder you point it at and sends what it reads to the provider of the model you chose, which is what pasting a file into any other client does. Nothing goes anywhere else, and indexing uses your own provider's embedding endpoint. Run a local model and nothing leaves the machine at all.

Can it run commands while I am not watching?

Yes, deliberately, and it is bounded. A command that outlives its deadline is adopted rather than killed, and at most eight are tracked at once so processes cannot accumulate invisibly. All of them are listed in the Runs panel with a Stop button, output is capped at 5 MB per command, and a command still running after a restart is reported as orphaned rather than assumed dead — because it may well still be alive.

What happens to my chats if I uninstall?

They stay. Uninstalling removes the application from %LOCALAPPDATA%\Loom and the shortcuts it created. ~/.loom is left alone, because deleting your conversations as a side effect of removing a binary would be hostile. Delete that folder yourself when you want it gone, and that is the entire deletion process.

Format
A single self-contained executable. The application is embedded into the installer at build time, so there is no payload to fetch afterwards.
Silent install
--silent --dir <path> does the whole thing without a window.
Updates
The payload is minisign-signed and verified before anything is applied. A release carrying no signature is refused rather than installed, which is the intended behaviour and not a fault.
Leaves behind
~/.loom, in full. Nothing in the install folder is needed to read your data, and nothing in your data is needed for the application to run.

Releases are built and published from the public repository, which is MIT licensed and published by Aaen Studios. The download button resolves through this site rather than pointing at GitHub directly, so a link you have already copied keeps working if the repository is ever renamed or moved.

6 movements, 8 panels, one window. If any of the claims above turn out to be wrong, the fix is a pull request rather than a support ticket — that is the point of shipping the source beside the installer.