Wellframe ships two independent artifacts:
| Artifact | What it is | Version source | Tag namespace |
|---|---|---|---|
Desktop app (desktop/) |
The Tauri desktop app (macOS/Windows/Linux installers) | desktop/package.json + desktop/src-tauri/tauri.conf.json |
v* |
Wellframe Coach MCPB (mcp-server/) |
An .mcpb bundle: an MCP server giving an AI host read-only access to your local wellframe.db |
mcp-server/manifest.json + mcp-server/package.json |
mcpb-v* |
Everything below is gated so nothing goes public on its own. Manual CI runs produce downloadable test builds; pushing a tag produces a draft GitHub Release that stays unpublished until you click Publish by hand.
The MCPB reads the same SQLite DB the desktop app writes
(<app-data>/com.codeyam.wellframe/wellframe.db) and finds it automatically per
OS — no configuration needed. Nothing is uploaded; it only reads local SQLite.
cd mcp-server
npm ci
npm run bundle # pack → smoke-test (9 tools) → sign
# → build/wellframe-coach.mcpb (~3.4 MB, self-signed)Optional extra checks:
npm run validate # manifest schema
npm run verify-signature # real PKCS#7 check (mcpb's own `verify` is broken in 2.x)- Open Claude Desktop → Settings → Extensions (Developer/Extensions pane).
- Drag
mcp-server/build/wellframe-coach.mcpbonto the window (or use Install from file). - Leave the optional Wellframe database path blank — the server defaults to the desktop app's DB location. Set it only to point at a different DB.
- First run the Wellframe desktop app and log some data so
wellframe.dbexists, otherwise the tools return a friendly "no database yet" message. - Ask Claude something like "What's my readiness today?" or "Show my recent
workouts" to exercise the 9 tools (
get_readiness,list_workouts,analyze_sleep,compute_training_load,recommend_recovery,list_goals,recent_checkins,estimate_fatigue,generate_plan).
Actions → MCPB Release → Run workflow (manual). When it finishes, download the
wellframe-coach-mcpb artifact. Same install steps. (CI bundles are unsigned
unless you've configured signing secrets — see §4; unsigned is fully functional.)
The macOS
.dmg/.appcan only be produced on macOS. This repo's Linux dev box verifies that the frontend and the Rust crate compile, but cannot emit a macOS installer — use your Mac or CI for a runnable macOS build.
cd desktop
npm install
npm run tauri:dev # live dev window
# or a local installer (unsigned unless you have a Developer ID configured):
npm run tauri:build # → src-tauri/target/release/bundle/Actions → Desktop Release → Run workflow (manual). It builds all four targets
and uploads them as downloadable artifacts:
wellframe-macos-aarch64, wellframe-macos-x86_64, wellframe-linux-x86_64,
wellframe-windows-x86_64. No release is created.
macOS test builds from CI are unsigned/un-notarized until the Apple secrets in §4 are set, so Gatekeeper will warn on first open (right-click → Open). That is expected for pre-public testing.
- (For a clean public macOS build) add the Apple secrets so CI signs and notarizes — see §4. Without them the installers build but macOS users hit Gatekeeper warnings.
- Bump the version in
desktop/package.jsonanddesktop/src-tauri/tauri.conf.json(keep them in sync). - Tag and push:
git tag v0.1.3 git push origin v0.1.3
- CI (
desktop-release.yml) builds every platform and creates a draft GitHub Release with the installers attached. - Review the draft under Releases, then click Publish to make it public. Nothing is public until this click.
- (Optional) sign in CI with the same stable identity as your local builds:
Add both as repo Actions secrets. Unset ⇒ CI ships an unsigned (still functional) bundle. Note:
# openssl base64 is portable (macOS's base64 has no -w); -A = no line wrapping openssl base64 -A -in mcp-server/.signing/cert.pem # → secret MCPB_SIGNING_CERT openssl base64 -A -in mcp-server/.signing/key.pem # → secret MCPB_SIGNING_KEY
.mcpbsigning is tamper-evidence only — mcpb 2.x cannot verify publisher identity — so signing is optional for distribution. - Bump the version in
mcp-server/manifest.jsonandmcp-server/package.json. - Tag and push:
git tag mcpb-v0.1.1 git push origin mcpb-v0.1.1
- CI (
mcpb-release.yml) builds + smoke-tests + validates, then attaches the.mcpbto a draft GitHub Release for that tag. - Review and Publish the draft to make it public.
Set these repo Actions secrets to un-inert macOS signing in desktop-release.yml:
| Secret | Purpose |
|---|---|
APPLE_CERTIFICATE |
base64 of the Developer ID .p12 |
APPLE_CERTIFICATE_PASSWORD |
password for that .p12 |
APPLE_SIGNING_IDENTITY |
e.g. Developer ID Application: … (88QLZH998K) |
APPLE_API_ISSUER |
App Store Connect API issuer ID (notarization) |
APPLE_API_KEY |
App Store Connect API key ID (notarization) |
APPLE_API_KEY_P8 |
base64 of the App Store Connect .p8 key file |
APPLE_TEAM_ID (88QLZH998K) is already baked into the workflow. Windows
Authenticode signing is not yet wired (add a signing step when you have a cert).
You can exercise the entire go-public pipeline without publishing, because tagging only ever produces a draft Release. A draft is visible to repo collaborators only — never the public — has no public URL, and fires no notifications. The one public act is clicking Publish; a dry run simply deletes instead.
Note: this repo is public, so the git tag you push is itself visible under Tags (a tag alone is harmless). The draft Release and its attached installers stay private until published. Delete the throwaway tag afterward for zero trace.
Use a clearly-throwaway tag so it never reads as a real version:
# Desktop dry run (swap in mcpb-v0.0.0-test1 to rehearse the MCPB flow)
git tag v0.0.0-test1
git push origin v0.0.0-test1- Watch Actions → Desktop Release build. When it finishes, open Releases — you'll see a draft "Wellframe v0.0.0-test1" with installers attached. Confirm it's marked Draft and is absent from the public releases list.
- Download an installer from the draft to confirm the attached artifacts are real.
- Clean up (leaves zero trace):
# In the GitHub UI: Releases → the draft → Delete, then: git push --delete origin v0.0.0-test1 git tag -d v0.0.0-test1
This runs the exact publish machinery — build → draft → attached installers → the
Publish button — the only difference being you delete instead of publishing. Repeat
with mcpb-v0.0.0-test1 to rehearse the MCPB release.
Don't reuse a real version tag for a rehearsal. The draft keys off the tag name, so delete the test tag and its draft before pushing that name for real.
| I want to… | Do this |
|---|---|
| Test the MCPB now | cd mcp-server && npm run bundle, install the .mcpb in Claude Desktop |
| Test the desktop app now (Mac) | cd desktop && npm run tauri:dev |
| Get test installers for all OSes | Actions → Desktop Release → Run workflow → download artifacts |
Get a test .mcpb from CI |
Actions → MCPB Release → Run workflow → download artifact |
| Publish the desktop app | bump version → git tag v0.x.y && git push → publish the draft |
| Publish the MCPB | bump version → git tag mcpb-v0.x.y && git push → publish the draft |