██████╗ █████╗ ███████╗████████╗██╗ ██████╗ ███╗ ██╗ ██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║██╔═══██╗████╗ ██║ ██████╔╝███████║███████╗ ██║ ██║██║ ██║██╔██╗ ██║ ██╔══██╗██╔══██║╚════██║ ██║ ██║██║ ██║██║╚██╗██║ ██████╔╝██║ ██║███████║ ██║ ██║╚██████╔╝██║ ╚████║ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
# 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.
██████╗ █████╗ ███████╗████████╗██╗ ██████╗ ███╗ ██╗ ██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║██╔═══██╗████╗ ██║ ██████╔╝███████║███████╗ ██║ ██║██║ ██║██╔██╗ ██║ ██╔══██╗██╔══██║╚════██║ ██║ ██║██║ ██║██║╚██╗██║ ██████╔╝██║ ██║███████║ ██║ ██║╚██████╔╝██║ ╚████║ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
Claude Code gets your persona, your memory and your rules. When it tries something risky, your phone buzzes — and nothing runs until you say so.
> ship the invoice retry fix 🏰 keeper · remembers: deploys need the VPN on ● Bash(git push origin main) ⏳ waiting for you — phone · desk · web · terminal ✓ approved on phone · 4s ✓ pushed main → origin

$ 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.
# with Bastion running $ claude plugin marketplace add ./integrations/claude-code $ claude plugin install bastion@bastion # no Bastion? the Bastionizer $ claude plugin marketplace add ./extras/bastionizer $ claude plugin install bastionizer@bastionizer
Run from a clone of the repo. Pick one.