Anima is an AI-powered life-management system that unifies tasks, moods, habits, goals, journaling and skills in one workspace. The problem it goes after is the one most of us live with: productivity lives in one app, mood tracking in another, habits in a third, and none of them see the full picture. An AI coach that can only read your to-do list gives you to-do-list advice. One that can also see that you've slept badly for a week and that your "ship the release" goal is three days behind gives you something closer to a real answer.
That cross-domain reasoning is the whole point of Anima, and it's also the hard part. This post is about how I built it, the architecture decisions that mattered, and where the project actually stands — which is pre-launch, private beta, not live.
Cross-domain intelligence, on a schedule
The naive version of "an AI that knows you" is to dump everything into a context window at request time and hope. That's slow, expensive, and the model drowns in raw rows.
Anima takes a different path. A Celery pipeline runs every four hours and builds a UserContextSnapshot per user — a merged, summarized view of tasks, moods, habits, goals and journal entries. By the time you talk to the coach, the heavy lifting of "what's going on in this person's life right now" is already done and compact. The chat path reads a snapshot, not a thousand database rows.
This is the difference between per-feature tracking and actual coaching. A habits app can tell you that you missed three workouts. Anima can connect that the missed workouts line up with a mood dip and a stalled goal, and surface it as one insight instead of three disconnected notifications.
RAG that would rather say "I don't know"
The fastest way to destroy trust in a personal AI is to have it confidently make something up about your own life. So abstention is a feature, not a fallback.
Anima's retrieval layer is RAG v2: BM25 for lexical matching, vector search for semantic similarity, fused with Reciprocal Rank Fusion, then a rerank pass, then citation. Every insight is grounded in retrieved context, and every generated insight passes through an EvalGate before it reaches you. If the model can't ground a claim well enough, the gate blocks it. The system would rather show nothing — or an explicit "not enough signal yet" — than invent a pattern that isn't there.
I wrote about the general pattern in RAG that refuses to hallucinate, because it's the same backbone I reuse across several products. In Anima the stakes are personal, which makes the abstention behavior matter more, not less.
The cost-aware LLM gateway
Running an AI coach that's always on gets expensive fast if every request hits a frontier model. Anima routes through a multi-provider gateway sitting in front of OpenAI, Anthropic and Google.
The routing rule is boring on purpose: cheap default models handle the high-volume, low-stakes work — summaries, quick replies, the snapshot pipeline. Premium models are gated behind the requests that justify them, like deep analysis where reasoning quality actually changes the answer. Having three providers behind one interface also means a single provider outage or price change doesn't take the product down or blow the budget. The gateway is where cost discipline lives, instead of being smeared across every call site.
On top of that sits the coach itself: streaming responses over SSE, a Memory v2 layer split into episodic and semantic memory, and realtime voice over WebSockets. PII scrubbing is on by default, and the whole thing is gated behind beta invites and feature flags.
The anti-AI-slop mandate
Anima has an explicit founder rule that shaped a surprising amount of the work: no fake metrics, no stock art, no emoji CTAs, hold a Linear/Stripe-quality bar. It sounds like a design preference. In practice it's an engineering constraint.
"No fake metrics" means the product can't show you a confidence score it didn't actually compute, or a streak it's fudging. "No invented patterns" is the same instinct the EvalGate enforces in code. The bar applies to the AI's output as much as the UI — an AI that pads its answers with plausible-sounding filler is its own kind of slop. Building to that standard is slower. It also rules out most of the shortcuts that make AI products feel cheap.
There's a related product decision I held to: all 17 modules survive. The instinct under pressure is to cut scope. The call here was the opposite — more parallel agents working the build, not less product. Whether that was wise is something the launch will judge.
Adversarial self-review
The part I'm most glad I did: Anima's development uses an adversarial self-review culture, where three independent reviewer agents go looking for the things I'd miss. They earned their keep. Across the build they found and fixed a Cypher injection vulnerability, an IDOR (insecure direct object reference), and TOCTOU (time-of-check to time-of-use) race conditions.
None of those are exotic. They're exactly the bugs a solo founder moving fast ships without noticing, because the happy path works and the demo looks great. Having reviewers whose only job is to assume I got it wrong caught real, exploitable issues before any of them reached a user. I lean on a version of this across everything I build, which I get into in my AI-assisted solo dev workflow.
The stack
Anima is a web-first app.
- Frontend: Next.js 15, React 19, TailwindCSS v4, Zustand, TanStack Query, TipTap for the editor, Framer Motion.
- Backend: Django 5.2 LTS with DRF, Celery 5.4 for the snapshot pipeline and async work, Channels/Daphne for WebSockets.
- Data & AI: PostgreSQL 16, Redis 7, ChromaDB with LangChain for retrieval, plus the multi-provider LLM gateway.
- Auth/DB: Supabase.
- Infra: bare-metal Ubuntu behind Nginx and systemd, Cloudflare in front, Sentry for errors, gitleaks and Playwright in CI.
The shape is deliberate: Django and Celery do the durable, scheduled, server-side work; Next.js owns the experience; the AI layer is a service the rest of the app calls, not the thing the app is built around.
Where it's at, and what's next
Honest status: Anima is an MVP in private beta. The landing page says it plainly — "Private beta · Invite-only · 2026" and "No public signup yet." App version is 0.1.0. It is not live, and I'm not going to pretend otherwise.
What's done: waves 0 through 6, with 469 Playwright tests covering the surface. The product is feature-complete-ish — the 17 modules are in, the snapshot pipeline runs, the coach works, the security review caught the worst of the bugs.
What's not: the founder handoff doc still lists unresolved pre-deploy blockers, and I haven't confirmed a clean production deploy. The target for public beta is 2026-08-03. Between here and there is the unglamorous work — closing those blockers, hardening the deploy, and putting Anima in front of real users to find out whether cross-domain coaching feels as useful as it does in my head.
Anima is one of 11 products I'm building as a solo founder. If you want to know when the public beta opens — and read the postmortem on whether any of this held up — subscribe to the newsletter.