Developing & Releasing NOOP
NOOP is now self-hosted at noop.fans (Forgejo) after being deplatformed from GitHub. This page covers how to contribute and, for maintainers, how to cut a release.
NOOP runs entirely on donations now. If it's useful to you, please chip in — #KeepNOOPAlive (BTC/ETH buttons are in the banner at the top of every page).
For contributors
Browse & clone
Everything is public to read — no account needed.
git clone https://noop.fans/NoopApp/noop.git
cd noop
Build it
- macOS / iOS:
xcodegen generatethen open in Xcode (schemesStrandfor macOS,NOOPiOSfor iOS). See the Installation and How NOOP Works pages. - Android:
./gradlew assembleFullDebug(JDK 17). See Tutorial: Android Widget and Notifications. - Shared logic lives in the Swift packages under
Packages/(WhoopProtocol,WhoopStore,StrandAnalytics,StrandImport,StrandDesign). Run their tests withswift testin each package — fast and CI-free.
Report a bug / request a feature
Open an Issue at noop.fans/NoopApp/noop/issues. For bugs, attach a strap log (Settings → Export log) — issues without logs are hard to action. Labels: bug, enhancement, roadmap, multi-source, help wanted.
Submit a change
- Get an account — sign-ups are open and instant (just a quick captcha to keep bots out). A throwaway email is fine — nothing is verified or shared. Or stay fully anonymous and send patches by email / raise it on r/NOOPApp.
- Fork
NoopApp/noop, branch, commit, and open a Pull Request againstmain. - Keep changes cross-platform where it matters — a fix in shared Swift usually needs an Android (Kotlin) port too.
- No account / prefer email? Send a
git format-patchset via the contact on the Donations page.
House rules
- Privacy first — NOOP is local-first and fully offline. Don't add network calls or telemetry.
- No firmware-derived code. We only use independently re-derived, publicly documented protocol knowledge.
- Match the existing code style; include tests for protocol/analytics changes.
For maintainers — the release workflow
Releases are cut from a Mac (binaries are built + anonymized locally; nothing is built in cloud CI). The forge has a GitHub-compatible API, so the flow mirrors the old one with the tooling pointed at noop.fans.
# 0. one-time: save a Forgejo API token (Settings → Applications) so the scripts can push
printf '%s' '<token>' > ~/.config/noop/forge_token && chmod 600 ~/.config/noop/forge_token
# 1. bump version + write the changelog FIRST
# Strand/System/AppChangelog.swift + android/app/.../AppChangelog.kt + CHANGELOG.md
# 2. build the anonymized binaries (universal macOS .zip, iOS .ipa, Android .apk)
# xcodegen → xcodebuild Release → Tools/anonymize-macos-app.sh → ditto zip
# ./gradlew assembleFullRelease (signed with android/noop-release.jks)
# 3. refresh the in-app community stats
Tools/update-donation-stats.sh
# 4. cut the release on the forge (creates the tag + release + uploads all 3 assets)
Tools/forgejo-release.sh 4.7.0 \
dist/NOOP-v4.7.0-macos.zip dist/NOOP-v4.7.0-ios.ipa dist/NOOP-v4.7.0-android.apk
# 5. refresh the install channels
Tools/update-homebrew-cask.sh 4.7.0 dist/NOOP-v4.7.0-macos.zip
Tools/update-altstore-source.sh 4.7.0 dist/NOOP-v4.7.0-ios.ipa "what changed"
# 6. commit + push (the Codeberg push-mirror replicates automatically)
git -c user.name=NoopApp -c user.email=thenoopapp@gmail.com commit -am "vX.Y.Z: ..."
git push origin main
Hard rules (unchanged from before)
- Commit only as
NoopApp <thenoopapp@gmail.com>. Before every push, the pre-push gate must show 0 hits for real-name / AI-assistant /£markers. - The Android signing key (
android/noop-release.jks) never leaves offline backup — it's not on the server. - Every change must reach all three platforms (macOS, iOS, Android) where applicable.
Anonymity / safety
Same as always: never reveal the development toolchain, keep all identities as NoopApp, prefer USD in donation copy, and don't evade the old GitHub suspension (this is new infrastructure, which is fine).
Home
Get started
Tutorials
- Tracking a Workout
- Recovery, Strain & Readiness
- Automations
- Breathe & Intervals
- Importing History
- AI Coach
- Widget & Notifications
- Reading Your Sleep
- Explore & Compare
Reference
Project
NOOP is an independent, unofficial, non-commercial interoperability project — not affiliated with, endorsed by, or sponsored by WHOOP, Inc. "WHOOP" is a trademark of WHOOP, Inc., used nominatively. Works only with a device you own; not a medical device; every metric is an approximation, not medical advice. · Privacy and Security · Donations · Releases