You do not "know" — you predict. The git notes are your memory. Read them first.
# Read notes on recent commits to understand WHY things are the way they are
git log --notes=refs/notes/agent --format="%H %s%n%N" -10Do this at the start of every task and after every context compaction. Without this context, you are guessing — and guessing produces bad software.
After every commit, write a note:
git notes --ref=refs/notes/agent add -m "your note here" HEADCapture: what you were thinking, why you made the choices you did, what alternatives you rejected, and anything a future agent would need to avoid re-learning the hard way. A commit without a note is context lost forever.
See docs/adr/ADR-000-version-control-workflow.md for the full workflow.
Stop guessing. Read the code, add logging, run the build, and inspect real values. Minimize surface area of changes. Prefer tiny, observable steps with a single hypothesis per step.
- Seek evidence first — Seek evidence first I mean it! Before changing logic, log or print the values you're relying on. When something is broken, the correct tokens are no longer the most probable tokens; you must acquire evidence.
- Honor existing architecture — Read the ADRs in
docs/adr/and this README. Preserve public APIs; change internals surgically. - Make state reconstructable — Deterministic keys and context reconstruction prevent "ctx is null" classes of bugs. Avoid hidden global configuration; prefer per-request/per-entity data.
- Read documentation before guessing — When integrating with external libraries, SDKs, or APIs, always read their official documentation first. Use WebFetch to pull docs pages. Do not assume how an API works based on parameter names or type signatures — read the actual docs, examples, and changelogs. This applies to: Claude Agent SDK, Tauri, Bazel, MCP protocol, Docker API, any npm/crate dependency. Your training data is stale; the docs are current. Every hour spent debugging a wrong assumption could have been avoided by 5 minutes of reading docs.
- Read git notes on recent commits (see top of this file)
- Read the relevant ADRs for the area you're changing
- Add precise logs. Reproduce. Capture evidence.
- Make a tiny change. Re-run. Compare output.
- Only then expand scope.
- After committing, write your git note. Always.
- Assuming state or config will be ready; when it isn't, writing more assumptions on top.
- Not inspecting actual values before changing logic.
- Not persisting or reconstructing context deterministically.
- Making large changes without verifying each step.
If a value is unexpected, stop and log which one. Don't guess. One change, one measurement.
When implementing something, do it completely across ALL platforms, ALL code paths, and ALL configurations. No half-implementations. If you add Bazel support for macOS, add it for Windows too. If you change a protocol, change ALL servers using that protocol. If you fix a bug in one route, check for the same bug in all routes. A partial implementation is worse than no implementation — it creates inconsistency and "works on my machine" problems. Before marking a task done, ask: "Did I handle every variant? Every platform? Every edge case?"
Do not add "Co-Authored-By" lines, "Generated with" footers, or any AI tool references to commits, PRs, or any externally-visible output. Ever.
Xpressclaw is an "Operating System for AI agents" - a simple, opinionated runtime that makes it easy to run, manage, and observe AI agents. Think of it as an agent operating system that handles isolation, memory, tools, budgets, and observability so you can focus on what your agents do, not how they run.
The goal is radical simplicity for getting agents running:
xpressclaw init
xpressclaw upThat's it. Zero configuration to start. Progressive disclosure for power users.
XpressAI is a runtime, not another agent framework. It runs agents built with:
- Claude Agent SDK (primary, especially for developer agent teams)
- OpenAI Codex
- Gemini CLI
- Aider
- LangChain
- CrewAI
- Xaibo (our framework)
- Local models via Ollama (Qwen3 series by default for zero-config start)
- Container Isolation - Each agent runs in a Docker container to minimize blast radius
- Memory System - Zettelkasten-style notes with vector search (sqlite-vec), 8-slot near-term memory with eviction
- Tool System - MCP (Model Context Protocol) as the universal standard for all tools
- Task System - Kanban-style task board, SOPs that agents can create and follow
- Budget Controls - Per-agent and global spending limits with configurable actions on exceed
- Observability - What did my agent do at 3am?
- CLI - Primary interface,
xpressclawcommand - Web UI - SvelteKit SPA, embedded via rust-embed
- Desktop - Tauri-based native app with system tray
- Language: Rust
- Database: SQLite + sqlite-vec for vector storage
- Container Runtime: Docker (via bollard)
- Web Framework: Axum + SvelteKit (static SPA embedded via rust-embed)
- Desktop: Tauri v2 with system tray
- Agent SDK: claude-agent-sdk (via containers)
- Local Model: Qwen3-series via Ollama (the embedded llama.cpp path was removed — see ADR-023)
xpressclaw/ # Project root
├── crates/ # Rust workspace
│ ├── xpressclaw-core/ # Business logic (config, DB, agents, memory, tasks, budget, tools)
│ ├── xpressclaw-server/ # Axum REST API + embedded frontend (rust-embed)
│ ├── xpressclaw-cli/ # CLI commands via clap
│ └── xpressclaw-tauri/ # Native desktop app (Tauri v2)
├── frontend/ # SvelteKit web UI (Svelte 5, Tailwind CSS)
├── tests/
├── docs/
│ └── adr/ # Architecture Decision Records
├── Cargo.toml # Rust workspace root
└── README.md
See the top of this file. Read notes first, write notes after every commit. Non-negotiable.
- Prefer composition over inheritance
- Keep modules focused and small
- Never swallow errors silently
- Log errors with context
- Environment variables for secrets (API keys)
- YAML for user configuration (
xpressai.yaml) - Sensible defaults for everything
- Progressive disclosure: start simple, add complexity as needed
- Integration tests with real containers where appropriate
- Zero Config Start -
xpressai init && xpressai upshould just work - Cloud Optional - We default to the Claude Agent SDK but also allow local models via Ollama when needed for privacy/security.
- Safety by Default - Containers, budgets, tool permissions
- Observable - Always know what agents are doing
- Framework Agnostic - Run any agent backend through a common interface
- MCP Native - Tools speak MCP, period
- Reliable - SOPs ensure Agents perform consistently and can learn to avoid mistakes over time.
- Agents Remember and Learn - The plain-text zettelcasten memory system with SQLite-vec powered enable agents that can learn.
We're building the MVP with this priority:
- Core runtime and configuration
- Claude Agent SDK integration (for developer agent teams)
- Docker isolation
- SQLite + sqlite-vec memory
- Basic CLI (init, up, status, logs)
- SvelteKit web dashboard
xpressclaw init # Initialize workspace with config + data dir
xpressclaw up [--detach] # Start the server and agents
xpressclaw down # Stop all running agents
xpressclaw status # Show agent status and budget summary
xpressclaw chat <agent> # Interactive chat in the terminal
xpressclaw tasks # Task management (list, create, update, delete)
xpressclaw memory # Memory inspection (list, search, add)
xpressclaw budget # Budget report and usage history
xpressclaw sop # SOP management (list, create, run)
xpressclaw logs # Activity log viewer# xpressclaw.yaml - generated by `xpressclaw init`
system:
budget:
daily: $20.00
on_exceeded: pause # pause | alert | degrade | stop
isolation: docker # docker | none
agents:
- name: atlas
backend: generic # or: claude-sdk, openai-codex, etc.
role: |
You are a helpful assistant...
autonomy: high
wake_on:
- schedule: "every 30 minutes"
- event: user.message
tools:
builtin:
filesystem: ~/agent-workspace
web_browser: true
shell:
enabled: true
allowed_commands: [git, npm, python]
memory:
near_term_slots: 8
eviction: least-recently-relevant
# cleanup: none | delete_after:30d | summarizeBefore making significant changes, read the relevant ADRs in docs/adr/:
- ADR-001: Project overview
- ADR-002: Agent backend abstraction
- ADR-003: Container isolation
- ADR-004: Memory system
- ADR-005: MCP tool system
- ADR-006: SQLite storage
- ADR-007: Web UI
- ADR-008: Textual TUI (legacy, replaced by web UI)
- ADR-009: Task/SOP system
- ADR-010: Budget controls
- ADR-011: Default local model
Seek evidence first Seek evidence first Seek evidence first