Skip to content

mobile(phase 6): release workflow scaffold + setup guide#33

Draft
Hackshaven wants to merge 1 commit into
mainfrom
claude/phase6-release-scaffolding
Draft

mobile(phase 6): release workflow scaffold + setup guide#33
Hackshaven wants to merge 1 commit into
mainfrom
claude/phase6-release-scaffolding

Conversation

@Hackshaven

Copy link
Copy Markdown
Member

Summary

Phase 6 scaffolding from docs/MOBILE_APP_PLAN.md. Adds the release
workflow for signed iOS and Android builds plus a step-by-step human
setup guide for the App Store and Play Console accounts.

The workflow is complete but will not run until signing secrets are
stored in GitHub.
This PR is the "everything Claude can do" half;
the human half is documented in docs/RELEASE_MOBILE.md.

New files

.github/workflows/release-mobile.yml

Two parallel jobs triggered on v* tags or manual workflow_dispatch:

iOS → TestFlight:

  • Runs on macos-26 (Xcode 26, free for public repos)
  • Imports Apple distribution certificate + provisioning profile from
    base64-encoded GitHub secrets into a temporary keychain
  • Builds signed IPA via tauri ios build --export-method app-store-connect
  • Uploads to TestFlight via xcrun altool with App Store Connect API key
  • Cleans up keychain on completion (even on failure)

Android → Play Console Internal Testing:

  • Runs on ubuntu-latest with JDK 17 + Android SDK 36
  • Decodes upload keystore from base64 GitHub secret
  • Writes key.properties for Gradle signing config
  • Builds signed AAB via tauri android build --aab
  • Uploads to Play Console Internal Testing track via
    r0adkll/upload-google-play@v1

docs/RELEASE_MOBILE.md

Step-by-step human setup guide (~200 lines):

Part 1 — iOS (7 steps):

  1. Create App ID in Apple Developer Portal
  2. Create distribution certificate (export as .p12)
  3. Create App Store provisioning profile
  4. Create App Store Connect API key (.p8)
  5. Create the app in App Store Connect
  6. Store 7 secrets in GitHub
  7. Test the workflow

Part 2 — Android (8 steps):

  1. Create app in Play Console
  2. Generate upload keystore via keytool
  3. Enroll in Google Play App Signing
  4. Create Google Cloud service account
  5. Grant service account access in Play Console
  6. Create Internal Testing track
  7. Store 5 secrets in GitHub
  8. Test the workflow

Plus a first-release checklist and troubleshooting section covering
common errors (provisioning mismatch, API auth failures, keystore
tampering, version code conflicts).

Secrets required (12 total)

Platform Count Secrets
iOS 7 APPLE_CERTIFICATE_BASE64, APPLE_CERTIFICATE_PASSWORD, APPLE_PROVISIONING_PROFILE_BASE64, APPLE_DEVELOPMENT_TEAM, APP_STORE_CONNECT_API_KEY_ID, APP_STORE_CONNECT_API_ISSUER_ID, APP_STORE_CONNECT_API_KEY_BASE64
Android 5 ANDROID_KEYSTORE_BASE64, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD, ANDROID_STORE_PASSWORD, GOOGLE_PLAY_SERVICE_ACCOUNT_JSON

What's NOT in this PR

  • The actual secrets (those come from you + the developer portals)
  • First TestFlight / Play Console upload (happens after secrets are set)
  • App Store submission for review
  • Production release promotion
  • Phase 7: Android on-device LLM (Gemini Nano)

https://claude.ai/code/session_01J5NptMVPCR5LY6REBZus8B

Phase 6 scaffolding — the CI workflow and human setup documentation
needed to ship signed iOS and Android builds to TestFlight and Play
Console. The workflow is complete but requires secrets to be stored
in GitHub before it can run.

New files:

.github/workflows/release-mobile.yml:
  Two parallel jobs triggered on version tags or manual dispatch:

  iOS (TestFlight):
  - Runs on macos-26 with Xcode 26
  - Imports Apple distribution certificate + provisioning profile
    from base64-encoded GitHub secrets into a temporary keychain
  - Builds signed IPA via `tauri ios build --export-method app-store-connect`
  - Uploads to TestFlight via xcrun altool with App Store Connect API key
  - Cleans up keychain on completion

  Android (Play Console):
  - Runs on ubuntu-latest with JDK 17 + Android SDK 36
  - Decodes upload keystore from base64 GitHub secret
  - Writes key.properties for Gradle signing config
  - Builds signed AAB via `tauri android build --aab`
  - Uploads to Play Console Internal Testing via r0adkll/upload-google-play

docs/RELEASE_MOBILE.md:
  Step-by-step human setup guide covering:

  Part 1 — iOS (7 steps):
  - Create App ID in Apple Developer Portal
  - Create distribution certificate (.p12 export)
  - Create App Store provisioning profile
  - Create App Store Connect API key (.p8)
  - Create the app in App Store Connect
  - Store 7 secrets in GitHub
  - Test the workflow

  Part 2 — Android (8 steps):
  - Create app in Play Console
  - Generate upload keystore via keytool
  - Enroll in Google Play App Signing
  - Create Google Cloud service account
  - Grant service account access in Play Console
  - Create Internal Testing track
  - Store 5 secrets in GitHub
  - Test the workflow

  Plus a first-release checklist and troubleshooting section.

WHAT'S NEEDED FROM THE HUMAN:
  - Apple: distribution cert, provisioning profile, API key, Team ID
  - Google: upload keystore, Play Console service account JSON
  - Both: store secrets in GitHub repo settings

The workflow will NOT run until these secrets are provided.

Refs: docs/MOBILE_APP_PLAN.md Phase 6
Signed-off-by: Claude <noreply@anthropic.com>
Hackshaven pushed a commit that referenced this pull request May 1, 2026
PR #33 scaffolds the mobile release pipeline (TestFlight /
Play Internal Testing) and MOBILE_APP_PLAN.md Phase 7 designs
on-device Orbit via Apple Intelligence Foundation Models on iOS
and Gemini Nano via AICore on Android. Worth foregrounding on
the poster — it's the strongest extension of the "one TypeScript
source, every platform" story since Tauri desktop, and the
on-device-LLM angle ties directly back to the §6 Orbit section.

Changes:
- Goals updated to mention mobile alongside desktop
- §3 feature gallery card renamed to "Multi-platform (web +
  desktop + mobile)"
- §8 rewritten: split into Desktop and Mobile blocks, calls out
  the mobile-only HTTPS capability, the 12-secret release
  pipeline, and the on-device-LLM Phase 7 design (honest
  "forthcoming" framing)
- §11 tech stack adds a Mobile row and on-device LLM providers
- Risks adds a "mobile mid-flight" mitigation note about
  PR-link vs store-link badges
- Open questions adds #11 on mobile framing + badge targets

https://claude.ai/code/session_011bkaCDBaTRH1TzGb4FjSkR
Signed-off-by: Claude <noreply@anthropic.com>
Hackshaven pushed a commit that referenced this pull request May 1, 2026
§2 Mission. Two-column layout (1.05fr / 1fr) on desktop,
stacked on mobile. Left column: monospace eyebrow ("THE
MISSION"), pull-quote h2 from MISSION.md (the "you have to
be in the room" line) styled with a Terraviz-accent left
border, three short body paragraphs covering what SOS is,
why most people never see one, and how Terraviz closes the
gap. Right column: figure with two side-by-side dashed-
border placeholders ("SOS installation photo" and "Terraviz
on a phone") plus a centered "Same data, no museum
required." caption. Real photo + screenshot drop in
alongside the rest of the asset follow-up.

§3 What you can do — feature gallery. Seven cards in a
3-column grid (drops to 2 at 900px, 1 at 600px). Each card:

- Inline SVG icon (24×24 stroke-based) tinted with the
  Terraviz accent on a light blue background tile
- §-anchor label in monospace
- Title
- 1-2 line description
- "Read more" CTA arrow that animates on hover

Cards link to the deeper sections by anchor:
  Photoreal globe (§4), Multi-globe comparison (§5),
  Tours — data-driven storytelling (§6), Orbit (§7),
  Immersive AR/VR (§8), Multi-platform (§9), Federated
  catalog (§10).

The Tours card carries the "today: AI-authored, human-
reviewed; soon: Orbit-authored on demand" framing locked
in earlier so the through-line is visible from the first
scroll. The Multi-platform card names PR #33 explicitly to
match the §9 framing.

CSS additions, all scoped:

- .section__eyebrow — shared eyebrow type used by §2 + §3
- .mission__container / __copy / __lede / __close /
  __visual / __pair / __ph / __caption
- .features__container / __title / __intro
- .feature-grid + .feature-card and its sub-elements,
  hover/focus state with translate-Y + accent border +
  subtle blue-tinted box-shadow

Hero unchanged. Sections 4-14 still ship as placeholders.

Build: 33428 bytes, 1059 lines. Re-running build_poster.py
produces byte-identical output (determinism check passes).

https://claude.ai/code/session_011bkaCDBaTRH1TzGb4FjSkR
Signed-off-by: Claude <noreply@anthropic.com>
Hackshaven pushed a commit that referenced this pull request May 2, 2026
Visitors don't need internal commit history on the poster.
Audited every partial for "P{N}", "Phase {N}", and PR
references; rewrote the copy in terms of "today" vs.
"in flight" / "awaiting handler" / "coming soon" instead.

Changes:

- sec-01-hero.html — placeholder-logo HTML comment loses
  "P1 follow-up" → "asset follow-up".
- sec-03-features.html — Multi-platform feature card drops
  "in-flight via PR #33" → "in flight".
- sec-04-globe.html — effect-note rewritten:
  "land in P12 (SPA-side handlers). Until then..."
  → "SPA-side handlers ... are still in flight. Until they
  land, clicking a button loads the live app at its default
  view rather than the requested effect."
- sec-05-multiglobe.html — same treatment for the layout
  toggle effect-note ("awaiting its SPA-side handler").
- sec-06-tours.html — same for the tour-launcher
  effect-note.
- sec-07-orbit.html — same for the chat/character toggle
  effect-note.
- sec-10-federation.html — Today shipped card body changes
  from "Phase 1a is live in this repo:" to "Live in this
  repo today:". The "Today · shipped" / "Forthcoming ·
  drafted" tags on the diptych are kept — those are
  status labels, not phase numbers.
- sec-09 / sec-11 / sec-12 / sec-13 / sec-14 placeholder
  partials replace "Section content lands in P{N}." with
  the simpler "Coming soon."

Verified: no remaining "P{N}", "Phase {N}", or "PR #{N}"
strings in the rendered output. The remaining "P"
mentions in the rendered HTML are all SSP1/SSP2/SSP5
(Shared Socioeconomic Pathways — real climate-model
identifiers used in §6 Tours).

Build deterministic at 156481 bytes / 4130 lines. HTML
tag balance unchanged.

https://claude.ai/code/session_011bkaCDBaTRH1TzGb4FjSkR
Signed-off-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants