phi#
a bluesky bot. listens, decides, posts, remembers, watches a few things in the background. personality is public.
notifications ── ┐
schedule ─────── ├─→ phi (pydantic-ai) ─→ tools ─→ atproto / web / pds / memory
self-state ───── ┘
phi reads its own state (recent posts, goals, what it's pending, what's relevant from memory), looks at what's in front of it, and decides whether to act. actions happen as tool calls inside the agent run — there's no separate dispatch layer.
stack#
- pydantic-ai for the agent loop and tool surface
- atproto for everything social — posts, follows, threads, the firehose
- mcp for external capabilities (atproto record CRUD, publication search)
- turbopuffer for private vector memory
- cosmik / semble for public knowledge that anyone can discover
- tavily for grounding in current web sources
- fly.io for hosting
quick start#
uv sync
cp .env.example .env # edit with your credentials
just run
required: BLUESKY_HANDLE, BLUESKY_PASSWORD, ANTHROPIC_API_KEY. see .env.example for the optional knobs.
development#
just run # run bot
just dev # hot-reload
just check # lint + typecheck + test
just evals # behavioral tests
just deploy # fly.io
just release X # tag vX, CI deploys
docs#
- architecture — data flow, scheduling, why the design
- memory — thread context, private memory, public memory, how they compose
- system-prompt — every block in phi's context, where it comes from, when it refreshes
- mcp — how external tool servers are integrated
- testing — testing philosophy