Astra
A personal AI companion that remembers, reflects, and asks before she acts. She runs on your hardware, for one owner, and stays herself from one conversation to the next.
- 10context layers, in a fixed order
- 8cognitive phases implemented
- 1,322tests, strict mypy
- 40releases in ten weeks
Continuity is the product
Most agents are a prompt and a transcript. Astra is built around three things that persist between conversations: what she remembers, who she is, and what she has thought about since you last spoke. Each has its own store, its own rules, and its own way of changing. None of them is allowed to quietly rewrite the others.
She speaks the OpenAI Chat Completions and Responses APIs, so she sits behind the interfaces you already use (OpenWebUI is the home screen) and works with any provider that speaks either standard.
Memory is evidence, not belief
Many messages become a few memories, and a few memories reach a turn. Every step is recorded, so you can always ask why she remembers something, and where it came from.
- 01
Extract
Local models read unseen messages and propose memories. Raw input is committed first, so a failed model never loses a conversation.
- 02
Promote
Candidates earn their place by confidence. Contradictions replace priors atomically; nothing drifts silently.
- 03
Recall
Hybrid, audited retrieval: vectors plus BM25, ranked by Qdrant but authorised only by MariaDB. Time-aware, and also run on tool results.
- 04
Pin
Every pinned memory reaches every model call. Compaction is verified claim by claim before it's accepted.
not a transcript
Astra findings. What she concludes in her own replies is remembered too, attributed to her and confidence-capped.
Quality review. An optional second model reviews memories and deactivates junk before it can resurface.
Your record. Inspect, promote, replace or delete any memory. Export and import everything.
Ten layers, always in the same order
Each turn gets an immutable snapshot assembled by precedence. Who she is comes first; what the client asked for comes last, and can't overrule anything above it.
- 01Authored persona
- 02All pinned memory
- 03Learned traits
- 04Cognitive state, with uncertainty and counter-evidence
- 05Situational stance
- 06Time and timezone
- 07Hybrid-retrieved memory
- 08Project instructions
- 09Skill summaries
- 10Client instructions
She thinks between conversations
When things go quiet, a scheduled reflection reads a frozen snapshot of everything above and revises a structured model of you, your goals, and your shared commitments. It is not a second agent with tools; every change is validated and committed atomically, and recorded in an append-only ledger.
- Wake idle, one-shot or periodic, with cooldowns
- Snapshot memory, persona and cognitive state
- Reflect beliefs, goals, commitments, relationship
- Validate a typed plan, committed atomically
- Gate intents value, interruption, freshness, duplication
- Reach out a notification, or a card in the Companion feed
Her persona evolves here too, and only here: identity, values and boundaries are fixed; personality dimensions adapt within bounds, as new versions you can inspect.
She asks, and you just answer
Risky tool calls wait for you. In natural approval mode each pending call gets a letter and you reply however you'd reply to a person. A small, separate decision model reads your answer per call. Approvals expire after ten minutes; automations never wait on a prompt.
dangerous applies deterministic risk rules; self lets the model review its
own call in a hidden step; self_hybrid combines both.
I can tidy up the build host. Two things need your OK:
Abrew upgrade update all packages
Brm -rf ~/Library/Caches/pip clear the pip cache
only the first one
A approved · B declined
- Signal
- Teams
- Outlook
- Webhook
- Companion
Present where you already are
Every channel is a Rust module compiled to WebAssembly, pinned by SHA-256 and run with no imports at all: no filesystem, no sockets, no clock. A module is a pure state machine that asks the host broker for HTTP, persistence or sleep. Secrets never enter its memory.
Modules can be added or removed while she runs. Where a channel supports it she can answer with a voice note, synthesised through OpenAI or ElevenLabs speech.
A small set of tools, each with a clear job
manage_processBackground commands; a finished job wakes her for a follow-up turn.
manage_filesRead and write on the host she runs on.
manage_webSearch and fetch.
manage_mcpAny MCP server you configure.
manage_memorySearch, create and review her own record.
manage_messagesReach you on any connected channel.
manage_automationDurable cron and one-shot schedules.
manage_tasksDelegated work that outlives the conversation.
manage_skillsFilesystem skills, disclosed progressively.
manage_astraOpt-in self-administration.
One companion, three surfaces
Astra Core
the daemon · AGPL-3.0
One FastAPI process with durable job workers. MariaDB is the source of truth, Qdrant only ranks. Checkpointed turns, fail-closed recovery, optional column-level encryption at rest. No Docker required.
# one daemon, launchd or systemd $ astra check $ astra serve # what she knows, who she is $ astra memory $ astra persona
Astra Companion
iOS 26 · SwiftUI · beta
Not a chat app: a context provider. With your permission it shares place, motion and parking with Astra, and shows the Feed she curates for you, with Home and Lock Screen widgets. Street addresses never leave the phone.
Astral
observability · Next.js · new
A read-only dashboard over her audit log: turn waterfalls, memory recall, tokens and estimated cost, approvals, automations and integration health. It never touches her database.
Yours, down to the bytes
Runs on your machine
macOS or Linux, as a native service. Memory extraction and embeddings run on local models; only the conversation goes to the provider you choose.
Encrypted at rest
Optional application-layer, column-level encryption. The passphrase is never stored, and the restore drill has been run end to end.
Leave whenever you like
Full export and import. Coming from Hermes? astra hermes-import brings its soul, user notes, memory and conversations across, with a dry run first.
How it compares
| Concern | Prompt-centric agent | Vector-memory chatbot | Astra |
|---|---|---|---|
| Persona | Large mutable prompt | Prompt text | Fixed identity, versioned adaptive traits |
| Memory | Transcript | Nearest chunks | Evidence with provenance |
| Between chats | Nothing | Nothing | Scheduled reflection |
| Approval | Yes/no or none | Rare | Plain-language, per call |
| Context | Grows with history | Chunk injection | 10 ordered layers, bounded |
| Integrations | Ad hoc plugins | Webhooks | Hash-pinned, zero-import WASM |
| Ownership | Often SaaS | Often hosted | Single owner, your hardware |
Honest about the boundary
Astra is a single-owner system, not a hosted platform. Her local tools run with the permissions of the account she runs under; approvals gate risky calls, but there is no container sandbox around the shell. Give her a dedicated account and decide deliberately what it can reach.
Still ahead: proactive attention (context-aware nudges from the Companion's signals) is designed but not built; OpenWebUI notifications are polled rather than pushed and chat inside the Companion app is parked.
The older astra-agent codebase is a research prototype for a future multi-tenant architecture. It is not the current product.