Pulse · Linux · build from source v0.1.0 · source

Install Pulse on Linux

Build from source · 6 steps · no official build today

Run Pulse on Linux by building it from source. There is no official Linux build today. Pulse is developed and tested primarily on Windows, and the community has ported the source to GTK3 and WebKit2GTK. Expect rough edges; if a step fails, open a GitHub issue and include the error output.

Two artifacts at the end: a .deb for Debian and Ubuntu, and an .AppImage that runs on most modern Linux desktops. Both are unsigned — there is no apt or pacman repository, and there is no auto-update channel.

Step 1

Prerequisites

Five toolchain pieces. Versions are minimums — newer is fine.

  • Node.js 20 or newer. The frontend is plain TypeScript on Vite. Use the Node release line that ships in the distro, or nodejs.org for the LTS tarball. Check with node --version.
  • Rust 1.75 or newer. Tauri 2 needs the 1.75 toolchain. Install via rustup.rs: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh. Check with rustc --version.
  • npm (bundled with Node 20+) or pnpm. The repo uses package.json scripts; the lockfile is npm.
  • git for cloning the repository. Most distros ship a recent git in their default repo.
  • Build tools: build-essential on Debian and Ubuntu, base-devel on Arch, @development-tools on Fedora. Tauri also needs pkg-config and the OpenSSL development headers (libssl-dev on Debian, openssl-devel on Fedora, openssl on Arch).
Step 2

Install Tauri system dependencies

GTK3 and WebKit2GTK are not bundled — they come from the distro. The package list is the Tauri 2 prerequisite set as published in the Tauri docs.

Ubuntu · Debian

apt

sudo apt update
sudo apt install -y libwebkit2gtk-4.1-dev \
  build-essential curl wget file pkg-config \
  libgtk-3-dev libayatana-appindicator3-dev \
  librsvg2-dev libssl-dev

On Debian 12 and Ubuntu 22.04, libwebkit2gtk-4.1-dev is the right package. On older Ubuntu 20.04 and Debian 11, swap to libwebkit2gtk-4.0-dev.

Fedora · RHEL

dnf

sudo dnf install -y webkit2gtk4.1-devel \
  gcc gcc-c++ make pkg-config \
  gtk3-devel libappindicator-gtk3-devel \
  librsvg2-devel openssl-devel

On Fedora 40 and newer, the package is webkit2gtk4.1-devel. On Fedora 39 and older, swap to webkit2gtk4.0-devel.

Arch · Manjaro

pacman

sudo pacman -Syu --needed \
  webkit2gtk-4.1 base-devel curl wget file pkg-config \
  gtk3 libappindicator-gtk3 librsvg openssl

The base-devel meta-package pulls gcc, make, and binutils. Replace webkit2gtk-4.1 with webkit2gtk-4.0 on Arch installs that predate the 4.1 bump.

The list above mirrors the Tauri 2 Linux prerequisites page. Versions of webkit2gtk shift between distros; if the build fails on a missing webkit2gtk-4.1 package, fall back to webkit2gtk-4.0 on older releases.

Step 3

Clone the repository

The Linux build lives in the pulse-desktop subdirectory of the main repo.

git clone https://github.com/TimesNuRoman/pulse.git
cd pulse/pulse-desktop

The monorepo holds Pulse for Windows, the Android app, and the shared data model. The Tauri app is in pulse-desktop. The rest of this guide assumes the working directory is that folder.

Step 4

Install npm dependencies

JavaScript dependencies and the Tauri CLI. First run takes 30 to 90 seconds on a fast connection.

npm install

The install pulls the Vite frontend, the Tauri 2 JavaScript bindings, and the Ollama client. The Rust toolchain handles the backend on the first tauri dev run, not during npm install.

Step 5

Run the dev build

Compiles the Rust backend and opens the dev window. First build is 3 to 5 minutes; later runs are incremental.

npm run tauri dev

The first run downloads and compiles every Tauri dependency — the Rust crates that bind to GTK3, WebKit2GTK, and the Vite plugins. Build output streams to the terminal; the Pulse window appears once the compile finishes.

Edits to TypeScript files hot-reload. Edits to Rust files trigger an incremental rebuild of the affected crate. The dev window uses the same Ollama runtime as production, so any local model that works on Windows will work here.

Step 6

Build the production artifacts

Two outputs in src-tauri/target/release/bundle/: a .deb and an .AppImage.

npm run tauri build

The build pipeline produces a Debian package for Debian-based distros, an AppImage for portable use, and a raw ELF binary under src-tauri/target/release/pulse-desktop. The full output tree:

  • Debian packagesrc-tauri/target/release/bundle/deb/Pulse_0.1.0_amd64.deb
  • AppImagesrc-tauri/target/release/bundle/appimage/Pulse_0.1.0_amd64.AppImage
  • Raw binarysrc-tauri/target/release/pulse-desktop (run directly, no install)

The .deb installs to /opt/pulse-desktop and registers a .desktop entry. The AppImage is a single file that runs from any folder, no install required. The raw binary skips the bundler entirely.

None of the three is signed. There is no apt repository and no auto-update mechanism. Re-run npm run tauri build to upgrade.

Troubleshooting

Things that go wrong

Four issues that come up most often, and the fix for each.

  • Build fails on a missing webkit2gtk-4.1 package. Older distros (Ubuntu 20.04, Debian 11, Fedora 39 and earlier) ship only webkit2gtk-4.0. The fix is in the Tauri config: open src-tauri/Cargo.toml, find the tauri dependency, and append features = ["gtk-4-0"] — or downgrade to Tauri 2.0.x line, which defaults to 4.0. The distro package list in Step 2 documents the swap.
  • Cargo errors with failed to run custom build command for openssl-sys. OpenSSL development headers are missing. On Debian and Ubuntu: sudo apt install libssl-dev. On Fedora: sudo dnf install openssl-devel. On Arch: sudo pacman -S openssl.
  • Rust version too old: error: package `tauri v2.x` requires Rust 1.77.2. The repo's rust-toolchain.toml pins the minimum Rust. Update via rustup update, or accept the toolchain prompt and let rustup download it. Older system rustc packages (e.g. apt install rustc) will not work; use rustup.rs.
  • The dev window is blank, or fonts look broken. Tauri on Linux needs a running compositor. Wayland sessions occasionally glitch with WebKit2GTK 4.1 — set WEBKIT_DISABLE_DMABUF_RENDERER=1 in the environment, or launch with GDK_BACKEND=x11 as a workaround. Headless servers (no display) will not start the dev window.
  • Ollama fails to start inside the app. The bundled Ollama runtime ships only on the Windows installer. On Linux, install Ollama separately via the Ollama Linux install script and verify it with ollama --version before launching Pulse.
Honest note

Known limitations

The Linux port is a community build. Some things on Windows do not work here yet.

  • No code signing. The .deb and .AppImage are unsigned. Some Linux distros (e.g. Fedora with strict SELinux policies, or Ubuntu Snap users) will need the file marked executable and run with explicit user consent.
  • No auto-update. Pulse for Windows uses a signed update manifest under /updates/desktop.json. The Linux build does not have an update channel — re-run npm run tauri build to upgrade.
  • No native installer for RPM or pacman. The Tauri build pipeline emits .deb and .AppImage. Fedora and Arch users fall back to the AppImage or the raw ELF binary.
  • Wayland may glitch. The dev window relies on WebKit2GTK and the GTK3 port. Wayland sessions work in most cases, but rare compositor issues (flicker on resize, no global hotkey on GNOME Wayland) remain. The known workaround is the XWayland fallback (GDK_BACKEND=x11).
  • Voice input is Windows-only. The panel's mic button uses the Windows SpeechRecognition API. On Linux, the button is disabled.
Get help

Get help

One channel: GitHub Issues. Include the error output and the distro version.

Open an issue on the pulse issue tracker and tag it linux. The minimum reproduction set is: distro and version, Node version, Rust version, the failing tauri dev or tauri build output, and the contents of ~/.cargo/registry/cache/ if the build failed on a specific crate.

Source patches go through the standard fork-and-pull-request flow on the pulse-desktop tree. CI runs on Ubuntu 22.04, Fedora 40, and Arch; a patch that breaks one of those three gets flagged before merge.