Angelo Kontaxis d567155f12 feat: voice chats v2 (#414)
* initial livekit support

fix up code

undo changes to compose file

add back .env.example

* move voice states to global

* track current state

* more stuff

* fix redis key inconsistancy

* split voice ops into its own library

* feat(livekit): more permission handling

* feat(livekit): push unfinished code

* fix: include voice states in servercreate event
feat: call started system message in dms

* feat: implement missing permission syncs

* fix: remove locked rocket version

* fix: remove local testing values from config

* chore: switch to ids for parameter

* feat: make Channel::server return a reference

* feat: support multiple voice nodes

* fix: expose list of nodes

* fix: respond with the url when joining a voice channel

* feat: being moved between voice channels

* fix: use existing node if someone is already in the voice channel

* refactor: Remove VoiceChannel

* chore: add pushd to debug image script

* refactor: add error messages for Rabbit issues

* docs: add some notes on overrides; fix defaults

* fix: ensure limit is always at least 1 when sent to database

* fix: change permission check for fetching channel webhooks

* chore: mount API at /0.8/ as well

* fix: ensure ratelimiter adjusts for version prefix

* chore: bump version to 0.8.2

* chore: disable LTO because it likely overloads GitHub worker

* fix: don't allow users to time themselves out
closes #376

* fix: match new error type for status code

* feat: init crond crate

* feat: file deletion implementation

* chore: fix version references

* feat: add crond container definitions

* chore: clarify cargo deny / tomls

* feat: add company information to email footers

* chore: bump version to 0.8.3

* fix: don't bump the lockfile version

* fix: include `production` default value for config

* chore: ignore python venv and dev script for user generation

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* test: Add tests for invite/fetch

Signed-off-by: phazeschift <51278042+phazeschift@users.noreply.github.com>

* test: add utilities for common setup

Signed-off-by: phazeschift <51278042+phazeschift@users.noreply.github.com>

* test: add delete server channel test

Signed-off-by: phazeschift <51278042+phazeschift@users.noreply.github.com>

* feat: allow to set an icon when creating a group

Signed-off-by: Nils Ponsard <nilsponsard@gmail.com>

* fix: allow message pinning and unpinning for DM-like channels

Signed-off-by: Bradlee Barnes <69256931+StupidRepo@users.noreply.github.com>

* fix: remove SavedMessages and Group due to given permissions

Signed-off-by: Bradlee Barnes <69256931+StupidRepo@users.noreply.github.com>

* feat: allow bots to manage emojis (#407)

* Remove bot check on emoji create

Signed-off-by: Builderb <builderbgamer@gmail.com>

* Remove bot check on emoji delete

Signed-off-by: Builderb <builderbgamer@gmail.com>

---------

Signed-off-by: Builderb <builderbgamer@gmail.com>

* feat: add option to send message with missing replies

Signed-off-by: ShaksterNano <54268387+shaksternano@users.noreply.github.com>

* chore: bump version to 0.8.4
chore: enable webhooks in test builds

* ci: downgrade lockfile

* feat: Add Mass Mentions to the backend (#394)

* feat: create base of push daemon

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* Add outbound senders

* Make web_push send to rabbit instead (temp stuff)

* feat: stability and friend requests

* make vapid fr stuff not suck

* swap naming of queue

* move pushd into daemons folder

* fix cargo file for move into daemons folder

* feat: probably working fcm push notifs

* comment out fcm webpush stuff since the config keys dont exist

* fix fcm, name queues according to their prod status and configure routing keys

* add pushd to docker

* mix: Remove old code, add stuff to pushd

* fix: lockfile

* feat: update rocket to 5.0.1

* fix: fix queues and ack bugs

* Move rabbit messsage processing into ack queue

* chore: update readme

* chore: optimizations for ack database hits

* pushd flowchart

* misc: update flowchart

* exit dependancy hell

* add rocket_impl flag to authifier

* make the tests file of delta actually compile

* fix: don't silence every push message

* fix: don't silence all messages

* add debug logging for sending data to rabbit from message events

* validate mentions at a server membership level

* put back that import that was actually important

* minor fix to lockfile

* update delta authifier

* feat: proper permissions for push notifications

* add unit test for mention sanitization

* remove local file dependancy on authifier

* update ports to proper defaults

* fixTM the node bindings

* Theoretically configure docker releases for pushd

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* declare exchange in pushd and delta

* fix createbuckets script

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: reference db implementation

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: remove finally redundant code

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: changes

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: other changes

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: make channel name return result

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* Add role mention parsing

* feat: update to mongo 3.1, add member generator.

* integrate mass mentions into pushd

* patch redis-rs with updated versions

* feat: chunk role mentions

* move permission bits to 37/38 to avoid livekit conflict

* change role mention format to <%id>

* fix the lockfile from merge

* fix: PR change requests

* feat: add tests

* fix: i am a dumbass

* fix: tests, again

---------

Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>

* fix: show full branch name on github webhook messages

* fix: dont leak invisible presence to others

* fix: add back missing early adopter badge

* fix: update branch from main

* fix: update branch from main

* Merge remote-tracking branch 'origin/main' into livekit

* feat: private livekit nodes

* fix: remove node from channel voice state

* fix: get_voice_state has incorrect unique_key and allowed_sources should be lowercase

* chore: bump livekit dep

* feat: ability to force disconnect existing voice connection

* chore: cleanup code

* feat: - track call length
- move voice and video limits to config
- seperate VoiceInformation into model and db model
- fix build scripts

* fix: move call system message to daemon,
check max participants when creating a token to avoid giving tokens but erroring when attempting to join,
check if the channel actually supports voice

* fix: dont set max participants in livekit

* fix: remove VoiceChannel channel type
fix: calculate user overwrites correctly
fix: dont include personal info in livekit user metadata
fix: revoke video permissons on denied publish
fix: add video to default permissions

* fix: update migration

* feat: Send push notifications for dm call start/end

* chore: cleanup

* feat: allow users to specify who is notified when starting a call

* feat: track join time

* merge: branch 'main' into feat/livekit

* fix: include voice-ingress in build

* fix: dont presume channel has a node

* chore: add error logging to internal errors

* chore: add debug logging to voice ingress

* refactor: seperate out disconnect logic

* fix: return correct error if user is already in a voice channel

* fix: dont break on user not still being in channel and force disconnecting

* fix: add Speak and Listen to default permissions

* fix: include channel ids in UserMoveVoiceChannel

* chore: add temp sentry logging system

* fix: handle track_muted and track_unmuted

* fix: dont set notification recipients when empty vec is passed

* fix: only send UserMoveVoiceChannel to the user

* fix: preserve order of replies in message (#447)

Signed-off-by: Aeledfyr <aeledfyr@gmail.com>

* fix: prevent timing out members which have TimeoutMembers permission

* chore: update ci

* fix: temporarily disable call started system messages
See #457

* fix: update code from review
2025-11-12 21:27:04 +00:00
2025-11-12 21:27:04 +00:00
2025-11-08 01:21:24 +00:00
2025-11-12 21:27:04 +00:00
2022-06-02 12:17:30 +01:00
2025-11-12 21:27:04 +00:00
2025-11-12 21:27:04 +00:00
2025-06-06 20:13:14 -07:00
2025-11-12 21:27:04 +00:00
2025-09-23 12:02:35 -05:00
2025-02-18 11:53:21 +00:00
2025-11-12 21:27:04 +00:00
2025-11-12 21:27:04 +00:00

Revolt Backend

Stars Forks Pull Requests Issues Contributors License

The services and libraries that power the Revolt service.

Crate Path Description
core/config crates/core/config Core: Configuration Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/database crates/core/database Core: Database Implementation Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/files crates/core/files Core: S3 and encryption subroutines Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/models crates/core/models Core: API Models Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/permissions crates/core/permissions Core: Permission Logic Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/presence crates/core/presence Core: User Presence Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/result crates/core/result Core: Result and Error types Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/coalesced crates/core/coalesced Core: Coalescion service Crates.io Version Crates.io Version Crates.io Version Crates.io License
delta crates/delta REST API server License
bonfire crates/bonfire WebSocket events server License
services/january crates/services/january Proxy server License
services/gifbox crates/services/gifbox Tenor proxy server License
services/autumn crates/services/autumn File server License
daemons/crond crates/daemons/crond Timed data clean up daemon server License
daemons/pushd crates/daemons/pushd Push notification daemon server License

Minimum Supported Rust Version

Rust 1.86.0 or higher.

Caution

The events server has a significant performance regression between Rust 1.77.2 and 1.78.0 onwards, see issue #341. This is currently solved by build time options but we are looking for a proper fix.

Development Guide

Before contributing, make yourself familiar with our contribution guidelines and the technical documentation for this project.

Before getting started, you'll want to install:

  • Rust toolchain (rustup recommended)
  • Docker
  • Git
  • mold (optional, faster compilation)

A default.nix is available for Nix users! Just run nix-shell and continue.

As a heads-up, the development environment uses the following ports:

Service Port
MongoDB 27017
Redis 6379
MinIO 14009
Maildev 14025
14080
Revolt Web App 14701
RabbitMQ 5672
15672
crates/delta 14702
crates/bonfire 14703
crates/services/autumn 14704
crates/services/january 14705
crates/services/gifbox 14706

Now you can clone and build the project:

git clone https://github.com/revoltchat/backend revolt-backend
cd revolt-backend
cargo build

A default configuration Revolt.toml is present in this project that is suited for development.

If you'd like to change anything, create a Revolt.overrides.toml file and specify relevant variables.

Tip

Use Sentry to catch unexpected service errors:

# Revolt.overrides.toml
[sentry]
api = "https://abc@your.sentry/1"
events = "https://abc@your.sentry/1"
files = "https://abc@your.sentry/1"
proxy = "https://abc@your.sentry/1"

Tip

If you have port conflicts on common services, you can try the following:

# compose.override.yml
services:
  redis:
    ports: !override
      - "14079:6379"

  database:
    ports: !override
      - "14017:27017"

  rabbit:
    ports: !override
      - "14072:5672"
      - "14672:15672"

And corresponding Revolt configuration:

#     Revolt.overrides.toml
# and Revolt.test-overrides.toml
[database]
mongodb = "mongodb://127.0.0.1:14017"
redis = "redis://127.0.0.1:14079/"

[rabbit]
port = 14072

Then continue:

# start other necessary services
docker compose up -d

# run everything together
./scripts/start.sh
# .. or individually
# run the API server
cargo run --bin revolt-delta
# run the events server
cargo run --bin revolt-bonfire
# run the file server
cargo run --bin revolt-autumn
# run the proxy server
cargo run --bin revolt-january
# run the tenor proxy
cargo run --bin revolt-gifbox
# run the push daemon (not usually needed in regular development)
cargo run --bin revolt-pushd

# hint:
# mold -run <cargo build, cargo run, etc...>
# mold -run ./scripts/start.sh

You can start a web client by doing the following:

# if you do not have yarn yet and have a modern Node.js:
corepack enable

# clone the web client and run it:
git clone --recursive https://github.com/revoltchat/revite
cd revite
yarn
yarn build:deps
echo "VITE_API_URL=http://local.revolt.chat:14702" > .env.local
yarn dev --port 14701

Then go to http://local.revolt.chat:14701 to create an account/login.

When signing up, go to http://localhost:14080 to find confirmation/password reset emails.

Deployment Guide

Cutting new crate releases

Begin by bumping crate versions:

just patch # 0.0.X
just minor # 0.X.0
just major # X.0.0

Then commit the changes to package files.

Proceed to publish all the new crates:

just publish

Cutting new binary releases

Tag and push a new release by running:

just release

If you have bumped the crate versions, proceed to GitHub releases to create a changelog.

Testing

First, start the required services:

docker compose -f docker-compose.db.yml up -d

Now run tests for whichever database:

TEST_DB=REFERENCE cargo nextest run
TEST_DB=MONGODB cargo nextest run

License

The Revolt backend is generally licensed under the GNU Affero General Public License v3.0.

Individual crates may supply their own licenses!

Description
This is the monorepo for Handmade Revolt backend services, our hosted instance is available at https://chat.handmadecities.com
Readme AGPL-3.0 13 MiB
Languages
Rust 90.8%
HTML 8.3%
Shell 0.4%
Dockerfile 0.3%