Skip to content

macco-dev/sigaw

Repository files navigation

Sigaw

Sigaw (Filipino: "shout/call"), a Discord voice overlay for Linux that works on Wayland fullscreen.

Sigaw logo

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-ctl for 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 Sigaw overlay with a channel header, speaker highlight, and inline mute and deaf icons. Sigaw overlay showing the latest fading voice chat rows beneath the voice roster. Compact Sigaw overlay with avatar-only rows, a speaking ring, and mute badges. Sigaw overlay showing a larger voice channel collapsed into a plus more row.
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 overlay
  • Show voice messages
  • Compact mode
  • Open config
  • Reload config
  • Stop 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 status shows daemon, voice, and overlay state
  • sigaw-ctl toggle toggles overlay visibility
  • sigaw-ctl reload reloads the config file
  • sigaw-ctl stop stops the daemon
  • sigaw-ctl config prints 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|disable controls fallback behavior. disable is 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 build completed successfully.
  • Avoid stacking another swap-buffer interposer on top of Sigaw.

If the tray icon does not appear:

  • Confirm you started sigaw-daemon from 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.

About

Renders a Discord voice channel overlay directly inside your game.

Topics

Resources

License

Stars

Watchers

Forks

Contributors