Linux Development
This guide covers local desktop development on Linux, including the common WebKitGTK dependencies and troubleshooting steps for Arch Linux, CachyOS, Debian, Ubuntu, Fedora, and similar desktop distributions.
1. System Dependencies
Required local versions are pinned in the app repository: Node.js 24.x in
.nvmrc and Rust 1.96.0 in rust-toolchain.toml.
Tauri v2 requires GTK3, WebKitGTK using the 4.1 API, libsoup3, OpenSSL,
pkg-config, and the normal app indicator/image packages used by Linux desktop
bundles. The x86_64 Linux build also uses mold because .cargo/config.toml
passes -fuse-ld=mold.
Debian / Ubuntu
sudo apt-get update
sudo apt-get install -y \
build-essential curl file libayatana-appindicator3-dev librsvg2-dev \
libssl-dev libwebkit2gtk-4.1-dev libxdo-dev mold pkg-config wget
Fedora
sudo dnf install \
gcc gcc-c++ make pkgconf-pkg-config webkit2gtk4.1-devel \
libsoup3-devel openssl-devel libxdo-devel librsvg2-devel mold
Arch Linux / CachyOS
sudo pacman -S --needed \
base-devel webkit2gtk-4.1 libsoup3 openssl pkgconf mold
After installing the OS packages, install the pinned Rust toolchain and desktop dependencies, then run the repository doctor:
rustup toolchain install
make setup
make doctor
Build temp directory
If /tmp is a small tmpfs, large Rust/Tauri builds can fail while compiling or
linking. Use a repo-local temp directory for those runs:
mkdir -p .irodori-local/tmp
TMPDIR=$PWD/.irodori-local/tmp make desktop-build-verified
AppImage FUSE Dependency
Arch Linux and CachyOS default to fuse3. To run built AppImages directly
without extracting them, you can optionally install FUSE v2:
sudo pacman -S --needed fuse2
If you do not want to install fuse2, you can execute the AppImage by
extracting it inline using the environment variable:
APPIMAGE_EXTRACT_AND_RUN=1 ./Irodori-Table.AppImage
(This is handled automatically by the project’s make run-linux and apps/desktop/tools/install-linux.mjs wrapper).
2. Troubleshooting GPU & WebKit Crashes
On Arch-based distros (especially those using NVIDIA drivers, Wayland, or Mesa hybrid graphics), the WebKit2Gtk rendering engine might crash silently or produce white screens. Use the following workarounds:
WebKit DMA-BUF Crash (White/Blank Screen)
If the application launches but renders a solid white screen or crashes with WebProcess failures in journalctl, disable DMA-BUF rendering:
export WEBKIT_DISABLE_DMABUF_RENDERER=1
Compositing Mode Crash
If the window still crashes, force software compositing:
export WEBKIT_DISABLE_COMPOSITING_MODE=1
Wayland vs. X11 Backend
If WebKit has input focus or window rendering issues under Wayland, force GDK to run via XWayland:
export GDK_BACKEND=x11
Or force Wayland native:
export GDK_BACKEND=wayland
3. Running and Debugging Locally
Running in Dev Mode
To run the hot-reloading development server:
make desktop-dev
make desktop-dev runs the Tauri CLI from apps/desktop, which starts Vite and
the desktop shell together.
Direct Binary Execution
Heads up: a debug binary loads its UI from the Vite dev server (
devUrl http://localhost:1420intauri.conf.json). Launching the debug binary on its own shows a blank window with “Could not connect to localhost: Connection refused” because nothing is serving port 1420. See the troubleshooting entry below.
To inspect Rust stdout/logs while still pointing the webview at a running UI, start the dev server first, then launch the binary in a second terminal:
# Terminal 1 - serve the frontend on :1420
make desktop-vite
# Terminal 2 - run the already-built debug binary
./.irodori-local/target/debug/irodori-table-desktop
To run a standalone binary that needs no dev server, build one with the
frontend embedded from frontendDist (../dist):
make desktop-build # populate apps/desktop/dist
npm --prefix apps/desktop run tauri -- build --debug
# Or a full AppImage with embedded assets:
make run-linux
Error: “Could not connect to localhost: Connection refused”
A blank window with this message is not a database error - the webview could
not reach the dev server URL baked into a debug build (http://localhost:1420).
Checklist:
- Use
make desktop-devinstead of launching the debug binary directly - it starts Vite (beforeDevCommand) and the app together. - If you must run the binary directly, confirm Vite is up:
ss -ltnp | grep 1420should show a listener. If not, runmake desktop-vitefirst. - The dev port is fixed and
strictPort: true, so if:1420is already taken, Vite exits and the app has nothing to connect to. Free the port (fuser -k 1420/tcp) or stop the other process, then retry. - For a no-dev-server run, use an embedded-assets build
(
npm --prefix apps/desktop run tauri -- build --debugormake run-linux); a debug binary alone always expects:1420.
Reading Console and Rust Logs
- Developer Tools: Open Help > Open Developer Tools from the app menubar during debug/dev runs. The WebView’s default right-click inspection menu is suppressed so product context menus stay clean.
- Stdout/Stderr Console: Run the app from a terminal. Console logs (
console.log) from the React frontend andprintln!/logevents from the Rust backend will print directly to the terminal stdout. - Core Dumps & Journal: If the app segfaults or WebKit crashes, inspect system logs:
journalctl -xe --user -u irodori-table # Or simply view core dump stats: coredumpctl list