- Postgres, pgvector
- Memories, their versions, entities, relationships, evidence, conflicts, Space membership and the vectors are one database. A memory and its embedding in two systems with no transaction between them drift apart, and nothing notices until an answer cites something that no longer says that.
- Redis
- The job queue and the shared rate-limit counters. Without a shared store the configured limit is silently multiplied by however many processes are running, and nobody can say what the real one is.
- Seven job kinds
- Ingest, OCR, extract, consolidate, embed, event and maintenance — each with its own timeout and its own concurrency, because what a job contends for differs per kind and is invisible from the queue. A kind is added when a handler exists to run it, never before.
- Several model providers
- Calls rotate across providers and across accounts within them, so one vendor being unavailable is a slower answer rather than an outage. Intent is classified deterministically — by pattern matching rather than by a model call — so a provider outage does not sit in front of every question that gets asked.
- Blob storage
- Original files. References travel through the queue as keys and never as signed URLs, because a URL with a grant baked into it outlives the grant once it is sitting in a dead-letter row.