# Troubleshooting ## Jay doesn't start / black screen Jay requires **at least one working renderer** -- without one, no GPU can be initialized and nothing will be displayed. It supports Vulkan (via libvulkan plus a GPU-specific driver) and OpenGL (via libEGL and libGLESv2). These libraries are loaded at runtime, not linked at build time. Vulkan is the primary renderer and should be used whenever possible; the OpenGL renderer is maintained only for backwards compatibility. Check that the required libraries are installed: ```shell ~$ ls /usr/lib/libEGL.so* /usr/lib/libGLESv2.so* /usr/lib/libvulkan.so* 2>/dev/null ``` > [!NOTE] > On some distributions (e.g. Fedora, Debian), 64-bit libraries live in > `/usr/lib64/` or `/usr/lib/x86_64-linux-gnu/` instead. If nothing is listed, install the appropriate packages. See the [Installation](installation.md) chapter for package names by distribution. **Nvidia users:** - You need **Linux 6.7 or later** for explicit sync support, which is required for Nvidia GPUs. - Make sure the Nvidia Vulkan ICD (Installable Client Driver) is installed. Jay's Vulkan renderer is the recommended option on Nvidia hardware. ## No applications open The built-in default configuration binds: - `Super_L` (left Windows key) -- open [Alacritty](https://alacritty.org/). - `alt-p` -- open [bemenu](https://github.com/Cloudef/bemenu) as an application launcher. If neither application is installed, nothing will happen when you press these keys. Either install them or create a custom configuration with your preferred applications: ```shell ~$ jay config init ``` Then edit `~/.config/jay/config.toml` to change the terminal and launcher bindings. > [!IMPORTANT] > If you created a config file manually (e.g. by touching an empty file), it > will have **no shortcuts at all**. Jay replaces the entire built-in default > when any config file exists. Always use `jay config init` to start with a > working configuration. ## Application doesn't have access to a protocol Jay splits Wayland protocols into unprivileged and privileged. By default, applications only have access to unprivileged protocols. If a program like a screen locker, status bar, clipboard manager, or screen-capture tool is not working, it likely needs access to one or more privileged protocols. Common symptoms include: - **swaylock** does nothing or fails to lock the screen (needs `session-lock`). - **waybar** or **i3bar** shows no workspace information (needs `foreign-toplevel-list`). - **wl-copy** / **cliphist** cannot access the clipboard (needs `data-control`). - **grim** or **slurp** cannot capture the screen (needs `screencopy`). **Quick fix -- grant all privileges:** The simplest approach is to launch the program with full access to all privileged protocols. In your config, set `privileged = true` in the exec action: ```toml on-idle = { type = "exec", exec = { prog = "swaylock", privileged = true, }, } ``` Or from the command line: ```shell ~$ jay run-privileged waybar ``` **Better fix -- grant only the capabilities needed:** Use a client rule to grant specific capabilities: ```toml [[clients]] match.comm = "waybar" capabilities = ["layer-shell", "foreign-toplevel-list"] ``` See [Granting Privileges](window-rules.md#granting-privileges) for the full list of capabilities and more advanced approaches using connection tags. ## Wrong keyboard layout The default keyboard layout is US QWERTY. To change it: **Option 1 -- edit the config:** ```shell ~$ jay config init ``` Then edit the `keymap.rmlvo` section in `~/.config/jay/config.toml`: ```toml [keymap.rmlvo] layout = "de" ``` **Option 2 -- change it at runtime:** ```shell ~$ jay input seat default set-keymap-from-names -l de ~$ jay input seat default set-keymap-from-names -l us -v intl ``` This takes effect immediately but does not persist across restarts unless configured in the config file. ## Screen sharing doesn't work Screen sharing requires PipeWire and the Jay desktop portal. **1. Check that PipeWire is running:** ```shell ~$ systemctl --user status pipewire ``` If it is not running, start it: ```shell ~$ systemctl --user start pipewire ``` **2. Check that the portal files are installed:** Jay needs two files to be found by the XDG desktop portal framework: - A portal definition file (e.g. `/usr/share/xdg-desktop-portal/portals/jay.portal`). - A portal configuration file (e.g. `/usr/share/xdg-desktop-portal/jay-portals.conf`). These files are included in the Jay repository under `etc/`. If you built Jay from source and did not install them, copy them manually: ```shell ~$ sudo cp etc/jay.portal /usr/share/xdg-desktop-portal/portals/ ~$ sudo cp etc/jay-portals.conf /usr/share/xdg-desktop-portal/ ``` **3. Restart the portal:** ```shell ~$ systemctl --user restart xdg-desktop-portal ``` See the [Screen Sharing](screen-sharing.md) chapter for more details. ## X11 applications don't work Jay uses Xwayland to run X11 applications. **1. Install Xwayland:** - Arch Linux: `sudo pacman -S xorg-xwayland` - Fedora: `sudo dnf install xorg-x11-server-Xwayland` - Debian/Ubuntu: `sudo apt install xwayland` **2. Check your configuration:** If you have a config file, make sure Xwayland is not explicitly disabled: ```toml [xwayland] # Make sure this is not set to false: # enabled = false ``` Xwayland is enabled by default. You can also check its status at runtime: ```shell ~$ jay xwayland status ``` ## Display manager doesn't show Jay **1. Check that the session file exists:** ```shell ~$ ls /usr/share/wayland-sessions/jay.desktop ``` If it does not exist, create it: ```shell ~$ sudo tee /usr/share/wayland-sessions/jay.desktop > /dev/null << 'EOF' [Desktop Entry] Name=Jay Comment=A Wayland Compositor Exec=jay run Type=Application DesktopNames=jay EOF ``` **2. Check that `jay` is in the system PATH:** If you installed Jay via `cargo install`, the binary is at `~/.cargo/bin/jay`. Display managers typically do not include `~/.cargo/bin` in their PATH. Either: - Add `~/.cargo/bin` to the system PATH, or - Create a symlink: ```shell ~$ sudo ln -s ~/.cargo/bin/jay /usr/local/bin/jay ``` ## How to check logs Open the log file in a pager: ```shell ~$ jay log ``` Follow the log in real time (like `tail -f`): ```shell ~$ jay log -f ``` Print just the log file path: ```shell ~$ jay log --path ``` Increase log verbosity at runtime: ```shell ~$ jay set-log-level debug ``` To set the log level at startup, add it to your config: ```toml log-level = "debug" ``` > [!NOTE] > The `log-level` config setting is read at startup and cannot be changed by > reloading the configuration. Use `jay set-log-level` for runtime changes. To automatically clean up old log files, see [Log File Cleanup](configuration/misc.md#log-file-cleanup). ## Performance issues If you experience dropped frames, stuttering, or high latency, try the following: **1. Use the Vulkan renderer:** The Vulkan renderer is generally faster and supports more features (e.g. HDR, direct scanout). Check your current API and switch if needed: ```shell ~$ jay randr show ~$ jay randr card card0 api vulkan ``` **2. Set `CAP_SYS_NICE`:** Granting `CAP_SYS_NICE` allows Jay to use real-time scheduling and high-priority Vulkan queues, which improves responsiveness under load: ```shell ~$ sudo setcap cap_sys_nice=p $(which jay) ``` > You need to re-run this command each time you update the Jay binary. **3. Adjust the flip margin:** The flip margin controls the time between initiating a page flip and the display's vblank. A smaller margin reduces input latency but risks missed frames. The default is 1.5 ms: ```shell ~$ jay randr card card0 timing set-flip-margin 1.5 ``` If you see missed frames, try increasing it. If you want lower latency, try decreasing it -- Jay will dynamically increase it if the margin is too small. **4. Enable direct scanout:** Direct scanout allows fullscreen applications to bypass the compositor's rendering pipeline entirely, reducing both latency and GPU usage: ```shell ~$ jay randr card card0 direct-scanout enable ```