/ȏȏ< awebo awebo awebo
  • Zig 95.9%
  • Objective-C 3.9%
  • C 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Loris Cro a6257c714c fix concurrency issues in miniaudio
miniaudio, being a temporary implementation of OS audio integration,
was never really polished much, which left in it a couple big bugs
relative to the lifecycle management of callers.

- callers would join/leave concurrently as the audio thread was running
  causing UB for complete lack of coordination between threads
- resource cleanup at the end of a call failed to check a flag and would
  leak audio resources

the first point has been fixed by introducing a ring buffer that
collects essentially join/leave requests that then get processed by
the audio thread at every loop. currently the audio thread will
process all requests at once, while instead it should try to stay within
a time budget, but that's an improvement that can be added later.

More problematic is the fact that currently the audio thread frees
caller resources, which is something that should be avoided when
working on a handcrafted OS audio integration.

With this change we should not experience anymore crashes when
joining / leaving a call when using the miniaudio backend.
2026-08-15 17:52:27 +02:00
.forgejo fleshed out screenshare flow + ffmpeg 2026-03-23 18:27:44 +01:00
ci Dockerfile for forgejo worker (#24) 2026-01-19 09:03:10 +01:00
deploy add systemd service file for server deployment 2026-03-06 18:33:00 +01:00
design typo 2026-01-18 15:58:02 +01:00
src fix concurrency issues in miniaudio 2026-08-15 17:52:27 +02:00
.gitignore update to zig 0.16.0-dev.2533+355c62600 2026-02-06 18:26:53 -08:00
build.zig remove AVAudioEngine interface 2026-08-14 17:07:38 +02:00
build.zig.zon remove opus/speex hardcoded header files 2026-08-14 16:14:49 +02:00
LICENSE "init" 2026-01-15 19:40:27 +01:00
LICENSE-APACHE "init" 2026-01-15 19:40:27 +01:00
LICENSE-MIT "init" 2026-01-15 19:40:27 +01:00
README.md update README.md 2026-03-23 18:30:54 +01:00

Awebo Chat

Light-weight, self-hostable group chat application with voice rooms and screensharing support.

From small groups of friends and work groups, up to worldwide communities, and without any enshittification.

Awebo server can run on extremely cheap hosting solutions (like Hetzner's 2.99EUR/mo VPS).

Awebo is written in Zig.

Development stage

Awebo is currently pre-alpha. We have working calls (all platforms) and screensharing (sending from macOS, receiving on all platforms).

As of March 2026 Awebo is complete enough to host Awebo development voice calls on Awebo.

A call with 3 screensharing sessions active at the same time (March 2026):

Does Awebo use WebRTC?

No, we are using state of the art codecs (Opus DRED, h264, HEVC, AV1, FFV1) and then write everything above from scratch, including UDP packet framing and jitter buffers. WebRTC is a complicated protocol with bloated C++ implementations that needlessly bump up system requirements and increase resource consumption.

We are currently focusing on native awebo clients but we plan to also create a web client, in which case we will most likely add to Awebo support for WebTransport.

Running the project

Create a new server instance

zig build server -- server init --server-name banana --owner-handle admin --owner-pass admin

This is only needed the first time and whenever the schema changes (make sure to delete awebo.db before re-running the command).

Run the server:

zig build server -- server run

Run the client:

zig build gui

The first time you will be asked to add a remote server, after that the info will be cached in the local config directory. See logs to learn how to reset your local cache if needed.

NixOS

If you get a runtime SDL error that there are no devices, try:

nix-shell -p sdl3
zig build gui -fsys=sdl3

You might also need to do the same with -fsys=pulseaudio.

Testing with multiple users

If you want to launch two or more instances of the client, each with a different logged user, use the -Dlocal-cache build option like so:

# from inside the awebo repository
mkdir user1
cd user1
zig build gui -Dlocal-cache

Repeat multiple times as needed replacing 'user1' with a different name.

The -Dlocal-cache flag will create a build of the client that stores cache and authentication data in .awebo-cache and .awebo-config respectively, and by dedicating a directory to each user you can achieve isolation.

This can also be useful to be able to connect as the same user twice, as you will not be able to do so without this flag (the client takes an exclusive lock to the sqlite database).