Layers and the blueprint
The layers #
| Layer | What it is | Runs where | Today |
|---|---|---|---|
| Core | Dashboard (HQ, page, AI chat), account, versions | Inside Zvessa | Dashboard, versions, sign-in |
| Features | Engines a workspace switches on | Inside Zvessa | None yet |
| Blocks | Ready parts, configuration only | Inside Zvessa | 10 + 3 HQ blocks |
| Apps | Custom logic: AI-made mini-apps, developer apps | Sandbox (WebView / iframe) | Mini-apps |
| Styles | Looks as settings (docs/STYLES.md) | Inside Zvessa | Classic, Futuristic, own styles, page looks |
| Templates | Ready-made blueprints | Data | The default starter |
| Capabilities | MCP, API keys, HTTP, jobs | Server only | Planned |
Quick test for something new:
- Filled in and placed → block
- Its own engine that the server must run (data, games with rules, payments) → feature
- Custom logic someone else writes → app
- An outside service → capability
The blueprint #
One JSON document per workspace (convex/lib/blueprint.ts):
{
"identity": { "name": "My space" },
"words": { "chatTitle": "AI", "approve": "Approve" },
"look": { "style": "futuristic", "scheme": "system", "changes": { "colors": { "accent": "#22c55e" } } },
"styles": [{ "id": "paper", "name": "Paper", "extends": "classic", "type": { "body": "serif" } }],
"dashboard": { "panes": [{ "kind": "page", "page": "hq" }, { "kind": "page", "page": "home" }, { "kind": "chat" }] },
"pages": [{ "id": "home", "title": "Home", "blocks": [{ "id": "hello", "kind": "heading", "props": { "text": "Hello" } }] }],
"apps": [{ "id": "snake", "name": "Snake", "html": "<canvas>…</canvas>" }]
}
Changes are JSON Patch ops (add, replace, remove). Every applied change is checked (checkBlueprint) and saved as a version, so undo is "restore version N".
Three ways in #
- HQ: screens that edit parts of the blueprint.
- The AI: proposes a patch, the person approves.
- The API / MCP server (later): the same propose and approve, under the same permissions.