Repository navigation
iOS round 7: ship-ready release build, parity, speed, animation and a sideloadable IPA - #277
Draft
Programcode wants to merge 17 commits into
Draft
Programcode wants to merge 17 commits into
Programcode wants to merge 17 commits into
Conversation
DEBATELAB_BUILD=release is the development build without the development client. Without DebateOwl's own Apple account it keeps only the App Group, so a free Apple ID can re-sign it, and the push switch shows as unavailable instead of failing. The sideload profile archives an unsigned Release build on EAS and packs it as an IPA; release-simulator builds the same app for the Simulator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AltStore re-signs with a free Apple ID by registering the App Group as <group>.<TEAMID> and writing that name into ALTAppGroups. expo-widgets and expo-share-intent now read that key first, so Live Activities, widgets and the share extension work in an AltStore install; other builds are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add Sparring Word export, saved Crossfire deletion, Generate role parity, model selection, account and plan details, shared timer links, sign-in language selection, and printable flow sheets. Co-Authored-By: Codex <noreply@openai.com>
Celebrate fresh tool results and completed timer rounds, welcome new debates once, and show save confirmation after its sheet closes. Add shared spring presses and session entrances while retaining Reduce Motion and accessibility behavior. Keep timer feedback separate from clock logic. Co-Authored-By: Codex <noreply@openai.com>
# Conflicts: # apps/mobile/src/app/timer.tsx
Paint account-owned cached tab data while refreshing, defer unused catalogs, and isolate streamed drafts and deadline clocks. Virtualize growing sheet lists and source text, skip unchanged source copy writes, and remove inexpensive React Compiler blockers. Record focused verification and the protected remaining skips. Co-Authored-By: Codex <noreply@openai.com>
# Conflicts: # apps/mobile/AGENTS.md # apps/mobile/src/app/(tabs)/(debate)/index.tsx # apps/mobile/src/app/ask.tsx # apps/mobile/src/app/context-review.tsx # apps/mobile/src/app/debates.tsx # apps/mobile/src/app/flowchart/index.tsx # apps/mobile/src/app/history.tsx # apps/mobile/src/components/live-run.tsx # apps/mobile/src/components/source-view.tsx # apps/mobile/src/lib/history.ts
Their new requests ran inside try blocks the React Compiler skips; they go through runRequest like the rest of the app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sign-in menu called i18next directly, so a language whose catalog was not loaded yet fell back to English; it now goes through changeAppLanguage. VoiceOver hears what the button chooses, and the screenshot script presses Send code by name now that the menu comes first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A row's entrance animation drew over the Library's web menu, hiding its last items. The screenshot script now shoots and dismisses the celebrations Attack, Brainstorm and Factoids results open with. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A refresh that failed after a newer switch or create still set the Debate tab to its error state, and any failed refresh replaced a list the server had already given. The failure now obeys the same guards as the answer and only shows the error when this refresh had painted the saved copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With saved copies painted first, the check could open from a copy whose last activity was days older than the student's latest work on the website. The debates provider now says whether its list is fresh, and the check waits for that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dismiss a judged voice round's celebration before its scorecard, and check the iPad outline against a part the case still has. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An offline or unreachable read answered with the saved copy looked like a server answer, so the five-day question could still open from it; and a failed refresh kept a copy another refresh had painted. cachedReadFrom says where its answer came from, and the debates provider tracks whether the list on screen is a copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This branch has not been deployed
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.
Round 7 of the iOS app. It fills the parity gaps left after rounds 1–6, makes the app faster and livelier, adds a release build, and produces an unsigned production IPA that Adam can re-sign with a free Apple ID and install.
Draft into
feat/native-ios. Don't merge yet.The IPA
DebateOwl-sideload.ipa (18 MB) is on the prerelease ios-r7-sideload-1. The release notes have the Sideloadly and AltStore steps and the list of what a free Apple ID can't sign.
2f4e3d5afrom58825f3. EAS keeps its own copy until 2026-11-12.com.pistack.debateowl1.0.0 (1).ExpoWidgetsTarget.appexandDebateOwlShare.appex, each signed ad hoc with only the App Group entitlement.68f4c87d274012834414c05325a2f87ed786fa48a3fa1d5937a1697851b98dc3.What changed
Release build and sideloading.
DEBATELAB_BUILD=releaseinapp.config.tsis the development build without the development client, so it runs its built-in JavaScript.DEBATELAB_APPLE_ACCOUNTits only entitlement is the App Group. Push, Sign in with Apple and Associated Domains are dropped, because a free Apple ID can't sign them. The Expo Go config is byte-identical; I comparedexpo config --jsonbefore and after.eas.jsongains two profiles:release-simulator;sideload, a custom EAS build (apps/mobile/.eas/build/sideload-ios.yml). It runs prebuild and the native patches,pod install, and an unsignedxcodebuild archive. Each bundle is then signed ad hoc with its prebuild entitlements, and the result is packed asDebateOwl-sideload.ipa. A normal EAS device build refuses to run without credentials, which is why this one is custom.push.tsreadsextra.remotePush. A build without the push entitlement shows the switch as "This version of the app cannot receive notifications yet" instead of failing when iOS refuses a token.scripts/patch-app-group-lookup.mjsmakes expo-widgets and expo-share-intent read AltStore'sALTAppGroupsfirst. AltStore renames the App Group to<group>.<TEAMID>; with the patch, Live Activities, widgets and the share extension still work in an AltStore install. Other builds are unchanged.Parity. The full checklist is below. New this round:
?custom=link, and opened from one;Performance.
cachedRead'sonCopy). A server refusal still surfaces, and another account's copy never shows.LiveValue, so only the draft re-renders, not the whole screen, 20 times a second.Animation. Brand-consistent, with no sounds, lessons, leagues or XP.
Fixed after merging the three strands (found by the screenshot run and the Codex reviews):
Parity checklist (website → iOS app)
Legend: ✅ in the app and wired to the same tables and functions as the website · 🆕 added in this round · ➖ not applicable on iOS (reason given).
Sign-in
sign-in.tsx,auth.tsx)social-sign-in.ts; native builds only, needsdebatelab://auth/callbackin the project's redirect list)Debate and Current Debate
Prepare
Practice
ModelSelector feature="sparring")/tools/debate-flow-sheet) as a PDF, from Practice and the iPad sidebarLibrary
src/)History
Flowchart
Timer and free tools
?custom=link, and open such a link in the app (codec moved topackages/core)You (Settings)
Sharing and export
Global
VITE_COLLABORATION_URLunset in production)Screenshots
The key screens are PNG assets on the release, with all 405 in
DebateOwl-r7-screenshots.zip.Builds and minutes
acffe3ed: the pipeline test of the sideload profile, at2361b759. It produced an installable-shaped IPA.2f4e3d5a: the final IPA, at58825f3.eas simulator:availabilityreturnsavailable: falsefor thepi-stackaccount (waitlist at expo.dev/services/simulators), and T3's MacBook device host failed to start. The screenshots are the web export instead, rendered at iPhone (390×844 @3x) and iPad landscape (1366×1024 @2x) sizes against staging with the Pro demo account and faked AI answers. They show layout, copy and colour, not native tab bars, sheets or gestures.Verification
npm run verifylocally at the final code:af57794found 2 issues, fixed inb14b3323anddb4554b5.f1a5677found 2 more in the round-1 fix, both fixed in58825f3with a test.58825f3has not been reviewed by a second model.Adam's to-do (not done here)
debatelab://auth/callbackto production Supabase's Auth › Redirect URLs, or Google sign-in in the IPA opens the website and the student has to close it.pi-stackor reconnect the MacBook device host in T3.🤖 Generated with Claude Code