Architecture
Core Thesis¶
An operating system is just a human doing things. Reading files, writing notes, thinking about problems, searching for information. These are human capabilities first. Tools are optional accelerators.
EmptyOS works at every level:
| Level | What | Examples |
|---|---|---|
| Autonomous | Scheduled agents, event-driven automation | Cron jobs, file watchers |
| Smart Tools | LLM for thinking, semantic search | OpenAI, Ollama, Claude |
| Basic Tools | File I/O, grep, cron | Filesystem, ripgrep |
| Human | You read, you write, you think | Always the final fallback |
Three Layers¶
┌─────────────────────────────────────────────┐
│ Apps (62, all first-class) │
│ capture search journal expense task │
│ assistant music-studio jobs finance ... │
├─────────────────────────────────────────────┤
│ Platform Runtime │
│ Services: vault watcher, scheduler, │
│ real-time WebSocket, workers │
│ Libraries: frontend (theme + components) │
│ Connectors: ollama, comfyui, voice-api │
├─────────────────────────────────────────────┤
│ Kernel │
│ Config, 7 Capabilities, EventBus, │
│ ServiceRegistry, AppLoader, PluginLoader │
└─────────────────────────────────────────────┘
Kernel — config, capabilities with provider chains, event bus, service registry, loaders. Human is always the final fallback.
Platform Runtime — shared infrastructure: services (always-running), libraries (imported), connectors (external adapters).
Apps — everything user-facing. All apps share the same manifest format and lifecycle. A capture app and a music studio are both apps — the difference is what they declare in their manifest.
7 Capabilities¶
Every app accesses the world through capabilities, never direct tools:
| Capability | Providers | Purpose |
|---|---|---|
| think | ollama, openai, claude-cli, human | LLM reasoning |
| read | filesystem, human | Read files |
| write | filesystem, human | Write files |
| search | grep, human | Find content |
| speak | voice-api | Text to speech |
| listen | whisper | Speech to text |
| draw | comfyui | Image generation |
Provider chains try each provider in order. If Ollama is down, fall back to OpenAI. If that fails, ask the human. Apps never know which provider answered — they just call self.think().
The App Model¶
An app = manifest (TOML) + backend (Python) + UI (HTML). Every app declares what it needs:
[app]
id = "myapp"
name = "My App"
[requires]
capabilities = ["read", "write", "think"]
apps = ["task", "journal"]
[provides.web]
prefix = "/myapp"
[provides.events]
emits = ["myapp:done"]
class MyApp(BaseApp):
data = await self.read("file.md")
result = await self.think("Analyze this", domain="code")
tasks = await self.call_app("task", "list_tasks")
await self.emit("myapp:done", {"key": "value"})
Event Bus¶
Apps communicate through events, not imports. When you capture a note tagged #dev, the capture app emits capture:saved. The projects app listens, routes it to the right project. The reactor app chains events into journal entries.
One action ripples to all related vault files. The system knows what happened — it writes it down.
Vault as Hard Drive¶
The vault is an external markdown folder mounted via config. Two storage domains:
| Domain | What | Where |
|---|---|---|
| Vault | User knowledge — journal, contacts, projects, expenses | External markdown files |
| data/ | Machine telemetry — event history, billing, sessions | SQLite/JSON |
If a human wrote it or needs it after reset → vault. If the system generates it at high frequency → data/.
Every vault note has three data layers:
- Frontmatter — structured, indexed, queryable (
tags,status,company) - Sections — semi-structured (
## Timeline,## Tasks) - Prose — unstructured, human-written, LLM-summarizable
Apps query by tag via vault_query(), read sections on demand, and pass prose to LLM when understanding is needed.
Self-Awareness¶
EmptyOS has a built-in integrity audit that scores 13 dimensions: 9 design principles, the Six Verbs metabolic cycle, plus security, privacy, and scale. A growth agent runs daily, a root agent reviews weekly. The topology graph at /topology visualizes all 62 apps and their connections in real time.