Repository navigation
feat(flutter): make the Android receiver releasable - #2
Merged
Merged
Conversation
Every other repo in the org carries one; this one never did. Without it the code is technically unlicensed, so nobody can legally use it — worth fixing before the repo gets any attention. MIT, matching gstack and forge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAsieST4zZGygM4WwsEuSH
The receiver had no publishable build path: Flutter's template signs release builds with the debug keystore, which is generated per machine and expires after a year. Android refuses an update signed with a different key, so an APK published that way would strand everyone who installed it. Release signing is now opt-in through a gitignored android/key.properties. When it is absent — a fresh clone, or CI — the build falls back to the debug keystore as before, so `flutter build apk --release` still works for anyone building for themselves. Only a published APK needs the key. Adds `mise run flutter-apk` (universal) and `flutter-apk-split` (per-ABI, roughly a third the size each), and docs/RELEASING-ANDROID.md covering keystore setup, verifying which key actually signed an APK, and the Gatekeeper-equivalent wording for the release notes. This makes Android the receiver a stranger can install without any Apple Developer relationship — macOS notarization stays a separate concern. Verified: arm64 25.2 MB, armeabi-v7a 21.0 MB, x86_64 27.7 MB, universal 68.6 MB. apksigner confirms the fallback path still yields CN=Android Debug, as documented. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAsieST4zZGygM4WwsEuSH
The README calls the sender "a single static binary", but the repo shipped none — the only install path was `cargo build --release`, which needs a Rust toolchain on the very machine most likely to be locked down. On a published release this cross-compiles porter-sender for macOS (arm64/x86_64) and Linux (arm64/x86_64), attaches the tarballs, then regenerates Formula/porter-sender.rb in TerrorSquad/homebrew-tap with the real checksums. Mirrors what goreleaser already does for forge, hand-rolled because goreleaser is Go-only. The formula's test drives `join` rather than `--version`: the sender is a ratatui TUI that panics without a real terminal, and there is no --version flag (it exits 1). `join` is plain file I/O, so it works in Homebrew's sandbox. Requires the HOMEBREW_TAP_GITHUB_TOKEN secret on this repo — GITHUB_TOKEN cannot write to another repository. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAsieST4zZGygM4WwsEuSH
Deploying porter with
|
| Latest commit: |
21a4140
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://1a372c9c.porter-3xy.pages.dev |
| Branch Preview URL: | https://feat-android-release-signing.porter-3xy.pages.dev |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Porter had no path to a build a stranger could install. This adds one for Android, plus the missing LICENSE and a release pipeline for the sender.
What's here
docs: add the MIT LICENSE file— the repo had none, which technically left the code unusable by anyone else. MIT, matching gstack and forge.feat(flutter): make the Android receiver releasable— Flutter's template signs release builds with the debug keystore. That keystore is generated per machine and expires after a year, and Android refuses an update signed with a different key, so a published APK would have stranded everyone who installed it.Release signing is now opt-in through a gitignored
android/key.properties. When it is absent — fresh clone, or CI — the build falls back to the debug keystore as before, soflutter build apk --releasestill works for anyone building for themselves. Addsmise run flutter-apk/flutter-apk-splitanddocs/RELEASING-ANDROID.md.ci: build sender binaries on release and publish the Homebrew formula— the README calls the sender "a single static binary" but shipped none. On a published release this cross-compiles for macOS and Linux (arm64 + x86_64), attaches the tarballs, and regenerates the formula inhomebrew-tapwith real checksums. Mirrors what goreleaser does for forge.Verified
APKs build: arm64 25.2 MB · armeabi-v7a 21.0 MB · x86_64 27.7 MB · universal 68.6 MB.
apksignerconfirms the fallback still yieldsCN=Android Debug, as documented.flutter analyzeclean.Before cutting a release
HOMEBREW_TAP_GITHUB_TOKENsecret to this repo —GITHUB_TOKENcannot write to another repositoryversion.txtsays2.8.0,rust-sender/Cargo.tomlsays0.1.0, and there has never been a releasedocs/RELEASING-ANDROID.md)Notes
Two pre-existing local issues surfaced while verifying, neither caused by this branch (debug builds failed identically before it) and neither committed, since both are machine-specific:
flutter build apkfails with a bare25.0.2— that is the JDK, not an NDK version. Android Studio's bundled Java 25 is unparseable by Gradle 8.12. Fix:flutter config --jdk-dir="$(/usr/libexec/java_home -v 17)". Documented inRELEASING-ANDROID.md.android/local.propertiespointed at a stale second Flutter SDK.Also worth knowing:
porter-senderhas no--versionor--helpflag, and--versionexits 1. That is why the Homebrew smoke test drivesjoininstead — verified working locally.🤖 Generated with Claude Code
https://claude.ai/code/session_01LAsieST4zZGygM4WwsEuSH