Tested on major Linux distributions (Fedora, Ubuntu, Arch Linux) and tiling window managers (Hyprland, Sway)
If you encounter issues with your desktop environment, feel free to open an issue.
# Ubuntu/Debian:
sudo apt install gnome-shell-extension-appindicator
# Fedora:
sudo dnf install gnome-shell-extension-appindicator
# Arch Linux:
sudo pacman -S gnome-shell-extension-appindicatorKDE and other DEs have built-in system tray support, no need for appindicator
Current Implementation: Smart Auto-Selection
| Desktop Environment | Primary Tool | Fallback | Status |
|---|---|---|---|
| 🟢 GNOME+Wayland | RemoteDesktop portal → ydotool | clipboard | ✅ Auto-detected |
| 🟢 KDE+Wayland | RemoteDesktop portal → wtype | clipboard | ✅ Auto-detected |
| 🟢 Sway/Other Wayland | wtype → ydotool | clipboard | ✅ Auto-detected |
| 🟢 X11 (all DEs) | xdotool | clipboard | ✅ Works out-of-box |
GNOME/KDE use the RemoteDesktop portal when available (one-time permission dialog), with a tool/clipboard fallback.
Other Wayland compositors (Sway, Hyprland, etc.) use wtype out of the box.
Inside the sandbox wtype cannot work: the Wayland security-context blocks its
virtual-keyboard protocol on wlroots/Hyprland, and GNOME/KDE never exposed it.
Dabri therefore selects automatically:
| Compositor | Active-window typing | Setup |
|---|---|---|
| GNOME / KDE | RemoteDesktop portal | None — one-time permission dialog |
| Hyprland / wlroots / Sway | ydotool (uinput) | Opt-in (see below) |
The portal path is provided by go-wlportal and needs no extra permissions.
Note: the portal types through the active keyboard layout, so it can't produce characters outside it (e.g. any non-ASCII text on a Latin/US layout). In that case Dabri switches to clipboard mode and notifies you — paste with
Ctrl+V.
For wlroots/Hyprland auto-typing, grant uinput access once (otherwise Dabri falls back to clipboard):
# 1) Allow the sandbox to see /dev/uinput
flatpak override --user --device=all io.github.ashbuk.dabri
# 2) Allow non-root access to /dev/uinput on the host (if not already granted)
echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-uinput.rules
sudo udevadm control --reload && sudo udevadm trigger
sudo usermod -a -G input $USER # re-login requiredDabri starts its own ydotoold inside the sandbox when uinput is accessible.
Notifications go through the org.freedesktop.portal.Notification portal (no
extra permissions). It works wherever a Notification portal backend is present,
which most desktops ship by default. If yours doesn't, install one (e.g.
xdg-desktop-portal-gtk) or use the native package or AppImage instead.
The application automatically selects the best available typing tool:
- wtype: Works without setup on non-GNOME Wayland compositors (KDE, Sway, etc.). Automatically selected if available.
- ydotool: Required for GNOME/Wayland, also works as fallback on other Wayland compositors. Requires setup (see below).
- Install ydotool:
sudo dnf install ydotool # Fedora
sudo apt install ydotool # Ubuntu/Debian
- Allow access to /dev/uinput for non-root:
echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-uinput.rules
sudo udevadm control --reload && sudo udevadm trigger
sudo usermod -a -G input $USER
# Re-login required for group change
- Run ydotool as user-unit service (no root):
mkdir -p ~/.config/systemd/user
tee ~/.config/systemd/user/ydotool.service >/dev/null <<'EOF'
[Unit]
Description=ydotool user daemon
[Service]
ExecStart=/usr/bin/ydotoold --socket-perm=0660
Restart=always
[Install]
WantedBy=default.target
EOF
- Restart and run the service
systemctl --user daemon-reload
systemctl --user enable --now ydotoolThis setup uses user service: safer and no root privileges needed
For non-GNOME Wayland compositors, wtype work without any setup - the app will automatically try it first
X11 works out-of-the-box without additional setups
Clipboard fallback
- Works on all desktop environments
- Requires manual
Ctrl+Vafter speech recognition - No additional setup needed
Dabri handles hotkeys internally. Configure the key in ~/.config/dabri/config.yaml:
hotkeys:
start_recording: "ctrl+shift+r"
stop_recording: "ctrl+shift+r"Restart Dabri after saving.
Default provider: D-Bus GlobalShortcuts portal — works out of the box on GNOME and KDE, no setup required.
Hyprland: The portal registers shortcuts but Hyprland requires an explicit binding in hyprland.conf. Run hyprctl globalshortcuts while Dabri is running to see the registered IDs, then add:
bind = <mods>, <key>, global, <appid>:<shortcutid>
The classic direct input access approach. Use if:
- Your WM/DE doesn't implement XDG GlobalShortcuts (i3, bspwm, openbox, etc.)
- You want to rebind hotkeys from the Dabri tray menu directly
- Portal behavior is inconsistent on your setup
Trade-off: requires access to all input devices (/dev/input/event*), not just keyboard.
Option A — udev rule (scoped to session user, recommended):
echo 'KERNEL=="event*", SUBSYSTEM=="input", ATTRS{capabilities/key}!="0", TAG+="uaccess"' \
| sudo tee /etc/udev/rules.d/70-dabri-input.rules
sudo udevadm control --reload && sudo udevadm triggerOption B — input group (broader access):
sudo usermod -a -G input $USER # then logout/loginThen enable in ~/.config/dabri/config.yaml:
hotkeys:
provider: evdevLet your DE or WM handle the key — no provider needed, Dabri just receives the command.
- GNOME: Settings → Keyboard → Keyboard Shortcuts → Custom Shortcuts →
+→ command:dabri toggle - KDE: System Settings → Shortcuts → Custom Shortcuts →
+→ command:dabri toggle - Tiling WMs (i3, sway, bspwm, etc.):
bindsym $mod+r exec dabri toggle
Separate start/stop commands are also available: dabri start / dabri stop. See CLI Usage Guide.
If you want Dabri ready as soon as you log in (without launching app manually), add to your session startup:
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/dabri.desktop << 'EOF'
[Desktop Entry]
Name=Dabri
Exec=dabri
Icon=io.github.ashbuk.dabri
Type=Application
Terminal=false
X-GNOME-Autostart-enabled=true
EOFAdd to ~/.config/hypr/hyprland.conf:
exec-once = dabri
Last updated: 2026-06-20