Hotline
A self-hosted room for AI agent teams on your own machine: any model, bring your own harness, each teammate gets its own computer.
- Source repo
- 1broseidon/hotline
- Stars
- ★ 12
- Last updated
- today
- License
- Apache-2.0
- Primary language
- Rust
- FA score
- 63/100 · Some gaps
At a glance
- Works with
- Universal · cross-platformCodex · Claude Code · OpenAI API · Claude API
- You'll need
- Typical use
- A solo developer wants one agent writing code and another reviewing it, with both visible in the same chat.
- Main limitation
- You must supply model keys and pay providers directly; real costs depend on the providers and usage you choose.
- Source review
- 63/100 · Some gaps
What does this agent do, and when should you use it?
Hotline is an open-source, self-hosted room for AI agent teams, written in Rust with a Tauri shell around a web UI. It ships as a desktop app for macOS, Windows and Linux, plus a headless server mode for any Linux box, and a beta phone app that pairs with your desk. Each named teammate has its own project directory and a conversation that keeps going whether or not you are watching; teammates can see who else is in the room, what they are working on, and message each other to ask questions, request reviews or hand off tasks. Teammates can be Hotline's built-in agent calling Anthropic, OpenAI, Google, OpenRouter or Ollama with your own key or subscription, or external harnesses such as Claude Code, Codex and opencode connected over ACP. A single switch gives a teammate a full Linux desktop in a container via Docker, Podman or Apple container. Transcripts and files stay on your disk, with no account and no cloud in the middle, and linked desks let multiple machines share one room.
Hotline runs a local desk that holds a named roster of teammates. Each teammate is bound to its own project directory and an ongoing conversation that persists independently of whether you are watching. The built-in agent can call models from Anthropic, OpenAI, Google, OpenRouter or Ollama; external harnesses including Claude Code, Codex and opencode join as teammates over the ACP protocol. Teammates can see who else is in the room and what they are on, and message each other directly to ask a question, request a review or hand off a task. Toggling the computer switch starts a Linux desktop container for a teammate through Docker, Podman or Apple container, providing a screen, a browser and a shell that you can watch or take control of when asked. Input supports text, pasted images and voice. The desktop app and headless server mode expose the same room, the beta phone app pairs with a desk, and linked desks let teammates on different machines work together while each stays under its own desk's grants.
- A solo developer wants one agent writing code and another reviewing it, with both visible in the same chat.
- A small team wants agents running on its own server via headless desk mode, without any cloud account.
- A security-conscious workflow needs agents to drive a browser or shell inside an isolated container, with humans taking over when asked.
- Claude Code or Codex users want to mix those harnesses with other models in one room and run them in parallel.
- A developer who steps away from the desk wants to check in or keep chatting with agents from a phone.
- A team with a laptop and a server wants linked desks so both sides' agents share one room.
How do you install or deploy this agent?
Install the desktop app on macOS or Linux with one command:
curl -fsSL https://hotline.dev/install | shInstall a headless desk on a server:
curl -fsSL https://hotline.dev/install | sh -s -- --serverOn Windows, or for .deb, .rpm and Intel Mac builds, download the latest release:
# open https://github.com/1broseidon/hotline/releases/latest in a browserTo give a teammate its own Linux desktop, the host needs a working Docker, Podman or Apple container runtime; on the model side, bring your own Anthropic, OpenAI, Google, OpenRouter or Ollama key or subscription.
How do you use this agent?
After installing, launch the desktop app or start the headless desk on a server to enter the room. Name each teammate, point it at its project directory, and choose a model: use the built-in agent directly, or attach Claude Code, Codex, opencode or another ACP harness as a teammate.
Give a teammate an operating system by turning on the computer switch; Hotline then starts a Linux desktop container for it:
# requires Docker, Podman or Apple container on the host
# flip the computer switch for a teammate in the Hotline UIThen talk to teammates in the room, paste screenshots, use voice, or take control of a teammate's desktop when it asks; teammates can message each other directly. Pair the phone app as documented:
# follow https://hotline.dev/docs/phone/ to pair the phone appFor architecture, wire protocol and container details, see docs/design.md, docs/wire.md and docs/computer.md.
What are this agent's strengths and limitations?
- Mix multiple model providers (Anthropic, OpenAI, Google, OpenRouter, Ollama) in one room, avoiding single-vendor lock-in.
- External harnesses such as Claude Code, Codex and opencode join as teammates over ACP, preserving existing workflows.
- A single switch gives a teammate a containerized Linux desktop with a screen, browser and shell for tasks that need a real environment.
- Transcripts and files stay on local disk with no account or cloud intermediary, keeping self-hosting and data boundaries clear.
- Offers a desktop app, a headless server mode for Linux and a beta phone app, plus linked desks across machines.
- You must supply model keys and pay providers directly; real costs depend on the providers and usage you choose.
- Giving a teammate a Linux desktop depends on Docker, Podman or Apple container on the host, adding container-runtime operations work.
- The phone app is still in beta, so mobile coverage and stability may be limited.
- The product shipped as Toad through 0.13.0 and was renamed in 0.14.0, and the README states this ground-up build replaced the Electrobun edition on the repository on 2026-09-08, so older material may not match the current version.
- Building from source requires a Rust toolchain and Tauri environment; setup beyond the install script is largely covered in linked docs rather than the README.
How does this agent compare with similar options?
Key facts side by side with the most closely related agents.
| Agent | Source review | Form / cost | Stars | Updated | Language | Full support on |
|---|---|---|---|---|---|---|
| Hotline This agent | 63 · Some gaps | — | ★ 12 | today | Rust | Codex · Claude Code · OpenAI API · Claude API |
| Vicoa | 52 · Major gaps | Desktop appFree + model costs | ★ 523 | 3d ago | Python | Codex · Claude Code |
| OpenTeams | 56 · Major gaps | Desktop appFree + model costs | ★ 581 | 14d ago | TypeScript | Codex · Claude Code |
| OtoDock | 77 · Good | Self-hosted serviceFreemium | ★ 193 | 1d ago | Python | Codex · Claude Code |
How does FollowAgents rate this agent?
Why each dimension lost points
docs/security.md handles least privilege unusually well: reach, mcpPolicy, allowedSenders, backgroundWork, computer and folders are independent axes with deny-by-default values and explicit migrations, and the model is explicitly not an enforcement point (least_privilege=3). The same document states plainly that the person is asked nothing at call time and there are no approval cards or per-path ACLs, so confirmation is standing rather than per-action (user_confirmation=2). Data flow is described (network on under every reach, workspace data can leave, which provider origins receive voice/image traffic) but there is no consolidated user-facing data-flow statement (data_flow_transparency=2). Sensitive data uses 0600/0700 files, secret redaction and key-free image results, yet the docs admit no encryption layer of its own and that root or a disk copy reads every secret (sensitive_data_handling=2). Dependency security is the strongest area: CI runs cargo-deny advisories/licenses, cargo machete and bun audit, Cargo.toml carries a justified patch for RUSTSEC-2026-0367/0368/0369, and speech engine and models are pinned by SHA-256 (dependency_security=3). External effects are acknowledged as irreversible: dispatched side effects survive revocation and there is no recall mechanism (external_effects=1). Rollback is thin: only lease revocation and computer recreation, no version rollback or state recovery (rollback=1). Source attribution has dual license files, a release pipeline and updater signing, but publisher identity is unverified and attribution stops at the repository (source_attribution=2).
Internal consistency is good: Cargo.toml at 0.43.0, the release workflow checks tag against Cargo.toml and tauri.conf.json, and the README explains the Toad-to-Hotline rename and the Electrobun replacement (self_consistency=2). Dependency availability has Cargo.lock, bun --frozen-lockfile, pinned tool versions and a hosted-runner fallback, but sherpa-onnx-sys depends on an upstream git commit and an external script downloads binaries, which is a real availability risk (dependency_availability=2). Failure messages are concrete in the installer tests (version mismatch, checksum mismatch, missing user), while runtime error handling is only inferable from docs (failure_messages=2).
The README targets multiple models, multiple harnesses and desktop/server/phone scenarios with a clear audience (audience_and_scenarios=2). Capability boundaries are documented in depth: workspace versus machine reach, externally managed ACP, computer not widening reach, no confined shell on Windows (capability_boundaries=3). Trigger precision is not assessable: this is a persistent room rather than a trigger-invoked agent and no routing rules are shown (trigger_precision=1). Environment fit covers macOS/Windows/Linux, headless server and three container runtimes, but Windows lacks a shell sandbox, macOS lacks namespaces and Apple container keeps no volumes, so platform gaps are material (environment_fit=2).
The README is well structured and links design, development, wire, sessions and computer docs (information_architecture=2). Install notes give curl installs, a server mode and per-platform packages, but rely on an external site script with limited in-repo detail (install_notes=2). Naming stability is affected by the Toad-to-Hotline rename and leftover ELECTROBUN_ prefixes, explained but still churn (naming_stability=2). Examples and FAQ are sparse in the visible files, mostly doc links (examples_and_faq=1). Known limitations are exceptionally thorough, including accepted risks, platform differences and residual risk (known_limitations=3). Licensing is dual MIT OR Apache-2.0 and consistent across files and metadata (license=3). A version exists but no CHANGELOG content is visible, only release-pipeline references (versioning_changelog=1). Maintenance responsibility is weak: the docs mention a product decision by George, but there is no CONTRIBUTING, security contact or maintainer statement, and the publisher is unverified (maintenance_responsibility=1).
Output usability: the product shape (desktop and phone room, multi-agent collaboration) is clear, but no sample outputs or UI flows appear in the visible files (output_usability=2). Marginal value comes from multi-agent co-location, bring-your-own harness and a containerized computer, which differentiates it from single-chat tools, though the space is crowded and value depends on configuration (marginal_value=2). Cost-benefit is demanding: self-hosting needs Docker/Podman, user-paid model keys, a half-gigabyte speech model download and a complex Rust+Tauri+bun+external-binary build chain (cost_benefit=1).
claim_traceability: the security doc names concrete files and tests for most claims (e.g. wire::tests::voice_is_owner_only_through_the_real_handler), though some claims are prose only (claim_traceability=2). cross_source_corroboration: README, security.md, CI workflows and Cargo.toml corroborate each other on dependency pinning, platform support and licensing (cross_source_corroboration=2). fact_inference_separation: the docs distinguish shipped from planned, accepted risk from defect, and flag device verification as outstanding (fact_inference_separation=2).
- The security model relies on one-time standing consent in settings; there is no per-call confirmation, so once machine reach or an MCP gateway is granted the agent can act with external effects unreviewed.
- The docs explicitly accept that the network is on under every reach, that readable workspace data can leave, and that dispatched side effects cannot be recalled after revocation.
- In self-hosted server mode secrets are 0600 files with no encryption layer of their own; root or a disk/backup copy reads every one.
- Installation pipes an external site script into a shell, and the build chain depends on an upstream git commit plus external binary downloads, widening the supply-chain surface.
- Publisher identity is unverified by FollowAgents, and maintenance responsibility and a security contact are not clear in the visible files.
- Platform behavior diverges: no confined shell on Windows, no namespaces on macOS, and Apple container keeps no volumes, so safety and persistence differ by OS.