LiveKit-based alternative to Mumble and Discord
  • TypeScript 55.8%
  • Rust 41.4%
  • CSS 1.9%
  • Nix 0.7%
  • Dockerfile 0.2%
Find a file
seb adde706771 Implement per-room user UI + speaking (#84)
Closes #47.

- Convert home.tsx into a set of tiles that lists the users connected to the current channel
- Add a set of sub-buttons underneath the currently-active panel, one per user
- Add the currently-logged in user to the bottom of the main sidebar (same component as the settings page)
- Unify the atproto did/name/profile pic logic between the home.tsx tiles, the sidebar sub-buttons, and the logged-in user components
- Add a connection strength dot + a reactive ActiveSpeakerChanged border to all 3 profile pic locations if connected to a channel
- Add a button in the bottom-right of the home screen if connected to list connection strength statistics
- Add endpoints to support the new connection strength/isSpeaking logic

Co-authored-by: Sebastian Benjamin <hex@hextraza.moe>
Reviewed-on: #84
Reviewed-by: Graham <red.iron2345@fastmail.com>
2026-04-16 13:04:34 -07:00
.cargo #82 Changing target directory for client on windows (#82) 2026-04-10 14:38:57 -07:00
.storybook Integrate Storybook and ts-rs (#30) 2026-02-19 09:20:49 -08:00
.vscode init tauri app 2026-02-10 18:22:49 -08:00
.zed add zed debugger config for server 2026-02-15 14:23:47 -08:00
app Implement per-room user UI + speaking (#84) 2026-04-16 13:04:34 -07:00
proto Implement allowlist-based access and user management (#79) 2026-03-13 13:14:44 -07:00
public Setting up react-router and shadcn 2026-02-11 19:29:18 -08:00
server Combine gRPC and HTTP services (#85) 2026-04-10 16:32:22 -07:00
src-tauri Implement per-room user UI + speaking (#84) 2026-04-16 13:04:34 -07:00
stories/ui Integrate Storybook and ts-rs (#30) 2026-02-19 09:20:49 -08:00
.dockerignore Add container build configuration (#32) 2026-02-18 11:01:38 -08:00
.gitattributes Adding server url page and channels sidebar 2026-02-18 17:28:39 -08:00
.gitignore #82 Changing target directory for client on windows (#82) 2026-04-10 14:38:57 -07:00
components.json Adding server url page and channels sidebar 2026-02-18 17:28:39 -08:00
deno.jsonc Implement room connection, handle local and remote audio streams, refactor client state management (#40) 2026-02-25 10:21:07 -08:00
deno.lock Implement allowlist-based access and user management (#79) 2026-03-13 13:14:44 -07:00
Dockerfile Add --locked flag and ca-certificates to Dockerfile (#86) 2026-04-10 15:26:15 -07:00
flake.lock Adjusting flake for mac build (#92) 2026-04-14 16:38:22 -07:00
flake.nix Adjusting flake for mac build (#92) 2026-04-14 16:38:22 -07:00
package.json Implement allowlist-based access and user management (#79) 2026-03-13 13:14:44 -07:00
react-router.config.ts Setting up react-router and shadcn 2026-02-11 19:29:18 -08:00
README.md #82 Changing target directory for client on windows (#82) 2026-04-10 14:38:57 -07:00
tsconfig.json Adding server url page and channels sidebar 2026-02-18 17:28:39 -08:00
tsconfig.node.json init tauri app 2026-02-10 18:22:49 -08:00
vite.config.ts Add nix flake for linux and macos (#78) 2026-03-14 17:37:23 -07:00
vitest.shims.d.ts Integrate Storybook and ts-rs (#30) 2026-02-19 09:20:49 -08:00

microclimate

A LiveKit-based alternative to Mumble and Discord.

Requires

  • Rust
  • Deno
  • protoc, the protobuffer compiler
  • A server/.env file, see server/.env.example for required values

Project structure

The server and Tauri client are separate Cargo workspaces. Most server-side Cargo commands should be run from the server/ directory; most client-side commands are run from the project root (via Deno tasks) or src-tauri/.

Setup

Server

The server uses SQLx compile-time query verification, which requires either a live database or a pre-generated query cache. The cache is already committed to the repository under server/.sqlx/, so a live database is only needed when you change the schema.

# Copy and fill in the environment file
cp server/.env.example server/.env

# JWT_SECRET is required — the server uses it to sign session tokens issued
# after a successful ATProto OAuth login. Use a long random value, e.g.:
#   openssl rand -base64 32

# (First time only, or after changing migrations) Install sqlx-cli and
# run migrations to set up the database
cargo install sqlx-cli --no-default-features --features sqlite
cd server && sqlx migrate run

# (After changing migrations) Regenerate the SQLx query cache and commit it
cd server && cargo sqlx prepare

Note: In production, migrations run automatically when the server starts.

Client

Install dependencies with deno i

If on windows create a windows.toml file in the .cargo folder then add the following:

[build]
target-dir = "C:/t"

Without it vite will choke itself scanning the target folder, and the application will never run.

Running

# Start the gRPC server (from server/)
cd server && cargo run

# Start the Tauri desktop app (from project root, use cmd.exe on Windows)
deno task tauri dev

Note: cargo build from the project root only builds the Tauri client. To build the server, run cargo build from server/.

Tips

  • If you're developing on Windows, I've observed that the Tauri app will not render when executing deno task tauri dev from Powershell. Using cmd seems to work just fine, though.
  • On Windows, set CARGO_TARGET_DIR=C:/t (or another short path) to redirect Cargo build artifacts off the project tree.
  • I recommend using Yaak for testing gRPC features without a client
  • Use cargo test export_bindings from src-tauri/ to generate TypeScript types from structs using ts-rs