Skip to content

Developing and Releasing

NoopApp edited this page Jun 17, 2026 · 2 revisions

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 generate then open in Xcode (schemes Strand for macOS, NOOPiOS for 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 with swift test in 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

  1. 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.
  2. Fork NoopApp/noop, branch, commit, and open a Pull Request against main.
  3. Keep changes cross-platform where it matters — a fix in shared Swift usually needs an Android (Kotlin) port too.
  4. No account / prefer email? Send a git format-patch set 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).

Clone this wiki locally