Commit Graph

206 Commits

Author SHA1 Message Date
engineer
26d61498ad seo(site): add /download/ page (transactional intent) + internal links + sitemap
Targets 'download opencode android', 'opencode apk', 'opencode f-droid'.
Serves the live install channels (self-hosted F-Droid repo + signed APK)
with SoftwareApplication + BreadcrumbList structured data. Linked from
landing hero, landing footer, and guide footer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:27:34 -07:00
engineer
b0aaddf263 refactor(readiness-check): port check.sh → check.ts (native Node 26, fetch+JSON, no curl/jq/python3)
Easier to maintain in this TS repo: typed gate definitions, native fetch/JSON
(drops the fragile jq/python3/grep branches), runs via `node check.ts` with no build/deps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 07:27:43 -07:00
engineer
6563f5ef53 fix(ui): correct mirrored chat empty-state + clipped IP placeholder; add readiness-check skill; privacy page nav/meta
- app/session/[id].tsx: chat empty-state rendered mirrored on Android (inverted FlatList) — now an untransformed overlay
- app/connection/add.tsx: shortened clipped host placeholder
- .agents/skills/readiness-check: production-readiness gate (Play+F-Droid published, app+site health)
- docs/privacy: back-nav + canonical/theme-color/description meta
Verified: tsc clean, CUA smoke green (run 26814702062)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 06:16:22 -07:00
Den
c46f273ecd fix(fdroid): disable dependenciesInfo signing block for F-Droid compliance 2026-06-03 04:52:23 -07:00
Den
a5769ca19f fix(fdroid): add expo-application installreferrer-free stub for F-Droid builds 2026-06-03 04:52:16 -07:00
Den
87d7777bf4 fix(fdroid): remove interface supertype from FirebaseMessagingDelegate stub to fix Unresolved reference compile error 2026-06-03 04:13:34 -07:00
Den
84eca3baa4 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:41 -07:00
Den
23c382d29b fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:40 -07:00
Den
e1948601b0 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:39 -07:00
Den
a22fcb92e9 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:37 -07:00
Den
0684f50606 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:36 -07:00
Den
fbce64fa97 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:35 -07:00
Den
3c2b069c20 fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:34 -07:00
Den
6ec1aaaa8b fix(fdroid): Firebase-free stubs for expo-notifications 2026-06-03 03:06:25 -07:00
engineer
b7b3f2fc27 fix(fdroid): force all expo modules to build from source
Set expo.autolinking.buildFromSource: [".*"] so F-Droid mainline's
scanner doesn't see the prebuilt .aar + -sources.jar files that Expo
ships inside every expo-* npm package's local-maven-repo/ directory.
When this flag is set, expo-modules-autolinking routes each module
through a Gradle source build instead of consuming the prebuilt AAR.

Verified: `./gradlew assembleRelease` succeeds (11 min, 92 MB APK)
with this flag and no prebuilt AARs consumed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 00:49:41 -07:00
engineer
18a1017f7d chore: sync package-lock version 0.0.1->0.4.3 to match package.json
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 18:04:58 -07:00
engineer
d69fe1be74 feat(site): QR codes for F-Droid repo + APK install (source)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:42:31 -07:00
engineer
6339d5f453 fix(fdroid): correct fastlane metadata for mainline MR #39530 — title, drop other-store claims, changelog by versionCode
Addresses linsui review: summary/description pulled from fastlane; honest, policy-compliant copy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:37:10 -07:00
engineer
86ef769736 seo: IndexNow key (source) — submitted landing/guide/privacy to Bing/Yandex
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:33:05 -07:00
engineer
0ad6cb306c docs(site): SEO content sources — guide, FAQ, OG image, sitemap, robots
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:27:58 -07:00
engineer
366a936431 docs(launch): fill launch drafts with live install URLs — post-ready (Play marked pending)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:19:29 -07:00
engineer
35f99d124b docs(site): keep landing page source (deployed to gh-pages root)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:16:43 -07:00
engineer
7c79753e44 docs(readme): correct store/platform claims — feature live F-Droid repo + APK, drop fake iOS/App Store links
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:14:03 -07:00
engineer
dc7cc749c2 docs(distribution): cite live GitHub Pages privacy URL for store submissions (unblocks Play/IzzyOnDroid)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:11:39 -07:00
engineer
fb5c97a8a5 docs: CEO cycle 4 — sharpen owner queue steps (exact push/bump/privacy/MR/growth)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 03:43:28 -07:00
engineer
c36605e5e6 docs: CEO cycle 3 — F-Droid v0.4.3 verified live; bucket-A closed; queue refreshed
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:55:14 -07:00
engineer
c8458cd397 docs(distribution): reconcile privacy-policy URL to opencode.vibebrowser.app; v0.4.3
Privacy URL was inconsistent across owner docs (agentlabs.cc/opencode/privacy
in 3 spots vs opencode.vibebrowser.app/privacy in the majority). Reconciled
all to the canonical opencode.vibebrowser.app/privacy (Search-Console-verified
domain; what privacy-policy.html self-references). Also fixed stale v0.4.2 AAB
reference in PLAY-APP-CONTENT-ANSWERS.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:52:09 -07:00
engineer
ee7082a72a fix: custom-dir session create used user input not server directory (scope drift)
onCreateInDirectory navigated with dir.trim() (raw user input) while the
sibling create paths use the server-authoritative session.directory. When
the opencode server normalizes the path (trailing slash/symlink/relative),
the nav param diverged from the session's real scope, causing the new
session/[id] screen to scope to the wrong client -> 'Failed to load
session'. Mirror the sibling paths' session.directory spread.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:52:04 -07:00
engineer
61cbb35bf3 docs: refresh HANDOFF.md with current publish state and owner actions
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:35:19 -07:00
engineer
861ac7f059 docs(context): play internal live; androguard 4.1.3 fix for F-Droid 2026-06-02 01:31:09 -07:00
engineer
eea84a3f35 fix(ci): pin androguard==4.1.3 for F-Droid publish (4.1.4 crashes on signer cert)
androguard 4.1.4 raises 'NoOverwriteDict object has no attribute append' in
parse_v2_v3_signature when fdroidserver extracts the signer cert — this broke the
self-hosted F-Droid publish from v0.4.2 on. 4.1.3 (which shipped v0.3.2–v0.4.1)
parses our re-signed v1+v2-only APK cleanly; verified locally with
fdroidserver.common.get_first_signer_certificate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:29:59 -07:00
engineer
821672048c docs(context): F-Droid publish fix + v0.4.3 release push 2026-06-02 00:59:55 -07:00
engineer
c66f4fb858 release(fdroid): v0.4.3 — fix self-hosted F-Droid publish (v2-only signing)
The self-hosted F-Droid repo (https://dzianisv.github.io/opencode-mobile/fdroid/repo)
has been stuck at v0.4.1 because publish-fdroid crashed in androguard parsing the
CI APK's v2+v3 signature block pair ('NoOverwriteDict' object has no attribute
'append'). Force v1+v2-only signing: gradle flags for local builds, plus a
deterministic apksigner re-sign step in the workflow (expo prebuild regenerates
build.gradle, so the workflow step is the real guarantee). Bump to v0.4.3 /
versionCode 5 so a fresh tag re-runs the publish with the verified bug fixes
(#10 scope fixes, send-error fix) included.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:58:41 -07:00
engineer
af351d1df0 docs(context): record runtime bug audit outcome 2026-06-02 00:42:01 -07:00
engineer
059b5cc0f5 fix(sessions): don't flash error / refresh wrong session on send failure
sendMessage captured currentSession at call time; if the user switched sessions
while a prompt was in flight and it failed, the catch handler surfaced the error
on and refetched the NOW-current session. Clear the sending flag for the session
we actually sent to, but only set error / refreshMessages when it's still on
screen. Found via runtime bug audit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:41:42 -07:00
engineer
f58f90ae05 docs(context): session close — #1 verified green; publish/growth owner-gated
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:27:52 -07:00
engineer
67773fc8ba docs(izzyondroid): correct stale package id and version in inclusion request
App ID is cc.agentlabs.opencode (post-rename), not ai.opencode.mobile; bump the
example release to v0.4.2. Verified against the live v0.4.2 APK: package
cc.agentlabs.opencode, versionName 0.4.2, signing SHA-256 0C:25:..:99 matches the
documented fingerprint. Makes the IzzyOnDroid submission filing-ready.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:21:20 -07:00
engineer
67ebbeb3f4 docs(context): #10 verified E2E green (CUA smoke run 26803479355)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:19:13 -07:00
engineer
6d0e8c9599 docs(context): log version fix, #10 scope refactor + second scope-bug fix, gates
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:50:40 -07:00
engineer
66b89f74d4 fix(sessions): keep created-session scope through navigation and send (#10)
createSession now stamps the scope directory onto the returned session, and the
create-session navigation passes that directory to the detail screen. Previously
a freshly created home-scoped session was opened/addressed with the default
(CWD) client because the route carried no directory param — the same scope
mismatch class as #10, on the open/send path instead of the list path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:49:19 -07:00
engineer
bed0b6f622 refactor(sessions): single source of truth for session directory scope (#10)
Extract the list/create scope rule into sessionScopeDirectory() so loadSessions
and createSession can no longer drift apart — the root cause of #10 (sessions
empty after connect/create). Add a zero-dependency node:test regression guard
proving both paths resolve identically across all inputs, a 'test' npm script,
and exclude test files from the app typecheck.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:46:48 -07:00
engineer
0615ab898e fix(android): bump versionName to 0.4.2 to match app.json; add ownership context
versionName in android/app/build.gradle was stale at 0.4.1 while app.json /
package.json declare 0.4.2, so CI-built APKs reported the wrong version string.
Align it. Also adds context.md (goal/design/plan/progress) and ignores the
generated index.android.bundle artifact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:43:34 -07:00
engineer
a5364668db fix(sessions): create session in the same scope the list reads (#10)
Root cause of the empty-sessions-after-connect bug, caught by the now-live E2E
smoke: createSession() created via the plain connection client (server CWD),
while loadSessions() lists home-scoped when the connection has no explicit
directory. When CWD != home the new session was invisible to the list.

Fix: createSession now mirrors loadSessions' directory scoping (home-scoped
client when no explicit directory), so a freshly created session reliably
appears. No change for connections with an explicit directory.

Verified by the connect-and-verify-sessions CUA smoke on push.
Refs #10.
2026-06-01 16:26:42 -07:00
Den
14e858a402 ci(play): production track input + launch kit + F-Droid metadata fix (#19)
* ci(play): add track/status inputs to publish workflow

Lets the Play publish run target a public track (production/beta) and
choose draft vs completed, instead of being hard-wired to internal.
Defaults stay internal/completed so tag-push and release triggers are
unchanged. Enables promoting the app to a publicly-downloadable track —
the prerequisite for any real download growth.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(play): record user authorization for production go-live

* docs(fdroid): correct metadata to cc.agentlabs.opencode + agentlabs.cc, flag post-rename tag gate

The fdroiddata submission still referenced the old package ai.opencode.mobile
and v0.3.1. Update package id, website, and document the real blocker: F-Droid
mainline needs a release tag built AFTER the package rename (v0.4.1 APK is the
old id) plus Play production live and a reproducible build. Signing fingerprint
is unchanged across the rename.

* docs(launch): ready-to-fire distribution kit (Show HN, Reddit, PH, X, dev.to)

Copy-paste launch posts + ordered fire checklist so distribution starts the
moment the public listing is live. Store URLs left as {{PLAY_URL}}/{{FDROID_URL}}
placeholders; web hub agentlabs.cc/opencode is live now.

---------

Co-authored-by: engineer <engineer@opencode.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:32:19 -07:00
Den
3bd6f6e1ab chore: repoint OpenCode links to agentlabs.cc/opencode (#17)
agentlabs.cc/opencode and /opencode/privacy are now live (200). Repoint
README, distribution listings (Play/App Store/F-Droid/IzzyOnDroid/iOS),
docs, and in-app privacy links (settings + telemetry consent) from
www.vibebrowser.app/opencode to the canonical agentlabs.cc hub.

Co-authored-by: engineer <engineer@opencode.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:32:12 -07:00
Den
c9a57901c4 fix(ci): CUA smoke true-E2E with local opencode server (#15) (#18)
* chore: repoint OpenCode links to agentlabs.cc/opencode

agentlabs.cc/opencode and /opencode/privacy are now live (200). Repoint
README, distribution listings (Play/App Store/F-Droid/IzzyOnDroid/iOS),
docs, and in-app privacy links (settings + telemetry consent) from
www.vibebrowser.app/opencode to the canonical agentlabs.cc hub.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): run local opencode server for CUA smoke true-E2E (#15)

GitHub-hosted runners can't reach the Tailscale dev server
(100.108.64.76:4096), so the CUA smoke always failed at session creation.

- Install opencode-ai and run `opencode serve` on the runner host; the
  Android emulator reaches it via 10.0.2.2. OPENCODE_URL now points there.
- Healthcheck /global/health before launching the app; dump server log on
  failure for diagnosis.
- Add --only-connect-scenario to the smoke script and run just the
  connect-and-verify-sessions path in CI: deterministic, needs no model
  backend. The scenario now creates a session if the list is empty, so a
  fresh server still yields a non-empty list.

This makes the smoke a true E2E and also exercises the #10 sessions-list
rendering path against a real server.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): emulator smoke script is dash, not bash — drop brace-group healthcheck

android-emulator-runner runs the script: block under /usr/bin/sh (dash). The
multi-line `|| { ...; }` healthcheck was a dash syntax error (end of file
unexpected), failing the step before the smoke ran. Replace with a non-fatal
one-line re-check; the server was already health-gated in the prior step.

* docs(tasks): record smoke CI round 1 failure + dash fix

---------

Co-authored-by: engineer <engineer@opencode.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:32:06 -07:00
engineer
d1888dc392 docs(play): draft App content declaration answers to speed console publish
Pre-fills data safety / content rating / target audience / ads declarations from
the app's actual behavior so the one human gate (Play Console App content) is a
quick verify-and-enter. User must review before attesting.
2026-06-01 15:24:39 -07:00
engineer
6df5d4004e docs(tasks): record F-Droid self-hosted deprioritization + session state 2026-06-01 15:22:33 -07:00
engineer
1e07e36d5c fix(ci): pin androguard==4.1.4 for F-Droid publish (verified locally)
Reproduced locally against the v0.4.2 APK: androguard 4.0.x fails resource
parsing ('res1 must be zero!'), 4.1.0/4.1.1 fail signature parsing
('NoOverwriteDict' object has no attribute 'append'), and 4.1.4 parses both
cleanly. fdroidserver 2.4.4's own resolver pulls a buggy 4.1.x, so pin 4.1.4.
2026-06-01 15:00:59 -07:00
engineer
1c242e6a21 fix(ci): use latest fdroidserver for F-Droid publish
Pinning fdroidserver 2.4.4 hit androguard parse bugs on modern aapt2 APKs
(4.1+: NoOverwriteDict.append; 4.0.x: 'res1 must be zero!'). Upgrade to latest
fdroidserver which ships a compatible androguard.
2026-06-01 14:37:32 -07:00