Astra

The companion that knows you. A personal AI companion that runs on your hardware: coherent, accountable, and private by default.

open source Python 3.12+
Illustrated portrait of Astra

A different kind of agent

Most AI agents are someone else's cloud, someone else's memory, someone else's rules. Astra is yours. It runs locally, remembers durably, and separates five concerns that most agents collapse together: persona (who it is), memory (what it knows), conversation (what you're asking), tools (what it can do), and policy (what's allowed). That separation is the source of everything else.

What runs today

One local daemon

Astra runs as one single-user FastAPI daemon: OpenAI-compatible Chat Completions and Responses APIs, streaming, model aliases, durable jobs, and a tool-using agent loop. MariaDB, Qdrant, local model services, and the chosen model provider remain independent services managed by the owner.

Durable cognition

Astra separates authored persona, pinned facts, approved memory, current conversation, stance, skills, and revisable cognitive state. Each turn receives a frozen, bounded context snapshot rather than an unbounded transcript.

Built to keep track

Astra stores conversations, memory provenance, persona versions, durable work, and cognitive state in MariaDB. Qdrant is a retrieval index, never the authority. Raw input is committed before optional downstream processing, so model, embedding, or index failure does not erase the conversation that caused it.

A scheduled reflection loop maintains bounded, revisable beliefs, goals, commitments, relationship state, and persona dimensions. It reads a structured snapshot, proposes typed changes, and application code validates and commits them atomically. Reflection is not a second agent with ambient tool access.


Thoughtful, close to the work

Astra is not a distant dashboard or an abstract glow. She is designed as a present working intelligence: attentive to the ongoing thread, able to remember the important details, and deliberate about what she acts on.


What sets it apart

Memory you control

Every memory has source provenance. You can inspect, promote, reject, replace, and delete records. Candidates stay excluded until approved. Contradictions replace priors atomically — no silent drift. MariaDB is always the authorization authority; Qdrant only ranks what's already authorized.

Runs on your hardware

astra-core is a single Python process. No Docker, no containers, no cloud dependency. Install it on macOS or Linux, point it at your MariaDB instance, and you're running. Your data never leaves your machine unless you choose to send it to a model provider.

Persona that doesn't drift

The authored persona core is versioned, auditable, and immune to automatic memory modification. Learned adaptations are attributable, inspectable, and reversible. Your agent stays who you designed it to be — not whoever the last conversation made it.

Your input is never lost

Raw messages persist before any optional processing. If memory extraction, Qdrant sync, or anything downstream fails, your input remains durable. Conversation latency is independent of local-model or vector database availability.

Bounded context, not unlimited prompt

Persona and memory are compiled into a bounded briefing — not an ever-growing transcript. This reduces model cost, improves coherence, and keeps sensitive context contained. Every pinned memory is included; ranked recall fills the remainder up to a hard budget.

Skills and connected tools

Filesystem-backed skills are progressively disclosed instead of flooding every prompt. Astra can use built-in filesystem, shell, process, HTTP, web search, memory, and conversation-search tools alongside explicitly configured MCP servers.


The core loop

1

User sends a message

Raw input is persisted immediately — before any processing. If anything fails downstream, your message is never lost.

2

Persona and memory are compiled

A bounded context briefing is assembled from the stable persona contract, authorized memory records (MariaDB), and conversation history — not an ever-growing prompt.

3

Conversation is orchestrated

The main model (OpenRouter) receives the compiled briefing. The agent reasons, decides what tools to invoke, and executes them directly on the host — no delegation control plane.

4

Tools execute locally

Built-in and MCP tools execute from the local daemon. Long-running commands have persisted lifecycle state, bounded output, and a tool-free completion follow-up in the original conversation.

5

Response is returned

Tool results — with provenance — are compiled into the final response. Memory extraction and indexing happen asynchronously after the response is sent, so conversation latency stays low.


A governed record, not opaque vectors

Raw Message Structured Extraction Candidate Review MariaDB Authority Qdrant Ranking Bounded Briefing
1

Every memory has provenance

Source message, extraction event, and lifecycle transitions are all recorded. You can trace why a memory exists — or who deleted it.

2

You control what stays

Candidates are excluded until promoted or explicitly high-confidence. You can inspect, reject, replace, and delete records. Contradictions atomically replace priors — no silent drift.

3

MariaDB is always the authority

Qdrant ranks memories but never authorizes them. Deleted records are immediately unauthorized even if vectors remain stale. This is true in both astra-core and astra-agent.

4

Persona is protected from memory drift

The authored persona core is versioned, auditable, and immune to automatic memory modification. Learned adaptations are attributable, inspectable, and reversible.


How it compares

ConcernPrompt-centric agentVector-memory chatbotAstra
PersonaLarge mutable promptPrompt textStructured stable kernel
MemoryTranscript / historyNearest chunksStructured records + provenance
Memory controlDelete historyOften coarseInspect, review, replace, delete
Retrieval authApplication-dependentVector filtersMariaDB authority + vector intersection
Runs locallyUsually cloudUsually cloudSingle process, no Docker
Context costGrows with historyChunk injectionBounded compiled briefing
ContinuityPer-sessionRetrieved fragmentsDurable jobs, processes, and reflection
IntegrationsAd hoc pluginsUsually webhooksHash-pinned sandboxed WASM
OwnershipOften multi-tenant SaaSOften hostedSingle owner, local daemon

Built with

astra-core

FastAPI · Python 3.12+ · OpenRouter (main model) · local models (memory extraction, reranking) · MariaDB (canonical state) · Qdrant (semantic retrieval) · Alembic migrations · OpenAI-compatible Chat & Responses endpoints

Memory & Context

Approved memory · hybrid recall · immutable turn snapshots · pinned-memory coverage · versioned persona · scheduled cognitive reflection

Automation & Integrations

Durable cron and one-shot automations · managed background processes · MCP · Teams presence and chat · Outlook review and threaded email · proactive delivery


Present where it matters

Teams

A delegated-user channel that polls a private chat, keeps a renewing availability presence, ingests supported inline media, replies in-thread, and can receive proactive delivery.

Outlook

A delegated inbox channel with raw-MIME authentication checks, an authorized-sender allowlist, threaded replies, review-only handling for untrusted mail, proactive email, and bounded attachments.

Sandboxed by default

Integrations are hash-pinned, import-free WebAssembly state machines. They have no direct filesystem, environment, database, process, socket, clock, or tool access; narrowly granted host brokers do the work.


Honest about the boundary

Astra is a single-owner system, not a hosted multi-tenant platform. Its main local tools run with the daemon user's permissions: there is currently no universal command allowlist, approval workflow, capability policy, or container sandbox. Run it under a dedicated account and decide deliberately what that account may reach.

The older astra-agent repository remains an open-source research prototype for a future distributed, multi-tenant architecture. It is not the current product, should not be treated as a supported installation, and its mTLS, remote-agent, Vault, and tenant-isolation claims do not describe Astra today.