██████╗ █████╗ ███████╗████████╗██╗ ██████╗ ███╗ ██╗ ██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║██╔═══██╗████╗ ██║ ██████╔╝███████║███████╗ ██║ ██║██║ ██║██╔██╗ ██║ ██╔══██╗██╔══██║╚════██║ ██║ ██║██║ ██║██║╚██╗██║ ██████╔╝██║ ██║███████║ ██║ ██║╚██████╔╝██║ ╚████║ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
# One agent for your whole life — health, work, money, projects — that stays useful for years without becoming unreviewable, irreversible, or owned by a vendor. # Most agents ask for the keys. Bastion never needs them.
Every fact has provenance, validity, and a lifecycle. Inspect where it came from, correct it, or revoke it — chat history is not unquestionable truth, and a "profile" never silently becomes policy.
Incoming content is classified by trust. Public messages and email are untrusted; WhatsApp is signature-checked; unknown senders rejected. No "the model saw it, therefore do it" path.
Sessions, memory, personas, companion and secrets live in your deployment — one directory holds all of it. Move the whole instance to a new machine, or just back it up, without a migration project. Your providers, your subscriptions — credentials never enter agent memory.
Work priorities shouldn't erase health goals. Personas, goals and memories stay distinct per life area while informing one person-level assistant. Context without collapse.
Cabinet mode convenes named personas to deliberate, preserves dissent, and returns a synthesized recommendation. Priorities made explicit and revisable — never flattened into one agreeable voice.
Declarative, WASM and subprocess extensions plug into a capability-bounded host — installing one grants nothing by default. Self-improvement is approval-gated: skill candidates queue for your sign-off.
Not an illustration — the runtime's real architecture. External content enters through quarantine and gains authority only with your signature. One gate.
The Keeper lives in the TUI — pixel art on Kitty, WezTerm, Ghostty, iTerm2. /pet game on turns healthy breaks and finished work into cosmetic progression.
██████╗ █████╗ ███████╗████████╗██╗ ██████╗ ███╗ ██╗ ██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║██╔═══██╗████╗ ██║ ██████╔╝███████║███████╗ ██║ ██║██║ ██║██╔██╗ ██║ ██╔══██╗██╔══██║╚════██║ ██║ ██║██║ ██║██║╚██╗██║ ██████╔╝██║ ██║███████║ ██║ ██║╚██████╔╝██║ ╚████║ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
Install the plugin and the coding agent you already use gets your persona, memory, goals and companion. Claude Code keeps running the model and the tools; Bastion supplies who it is and what it may do. Local-only memory never leaves the machine — it fails the same egress check as everything else. If the daemon isn't running, the hooks stay silent and Claude Code behaves as if the plugin weren't there.
A remote rule opens an approval on every surface at once and waits. Approved means allow, denied means deny, and no answer falls back to the host's own prompt — silence never approves.
$ claude plugin marketplace add ./integrations/claude-code $ claude plugin install bastion@bastion
Run the first line from a clone of the repo. This connects Claude Code to your running Bastion. No Bastion running? See the Bastionizer below.
Six skills and one standard-library Python script make Claude Code, Codex or any agent that reads skills work the Bastion way: personas per life area, local SQLite memory (FTS5 and a knowledge graph), search over past conversations, reminders, skills the agent writes and improves itself, the Cabinet, and a status-line companion. Everything stays in ~/.bastion. No server, no background process, no network.
$ claude plugin marketplace add ./extras/bastionizer $ claude plugin install bastionizer@bastionizer
Run the first line from a clone of the repo. Other agents: copy the skills folders into their skills directory.
Web app. Sessions, approvals with a countdown, persona switch, paired devices.
Mobile app. The same buddy view in your pocket — approve or deny where you are.
Terminal UI. Ctrl+Y approves, Ctrl+N denies, /agents shows who is doing what. The Keeper raises its hand.
Desktop tray. Notifications and approve / deny from the tray, with no one-click approve unless the call is shown whole.
CLI. bastion presence status | approve | deny — scriptable, and the same contract as the rest.
GeekMagic SmallTV Ultra / Pro. Reference firmware shows persona, sessions and approvals. The Pro approves by touch (off by default).
$ curl -fsSL bastion.run | sh
Bootstraps the full stack. Inspect the script first if that's your style — it preserves an existing .env and never prints generated credentials.
$ git clone \ https://github.com/thewaifucorp/bastion-agent.git $ cd bastion-agent && ./installer.sh $ bastion # opens the TUI
bastion finds or starts the local Compose runtime and opens the TUI — Keeper included.