Commit Graph

274 Commits

Author SHA1 Message Date
engineer
42fa36f3cd fix(ux): 10 UI/UX bugs from pre-release audit (toward no-bug launch gate)
Found via parallel screen audit; each confirmed in code:
- AuthGate: auto-prompt biometrics on lock (useEffect was imported but unused)
- CodeBlock: horizontal scroll for long code lines (were wrapped/mangled)
- DiffView: horizontal scroll instead of numberOfLines=1 truncation
- chat: biometric-cancel on send shows feedback instead of silently dropping msg
- chat: send failure restores input + attachments and alerts
- chat: removed dead /compact + /clear builtin commands (advertised, no-op)
- sessions: delete + rename failures alert instead of silent; rename guarded
  against double-submit
- sessions: onRefresh spinner no longer hangs forever if a refresh rejects
- add/edit connection: validate URL has http(s):// scheme before save/test

typecheck clean, 65/65 unit tests pass. Runtime UI behavior still needs on-device
verification per the pre-posting test gate (HANDOFF §0b).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 05:34:12 -07:00
engineer
609bd45889 docs(handoff): 17 commits ahead; record ASO/SEO additions + pre-posting test gate
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 05:18:43 -07:00
engineer
2ec2a87143 seo(site): add /opencode-on-phone/ — targets proven 'setup opencode on phone' query
Google 'opencode android' surfaces a 40+ comment Reddit thread ('best way to
setup opencode on phone') and not us. New high-intent page answers it directly:
HowTo + FAQ + Breadcrumb JSON-LD, 4-step setup, tunnel table, Termux contrast.
Linked from landing footer + in-content, added to sitemap (priority 0.8).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 05:18:04 -07:00
engineer
2b5519a115 aso(play): keyword-optimize title + short desc, fix dead privacy URL
- title.txt: 'OpenCode Mobile' -> 'OpenCode Mobile: AI Coding' (26/30 chars,
  adds the 'AI coding' search keyword to the strongest Play ranking field)
- short_description: front-load 'AI coding agent for Android' (71/80)
- full_description: dead privacy URL opencode.vibebrowser.app (000) ->
  live dzianisv.github.io/opencode-mobile/privacy/ (200) — was a Play
  rejection risk

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 05:18:04 -07:00
engineer
f14bd39d66 release: bump version 0.4.3 -> 0.4.4
Ships accumulated work incl session-scope fix (ee7082a) to F-Droid + Play
via v0.4.4 tag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 05:10:57 -07:00
engineer
da1e89157e docs(handoff): refresh push backlog (13 commits ahead, SEO cluster + screenshots)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 04:44:57 -07:00
engineer
b40651748f site: add app screenshot strip to landing (connect → chat → diff)
Visual proof above the fold-ish: 3 UI previews with captions + descriptive
alt text. Responsive flex strip, lazy-loaded. Conversion lever for first-time
visitors — landing had QR codes but no app visuals.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 04:44:06 -07:00
engineer
6232430fe6 seo(site): ship comparison, vs-termux, claude-code-android pages + internal links
3 long-tail pages targeting 'opencode vs chatgpt/copilot', 'vs termux',
'claude code on android'. Added to sitemap, footer nav, in-content links
from landing + guide + troubleshooting. All have canonical + install CTAs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 04:42:20 -07:00
engineer
fb03a9af47 seo(site): add /features/ page (capabilities, use cases, comparison)
Targets "opencode mobile features", "AI coding android", and
"opencode vs ChatGPT for coding" queries not covered by existing pages.
Includes SoftwareApplication + BreadcrumbList structured data.
Adds /features/ to sitemap and internal footer nav on all 5 pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 10:00:05 -07:00
engineer
c3244b7eca docs(readme): add non-affiliation note (per upstream opencode request)
The upstream opencode project asks 'opencode-*' named projects to clarify they are
not built by or affiliated with the opencode team. Adds that note near the top.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:00:09 -07:00
engineer
13c21f3921 seo(site): add /troubleshooting/ page (connection-error queries) + internal links
Authentic troubleshooting content mapping the app's six connection-failure
diagnostics (malformed-url, no-internet, tls, health-failed, timeout,
server-unreachable) to concrete fixes. Targets real problem queries
('opencode mobile can't connect', 'opencode tailscale setup', 'network request
failed'). FAQPage + BreadcrumbList JSON-LD for rich results. Linked from landing,
guide, and download footers; added to sitemap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:39:44 -07:00
engineer
2b3de23e45 ci: run typecheck + unit tests on push/PR
build.yml only built the APK — the 65 unit tests and typecheck never ran in CI,
so regressions in the covered logic (headers/SSE/diagnostics/settings/etc.) could
land silently. Add a fast 'test' job (Node 24, native TS test-running) so every
push and PR enforces typecheck + npm test before merge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 14:24:11 -07:00
engineer
6013d1d86d test(lib): cover agent-activity status labels (57→65 tests)
Extract TOOL_STATUS + statusFromPart from stores/events.ts into a pure
status-labels.ts (type-only Part import, erased at runtime; events.ts delegates).
8 tests pin the live 'what is the agent doing' labels: reasoning/text/known-tool
mappings, shared labels (search/edit groups), unknown-tool degrade to
'Running <tool>...', and the no-tool/unknown-type fallthroughs. typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 14:22:39 -07:00
engineer
39c4347092 test(lib): cover connection URL parsing + failure classification (42→57 tests)
Extract parseUrl + classify from diagnostics.ts into a pure diagnostics-classify.ts
(diagnostics.ts imports + re-exports the types; behavior unchanged) so the
connection-failure decision tree — the user-facing 'why did connecting fail'
guidance — is unit-testable without react-native/expo. 15 tests: URL parsing
(port defaults, IPv4-vs-hostname, path/query stripping, malformed rejection) and
every classify branch (malformed, ok, tls, no-internet, health-failed, timeout,
server-unreachable incl. the hostname-only MagicDNS hint). typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 14:20:27 -07:00
engineer
48bc314dfc test(stores): cover settings merge/clamp + notification sanitizer (29→42 tests)
Extract two pure helpers so they're testable without zustand/expo:
- settings-merge.ts: clampPageSize + forward-compatible mergeStoredSettings (the
  upgrade path where stored data predates a new notification category must yield
  the default, not undefined). stores/settings.ts now delegates.
- notify-format.ts: sanitizeBody (strip C0/DEL control chars, trim, cap at 200)
  used for server-supplied notification text. stores/events.ts now imports it.
Behavior unchanged; typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 14:01:29 -07:00
engineer
dd55ca471d test(lib): cover SSE event-stream framing (20→29 tests)
Extract the SSE chunk-buffering from sdk.ts into a pure SSEParser (sdk.ts delegates;
behavior unchanged) and pin the framing rules that are easy to break when an event
splits across network reads: partial trailing lines held until completed, frames
reassembled across 2-3 reads, [DONE] sentinel and empty/non-data lines filtered,
each frame emitted exactly once. typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:58:19 -07:00
engineer
3499167b60 test(lib): cover request-header building + log ring buffer (4→20 tests)
Extract the auth + directory-header encoding from sdk.ts into a pure, dep-free
headers.ts (sdk.ts now delegates — behavior unchanged) so the connection-critical
logic is unit-testable without expo/fetch. Add 8 header tests (ASCII passthrough,
non-ASCII/CJK percent-encoding stays header-safe, Basic auth, empty-dir handling)
and 8 logbuffer tests (serialization incl. circular-ref fallback, 200-entry ring
cap, copy semantics, formatting). typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:55:31 -07:00
engineer
b2ca5793d1 seo(site): trim meta descriptions to ~150 chars (avoid SERP truncation)
Landing/guide/download descriptions were 257/246/217 chars and truncated in
Google results. Tightened to ~150 while keeping target keywords.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:42:49 -07:00
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