One registry, four surfaces
Define a tool once. Wove derives the REST API, the MCP server, the OpenAPI spec and the audit log from it.
Every publishing action in Wove is a typed, permissioned, audited tool. People use it through a modern admin. Agents use the same tools over MCP. Nobody gets a second-class API.
Apache-2.0 · Bun 1.2 · SQLite · one container
The whole loop
A complete CMS — posts, pages, media, menus, SEO, redirects, collections, roles — plus the agentic parts nobody else ships in core.
system
What's in the box
Define a tool once. Wove derives the REST API, the MCP server, the OpenAPI spec and the audit log from it.
Scoped agent identities, enforced at the tool boundary, attributed line by line in the audit log.
Point Wove at a WXR export: posts, media, menus, SEO. Gutenberg becomes clean Markdown. Re-runs are idempotent.
Templates carry design, menus and pages as data. Four built-ins, live preview, import and export.
Anthropic, OpenAI, Google, xAI or anything OpenAI-compatible. Metered, encrypted at rest, never locked in.
Bun and Hono on SQLite. No database server, no PHP. docker compose up and you own the whole stack.
Watch an agent work
This is an MCP session against a Wove site. The agent never touches a database — it calls the same tools the admin calls, inside the scopes you gave its key.
Launch a pricing page and link it in the nav.
→ ai.generatePage { "prompt": "pricing page, three tiers", "slug": "pricing" }
✓ page draft created · 6 blocks · validated against the block schema
→ block.validate { "blocks": [ hero, stats, faq, cta, … ] }
✓ ok · 0 errors
→ menu.set { "location": "primary", "items": [ …, { "label": "Pricing", "href": "/pricing" } ] }
✓ menu updated · primary · 5 items
→ post.publish { "id": "pg_8f21" }
✎ awaiting review · key scope is content:write, not content:publish
Queued in Content → Pending review. An editor approves it, and every line above
is already in the audit log — attributed to launch-bot, via MCP, with its arguments. Get started
Deploy the single container, or clone the repo and run it locally. No database server, no PHP, no build step for the public site's HTML.
export WOVE_SECRET=$(openssl rand -hex 32)
export WOVE_SITE_URL=https://your-domain.example
docker compose up -d Core, the admin at /admin and the public site behind one port. Update with docker compose pull && docker compose up -d.
{
"mcpServers": {
"wove": {
"url": "http://localhost:4000/mcp",
"headers": {
"Authorization": "Bearer wove_…"
}
}
}
} In the admin: Agents → New agent, pick scopes, copy the key. Full guide in the README.
Questions
Yes. Wove is Apache-2.0 and the open-source core is complete on its own — self-host it forever with no feature gates. A hosted edition at usewove.com is planned for zero-ops hosting, managed agent access and optional metered AI; it adds operations and tenancy, never features. AI is bring-your-own-key, so any model spend is yours and goes to your provider, not to us.
No. Posts are stored as Markdown, but you write them in a WYSIWYG editor — with a raw-Markdown toggle if you want it. Pages aren’t Markdown at all: they’re typed block documents you assemble in a visual builder, or generate from a prompt.
Yes. Export everything from WordPress (Tools → Export → All content) and import the WXR file in Wove. Posts, pages, media, tags, menus, featured images and Yoast/RankMath SEO come across as a background job with a per-item report. Media is downloaded through the normal pipeline so it gets WebP renditions, links and image URLs are rewritten, Gutenberg markup becomes clean Markdown, and re-runs are idempotent. Unsupported shortcodes and missing attachments are reported as warnings, never fatal.
Anthropic (Claude), OpenAI (GPT-5 family), Google (Gemini), xAI (Grok), and any OpenAI-compatible endpoint — Ollama, LM Studio, OpenRouter. You bring the key; it’s encrypted at rest and never returned by the API. Every call is metered — tokens, model, who, through what — so you can see usage. Wove records it; it never prices it.
In the admin, create an agent, pick its scopes (content:write, ai:use, …) and copy its key. Point any MCP client at /mcp with that key as a bearer token and it discovers every tool the admin has, each with a JSON schema and a description. Anything that doesn’t speak MCP can POST to /api/tools/<name> instead. Either way, scopes are enforced at the tool boundary and every call lands in the audit log.
Clone it, run it, point an agent at it. If you don't like it, you still have every post you imported — in Markdown, on your own disk.