Bots that live on your Mac, each with its own personality, model and screen. Give one a job, like watching a market, finding a hotel, or checking a price every morning, and it opens a browser and does it, on any AI you already pay for: a Claude plan, a ChatGPT plan, or an API key. Routi is a Mac app, with iPhone and iPad apps for reaching the same bots when you are away from it.
routi-bot-demo-web.mp4
“One shared Linux, a screen per bot, any model you already pay for — on the Mac that stays on. Same idea, cleanly executed. Ship it.”
— Architecture Bot (a Grok Bot), asked to review the competition
Install
Download Routi Bot, open the disk image, drag the app to Applications, open it.
Setup does the rest, in three screens: one command to paste into Terminal that installs Routi Core — the part that keeps your bots and does the work, and starts at every login; a sign-in with Claude or ChatGPT, or an API key; and, if you want bots that browse, the desktop they browse in. Claude Code and Codex come with the core.
The desktop is a Linux machine in Docker Desktop, one screen per bot, kept apart from your own. Install Docker and set it to start at login; setup checks for it and builds the desktop right there, and Settings → Screens shows its state afterwards. Bots without a screen, and bots set to This Mac, don't need it.
Do this on the Mac that stays on. Give it automatic login, so the Keychain is unlocked after a reboot, and set it to never sleep. Needs macOS 14 or newer.
From another Mac, or a phone
Install the app anywhere and point it at the host under Settings → Routi Core. A Tailscale name works. iPhone and iPad are the same app; they're coming.
Without the app, or with Homebrew
For a mini with no monitor, or if you'd rather manage the core yourself:
brew tap narralabs/tap && brew install routi-core && brew services start routi-core
or the install command above, which needs nothing on the Mac beforehand.
If something's off
curl http://127.0.0.1:7171/healthon the host says whether the core is up, and which version.- Logs:
~/.routi/logs/routid.log; with Homebrew,brew services info routi-core. - A bot that says its screen is unavailable: Settings → Screens names which of Docker, the desktop image, or the machine is the problem, with the button that fixes it.
- Sign-in trouble: Settings → the provider's pane says what is connected and how.
Uninstall
curl -fsSL https://raw.githubusercontent.com/narralabs/routi/main/scripts/uninstall.sh | shStops and removes the core, its login agent, the desktop machine and image in Docker,
and the API keys Routi stored in the Keychain. Your bots and conversations stay in
~/.routi, so reinstalling brings them back. To remove those and the app as well:
curl -fsSL https://raw.githubusercontent.com/narralabs/routi/main/scripts/uninstall.sh | sh -s -- --purgeAdd --dry-run to either to see what would go without touching anything. Docker Desktop
itself, and the sign-ins that belong to Claude Code, Codex and Grok, are left alone —
they were yours before Routi.
Roadmap
- Personal Assistant (working name). One default, general-purpose assistant per host Mac, with exclusive bot access to that Mac's files, terminal, native apps and iMessage. Other bots use their own isolated computers without these host-Mac privileges. Reach the same assistant through Routi Bot on Mac, iPhone or iPad, or through iMessage, with shared context across channels. Start with one active task at a time: scheduled jobs and requests from every channel share a queue, with visible waiting status and cancellation. Hold desktop/browser ownership for the whole task and release it on completion, failure or cancellation. Host-access restrictions must be enforced by the tools and execution environment. The iMessage bridge, authorized senders and Mac permissions need design before implementation.
- Apple containers. Add Apple's container runtime as an optional backend for bot computers, while keeping Docker support. Aim for stronger isolation and improved performance; measure memory use, CPU and startup time before choosing defaults.
- More AI providers. Add Gemini and Kimi, plus local model providers such as Ollama and llama.cpp. Let users choose a supported hosted or local model per bot.
- Connectors. Sign in to Gmail once and every bot you allow can search, read, draft and send, as tools rather than through the browser; Google Calendar, Drive, Slack and GitHub follow the same way. The sign-in happens on the Mac running the core and the token stays in its Keychain, per profile. Gmail first, after launch. Public use of the Google ones waits on Google's app verification; until then, a bring-your-own OAuth client.
- Sign-in relay. When a bot reaches a login it cannot do itself, it asks in the thread with a Continue, and you finish the sign-in from wherever you are — your phone, your own browser — with the session or the code relayed to the bot's screen, rather than taking the screen over. Today that moment is a hand-over: the bot stops, you sign in on its desktop, it carries on.
- Per-bot connectors and screens. Which connections a bot may use, chosen per bot, the way a screen is today.
- Folders. Bots grouped by topic in the sidebar — travel, trading, the company — so a list of twenty stays readable.
- Bots in a group chat. Several bots and you in one thread, each seeing the others' messages, for work that takes more than one specialist. A maybe: the core can already hold such a room, but whether bots talking to each other is worth the cost and the confusion is not settled.
Why it is Mac only
If you build something for everyone, it works for no one.
Routi is for a Mac that stays on: the Mac mini in the corner, the laptop you replaced, any spare Mac you would like to turn into a small server that runs your bots all day. The core runs there, the app opens onto it from your other Macs and from the phone.
There is no plan to support Windows or Linux, and no roadmap entry for it. Staying on one platform is what lets the app be a real Mac app rather than a web page in a frame: small binaries, native windows and notifications, the Keychain for every credential, and an installer that is a drag and a double-click. Every hour that would go to a second platform goes to the experience on this one.
Developing
pnpm install && pnpm --filter @routi/protocol build pnpm --filter routid dev:isolated # a second core on ~/.routi-dev, port 7172 scripts/dev-app.sh # builds the app and opens it on that core
dev:isolated reloads on every daemon change; run dev-app.sh again after an app
change. Or cd apple && ./bootstrap.sh && open Routi.xcodeproj and ⌘R in Xcode, with
-daemonPort 7172 under the scheme's arguments. Either way the core serving your real
bots is never touched. How it's built and released: docs/ENGINEERING.md.
Adding an AI provider: CLAUDE.md.
License
Apache-2.0, © 2026 Narra Labs, LLC. Provider marks are LobeHub's, MIT — see NOTICE.