# Sqwrl: structured workspaces for agents and humans

> Sqwrl gives AI agents and people the same durable, structured data. Agents design their own domain tools as versioned MCP profiles. No AI inside.

Source: https://ahmedprime.dev/projects/sqwrl

# Sqwrl

- Status

  Unreleased

- Platforms

  Local · Docker · Cloudflare

- Since

  August 2026

- Availability

  Private build

- Stack

  TypeScript · Bun · SQLite · Durable Objects · Hono · MCP

- Last shipped

  2026-08-29

Sqwrl is a structured workspace where agents and people work on the same persistent data. A generic engine underneath, and a purpose-built MCP server for every workspace on top.

It's for agent work that has to outlast the chat, instead of ending up in a Markdown file nobody opens again.

## What's the most AI-native thing a product can do?

Not ship its own AI.

Sqwrl calls no model and needs no API key. The intelligence comes from the agents you already use. Sqwrl is where their work lands, and stays. It also means there's no model bill to pass on.

## How agents use it

- **The Builder:** a full MCP toolkit with 42 tools to design workspaces, tables and views, and to read and write rows. Search, batch, and undo any change.
- **Profiles: agents build the tools other agents use.** A builder agent designs domain tools like `mark_lead_contacted` or `get_followups_due` as a declarative, versioned manifest. Draft, validate, publish. Every request rebuilds a live MCP server from that manifest. No generated code, no restart.
- **Worker agents see only what they need:** that workspace's domain tools, instructions and resources.
- **A deliberately small workflow language.** No arbitrary scripting, so a tool can't become a backdoor. Some tools can't be expressed in it, on purpose.
- **Errors agents can fix.** Every failure comes back as a structured code with the specific issues, so the agent repairs its own call.
- **Undo for everything.** Every change returns a transaction ID. Undo is atomic, and refuses politely if someone has changed the data since.

*Diagram: How Sqwrl profiles work: a builder agent writes a versioned profile manifest through draft, validate and publish; each request rebuilds a live MCP server from the published manifest; a worker agent sees only that workspace's domain tools.*

## How people use it

A grid, a drag-and-drop board, record details, an activity log, and backup and restore. The same data the agents see.

## Architecture

- A pure TypeScript engine over a thin SQLite adapter: Bun's SQLite locally, Durable Object SQLite on Cloudflare.
- User tables are real SQLite tables with immutable column IDs. Full-text search built in.
- One portable `.sqlite` file per deployment moves between local, Docker and hosted, with a safety snapshot before every restore.
- Tokenless on localhost. Fails closed the moment it's exposed to a network.
- The profile manifest is versioned from day one, because it's a contract, not a config file.

## Decisions

### Why constrain the workflow language?

A tool an agent designs can't run arbitrary code, because the language has no way to say it. The cost: some tools can't be built at all.

### Why SQLite, from a laptop to the edge?

Same engine, same file format, everywhere: Bun locally, a Durable Object when hosted. One durable object per deployment gives isolation without a database server.

## How long does a first version take when the spec is right?

- **The first commit was a 3,014-line PRD, and nothing else.**
- **28 commits in about 25 hours,** through nine phases, each one a spec and a status tracker.
- **About 26,600 lines of TypeScript, 7,100 of them tests,** some running inside Cloudflare's own runtime.
- **Fair Source licence** (FSL-1.1), becoming Apache 2.0 after two years.

**Still have questions?** [Ask the agent about this page](/ask?about=sqwrl)

- [How do Sqwrl's agents build tools for other agents?](/ask?about=sqwrl\&q=How+do+Sqwrl%27s+agents+build+tools+for+other+agents%3F)
- [Why doesn't Sqwrl ship its own AI?](/ask?about=sqwrl\&q=Why+doesn%27t+Sqwrl+ship+its+own+AI%3F)

Or [write to Ahmed](/contact)
