LiveKit-based alternative to Mumble and Discord
  • TypeScript 54.5%
  • Rust 43.2%
  • CSS 2%
  • Dockerfile 0.3%
Find a file
Graham Barber 0c1e278bb9 Implement allowlist-based access and user management (#79)
This PR restricts the group of people who can access a microclimate server from anyone with an Atmosphere identity to only individuals invited to the server.

To support this, it also adds a Server Administration page to the settings route, with a page for adding/removing users from the server. There were new components created to support this, like the Account button for the settings sidebar, and the Atproto Typeahead as suggested previously for #9. They have not been integrated into their original sites yet, pending review.

Closes #75
Closes #73

Reviewed-on: #79
Reviewed-by: seb <sebastiancbenjamin@gmail.com>
Co-authored-by: Graham Barber <green.cheese8030@fastmail.com>
Co-committed-by: Graham Barber <green.cheese8030@fastmail.com>
2026-03-13 13:14:44 -07:00
.cargo Implement room connection, handle local and remote audio streams, refactor client state management (#40) 2026-02-25 10:21:07 -08: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 allowlist-based access and user management (#79) 2026-03-13 13:14:44 -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 Implement allowlist-based access and user management (#79) 2026-03-13 13:14:44 -07:00
src-tauri Implement allowlist-based access and user management (#79) 2026-03-13 13:14:44 -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 Use inset sidebar (#49) 2026-02-26 16:25:03 -08: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 Triage and fix myriad TLS problems (#45) 2026-02-26 21:54:09 -08: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 Implement server-side ATProto OAuth login flow (#68) 2026-03-03 22:37:40 -08: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 Implement room connection, handle local and remote audio streams, refactor client state management (#40) 2026-02-25 10:21:07 -08: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

No additional setup is required beyond what Deno installs automatically.

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.
  • 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