- C++ 73.9%
- C 17.7%
- Shell 3.5%
- Astro 2.5%
- Meson 2.3%
- Other 0.1%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| assets | ||
| contrib | ||
| layer-manifest | ||
| src | ||
| tests | ||
| www | ||
| .gitignore | ||
| layer-gl.map | ||
| layer.map | ||
| LICENSE | ||
| meson.build | ||
| README.md | ||
| sigaw.conf.example | ||
Sigaw
Sigaw (Filipino: "shout/call"), a Discord voice overlay for Linux that works on Wayland fullscreen.
Sigaw renders a Discord voice channel overlay directly inside your game's Vulkan or OpenGL render pipeline, using the same approach as MangoHUD and DXVK. No transparent windows, no compositor hacks, no Wayland limitations.
Why?
Overlayed.dev and similar overlays use a transparent window on top of the game. On Linux, that is unreliable for fullscreen Wayland apps because the compositor is not supposed to let another window draw over the game surface.
Sigaw takes a different route. It injects the overlay into the application's
own frame instead of relying on the desktop compositor: a Vulkan implicit
layer for Vulkan apps, and an LD_PRELOAD swap-buffer hook for OpenGL.
That makes it work in the cases this project is meant for: Wayland fullscreen,
Gamescope, X11 Vulkan apps, and X11/EGL OpenGL apps.
Features
- Shows the current Discord voice channel in-game
- Updates speaking, mute, and deaf state live
- Keeps active speakers visible when the channel is larger than the visible row limit
- Can show the latest voice channel chat messages as fading overlay rows
- Supports avatars, compact mode, and basic overlay placement controls
- Exposes a system tray menu for quick overlay, chat, compact, reload, and daemon actions
- Runs as a daemon plus Vulkan/OpenGL hooks, with
sigaw-ctlfor control and status
Example Overlays
Generated from the current renderer on a 3840x2160 test frame. Regenerate them
with meson compile -C build render-readme-screenshots.
|
|
|
|
| Standard layout Channel header, live speaking state, and inline mute icons. |
Voice chat Recent channel messages fade beneath the roster. |
Compact mode Avatar-first rows with badge indicators. |
Larger channels Extra users collapse into a +N more row. |
Limits
- Linux only
- Vulkan applications, plus OpenGL via GLX/EGL
- Discord desktop client only
- Voice overlay only
Quick Start
1. Build and install
git clone https://git.macco.dev/macco/sigaw.git
cd sigaw
meson setup build --prefix=/usr
meson compile -C build
sudo meson install -C build
2. Generate the config
sigaw-daemon --init-config
$EDITOR ~/.config/sigaw/sigaw.conf
3. Start the daemon
sigaw-daemon --foreground
Or enable the installed user service:
systemctl --user daemon-reload
systemctl --user enable --now sigaw-daemon
On first run, Discord should prompt for authorization.
When started inside a graphical session with an AppIndicator/StatusNotifier
host, sigaw-daemon also exposes a tray menu with:
- Live Discord connection and current channel status
Show overlayShow voice messagesCompact modeOpen configReload configStop daemon
4. Launch an app with Sigaw enabled
sigaw-run ./my-game
Common launch patterns:
sigaw-run %command%
sigaw-run -- gamescope -f -- %command%
Manual paths:
SIGAW=1 ./vulkan-game
LD_PRELOAD=/usr/lib/libSigawGL.so ./opengl-game
5. Check that it is working
sigaw-ctl status
If the daemon is connected and you are in a voice channel, sigaw-ctl status
shows the current channel, users, and overlay visibility state.
Requirements
Runtime:
- Linux
- A Vulkan or OpenGL game/application
- Discord desktop app running on the same machine
Build:
- Vulkan headers and loader
- OpenGL/EGL/X11 development files
- GTK 3
- Ayatana AppIndicator or AppIndicator 3 development files
- Meson
- Ninja
- nlohmann-json
- libcurl
- FreeType
- libpng
Package examples:
Arch Linux
sudo pacman -S vulkan-headers vulkan-icd-loader meson ninja \
nlohmann-json curl freetype2 libpng gtk3 libayatana-appindicator
Ubuntu / Debian
sudo apt install libvulkan-dev meson ninja-build \
nlohmann-json3-dev libcurl4-openssl-dev \
libfreetype-dev libpng-dev libgtk-3-dev \
libayatana-appindicator3-dev
Configuration
Sigaw keeps its config in ~/.config/sigaw/sigaw.conf.
| Option | Default | Description |
|---|---|---|
position |
top-right |
Overlay anchor: top-left, top-right, bottom-left, bottom-right |
scale |
1.0 |
Overall size multiplier |
opacity |
0.72 |
Overlay opacity from 0.0 to 1.0 |
show_avatars |
true |
Show Discord avatars when available |
show_channel_name |
false |
Show a channel header above the user list |
show_voice_channel_chat |
false |
Show the latest voice channel chat messages below the user list |
compact |
false |
Render a smaller avatar-first layout |
max_visible_users |
8 |
Maximum rows shown before collapsing the rest into +N more |
max_visible_chat_messages |
4 |
Maximum fading voice channel chat rows shown at once |
visible |
true |
Persisted overlay visibility, usually managed by sigaw-ctl |
Example config: sigaw.conf.example.
Sigaw also supports per-game overlay profiles in the same file:
[profile:vkcube]
position=bottom-left
compact=true
show_voice_channel_chat=true
Profile matching is exact and case-sensitive, using the hooked process basename.
On Wine/Proton, Sigaw matches the Windows game executable basename instead of
wine-preloader. Profiles override overlay settings only.
When the global config or any profile enables show_voice_channel_chat, Sigaw
will request Discord's messages.read scope the next time the daemon reconnects
or reloads authentication.
CLI
sigaw-ctl supports:
sigaw-ctl statusshows daemon, voice, and overlay statesigaw-ctl toggletoggles overlay visibilitysigaw-ctl reloadreloads the config filesigaw-ctl stopstops the daemonsigaw-ctl configprints the active config path
Troubleshooting
If the overlay does not appear:
- Start it with
sigaw-run <game>. - For Vulkan-only debugging, try
SIGAW=1 <game>. - For OpenGL-only debugging, try
LD_PRELOAD=/usr/lib/libSigawGL.so <game>. - On Proton/Wine,
SIGAW_WINE_POLICY=auto|force|disablecontrols fallback behavior.disableis the safe escape hatch if an injected Vulkan layer keeps a game from launching. - Verify the daemon is running with
sigaw-ctl status. - If you installed from source, confirm
sudo meson install -C buildcompleted successfully. - Avoid stacking another swap-buffer interposer on top of Sigaw.
If the tray icon does not appear:
- Confirm you started
sigaw-daemonfrom a graphical user session. - Make sure your desktop environment exposes an AppIndicator or StatusNotifier host.
If you need daemon logs:
journalctl --user -u sigaw-daemon -f
Related Projects
License
MIT. See LICENSE.