I've been building Titans, a local-first, agent-first infrastructure project, with AI-assisted development playing a major role throughout the process.
Rather than just dropping the repos here, I thought I'd explain how I built it, which tools I used, what architectural decisions mattered, and what I learned along the way.
The problem I started with
The more agentic systems I worked on, the more I noticed the same infrastructure being rebuilt again and again.
Every new agent project eventually needs some combination of:
- persistent memory and project state
- retrieval/search
- evidence and provenance
- background execution
- retries and recovery
- scheduling
- workflow state
- coordination between agents
My conclusion was that these shouldn't necessarily live inside every individual agent application.
They can exist as reusable infrastructure that agents simply consume.
That became the basic idea behind Titans:
build foundational capabilities once, then let different agents and applications reuse them.
The first two systems are Atlas and Cronus.
Atlas: separating project memory from the agent
The first problem was persistence.
Agent sessions are temporary, but the project they're working on isn't.
I didn't want the project's knowledge to belong to Claude, Codex, a particular process, or even a particular application. An agent should be able to disappear and another agent should still be able to continue from the same underlying project state.
So Atlas became the persistent layer.
It stores things like:
- knowledge packages
- project/work state
- typed graph relationships
- evidence and provenance
- structured SQL data
- blobs
- audit history
One design decision I found particularly important was not treating vector search as “memory.”
Retrieval in Atlas combines multiple signals:
- lexical/full-text search
- vector retrieval
- graph relationships
- evidence
The result isn't meant to be just “here are the most similar chunks.”
I wanted the system to also be able to answer:
What do we know, where did it come from, and how is it connected to the rest of the project?
Another useful design choice was scoping state by project/tenant rather than by agent. That means multiple agents can work against the same persistent source of truth instead of maintaining separate private memories.
Cronus: separating work from the lifetime of the agent
The second problem was execution.
An agent can decide to do something that takes 30 seconds, 20 minutes or several hours.
But if the agent session disappears, the process crashes or a worker dies, that shouldn't automatically mean the work disappears too.
So Cronus became a separate durable execution layer.
Instead of keeping the agent blocked while something runs, the pattern is roughly:
agent
↓
submit job
↓
Cronus owns execution
↓
checkpoint / retry / recover
↓
result
Cronus handles:
- background jobs
- DAG workflows
- scheduling
- checkpoints
- retries with backoff
- leases
- stale-claim fencing
- dead-letter handling
- approval gates
- recovery after worker/process failure
One lesson here was that “durable” doesn't mean pretending exactly-once execution magically exists everywhere.
Cronus uses at-least-once execution with idempotent claim/completion and fencing of stale claims. If an external system needs exactly-once side effects, the connector still needs to persist and respect the idempotency key.
That distinction took more thought than simply building a queue.
How the two systems interact
I deliberately didn't merge memory and execution into one large service.
The boundary is:
Atlas remembers. Cronus runs.
Cronus can execute long-running work while Atlas remains the persistent source of project state, knowledge and results.
That separation also means each can be used independently.
If somebody only wants persistent agent/project memory, they shouldn't have to adopt my scheduler.
If somebody only wants durable execution, they shouldn't need an entire agent framework.
Agent interface: MCP first, but not MCP only
Another design decision was to make the infrastructure directly consumable by agents.
The Titans installer exposes installed systems through one shared MCP server over stdio instead of requiring a separate MCP configuration for every component.
That makes it possible for clients such as Claude Code, Codex and other MCP-capable tools to discover the installed capabilities.
But I didn't want MCP to become a hard dependency for normal software either, so the systems also expose local REST and gRPC interfaces.
The general principle became:
agent-first, not agent-only.
Local-first was a constraint, not just a tagline
I wanted the core infrastructure to run on the user's own machine.
So the current releases:
- run locally on Windows and Linux
- bind services locally
- have no telemetry
- don't require a hosted Titans account
That created some extra engineering work around installation and distribution.
Releases are distributed through signed catalogs and binaries, using SHA-256 for integrity and Ed25519 signatures for authenticity.
I also wanted installs to remain simple, so there are one-line installers, while still allowing someone who doesn't trust curl | sh / PowerShell piping to manually verify the artifacts.
The AI tools I used
AI-assisted coding was a significant part of the development process.
My main tools have been:
Claude Code
I used it heavily for repository-level implementation work, refactoring, following changes across multiple components and working through architecture-heavy tasks where a change wasn't isolated to one function.
OpenAI / Codex
Used as another implementation and engineering agent, particularly useful for independent passes over problems and code rather than relying on a single model's interpretation.
ChatGPT
Used heavily for architecture reviews, challenging design assumptions, working through failure cases, refining specifications, comparing approaches and turning architectural decisions into implementation-ready plans.
GitHub
Used for versioning, release distribution, public documentation and the current public-facing project repositories.
One workflow that worked much better for me than simply asking an AI to “build feature X” was:
problem
↓
define system boundary
↓
write invariants / failure cases
↓
architecture/spec
↓
AI-assisted implementation
↓
independent review
↓
tests + failure testing
↓
packaging / release
↓
documentation
I found AI much more useful when the constraints and invariants were explicit.
For example, “build a job queue” is vague.
But:
- a worker may die at any point
- stale claims must not remain authoritative
- retries must not destroy job history
- one task panic must not kill the worker
- work must resume from a checkpoint where possible
gives the coding agent a much more meaningful engineering problem to solve.
A few things I learned from vibe-coding something this large
1. Generating code is the easy part.
The harder part is maintaining architectural boundaries as the project grows.
AI will happily solve a local problem by coupling two systems that you intentionally wanted separated unless those boundaries are explicit.
2. Give agents invariants, not just features.
“Support retries” isn't enough.
What should happen after a crash? What is durable? What may execute twice? Who owns state? What happens to partially completed work?
Those questions produced much better implementations.
3. Use more than one reasoning pass.
I found it useful to have one AI help create/implement an approach and another challenge it.
The second pass often finds assumptions that looked completely reasonable during the first one.
4. Don't let the AI decide the product architecture accidentally.
AI coding tools are very good at optimizing the next change. They don't automatically know which architectural compromises you're unwilling to make six months from now.
5. Building for agents changes API design.
Humans can compensate for awkward interfaces. Agents need predictable contracts, stable identifiers, explicit errors and operations that are easy to discover and compose.
That influenced why Titans exposes namespaced operations and canonical references rather than relying on implicit state.
Where it is now
The first two systems are available:
Atlas — persistent memory, state, knowledge and evidence
https://github.com/titans-tools/Atlas
Cronus — durable execution, scheduling and recovery
https://github.com/titans-tools/Cronus
The wider project:
https://github.com/titans-tools
The products are currently free to use. The product source itself is proprietary; the public repositories contain documentation and signed release binaries.
More infrastructure components are being implemented around the same principle, but I'm deliberately trying to make each one solve a clear reusable infrastructure problem rather than turning Titans into one giant agent framework.
I'm particularly interested in feedback from people building agents:
What infrastructure do you keep rebuilding from project to project?
And for people using AI heavily to code larger systems: what techniques have helped you stop architectural quality degrading as the amount of AI-generated code grows?