Building from source
Trove is open source under the MIT license. This page gets you from a fresh clone to a running desktop build.
Prerequisites
Section titled “Prerequisites”| Tool | Version | Why |
|---|---|---|
| Node.js | ≥ 24 | Runs the workspace tooling. Use nvm use — .nvmrc pins it. |
| pnpm | ≥ 10 | The workspace package manager. Install via Corepack. |
| Rust | stable | Compiles the Tauri core. Install with rustfmt and clippy. |
| Go | ≥ 1.23 | Only needed to build the collector sidecar (pnpm build:collector). |
You’ll also need the platform-specific Tauri system dependencies — see the Tauri prerequisites guide for macOS, Windows, and Linux.
Clone and bootstrap
Section titled “Clone and bootstrap”-
Clone the repository:
Terminal window git clone https://github.com/Intevity/trove.gitcd trove -
Use the pinned Node version and install dependencies:
Terminal window nvm usepnpm installThe first
pnpm installalso installs the lefthook git hooks via thepreparescript — Prettier + ESLint on staged files at commit time, andpnpm typecheck && pnpm testat push time. -
Build the workspace packages the app imports from their
dist/:Terminal window pnpm buildThis compiles
@trove/shared,@trove/collector-presets, and the rest. Skip it on a fresh clone and the app fails to resolve them.
Build the collector sidecar
Section titled “Build the collector sidecar”Trove bundles a custom OpenTelemetry Collector binary built with ocb. You build it once per platform; both steps are gitignored outputs, so every contributor builds locally for their host.
-
Build the binary (≈ 1–2 min on first run — it downloads and compiles the collector components):
Terminal window pnpm build:collectorscripts/build-collector.shresolves your host Rust target triple, installs the pinnedocbviago installif it isn’t already onPATH, and writes the binary toresources/otelcol/dist/<triple>/trove-otelcol[.exe]. -
Stage the binary where Tauri’s
externalBinresolver expects it:Terminal window pnpm bundle:sidecarThis copies the binary into
packages/app/src-tauri/binaries/trove-otelcol-<triple>[.exe]. Tauri strips the suffix at bundle time, so the runtime sees a plaintrove-otelcolnext to the app executable.
Run the app
Section titled “Run the app”Boot the desktop app with the Vite dev server and Rust hot reload:
pnpm --filter @trove/app tauri:devProduce an installable local build (unsigned). This is the standard loop after a UI change:
pnpm build:appbuild:app runs scripts/build-app.mjs, which builds an unsigned bundle,
installs it, and relaunches the app.
Production build
Section titled “Production build”To produce signed, distributable bundles, the Tauri build runs directly:
pnpm build:app:release # pnpm -F app tauri buildRelease outputs land in
packages/app/src-tauri/target/release/bundle/:
| Platform | Output |
|---|---|
| macOS | macos/Trove.app, .dmg |
| Linux | .deb, .rpm, .AppImage |
| Windows | .msi, NSIS installer |
Run the checks
Section titled “Run the checks”Before opening a PR, run the same checks CI runs:
pnpm lintpnpm format:checkpnpm typecheckpnpm testcargo clippy --manifest-path packages/app/src-tauri/Cargo.toml --all-targets -- -D warningscargo test --manifest-path packages/app/src-tauri/Cargo.tomlSee Testing for the coverage gate and Contributing for the PR conventions.