Decision record · D003

What runs inside each bot container?

Aquila POC · decided 2026-09-16 by Bhavya (reviewed via this page) · status: locked

Each user's bot is one Docker container on a mini PC. The runtime choice decides density (how many bots per 16GB box), the ceiling on features, and how much of the 3–4 day window we spend fighting other people's code instead of measuring economics. The founding call's reference was OpenMausBot — an open-source Grok Bot clone.

Chosen: build our own minimal runtime (core/)

~600-line Python service — persona, chat loop, SQLite memory, cron routines, an LLM client that speaks to our metered gateway. Tiny by design. OpenMausBot remains the UX reference; nanobot stays as the fallback codebase and reference implementation.

Build our runtimePort OpenMausBotAdopt nanobotLimeBot-OSDaemoraOpenClaw itself
Verdictchosenrejectedfallbackrejectedrejectedrejected
What it isOur ~600-line Python service: persona + chat + memory + cron + gateway clientDays-old Mac-first local app; rides Claude Code / Codex / Grok desktop logins; Linux "coming"HKUDS ultra-lightweight Python agent framework; WebUI, channels, cron, MCP, memoryNode+Python agent; SOUL.md personas; Playwright; unofficial WhatsApp bridgeNode agent platform; 52 tools, 20 channels, OAuth integrations, vault; AGPL-3.0The heavyweight original developer agent ("Swiss army knife")
Idle RAM / bot~100–150MBunknown (likely heavy)~200–300MB500MB–1GB+ (Chromium, LanceDB)300–500MB+1GB+ (needs a Mac mini per user)
Density on 16GB (~12GB usable)15–20 bots?10–15≤8, often ≤5~8–12~2 — economics dead
Inference modelOur metered gateway, per-bot keys + ₹ budgetsRides personal CLI subscriptions — cannot ship to customersOpenAI-compatible — wireable to gatewayLiteLLM — wireable7 providers — wireableAPI keys — wireable but heavy
Runs on Linux/Docker today✅ by construction❌ Mac-first✅ documented✅ compose
Cron routines✅ APScheduler (we control IST timing)❌ none✅ built-in
Personas✅ persona.md, ours to shape✅ best-in-class UX⚙️ config-level✅ SOUL/IDENTITY/MOOD.md⚙️
What we'd still buildeverything (that's the point)fork maintenance of a 1-day-old project + replace its brainmanager, metering, micrositesslimming it down; WhatsApp ban riskAGPL network-copyleft review; slimming
License / riskours · LOWyoung project · HIGH for 3–4 daysopen · LOW‑MEDopen · MED‑HIGHAGPL-3.0 · MEDopen · FATAL to density

Why the alternatives lost

OpenMausBot port — rejected

  • Mac app that expects your personal Claude/Codex/Grok login on your desktop — that auth model cannot serve thousands of customers, whatever we do.
  • Days-old codebase; Linux support "coming"; porting + re-braining inside the POC window is a gamble with no upside that a minimal build doesn't give us.
  • Kept as UX reference (bot-per-contact shape, approval cards, persona roster) — and its one-click pack install format becomes our marketplace blueprint.

LimeBot / Daemora / OpenClaw — rejected

  • Chromium-class footprints (300MB–1GB+) destroy the ₹250 math: they halve or third density.
  • LimeBot's WhatsApp bridge = ToS violation, number bans within weeks.
  • Daemora is AGPL — hosting it as a service obliges open-sourcing our platform.
  • OpenClaw per the founding call already needs a Mac mini per user (~2/box) — the exact economics the POC must beat.

What the chosen runtime must hit

Image ≤180MB · idle ≤180MB RAM · /chat SSE streaming · SQLite memory with FTS5 recall · routines on IST schedules · only four tools (web_search, web_fetch, imap_read, calculator) · every LLM call through the gateway with a per-bot virtual key. Contract: AGENTS.md §2.2.

Full rationale in DECISIONS.md (D003). Sibling comparison: LLM supply.