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.
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.
- 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
Generated from the current renderer on a 3840x2160 test frame. Regenerate them
with meson compile -C build render-readme-screenshots.
- Linux only
- Vulkan applications, plus OpenGL via GLX/EGL
- Discord desktop client only
- Voice overlay only
git clone https://git.macco.dev/macco/sigaw.git
cd sigaw
meson setup build --prefix=/usr
meson compile -C build
sudo meson install -C buildsigaw-daemon --init-config
$EDITOR ~/.config/sigaw/sigaw.confsigaw-daemon --foregroundOr enable the installed user service:
systemctl --user daemon-reload
systemctl --user enable --now sigaw-daemonOn 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
sigaw-run ./my-gameCommon launch patterns:
sigaw-run %command%
sigaw-run -- gamescope -f -- %command%Manual paths:
SIGAW=1 ./vulkan-game
LD_PRELOAD=/usr/lib/libSigawGL.so ./opengl-gamesigaw-ctl statusIf the daemon is connected and you are in a voice channel, sigaw-ctl status
shows the current channel, users, and overlay visibility state.
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-appindicatorUbuntu / Debian
sudo apt install libvulkan-dev meson ninja-build \
nlohmann-json3-dev libcurl4-openssl-dev \
libfreetype-dev libpng-dev libgtk-3-dev \
libayatana-appindicator3-devSigaw 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=trueProfile 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.
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
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 -fMIT. See LICENSE.



