I build small, composable tools for AI agents and the machines they live on: MCP servers, memory systems, model gateways, media infrastructure, and terminal-first workflows across Linux and Android.
I tend to favour boring interfaces between interesting systems: shell commands, HTTP, MCP, SQLite, systemd, Unix sockets, and files that remain understandable when the shiny layer changes.
- runlet — let an AI assistant run shell commands on your machine through a tiny Cloudflare Worker, without an inbound port or a local agent runtime.
- agent-media — the agent audio/media stack: speech, TTS engines, whole-house playback, Audiobookshelf, visual output, voice input, and MCP control across Linux and Termux.
- agent-memory — persistent long-term memory for assistants, with storage/retrieval, memory policy, consolidation, recall signals, and dreaming/reflection.
- meridian — bridge a Claude Max subscription into OpenAI-compatible and third-party agent workflows.
- astrotunes — choose music from transit astrology, time of day, mood, weather, and what you're doing.
- mopidy-mpv — a Mopidy backend that hands playback to external mpv over JSON-IPC for robust yt-dlp/YouTube playback.
The projects are increasingly split by responsibility rather than by assistant: model access, execution, memory, history, workspace UX, personas, and media can change independently and meet through coarse interfaces.
That means ChatGPT, Claude, Pi, OpenCode, local models, or whatever turns up next can share the same underlying tools without one harness becoming the centre of the system.
Terminal-first: tmux, Neovim/Emacs, org-mode, Termux on Android, and a small fleet managed with Ansible and dotfiles. I like self-hosting, open source, and software that can explain what it is doing without requiring an archaeology team.



