Versioning
Spacedrive follows semver with pre-release suffixes for alpha/beta releases.core/Cargo.tomlapps/server/Cargo.tomlapps/cli/Cargo.tomlapps/tauri/src-tauri/Cargo.tomlapps/tauri/sd-tauri-core/Cargo.tomlapps/tauri/src-tauri/tauri.conf.jsonapps/tauri/package.json
Bump Command
cargo xtask bump updates all version files, commits the changes, and creates a git tag.
- Updates the version string in all 7 files
- Commits with message
v2.0.0-alpha.2 - Creates git tag
v2.0.0-alpha.2
Workflows
Five GitHub Actions workflows handle CI and releases.CI (ci.yml)
Runs on every pull request and push to main. Handles formatting checks, linting, and build verification. This is the standard PR gate.
Core Tests (core_tests.yml)
Runs sd-core integration tests on push to main across macOS, Linux, and Windows. Tests run on real hardware including self-hosted macOS ARM64 and Windows runners.
Release (release.yml)
Triggered by pushing a v* tag or manual dispatch. Builds all release artifacts and creates a draft GitHub release.
Server binary builds:
Server binaries are compiled with
sd-core/heif, sd-core/ffmpeg, and sd-core/ai features enabled. Each produces a tarball with the binary and a SHA256 checksum.
Desktop builds (Tauri):
Desktop builds go through
tauri-action which handles code signing (macOS), Tauri signing keys (for the updater), and bundle creation. macOS builds run on self-hosted runners with Apple signing certificates.
The final release job waits for all builds to complete, downloads all artifacts, and creates a draft release on GitHub. The release is always created as a draft so you can review before publishing.
The release is created as a draft. You must manually publish it on GitHub after verifying the artifacts.
Server Docker (server.yml)
Triggered by the same v* tag or manual dispatch. Builds a multi-arch Docker image (amd64 + arm64) and pushes it to GitHub Container Registry at ghcr.io/spacedriveapp/spacedrive/server.
The Docker build uses buildah with QEMU emulation for cross-platform images. The Dockerfile is at apps/server/Dockerfile.
Tagging behavior:
The
latest tag only moves for stable releases (tags matching vX.Y.Z with no suffix). Pre-release tags like alpha or beta are published under their specific version only. This protects users pulling latest from getting unstable builds.
Mobile Release (mobile.yml)
Manual dispatch only. Builds the React Native app for iOS and/or Android. A platform picker lets you build ios, android, or all.
The mobile app bundles sd-mobile-core, a native Expo module that wraps the Spacedrive Rust core. This means mobile builds require the full Cargo workspace and Rust cross-compilation toolchain, not just JavaScript bundling.
iOS (TestFlight):
- Compiles
sd-mobile-coreforaarch64-apple-iosviacargo xtask build-mobile - Runs
expo prebuildto generate the Xcode project - Archives with
xcodebuildusing manual code signing - Exports IPA with
app-store-connectdistribution method - Uploads directly to TestFlight via
xcrun altool
- Compiles
sd-mobile-coreforaarch64-linux-androidviacargo xtask build-mobile - Runs
expo prebuildto generate the Android project - Builds a signed AAB with
./gradlew bundleRelease - Uploads to Play Store internal testing track
The mobile workflow is manual dispatch only. It is not triggered by tags. Run it from the Actions tab when you want to push a mobile build to testers.
Release Flow
A full release looks like this:release.yml and server.yml trigger in parallel from the same tag push. The GitHub release is created as a draft. The Docker image is pushed to ghcr.io immediately.
Mobile releases are decoupled from this flow. Trigger the mobile workflow manually from the Actions tab when you want to push a build to TestFlight or Play Store internal testing.
Tauri Updater
Desktop builds includeincludeUpdaterJson: true in the Tauri action config. This generates a JSON manifest that the Tauri updater checks against to notify users of new versions. The updater JSON files are included as release artifacts alongside the binaries.
Secrets
The release workflow depends on several repository secrets:
The Docker workflow uses only
GITHUB_TOKEN which is provided automatically.