Publishing
The repository uses one lockstep SemVer version for the Rust crates, WASM npm metadata, station app, Tauri shell, and docs site.
Preview a release:
scripts/release-version.sh 0.2.0 --dry-run
Create the version bump commit and annotated Git tag:
scripts/release-version.sh 0.2.0
Push the branch and tag:
scripts/release-version.sh 0.2.0 --push
Pushing the v0.2.0 tag triggers GitHub Actions release jobs. After the normal
checks pass, CI publishes crates.io packages, publishes @openipc-rs/web to npm
with trusted publishing, and uploads Tauri desktop bundles to the GitHub Release.
Required release secret:
CARGO_REGISTRY_TOKEN
Configure npm trusted publishing for @openipc-rs/web on npmjs.com:
| Field | Value |
|---|---|
| Publisher | GitHub Actions |
| Organization or user | neelsani |
| Repository | openipc-rs |
| Workflow filename | ci.yml |
| Allowed action | npm publish |
The existing Cloudflare secrets are still required for master deploys:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
Generated Artifacts
Generated artifacts are ignored by git:
- Rust
target/, .cargo-tools/,crates/openipc-web/pkg/,- app
node_modules/anddist/, - app
.wrangler/, - docs
node_modules/,.docusaurus/, andbuild/, - root-level npm package tarballs.
Clean them with:
sh scripts/clean-generated.sh
WASM npm Package
Build before packing or publishing:
npm --prefix crates/openipc-web run build
npm pack --dry-run crates/openipc-web/pkg
Publish when ready:
npm publish crates/openipc-web/pkg --access public
CI performs this automatically for v* tags with npm trusted publishing. The
workflow grants id-token: write, uses Node 24, and does not need NPM_TOKEN.
npm generates provenance automatically for public packages published from
GitHub Actions trusted publishing.
Cargo Crates
The library crates are intended for crates.io publication:
openipc-coreopenipc-rtl88xxopenipc-nativeopenipc-web
openipc-core is the easiest crate to publish because it owns protocol logic
and does not need USB access. The hardware and WASM crates depend on the
published nusb-webusb package while importing it as nusb:
nusb = { package = "nusb-webusb", version = "0.2.3" }
Dry-run the workspace publish before publishing:
cargo publish --workspace --dry-run
Publish after logging in to crates.io or configuring CARGO_REGISTRY_TOKEN:
cargo publish --workspace
openipc-rs-desktop is marked publish = false because the Tauri desktop shell
is released as bundled applications, not as a crates.io package.
Desktop Releases
Tauri desktop bundles are uploaded to the GitHub Release for each v* tag for:
| Release label | GitHub runner | Rust target |
|---|---|---|
linux-x64 | ubuntu-24.04 | x86_64-unknown-linux-gnu |
linux-arm64 | ubuntu-24.04-arm | aarch64-unknown-linux-gnu |
macos-apple-silicon | macos-15 | aarch64-apple-darwin |
macos-intel | macos-15-intel | x86_64-apple-darwin |
windows-x64 | windows-2025 | x86_64-pc-windows-msvc |
windows-arm64 | windows-11-arm | aarch64-pc-windows-msvc |
Linux releases are built on Ubuntu runners and emit the Linux bundle formats
enabled by Tauri, such as AppImage, .deb, and .rpm; they are not separate
per-distro builds.
These bundles are currently unsigned. Users may see operating-system warnings until signing and notarization are configured.
Station Web App
The browser/WebUSB OpenIPC Station app is built from apps/openipc-station.
Its production build includes the generated Rust/WASM package:
cd apps/openipc-station
npm run build
Deploy it to Cloudflare Workers:
npm run deploy:worker