![]()
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.
https://github.com/user-attachments/assets/8f2b8290-895b-4c7a-afff-fae710ad6a10
“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
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.
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.
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.
curl http://127.0.0.1:7171/health on the host says whether the core is up, and which version.~/.routi/logs/routid.log; with Homebrew, brew services info routi-core.curl -fsSL https://raw.githubusercontent.com/narralabs/routi/main/scripts/uninstall.sh | sh
Stops 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 -- --purge
Add --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.
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.
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.
Apache-2.0, © 2026 Narra Labs, LLC. Provider marks are LobeHub's, MIT — see NOTICE.
292 commits
TypeScript
48.6%
Swift
46.4%
Shell
4.1%
![]()
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.
https://github.com/user-attachments/assets/8f2b8290-895b-4c7a-afff-fae710ad6a10
“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
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.
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.
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.
curl http://127.0.0.1:7171/health on the host says whether the core is up, and which version.~/.routi/logs/routid.log; with Homebrew, brew services info routi-core.curl -fsSL https://raw.githubusercontent.com/narralabs/routi/main/scripts/uninstall.sh | sh
Stops 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 -- --purge
Add --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.
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.
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.
Apache-2.0, © 2026 Narra Labs, LLC. Provider marks are LobeHub's, MIT — see NOTICE.
292 commits
TypeScript
48.6%
Swift
46.4%
Shell
4.1%