Praxis is a standalone, self-evolving personal AI agent framework written in Rust.
It is designed to be self-hosted, private by default, and shaped around one operator instead of a generic user profile. The long-term goal is not to build another chatbot. The goal is to build an always-on personal agent that learns, develops capabilities, and becomes genuinely irreplaceable over time.
The reference implementation is Axonix. Praxis is the framework extraction of those ideas into a reusable codebase.
This repository is in the early foundation milestones.
Implemented so far:
- Rust crate scaffold with a library-first structure
praxisCLI withinit,run --once,status, anddoctor- TOML config loading and validation
- Cross-platform data directory handling for Linux and macOS
- Resumable session state with the
orient -> decide -> act -> reflect -> sleeploop - SQLite-backed session storage
- Context budget configuration and deterministic budget allocation
- Hot/cold memory tables with SQLite FTS-backed search
- Memory loading for orient-time context assembly
- Markdown-based identity and goal files
- Deterministic offline tests
- GitHub Actions verification for formatting, tests, compose validation, and Docker smoke builds
- Dockerfile and
docker-compose.ymlfor containerized runs
Not implemented yet:
- Live Claude integration
- Messaging platforms
- Memory consolidation and decay
- SSE/dashboard consumers
- Watchdog updates
- Reviewer sub-agents and success-criteria execution
Initialize a local Praxis data directory:
cargo run -- --data-dir ./local-data init --name "Praxis" --timezone UTCRun one session:
cargo run -- --data-dir ./local-data run --onceInspect the current state:
cargo run -- --data-dir ./local-data statusValidate the setup:
cargo run -- --data-dir ./local-data doctorPraxis is meant to stay runnable in Docker from the start.
Initialize container data:
docker compose run --rm praxis-initRun one session in Docker:
docker compose run --rm praxis-runCheck status:
docker compose run --rm praxis-statusThe compose setup binds ./docker-data to /var/lib/praxis in the container so state persists across runs.
The current codebase is organized around small modules with a preference for keeping Rust source files under 250 lines.
src/cli.rs: CLI surface and command dispatchsrc/config.rs: typed config schema and validationsrc/paths.rs: data directory and path resolutionsrc/state.rs: persisted session checkpoint statesrc/context/: budget engine and local context assemblysrc/identity/: markdown identity and goal parsing/policysrc/memory/: memory types and loading logicsrc/storage/: SQLite session persistencesrc/loop/: runtime loop orchestrationtests/cli.rs: end-to-end CLI coverage
The broader Praxis vision includes:
- hot and cold memory tiers
- context budgeting and handoff notes
- tool registry and approval queues
- messaging interfaces
- dashboard and SSE streaming
- reviewer sub-agents
- a watchdog-managed update path
The detailed design and long-form architecture notes live in PRAXIS_DESIGN.md.
Run formatting and tests locally:
cargo fmt
cargo testGitHub Actions runs cargo fmt --check, cargo test --locked, docker compose config, and a Docker smoke build on pushes to main and on pull requests.
- One instance per person
- Privacy by default
- Self-hosted over hosted
- Single binary deployment
- Irreplaceable usefulness as the end goal
Praxis is theory becoming action.