Skip to content
ludo-technologiesPublic

About

Ultra-light 2D virtual office. Built to be left running all day.

Topics

Resources

Contributing

Security policy

Stars

3 stars

Watchers

1 watching

Forks

Repository files navigation

English | 日本語

Hiroba

A lightweight, open-source virtual office for remote teams.

See who's around. Walk over. Start talking.

Latest release License

An avatar walks over to a teammate and starts a voice conversation in Hiroba

Download Hiroba · Website · Blog · Self-hosting guide · Protocol · Contributing

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

  1. Join your organization's floor and see where everyone is.
  2. Move through the lobby or switch to a small team space.
  3. Walk near someone to talk, or call any teammate with one click.
  4. 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.

About

Ultra-light 2D virtual office. Built to be left running all day.

Topics

Resources

Contributing

Security policy

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages