Skip to content

Building from source

Zephyr is a Tauri 2 + Svelte 5 app. Building it locally takes about 5 minutes the first time, ~30 seconds for subsequent rebuilds.

Prerequisites

  • Rust stable toolchain - install via rustup.
  • Node.js 18+ - nodejs.org or via your package manager.
  • pnpm - npm i -g pnpm once Node is installed.
  • Platform-specific deps for Tauri - see Tauri's prerequisites for your OS.

On Linux you'll typically need:

sh
sudo apt install libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev

On Windows you need the Microsoft C++ Build Tools + WebView2 runtime (the latter usually pre-installed on Win10/11).

On macOS, Xcode Command Line Tools (xcode-select --install) is enough.

Clone

sh
git clone https://github.com/Prismo-Studio/Zephyr.git
cd Zephyr

Install JS deps

sh
pnpm install

This pulls Svelte, Tauri's JS bindings, and dev tools. ~30 seconds on a normal connection.

Run in dev mode

sh
pnpm tauri dev

Compiles the Rust side (slow first time, fast on subsequent runs thanks to cargo cache) and launches Zephyr with HMR - frontend changes hot-reload, Rust changes trigger a recompile + restart.

Build a release binary

sh
pnpm tauri build

Output:

OSOutput
Windowssrc-tauri/target/release/bundle/nsis/Zephyr_x.y.z_x64-setup.exe
macOSsrc-tauri/target/release/bundle/dmg/Zephyr_x.y.z_x64.dmg
Linuxsrc-tauri/target/release/bundle/appimage/zephyr_x.y.z_amd64.AppImage and bundle/deb/zephyr_x.y.z_amd64.deb

Release builds take 3-5 minutes on a modern machine.

Project layout

Zephyr/
├── src/                      # Svelte 5 frontend
│   ├── lib/
│   │   ├── components/       # reusable UI components
│   │   ├── features/         # feature-specific code (randomizer, console, etc.)
│   │   ├── state/            # Svelte 5 runes-based stores
│   │   └── api/              # thin wrappers around Tauri invoke()
│   └── routes/               # SvelteKit routing
├── src-tauri/                # Rust backend
│   ├── src/
│   │   ├── randomizer/       # Archipelago integration
│   │   ├── profile/          # mod profiles, install, sync
│   │   └── ...
│   ├── Cargo.toml
│   └── tauri.conf.json       # app metadata, build config
├── messages/                 # i18n translations (Inlang Paraglide)
├── data/randomizer/schemas/  # bundled Archipelago option schemas
└── scripts/                  # Python helpers (schema extractor, patcher, etc.)

Common tasks

TaskCommand
Run frontend type-checkpnpm check
Run formatter checkpnpm lint (Prettier in --check mode)
Formatpnpm format
Run Rust testscargo test --manifest-path src-tauri/Cargo.toml
Regenerate translationspnpm machine-translate (best-effort, review before committing)
Bump versionedit src-tauri/tauri.conf.json + src-tauri/Cargo.toml + package.json

Debugging

The dev build opens with the WebView devtools accessible via right-click → Inspect Element. Console output, network panel, all standard browser tools.

For Rust-side logs, set RUST_LOG:

sh
RUST_LOG=zephyr=debug pnpm tauri dev

Logs go to stdout in dev, and to the data dir's latest.log in release builds.

Cross-compiling

Tauri can cross-compile in some cases but it's painful. The release pipeline builds each OS on its own runner - see .github/workflows/release.yml. For local cross-compilation, use a VM or wait for the CI build.

Contributing

PRs welcome. Please:

  • Run pnpm check, pnpm lint, and cargo test before submitting.
  • Add tests for non-trivial backend logic.
  • For UI changes, attach before/after screenshots in the PR description.
  • One feature/fix per PR - easier to review.

Issues to start with are tagged good first issue.

License

Zephyr is GPL-3.0. Forks and modified versions must keep the same license. The bundled Archipelago runtime is MIT-licensed independently.

Released under GPL-3.0.