fdroid(mainline): add Binaries field to recipe; sync local metadata + log
MR #39530 remaining blocker was the missing top-level Binaries: field (maintainer: AllowedAPKSigningKeys rejects the APK without it). Added Binaries pointing at the GitHub release APK (v%v) and synced the stale local distribution copy to the canonical fork recipe. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,20 @@
|
|||||||
# autopilot state — 2026-06-02
|
# autopilot state — 2026-06-02
|
||||||
|
|
||||||
|
## cycle 11 — 2026-06-08 — QA GATE FULLY PASSED → CUT v0.4.4 PUBLIC RELEASE
|
||||||
|
Render check PASSED (cycle 10, real screenshots in docs/qa/render-check/: markdown + 430-char code line horizontally scrolls/not truncated + diff, both themes; no app bugs). So the owner's full QA gate is met: 65/65 units · 10 UI/UX fixes · on-device E2E green · server reply proven · **visual render verified**.
|
||||||
|
- **Caught a release blocker pre-tag:** versionCode was still 5 (== v0.4.3) → would be rejected by Play / ignored by F-Droid. Bumped app.json + build.gradle to **6**, added fastlane changelog `6.txt` (commit 108260c).
|
||||||
|
- **CUT v0.4.4** (annotated tag pushed). Triggered: Build APK→GitHub Release (27148869375), Publish F-Droid (27148869310), Publish Play **internal** (27148870576, track resolves to internal on tag — NOT production), + iOS TestFlight (expected no-op, not enrolled). Background poll armed to confirm artifacts land.
|
||||||
|
- Confirmed tag→Play uses internal track (publish-play-store.yml L121 `inputs.track || 'internal'`); GitHub release auto-created by build.yml `release` job (softprops, signed APK, generate_release_notes).
|
||||||
|
**RELEASE CONFIRMED LIVE:** GitHub Release v0.4.4 has app-release.apk (HTTP 206 downloadable); F-Droid index now serves **0.4.4 / code 6** (existing users get the update); Build APK + Publish F-Droid runs = success; Play internal still uploading (low priority, internal track).
|
||||||
|
|
||||||
|
**LAUNCH = owner login-gated (VERIFIED via chrome-use on the real Chrome):** chrome-use IS connected + working (Chrome 148, real profile). Login check: **GitHub logged in; HN logged OUT (#me absent, login link present); Reddit logged OUT (old + new reddit submit both 302 → /login)**. So I cannot post the launch (not signed in) and will not log in as the owner / use fake accounts. → MINIMAL UNBLOCK: owner logs into news.ycombinator.com + reddit.com in THIS Chrome, says "logged in", and I post ALL launch posts immediately via chrome-use (I'm connected + the drafts are ready in distribution/launch/ + docs/marketing/). Reddit acct present = u/DisclosureDay. NOTE: docs/marketing drafts still carry {{PLAY_URL}} placeholder — use distribution/launch/ set (no placeholders) or strip the Play line (Play is internal-only).
|
||||||
|
|
||||||
|
**EXHAUSTIVE channel-login check (chrome-use, real Chrome):** HN logged OUT · Reddit logged OUT (old+new) · X/Twitter logged OUT · LinkedIn logged OUT · GitHub logged IN. Bitwarden CLI `bw status` = **locked** (no BW_SESSION; can't unlock — needs owner master password). sst/opencode Discussions = DISABLED (no upstream show-and-tell channel). → CONCLUSION: firing the launch is a genuine creds wall I cannot pass. Every social channel needs a login; the vault that holds the logins is locked. This is bucket-C (owner). NOT avoidance — verified across 4 platforms + bw + upstream.
|
||||||
|
|
||||||
|
**THE SINGLE UNBLOCK:** owner unlocks Bitwarden (or signs into HN+Reddit+X in the open Chrome) → says "go" → I post the full launch via chrome-use in minutes (drafts ready in distribution/launch/). Then 100 downloads/customers accrue from real installs over days (un-manufacturable). Until then, the autonomous high-impact work (QA ✅, v0.4.4 release ✅ live, 9 SEO pages ✅ indexed) is DONE; only marginal SEO remains autonomous and won't reach 100 without the launch.
|
||||||
|
|
||||||
|
**Honest goal status:** items (1) render check ✅ and (2) public release ✅ DONE. (3) launch posting = owner (identity wall). (4) 100 downloads + 100 happy customers = accrues from real humans over days after the launch; cannot be fabricated by any tool. Autonomous engine continues: SEO compounding (9 pages live+indexed); next autonomous high-ceiling reach lever = F-Droid MAINLINE inclusion (MR #39530, blocker = Expo reproducible `fdroid build`) which would open f-droid.org discovery without any owner account.
|
||||||
|
|
||||||
## cycle 10 — 2026-06-08 — RENDER-CHECK GATE CLEARED VISUALLY (was the cycle-9 residual) — release-ready
|
## cycle 10 — 2026-06-08 — RENDER-CHECK GATE CLEARED VISUALLY (was the cycle-9 residual) — release-ready
|
||||||
|
|
||||||
The cycle-9 "genuinely BLOCKED" on-device VISUAL render check is now DONE with real screenshots.
|
The cycle-9 "genuinely BLOCKED" on-device VISUAL render check is now DONE with real screenshots.
|
||||||
@@ -367,3 +382,37 @@ Shipped 2 new high-intent SEO pages targeting uncovered queries, deployed live,
|
|||||||
|
|
||||||
### Not done (per task scope)
|
### Not done (per task scope)
|
||||||
- No release tag cut. No external/social posts.
|
- No release tag cut. No external/social posts.
|
||||||
|
|
||||||
|
## cycle 9 — 2026-06-08 — TEST GATE CLOSED ON SHIPPING BUILD + critical auth fix + demo GIF
|
||||||
|
Owner goal: 100 downloads + 100 happy customers + tested release (no UI/UX bugs) before posting.
|
||||||
|
|
||||||
|
Executed + VERIFIED this session (all free, no fabrication):
|
||||||
|
- **CRITICAL connect bug found+fixed+verified**: Quick Connect (default, no username field) sent
|
||||||
|
empty username → auth undefined → 401 against password-protected server (the common
|
||||||
|
`OPENCODE_SERVER_PASSWORD=… opencode serve` setup) = silent install→churn. Fix: buildAuth
|
||||||
|
defaults username to "opencode" (src/lib/auth.ts, all 6 sites in connections.ts, +3 tests, 68/68).
|
||||||
|
- **On-device GUI verification (the gate)**: built native arm64 emulator (macOS SDK ~/android-sdk-mac;
|
||||||
|
homebrew SDK was Linux-x86-64 junk), drove via adb against live server. CI APK: Quick Connect→401
|
||||||
|
(bug reproduced). **HEAD release build (BUILD SUCCESSFUL 11m48s): Quick Connect→CONNECTS**, sessions
|
||||||
|
load, live send→streaming reply renders clean. 8 screenshots + docs/qa/ONDEVICE-VERIFICATION-2026-06-08.md.
|
||||||
|
→ Owner condition (3) MET on the actual shipping build.
|
||||||
|
- 11 UI/UX bug fixes (auth + scroll + silent-failure alerts + dead commands + URL validation).
|
||||||
|
- Demo GIF (real on-device, connect→reply) added to README + landing + launch kit — #1 conversion asset, none existed.
|
||||||
|
- Launch copy accuracy pre-flight (removed EAS/iOS-Keychain/FlatList overclaims).
|
||||||
|
|
||||||
|
VERIFIED FLOOR (every download lever gated, not assumed):
|
||||||
|
- Launch posts = owner social identity (creds-wall). F-Droid MR #39530 = green, blocking_discussions_resolved=True,
|
||||||
|
awaiting MAINTAINER (external). IzzyOnDroid = owner Codeberg. git push = harness-blocked (engine carries commits).
|
||||||
|
SEO = time. Play = Google review + owner Console.
|
||||||
|
- DOWNLOADS 20/100, happy-customers unmeasurable until real users connect. Cannot be manufactured without
|
||||||
|
fabrication. Conditions (1)+(2) require the OWNER LAUNCH + real humans + time.
|
||||||
|
|
||||||
|
NEXT (owner): fire distribution/launch/ (verified-accurate, demo GIF, paste-ready). Then agent drives next cycle off live signal.
|
||||||
|
4 commits ahead of origin for engine to push.
|
||||||
|
|
||||||
|
### 2026-06-08 — F-Droid MAINLINE MR #39530: added Binaries field (the real remaining blocker)
|
||||||
|
- **GitLab access: YES** (glab v1.67 authed as dzianisv via GITLAB_TOKEN; fork = gitlab.com/dzianisv/fdroiddata, project 82771999; fdroiddata canonical = project 36528).
|
||||||
|
- **MR #39530 status: OPEN**, branch `add-cc.agentlabs.opencode` → `master`. Reproducible-build CI was ALREADY solved in a prior cycle — pipeline 2574586691 had all 9 jobs green incl. `fdroid build` + `check apk` (Expo SDK54/RN0.81 source-only recipe: `buildFromSource:['*']`, scandelete node_modules binaries, Firebase/Sentry/installreferrer stripped via in-repo `fdroid/*-patches`, JDK17→21 sed, NDK 27.1.12297006).
|
||||||
|
- **The actual remaining blocker was NOT the build — it was a missing `Binaries:` field.** Maintainer linsui's last two notes: "Please add Binaries for reproducible build" and "AllowedAPKSigningKeys can't make F-Droid use your key without Binaries. It will just reject the apk." Without Binaries, F-Droid has no published-APK reference to verify the rebuild against, so a developer-signed (AllowedAPKSigningKeys) APK is rejected.
|
||||||
|
- **FIX SHIPPED (commit 2f93f8e on fork branch):** added top-level `Binaries: https://github.com/dzianisv/opencode-mobile/releases/download/v%v/app-release.apk` (verified live: every release tag v0.4.0–v0.4.4 publishes `app-release.apk`; %v resolves to v0.4.3 for the pinned versionCode-5 build). Posted update note to linsui (note 3433771701) requesting a verification run. Synced stale local `distribution/fdroid-submission/metadata.yml` (was v0.3.1) to the canonical recipe.
|
||||||
|
- **NEXT STEP:** maintainer/F-Droid verification server reruns: rebuild from pinned commit c46f273 → download published v0.4.3 APK → byte-compare. If reproducible, MR merges and app ships to f-droid.org serving our signed APK. If diffs surface, iterate on determinism (likely candidates: hermes bytecode, build timestamps, R8/zip ordering). This now needs F-Droid-CI/maintainer iteration — the metadata side is complete and correct; cannot self-merge.
|
||||||
|
|||||||
@@ -1,108 +1,68 @@
|
|||||||
# F-Droid metadata for cc.agentlabs.opencode
|
AntiFeatures:
|
||||||
# Target file path in fdroiddata: metadata/cc.agentlabs.opencode.yml
|
NonFreeNet:
|
||||||
#
|
en-US: The app connects to a user-self-hosted opencode server which may in turn
|
||||||
# BLOCKER (do NOT file the fdroiddata MR until all true):
|
connect to proprietary AI services (OpenAI API, Anthropic API, Google Gemini).
|
||||||
# 1. A release tag built AFTER the ai.opencode.mobile -> cc.agentlabs.opencode
|
The app itself is fully open source and does not require any specific provider.
|
||||||
# rename exists, with a cc.agentlabs.opencode APK attached, signed by the
|
|
||||||
# release key. v0.4.1 and earlier APKs are the OLD package id and cannot be
|
|
||||||
# used. Cut a new tag (e.g. v0.4.2+) post-rename, then set the Builds entry
|
|
||||||
# below (versionName / versionCode / commit) to that tag.
|
|
||||||
# 2. First Google Play production release is live (required by F-Droid policy).
|
|
||||||
# 3. Reproducible build verified locally (see REPRODUCIBLE-BUILD-NOTES.md). Expo
|
|
||||||
# RN builds are not reproducible by default; expect reviewer back-and-forth.
|
|
||||||
#
|
|
||||||
# Signing key SHA-256 (AllowedAPKSigningKeys, lowercase no colons) is confirmed in
|
|
||||||
# distribution/SIGNING-KEY-FINGERPRINTS.md and is unchanged across the rename.
|
|
||||||
|
|
||||||
Categories:
|
Categories:
|
||||||
- Development
|
- Development
|
||||||
|
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
AuthorName: VIBE TECHNOLOGIES, LLC
|
AuthorName: VIBE TECHNOLOGIES, LLC
|
||||||
AuthorEmail: support@vibebrowser.app
|
AuthorEmail: support@vibebrowser.app
|
||||||
|
|
||||||
WebSite: https://agentlabs.cc/opencode
|
WebSite: https://agentlabs.cc/opencode
|
||||||
SourceCode: https://github.com/dzianisv/opencode-mobile
|
SourceCode: https://github.com/dzianisv/opencode-mobile
|
||||||
IssueTracker: https://github.com/dzianisv/opencode-mobile/issues
|
IssueTracker: https://github.com/dzianisv/opencode-mobile/issues
|
||||||
Changelog: https://github.com/dzianisv/opencode-mobile/releases
|
Changelog: https://github.com/dzianisv/opencode-mobile/releases
|
||||||
|
|
||||||
Summary: Drive your self-hosted AI coding agent from your phone
|
AutoName: OpenCode
|
||||||
|
|
||||||
Description: |-
|
|
||||||
OpenCode Mobile is a free, open-source (MIT) client for the opencode AI coding
|
|
||||||
agent (sst/opencode). Connect to your self-hosted opencode server and drive
|
|
||||||
AI-powered coding sessions from your phone — no proprietary backend, no mandatory
|
|
||||||
accounts, no tracking by default.
|
|
||||||
|
|
||||||
'''Key features'''
|
|
||||||
|
|
||||||
* Multiple connection types — local network, secure tunnels (Cloudflare, ngrok),
|
|
||||||
or any self-hosted opencode instance
|
|
||||||
* Biometric unlock — fingerprint / PIN to keep your sessions private
|
|
||||||
* Real-time streaming chat — watch your AI agent think and respond live
|
|
||||||
* File diff viewer — see exactly what code changes the agent proposes
|
|
||||||
* Multi-session management — start, resume, and switch between coding sessions
|
|
||||||
* Tool call approval — review and approve agent actions before they run
|
|
||||||
|
|
||||||
'''Self-hosted first'''
|
|
||||||
|
|
||||||
The app requires your own opencode server. Your AI traffic goes directly to your
|
|
||||||
backend (Claude, GPT, Gemini, local models — your choice). No middleman required.
|
|
||||||
|
|
||||||
An optional hosted backend ("opencode Cloud") is planned as a future paid service,
|
|
||||||
but the client is always free and fully functional without it.
|
|
||||||
|
|
||||||
'''Crash reporting'''
|
|
||||||
|
|
||||||
Sentry crash reporting is opt-in with default OFF. Code, prompts, and AI responses
|
|
||||||
never leave your own server.
|
|
||||||
|
|
||||||
'''Anti-features'''
|
|
||||||
|
|
||||||
NonFreeNet: the opencode server you connect to may connect to proprietary AI
|
|
||||||
services (OpenAI, Anthropic, Google). The app itself contains no proprietary
|
|
||||||
network code.
|
|
||||||
|
|
||||||
AntiFeatures:
|
|
||||||
NonFreeNet:
|
|
||||||
en-US: >-
|
|
||||||
The app connects to a user-self-hosted opencode server which may in turn
|
|
||||||
connect to proprietary AI services (OpenAI API, Anthropic API, Google Gemini).
|
|
||||||
The app itself is fully open source and does not require any specific provider.
|
|
||||||
|
|
||||||
RepoType: git
|
RepoType: git
|
||||||
Repo: https://github.com/dzianisv/opencode-mobile
|
Repo: https://github.com/dzianisv/opencode-mobile
|
||||||
|
|
||||||
|
Binaries: https://github.com/dzianisv/opencode-mobile/releases/download/v%v/app-release.apk
|
||||||
|
|
||||||
Builds:
|
Builds:
|
||||||
- versionName: '0.3.1'
|
- versionName: 0.4.3
|
||||||
versionCode: 2
|
versionCode: 5
|
||||||
commit: v0.3.1
|
commit: c46f273ecda0269ba2dc165053096e63d2bf5160
|
||||||
subdir: android
|
subdir: android/app
|
||||||
sudo:
|
sudo:
|
||||||
- apt-get update
|
- apt-get update
|
||||||
- apt-get install -y nodejs npm
|
- apt-get install npm
|
||||||
init:
|
init:
|
||||||
- npm install --prefix .. --legacy-peer-deps
|
- cd ../..
|
||||||
- npx --prefix .. expo prebuild --platform android --non-interactive
|
- npm install --legacy-peer-deps
|
||||||
gradle:
|
gradle:
|
||||||
- release
|
- yes
|
||||||
ndk: 26.1.10909125
|
|
||||||
# Node 20+ required for Expo SDK 52+
|
|
||||||
# prebuild regenerates android/ from app.json + package.json
|
|
||||||
# The signed AAB/APK is then compared against AllowedAPKSigningKeys
|
|
||||||
prebuild:
|
prebuild:
|
||||||
- cd .. && npm install --legacy-peer-deps
|
- cd ../..
|
||||||
- cd .. && npx expo prebuild --platform android --non-interactive
|
- sed -i '/apply from.*sentry.gradle/d' android/app/build.gradle
|
||||||
|
- sed -i '/jvmToolchain\|JavaVersion/s/17/21/' node_modules/@react-native/gradle-plugin/*/build.gradle.kts
|
||||||
|
node_modules/@react-native/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt
|
||||||
|
node_modules/expo-modules-core/android/ExpoModulesCorePlugin.gradle
|
||||||
|
- printf '\nkotlin.jvm.target.validation.mode=warning\n' >> android/gradle.properties
|
||||||
|
- sed -i '/firebase/d' node_modules/expo-notifications/android/build.gradle
|
||||||
|
- cp -a fdroid/expo-notifications-patches/.
|
||||||
|
node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/
|
||||||
|
- rm -f
|
||||||
|
node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/RemoteMessageSerializer.java
|
||||||
|
node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/triggers/FirebaseNotificationTrigger.kt
|
||||||
|
- sed -i '/installreferrer/d' node_modules/expo-application/android/build.gradle
|
||||||
|
- cp -a fdroid/expo-application-patches/. node_modules/expo-application/android/src/main/java/expo/modules/application/
|
||||||
|
scanignore:
|
||||||
|
- node_modules/expo-modules-autolinking/scripts/android/autolinking_implementation.gradle
|
||||||
|
- node_modules/expo-modules-core/android/ExpoModulesCorePlugin.gradle
|
||||||
|
- node_modules/react-native-safe-area-context/android/build.gradle
|
||||||
|
- node_modules/react-native-screens/android/build.gradle
|
||||||
|
- node_modules/react-native-svg/android/build.gradle
|
||||||
|
- node_modules/react-native/ReactAndroid/publish.gradle
|
||||||
|
- node_modules/react-native/sdks/hermesc/linux64-bin
|
||||||
|
scandelete:
|
||||||
|
- node_modules
|
||||||
|
ndk: 27.1.12297006
|
||||||
|
|
||||||
# AllowedAPKSigningKeys pins our release signing key.
|
|
||||||
# F-Droid will serve our pre-signed APK rather than re-signing with their key.
|
|
||||||
# This requires reproducible builds (identical output across machines).
|
|
||||||
AllowedAPKSigningKeys: 0c259d94e0ffea5d6319614b229d4b6bdc22de1f56e38e76948398d2df6aa099
|
AllowedAPKSigningKeys: 0c259d94e0ffea5d6319614b229d4b6bdc22de1f56e38e76948398d2df6aa099
|
||||||
|
|
||||||
AutoUpdateMode: Version v%v
|
AutoUpdateMode: Version
|
||||||
UpdateCheckMode: Tags
|
UpdateCheckMode: Tags
|
||||||
UpdateCheckData: https://raw.githubusercontent.com/dzianisv/opencode-mobile/main/app.json|"version":\s*"([^"]+)"|.|.
|
CurrentVersion: 0.4.3
|
||||||
|
CurrentVersionCode: 5
|
||||||
CurrentVersion: '0.3.1'
|
|
||||||
CurrentVersionCode: 2
|
|
||||||
|
|||||||
Reference in New Issue
Block a user