Developing
Cyclemetry is open source. The code lives on GitHub , and issues or pull requests are welcome.
Prerequisites
Setup
Install dependencies from the repo root:
pnpm installRunning Locally
Start the desktop app in development mode:
pnpm devAdding a Bundled Font
Drop a .ttf or .otf file into resources/fonts/. The Tauri bundler picks up the whole directory, and the font picker in the app lists it automatically. No config changes required.
Releasing
- Set the new release version in
src-tauri/Cargo.toml. - Add the matching changelog page at
website/content/changelog/vX-Y-Z.mdx, then add it to the release table inwebsite/content/changelog/index.mdxand_meta.js. - Run the release command from the repo root:
pnpm releaseThe release script checks that the website changelog entry exists before it tags anything. It syncs the version to package.json, app/package.json, and src-tauri/Cargo.lock, commits those release metadata and changelog files, creates a vX.Y.Z git tag, pushes main plus the tag, and starts the Release workflow for all platforms with publishing enabled.
Test a Release Build
Run the Release workflow with publishing disabled for the platform you want to test:
gh workflow run release.yml -f platform=macos -f publish_release=false
gh workflow run release.yml -f platform=windows -f publish_release=false
gh workflow run release.yml -f platform=linux -f publish_release=falseThis builds the release artifacts in GitHub Actions and uploads them as workflow artifacts, but does not publish anything to GitHub Releases. Use -f platform=all only when you want to test every platform in one run.
The Release workflow is manual-only. In the GitHub UI, choose a platform and leave publish_release unchecked to test builds. The pnpm release command starts the all-platform publishing workflow for the vX.Y.Z release.
Inspect Built App Logs
When debugging the installed macOS app, stream the built app log from Terminal:
tail -f ~/Library/Logs/com.cyclemetry/cyclemetry.logThis is useful for inspecting startup problems, render failures, and other behavior that may not be visible in the app UI.