Octopal, Tower, and RyanOS
Various iterations of personal assistant daemons and agent orchestrators
Octopal: https://github.com/RyanHecht/octopal#
Gripped by OpenClaw mania in early 2025, I wanted to make my own personal agentic assistant powered by the burgeoning GitHub Copilot SDK.
OpenClaw seemed very bloated and brittle given what I wanted for my own usecase, and I wanted to build on the amazing harness built by the Copilot CLI team.
Octopal is built around an ever-improving personal knowledge management “second brain.” Give it notes, brain dumps, or voice transcripts — it files them into your Obsidian vault using the PARA method and creates actionable tasks. Connects via CLI, Discord, or VS Code. Extend its capabilities via skills.
Learn more about its capabilities in the wiki.
Tower: https://github.com/RyanHecht/tower#
The Copilot SDK moved so quickly in early 2025 that custom features I added to Octopal became obsolete very quickly. After I ditched Octopal for a number of other short-lived experiments, each exploring different ways of sharing memory and communicating across sessions, I built Tower to be my main agent orchestration daemon. It runs copilot --headless and provides a small gateway server. Surfaces (TUI, web app, mobile app, Discord bot, …) connect to the
gateway over WebSocket with a static bearer token and drive Copilot agent
sessions. Each session has its own workspace directory under workspaces/.
The gateway also serves an HTTP API on the same port for webhooks, cron
management, and health probes.
┌─── HTTP (webhooks, crons, health)
Surfaces ── WS + bearer ──►│
└─── Gateway ── cliUrl ──► copilot --headless --port 4321
(Node, this repo) (the agent runtime)I also used this as a testing ground for OpenTUI as I experimented with new possible design directions and UX flows for the Copilot CLI.
