Why Hiroba
Remote teams have plenty of tools for scheduled meetings. What they lose is the
small moment before a conversation: seeing that someone is around, walking over,
and asking, "Got a sec?" Hiroba brings that moment back without trying to
replace your meeting software.
- Presence at a glance — see who is active, away, busy, or already in a call.
- Conversation without ceremony — walk over for spatial voice, or page
someone directly from the roster.
- Light by design — a native Tauri client built to stay open all day, not an
Electron meeting suite.
- Open and self-hostable — run the Rust server yourself with no seat limits
or feature gating, or use the managed hosted edition.
Install
macOS (Apple Silicon or Intel):
brew tap ludo-technologies/hiroba
brew trust ludo-technologies/hiroba
brew install --cask hiroba
Homebrew 6 refuses to load a cask from a third-party tap until you trust it; on
older versions the brew trust line is unnecessary.
Windows:
winget install hiroba
Or download the installer from the
latest release.
Hiroba updates itself in place, so you only install once.
How It Works
- Join your organization's floor and see where everyone is.
- Move through the lobby or switch to a small team space.
- Walk near someone to talk, or call any teammate with one click.
- Leave Hiroba running so the floor is there when your team needs it.
Voice is peer-to-peer over WebRTC. There is no always-on video, recording, or
media server. During a 1:1 call you can share your screen with that peer.
Architecture
┌──────────────────────────────┐ WebRTC P2P (Opus)
│ Rust signaling/state server │ ┌───────────────────────┐
│ axum + tokio + WebSocket │ ▼ ▼
│ • org roster / presence │ ┌──────┐ audio only ┌──────┐
│ • per-space position relay │ │client│◀────mesh─────▶│client│
│ • per-space proximity │ │Tauri │ │Tauri │
│ • WebRTC signaling relay │ └──────┘ └──────┘
│ • paging (cross-space 1:1) │ ▲ ▲
│ NEVER touches media │ │ WebSocket (control)│
└──────────────┬───────────────┘ └─────────────────────┘
└──────────────────────────────────────────────┘
The server relays control data only; audio goes directly between peers. The
wire format is specified in PROTOCOL.md.
- Server (
server/) — Rust, axum, tokio. A single static binary with no
required external services.
- Client (
client/) — Tauri (Rust shell + OS WebView) with a vanilla
TypeScript + Canvas 2D frontend, using the WebView's built-in WebRTC.
Development
Prerequisites: Rust (stable), Node 18+, and the
Tauri v2 system dependencies for your OS.
# Server (listens on 0.0.0.0:8787 by default; override with HIROBA_ADDR)
cd server && cargo run
# Client, in another terminal
cd client && npm install && npm run tauri:dev
In the join screen, point the client at ws://127.0.0.1:8787/ws. Open a second
client to see two avatars; walk them together to hear spatial voice fade in.
You start muted — click the mic button to go live. Move with WASD / arrow
keys, switch spaces with the tabs, and page a teammate with Call in
the sidebar.
Release builds:
# Server binary: server/target/release/hiroba-server
cd server && cargo build --release
# Client bundles: client/src-tauri/target/release/bundle/
# Both server URLs are required; the build fails without them.
cd client && npm install
VITE_HIROBA_SERVER="wss://hiroba.example/ws" \
VITE_HIROBA_AUTH_SERVER="https://auth.hiroba.example" \
npm run tauri build
Tagged releases build these on CI and publish them to GitHub Releases, the
Homebrew tap, and winget — see docs/PACKAGING.md.
Self-Hosting
The server needs no media server and no database (SQLite is optional via
HIROBA_DB). See docs/SELF_HOSTING.md for deployment,
configuration, firewall/NAT notes, and when you might need a TURN server.
A managed hosted edition (OAuth sign-in, invites, billing) is offered separately
and is not part of this repository.
Update Checks
Official builds check update.hirobaoffice.com for a new version shortly after
launch and every four hours while open; the update itself downloads from GitHub
Releases. From those requests we keep one row per device per day: platform,
architecture, installed version, and the country Cloudflare derives from the
IP. The device is a hash of IP and user agent salted with the date, so rows
cannot be linked across days, and they are deleted after 90 days.
There is no other telemetry: nothing about your org, floor, teammates, calls,
or usage is collected, and the server ships no analytics SDK. Self-hosted
builds can disable the check entirely — see
docs/SELF_HOSTING.md.
License
Apache-2.0. Includes a patent grant.
Brand assets are not covered by Apache-2.0. The "Hiroba" name, logo, and
app icons (app-icon.png, app-icon-macos.png) are excluded from the
Apache-2.0 license grant. They may not be used to brand a fork or a derived
service without permission. Everything else — code, docs, protocol — is
Apache-2.0.