Skip to main content

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:

FieldValue
PublisherGitHub Actions
Organization or userneelsani
Repositoryopenipc-rs
Workflow filenameci.yml
Allowed actionnpm publish

The existing Cloudflare secrets are still required for master deploys:

  • CLOUDFLARE_API_TOKEN
  • CLOUDFLARE_ACCOUNT_ID

Generated Artifacts

Generated artifacts are ignored by git:

  • Rust target/,
  • .cargo-tools/,
  • crates/openipc-web/pkg/,
  • app node_modules/ and dist/,
  • app .wrangler/,
  • docs node_modules/, .docusaurus/, and build/,
  • 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-core
  • openipc-rtl88xx
  • openipc-native
  • openipc-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 labelGitHub runnerRust target
linux-x64ubuntu-24.04x86_64-unknown-linux-gnu
linux-arm64ubuntu-24.04-armaarch64-unknown-linux-gnu
macos-apple-siliconmacos-15aarch64-apple-darwin
macos-intelmacos-15-intelx86_64-apple-darwin
windows-x64windows-2025x86_64-pc-windows-msvc
windows-arm64windows-11-armaarch64-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