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.

v0.0.40 · shipping AGPL-3.0 Python 3.12 self-hosted
  • 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.

  1. 01

    Extract

    Local models read unseen messages and propose memories. Raw input is committed first, so a failed model never loses a conversation.

  2. 02

    Promote

    Candidates earn their place by confidence. Contradictions replace priors atomically; nothing drifts silently.

  3. 03

    Recall

    Hybrid, audited retrieval: vectors plus BM25, ranked by Qdrant but authorised only by MariaDB. Time-aware, and also run on tool results.

  4. 04

    Pin

    Every pinned memory reaches every model call. Compaction is verified claim by claim before it's accepted.

the turna bounded briefing,
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.

  1. 01Authored persona
  2. 02All pinned memory
  3. 03Learned traits
  4. 04Cognitive state, with uncertainty and counter-evidence
  5. 05Situational stance
  6. 06Time and timezone
  7. 07Hybrid-retrieved memory
  8. 08Project instructions
  9. 09Skill summaries
  10. 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.

  1. Wake idle, one-shot or periodic, with cooldowns
  2. Snapshot memory, persona and cognitive state
  3. Reflect beliefs, goals, commitments, relationship
  4. Validate a typed plan, committed atomically
  5. Gate intents value, interruption, freshness, duplication
  6. 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 defaultselfself_hybridalwaysnever

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


wasmtimezero imports
  • Signal
  • WhatsApp
  • 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_process

Background commands; a finished job wakes her for a follow-up turn.

manage_files

Read and write on the host she runs on.

manage_web

Search and fetch.

manage_mcp

Any MCP server you configure.

manage_memory

Search, create and review her own record.

manage_messages

Reach you on any connected channel.

manage_automation

Durable cron and one-shot schedules.

manage_tasks

Delegated work that outlives the conversation.

manage_skills

Filesystem skills, disclosed progressively.

manage_astra

Opt-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.

Astra Companion on iPhone

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.

Astral overview dashboard Astral automations: runs over time and per-automation stats Astral approvals view

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

ConcernPrompt-centric agentVector-memory chatbotAstra
PersonaLarge mutable promptPrompt textFixed identity, versioned adaptive traits
MemoryTranscriptNearest chunksEvidence with provenance
Between chatsNothingNothingScheduled reflection
ApprovalYes/no or noneRarePlain-language, per call
ContextGrows with historyChunk injection10 ordered layers, bounded
IntegrationsAd hoc pluginsWebhooksHash-pinned, zero-import WASM
OwnershipOften SaaSOften hostedSingle 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.