docs: improve setup guide readability across framework pages - #281
Conversation
react-native:
- Explain Vega OS in its own section instead of introducing it
unannounced, and link Amazon Store Setup for details
- Document the react-native-nitro-modules peer dependency in the
install command; fix the Nitro Modules repo link
- Merge overlapping requirement callouts into one; move the Swift 6
interop workaround into Troubleshooting
expo:
- Add a Config Plugin Options orientation paragraph (IAPKit key +
optional store modules); deduplicate repeated store links
- Restore hedged Expo SDK 54 Kotlin guidance; add the missing Store
Setup bullet to Next Steps
flutter:
- Add Prerequisites; reshape Basic Setup around a StatefulWidget
- Move the dataAndroid deprecation note into Troubleshooting
- State the real (optional) reason for the itms-apps Info.plist entry
godot / kmp / maui:
- Unify section order (Troubleshooting before terminal Next Steps)
- Scope the kmp suspend-API claim to connection/fetch/purchase APIs;
align itms-apps guidance with flutter; clarify store boundaries
store pages (index, amazon, horizon):
- Add orientation paragraphs and per-framework support boundaries
(e.g. Horizon ships in every framework except Godot)
Also update the maui parity-audit text pin to the corrected product
name ("Google Play Billing, Play Services") so the guard keeps
requiring the NuGet dependency-shape description.
Verified: prettier, tsc, eslint, vite build, and audit:docs all pass;
four review-self lens rounds (facts/links/render/consistency)
converged with zero findings.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughUpdated framework setup guides, store-target documentation, and documentation presentation. Added shared ChangesStore targets and framework setup
Shared callout migration
Documentation audit and link styling
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration. 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 |
Rendered full-page captures of the reworked React Native, Expo, and Flutter setup pages. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/docs/src/pages/docs/setup/store/amazon.tsx (1)
317-329: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winReject conflicting Flutter store flags.
The current Flutter sample does not check
horizonEnabled && fireOsEnabledbefore computingflavor, so a stale Horizon flag can force the Fire OS Gradle flavor. Add the same mutual-exclusion check shown in the React Native and Horizon samples.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/setup/store/amazon.tsx` around lines 317 - 329, Update the Flutter sample’s Gradle configuration around the fireOsEnabled and horizonEnabled property parsing to reject or fail on both flags being true before computing flavor. Preserve the existing flavor selection for valid configurations, ensuring conflicting store flags cannot silently select a flavor.packages/docs/src/pages/docs/setup/kmp.tsx (1)
292-307: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winWait for
initConnection()before querying or purchasing.The docs state init runs first, but line 292 launches it independently. Lines 338-362 then call
fetchProductsandrequestPurchasein separate coroutines, so they can start before the billing client is connected. Await the initialization coroutine before the product/purchase flow.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/setup/kmp.tsx` around lines 292 - 307, Update the setup example around kmpIAP.initConnection so initialization completes before any fetchProducts or requestPurchase calls execute. Capture and await the coroutine that runs initConnection, then start the product and purchase flow only after it has completed; keep the purchaseUpdatedListener and purchaseErrorListener collectors independent as required.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/docs/src/pages/docs/setup/flutter.tsx`:
- Around line 290-293: Update the purchase handlers in
packages/docs/src/pages/docs/setup/flutter.tsx (lines 290-293) and
packages/docs/src/pages/docs/setup/godot.tsx (lines 523-525) to derive the
finishTransaction consumable flag from each product’s catalog type: pass true
only for consumables, and pass false or omit it for non-consumables and
subscriptions.
In `@packages/docs/src/pages/docs/setup/react-native.tsx`:
- Around line 456-472: The prose description in the paragraph under the "Swift 6
C++ interop errors (Nitro)" heading states "pin Swift 5.10" but the actual build
setting SWIFT_VERSION = '5.0' selects Swift 5 language mode, not version 5.10.
Update the text in that paragraph to accurately describe the setting as enabling
Swift 5 language mode or Swift 5 compatibility mode instead of referring to
"Swift 5.10".
---
Outside diff comments:
In `@packages/docs/src/pages/docs/setup/kmp.tsx`:
- Around line 292-307: Update the setup example around kmpIAP.initConnection so
initialization completes before any fetchProducts or requestPurchase calls
execute. Capture and await the coroutine that runs initConnection, then start
the product and purchase flow only after it has completed; keep the
purchaseUpdatedListener and purchaseErrorListener collectors independent as
required.
In `@packages/docs/src/pages/docs/setup/store/amazon.tsx`:
- Around line 317-329: Update the Flutter sample’s Gradle configuration around
the fireOsEnabled and horizonEnabled property parsing to reject or fail on both
flags being true before computing flavor. Preserve the existing flavor selection
for valid configurations, ensuring conflicting store flags cannot silently
select a flavor.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 94032e16-97b1-40b8-8b8c-be34015e9452
⛔ Files ignored due to path filters (3)
.github/pr-previews/pr-281-setup-readability-expo.jpgis excluded by!**/*.jpg.github/pr-previews/pr-281-setup-readability-flutter.jpgis excluded by!**/*.jpg.github/pr-previews/pr-281-setup-readability-react-native.jpgis excluded by!**/*.jpg
📒 Files selected for processing (10)
packages/docs/src/pages/docs/setup/expo.tsxpackages/docs/src/pages/docs/setup/flutter.tsxpackages/docs/src/pages/docs/setup/godot.tsxpackages/docs/src/pages/docs/setup/kmp.tsxpackages/docs/src/pages/docs/setup/maui.tsxpackages/docs/src/pages/docs/setup/react-native.tsxpackages/docs/src/pages/docs/setup/store/amazon.tsxpackages/docs/src/pages/docs/setup/store/horizon.tsxpackages/docs/src/pages/docs/setup/store/index.tsxscripts/audit-non-godot-parity.mjs
Per maintainer feedback: code examples never told readers where in the docs each function is specified, so following a setup page to a working implementation felt disorienting. - Turn each Usage intro's flow sentence into a clickable roadmap: initConnection -> listeners -> fetchProducts -> requestPurchase -> finishTransaction, every step linking its API/event reference - Add a one-line reference pointer next to each major example naming the APIs it uses (snake_case on godot, PascalCase on maui — all resolve to the same language-neutral reference pages) - Link first mentions in prose (ErrorCode -> Error Codes, listeners -> event pages); CodeBlock contents untouched Also address CodeRabbit review findings: - flutter/godot purchase handlers no longer pass the consumable flag unconditionally as true; examples now use false with a "true for consumables" note, matching the react-native page - react-native Swift workaround wording corrected from "pin Swift 5.10" to "Swift 5 language mode (SWIFT_VERSION = '5.0')" Verified: prettier, tsc, eslint, vite build, audit:docs pass; three review-self lens rounds converged (identifier-truth and render lenses clean from round 1; link targets mechanically checked against the route inventory; CodeBlock strings byte-identical). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Per maintainer feedback that the rounded bordered boxes read poorly and pages stack multiple boxes: replace both legacy callout systems (21 files of copy-pasted inline-styled divs and 23 files of .alert-card classes — ~95 boxes total) with one semantic component. - New src/components/Callout.tsx: kind = note | tip | important | warning, optional title; flat brand-tinted background, thin left rule, small uppercase label; light + dark variants - Editorial reduction on the setup-journey pages (framework setup, ios-setup, android-setup): audience-routing boxes folded into intro prose, redundant boxes demoted to paragraphs, no page stacks adjacent callouts anymore; every framework page now surfaces the same boxed finishTransaction auto-refund warning - Mechanical conversion everywhere else: labels moved into titles, emoji prefixes dropped, hazard-only use of the warning kind (availability/requirement boxes downgraded to important) - Fix dark-mode breakage from hard-coded colors (e.g. the Apple Developer Forums blockquote in upgrade-downgrade) - Remove the dead .alert-card CSS; carry the TL;DR-adjacency rule over to .callout - Update the deprecation-schedule audit pin to the callout title form Verified: prettier, tsc, eslint, vite build, audit:docs, audit:parity pass; link targets on removed lines mechanically confirmed present in the replacement markup; kind inventory audited (warning reserved for hazards, no default-duplicate titles); light and dark render checked live. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/docs/src/pages/docs/features/subscription/upgrade-downgrade.tsx`:
- Around line 161-178: Restore the quoted Apple Developer Forums excerpt in a
blockquote within the Callout, replacing the first paragraph while preserving
its text and inline code formatting. Keep the attribution link in the separate
paragraph unchanged.
In `@packages/docs/src/pages/docs/guides/testing.tsx`:
- Around line 321-325: Update the warning Callout guidance in the testing
documentation to instruct callers to finish transactions only after successful
verification and durable content delivery. Explicitly state that failed or
transient verification must leave the transaction pending for retry, replacing
the current direction to always call finishTransaction even when verification
fails.
In `@packages/docs/src/pages/docs/ios-setup.tsx`:
- Around line 377-379: Update the iOS-specific requirements text near the
paragraph and the corresponding section around the subscription guidance to
narrow the automatic-handling claim: describe OpenIAP libraries as providing
platform bindings and normalized APIs, while explicitly stating that the app or
backend must still implement server-side verification, finishTransaction,
Restore Purchases, and subscription handling.
In `@packages/docs/src/styles/components.css`:
- Around line 323-333: Update the paragraph reset selector in the callout styles
from `.doc-page .callout p` to `.callout-body p`, so it only affects body
paragraphs and allows `.doc-page .callout-label` and `.callout-body p + p` to
apply their intended margins.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 4108dd9d-7825-4e84-b616-51440b8511b0
⛔ Files ignored due to path filters (2)
.github/pr-previews/pr-281-setup-readability-flutter.jpgis excluded by!**/*.jpg.github/pr-previews/pr-281-setup-readability-react-native.jpgis excluded by!**/*.jpg
📒 Files selected for processing (48)
packages/docs/src/components/Callout.tsxpackages/docs/src/pages/docs/android-setup.tsxpackages/docs/src/pages/docs/apis/android/acknowledge-purchase-android.tsxpackages/docs/src/pages/docs/apis/android/consume-purchase-android.tsxpackages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsxpackages/docs/src/pages/docs/apis/fetch-products.tsxpackages/docs/src/pages/docs/apis/finish-transaction.tsxpackages/docs/src/pages/docs/apis/ios/present-external-purchase-link-ios.tsxpackages/docs/src/pages/docs/apis/request-purchase.tsxpackages/docs/src/pages/docs/ecosystem.tsxpackages/docs/src/pages/docs/events/ios/promoted-product-listener-ios.tsxpackages/docs/src/pages/docs/features/debugging.tsxpackages/docs/src/pages/docs/features/discount.tsxpackages/docs/src/pages/docs/features/external-purchase.tsxpackages/docs/src/pages/docs/features/purchase.tsxpackages/docs/src/pages/docs/features/refund.tsxpackages/docs/src/pages/docs/features/subscription/index.tsxpackages/docs/src/pages/docs/features/subscription/upgrade-downgrade.tsxpackages/docs/src/pages/docs/features/validation.tsxpackages/docs/src/pages/docs/foundation/founding-supporters.tsxpackages/docs/src/pages/docs/foundation/governance.tsxpackages/docs/src/pages/docs/foundation/one-pager.tsxpackages/docs/src/pages/docs/foundation/roadmap-budget.tsxpackages/docs/src/pages/docs/foundation/sponsorship.tsxpackages/docs/src/pages/docs/guides/ai-assistants.tsxpackages/docs/src/pages/docs/guides/testing.tsxpackages/docs/src/pages/docs/ios-setup.tsxpackages/docs/src/pages/docs/kit-backend.tsxpackages/docs/src/pages/docs/lifecycle/index.tsxpackages/docs/src/pages/docs/setup/expo.tsxpackages/docs/src/pages/docs/setup/flutter.tsxpackages/docs/src/pages/docs/setup/godot.tsxpackages/docs/src/pages/docs/setup/kmp.tsxpackages/docs/src/pages/docs/setup/maui.tsxpackages/docs/src/pages/docs/setup/react-native.tsxpackages/docs/src/pages/docs/setup/store/amazon.tsxpackages/docs/src/pages/docs/types/ios/app-transaction-ios.tsxpackages/docs/src/pages/docs/types/ios/subscription-billing-plan-ios.tsxpackages/docs/src/pages/docs/types/purchase.tsxpackages/docs/src/pages/docs/types/verify-purchase-with-provider-props.tsxpackages/docs/src/pages/docs/types/verify-purchase-with-provider-result.tsxpackages/docs/src/pages/docs/updates/announcements.tsxpackages/docs/src/pages/docs/updates/deprecations.tsxpackages/docs/src/pages/docs/updates/releases.tsxpackages/docs/src/pages/docs/webhooks.tsxpackages/docs/src/styles/components.csspackages/docs/src/styles/dark-mode.cssscripts/audit-deprecation-schedule.mjs
🚧 Files skipped from review as they are similar to previous changes (5)
- packages/docs/src/pages/docs/setup/store/amazon.tsx
- packages/docs/src/pages/docs/setup/kmp.tsx
- packages/docs/src/pages/docs/setup/maui.tsx
- packages/docs/src/pages/docs/setup/flutter.tsx
- packages/docs/src/pages/docs/setup/godot.tsx
Direct read-through of the reader journey found the iOS/Android setup pages naming APIs without linking them: - ios-setup: Purchase Verification -> validation guide; Restore Purchases -> restorePurchases + getAvailablePurchases references - android-setup: acknowledgment and consumption -> finishTransaction (with the isConsumable flag), verification -> validation guide and IAPKit Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The verification lens caught .doc-page global rules defeating the new callout styles by specificity: - .doc-page p (0,1,1) overrode .callout-label (0,1,0), rendering every label 14px gray with no gap instead of the small kind-colored uppercase label; .doc-page .callout p (0,2,1) also zeroed paragraph and list spacing inside bodies. Scoped stronger selectors (.doc-page .callout .callout-label, .doc-page .callout-body p + p, .doc-page .callout-body ul/ol) now win; list left indent preserved. - Verified live with computed styles: label 12px/kind color/4px gap, body paragraphs 13px with 8px gaps, list indent 24px kept. Also from the lens round and direct read-through: - create-billing-program-reporting-details-android: External Offer ordering callout upgraded important -> warning (24-hour token reporting carries the account-suspension consequence documented on the external-purchase page) - purchase.tsx: fix pre-existing cross-line JSX seam rendering "useiapkit.amazon" Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- upgrade-downgrade: restore blockquote semantics for the Apple Developer Forums quotation inside the callout - testing: correct the finishTransaction guidance — finish only after verification and delivery succeed; leave transient verification failures unfinished so the transaction is redelivered (the previous wording said to finish even when verification fails, contradicting the finish-transaction reference) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/docs/src/pages/docs/ios-setup.tsx (1)
377-379: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winNarrow the automatic-handling claims across both setup pages.
The four paragraphs still imply OpenIAP libraries complete platform or subscription requirements rather than providing bounded APIs. Replace them with scoped wording: libraries implement the OpenIAP spec for platform bindings, while the app and backend still implement verification, entitlement delivery, transaction finishing/acknowledgment, restore, subscription-state handling, and renewal work.
packages/docs/src/pages/docs/ios-setup.tsx#L377-L379packages/docs/src/pages/docs/ios-setup.tsx#L462-L466packages/docs/src/pages/docs/android-setup.tsx#L353-L355packages/docs/src/pages/docs/android-setup.tsx#L490-L494🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/ios-setup.tsx` around lines 377 - 379, Update the four referenced paragraphs in packages/docs/src/pages/docs/ios-setup.tsx lines 377-379 and 462-466, and packages/docs/src/pages/docs/android-setup.tsx lines 353-355 and 490-494, to state that OpenIAP libraries implement the OpenIAP specification for platform bindings only; explicitly preserve app/backend responsibility for verification, entitlement delivery, transaction finishing or acknowledgment, restore, subscription-state handling, and renewals.packages/docs/src/pages/docs/android-setup.tsx (1)
306-310: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winDescribe the ADB command accurately.
adb shell pm clear com.android.vendingclears Google Play Store data, not only the cache. This can reset Play Store state and require the tester to sign in again.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/android-setup.tsx` around lines 306 - 310, Update the Callout text near the ADB command to state that `adb shell pm clear com.android.vending` clears Google Play Store data, including app state, rather than only its cache, and warn that this may require signing in again.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/docs/src/pages/docs/android-setup.tsx`:
- Around line 374-379: Update the Android acknowledgment guidance near
finishTransaction to state the complete order: verify the purchase with a
trusted verifier such as /v1/purchase/verify or IAPKit, grant and persist the
entitlement, then call finishTransaction. Explicitly warn that finishing before
delivery is durably persisted can cause Google Play to refund an unfulfilled
purchase.
---
Outside diff comments:
In `@packages/docs/src/pages/docs/android-setup.tsx`:
- Around line 306-310: Update the Callout text near the ADB command to state
that `adb shell pm clear com.android.vending` clears Google Play Store data,
including app state, rather than only its cache, and warn that this may require
signing in again.
In `@packages/docs/src/pages/docs/ios-setup.tsx`:
- Around line 377-379: Update the four referenced paragraphs in
packages/docs/src/pages/docs/ios-setup.tsx lines 377-379 and 462-466, and
packages/docs/src/pages/docs/android-setup.tsx lines 353-355 and 490-494, to
state that OpenIAP libraries implement the OpenIAP specification for platform
bindings only; explicitly preserve app/backend responsibility for verification,
entitlement delivery, transaction finishing or acknowledgment, restore,
subscription-state handling, and renewals.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 5216d70e-af9f-46e9-877a-b3009887d08a
⛔ Files ignored due to path filters (3)
.github/pr-previews/pr-281-setup-readability-expo.jpgis excluded by!**/*.jpg.github/pr-previews/pr-281-setup-readability-flutter.jpgis excluded by!**/*.jpg.github/pr-previews/pr-281-setup-readability-react-native.jpgis excluded by!**/*.jpg
📒 Files selected for processing (2)
packages/docs/src/pages/docs/android-setup.tsxpackages/docs/src/pages/docs/ios-setup.tsx
Per review: verify with a trusted verifier, grant and persist the entitlement so it survives a restart, then acknowledge through finishTransaction — finishing before durable delivery risks refunding an unfulfilled purchase. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Per maintainer feedback that hook-state fields and type names in prose never link their Types pages: - react-native Hook State bullets now show each field's shape with a linked type: products (Product[]), subscriptions (ProductSubscription[]), availablePurchases (Purchase[]), activeSubscriptions (ActiveSubscription[]) - flutter/godot/maui prose first-mentions of Purchase and ProductRequest link their type pages - expo/kmp left unchanged: their prose never names a mapped type, and links are only added where the identifier actually appears Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/docs/src/pages/docs/setup/maui.tsx (2)
227-254: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winDeliver the entitlement before finishing the transaction.
The new flow says to finish after verification, but it does not require successful entitlement delivery first. The adjacent example finishes at Line [332]–[334] and grants the entitlement at Line [336]. If delivery fails after
FinishTransactionAsync, the transaction loses its recovery path.Update the prose and example to use this order: verify the purchase, grant the entitlement, then finish the transaction. This matches
packages/docs/src/pages/docs/apis/finish-transaction.tsxandpackages/docs/src/pages/introduction.tsx.Proposed sequence correction
- await mutate.FinishTransactionAsync( - purchase: new PurchaseInput(purchase), - isConsumable: true); - GrantEntitlement(purchase.ProductId); + + await mutate.FinishTransactionAsync( + purchase: new PurchaseInput(purchase), + isConsumable: true);Also applies to: 306-324
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/setup/maui.tsx` around lines 227 - 254, Update the Maui setup prose and adjacent purchase example around the typical flow and transaction handling to explicitly verify the purchase, grant/deliver the entitlement, and only then call FinishTransactionAsync. Ensure both referenced sections no longer imply finishing immediately after verification, preserving the recovery path if entitlement delivery fails.
522-533: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winClarify the Google Play signing-key requirement.
“Signing key match the uploaded build” is ambiguous with Google Play App Signing. The upload key is used to submit the bundle, but Play distributes the app with the associated app-signing certificate. Test-track installations therefore require matching the installed package name and the Play app-signing certificate, not necessarily the upload key. State the required certificate explicitly.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/setup/maui.tsx` around lines 522 - 533, Update the signing-key checklist item in the Maui setup documentation to explicitly require that the installed package name and Google Play app-signing certificate match the uploaded/configured build. Clarify that this is the Play-distributed app-signing certificate, not necessarily the upload key.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/docs/src/pages/docs/setup/maui.tsx`:
- Around line 227-254: Update the Maui setup prose and adjacent purchase example
around the typical flow and transaction handling to explicitly verify the
purchase, grant/deliver the entitlement, and only then call
FinishTransactionAsync. Ensure both referenced sections no longer imply
finishing immediately after verification, preserving the recovery path if
entitlement delivery fails.
- Around line 522-533: Update the signing-key checklist item in the Maui setup
documentation to explicitly require that the installed package name and Google
Play app-signing certificate match the uploaded/configured build. Clarify that
this is the Play-distributed app-signing certificate, not necessarily the upload
key.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 558664db-c3af-4513-a07f-8112a15a4e98
📒 Files selected for processing (10)
packages/docs/src/pages/docs/android-setup.tsxpackages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsxpackages/docs/src/pages/docs/features/purchase.tsxpackages/docs/src/pages/docs/features/subscription/upgrade-downgrade.tsxpackages/docs/src/pages/docs/guides/testing.tsxpackages/docs/src/pages/docs/setup/flutter.tsxpackages/docs/src/pages/docs/setup/godot.tsxpackages/docs/src/pages/docs/setup/maui.tsxpackages/docs/src/pages/docs/setup/react-native.tsxpackages/docs/src/styles/components.css
🚧 Files skipped from review as they are similar to previous changes (9)
- packages/docs/src/pages/docs/features/subscription/upgrade-downgrade.tsx
- packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx
- packages/docs/src/pages/docs/android-setup.tsx
- packages/docs/src/pages/docs/guides/testing.tsx
- packages/docs/src/styles/components.css
- packages/docs/src/pages/docs/setup/godot.tsx
- packages/docs/src/pages/docs/setup/flutter.tsx
- packages/docs/src/pages/docs/features/purchase.tsx
- packages/docs/src/pages/docs/setup/react-native.tsx
Inline code chips share the warm-brown link color (#8b6545) and the link underline was transparent until hover, so linked and unlinked text/chips were indistinguishable at a glance. Links inside doc pages now carry a persistent subtle underline (--doc-link-underline CSS variable: 35% warm brown in light mode, 40% oatmeal in dark mode); hover still strengthens it. Heading anchors, buttons, and external links (already dotted + arrow) are unaffected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Summary
react-native-nitro-modulespeer-dependency in the install command, a stale "Expo SDK 54+: no configuration needed" claim, and two fabricated/unconditionalitms-appsInfo.plist justificationsChanges
react-native.tsx
react-native-nitro-modulespeer dependency; Nitro link corrected tomrousavy/nitroexpo.tsx
flutter.tsx
dataAndroiddeprecation note moved into Troubleshooting;itms-appsInfo.plist entry now states its real, optional purpose (only needed if your own code checks App Store links — the plugin never does)godot.tsx / kmp.tsx / maui.tsx
store pages
scripts/audit-non-godot-parity.mjs
"Google Billing, Play"to the corrected product name"Google Play Billing, Play Services"; the guard still requires the NuGet dependency-shape descriptionAPI wayfinding (follow-up commit
33a52523)Per maintainer feedback that code examples never tell readers where in the docs each function is specified:
initConnection→ listeners →fetchProducts→requestPurchase→finishTransaction, each step linking its API/event reference pagesnake_case, MAUI links*AsyncPascalCase — all resolve to the same language-neutral reference pages)ErrorCode→ Error Codes, listeners → event pages); CodeBlock contents are untouched (verified byte-identical)Unified Callout system (follow-up commit
ded5e45e)Per maintainer feedback that the rounded bordered callout boxes read poorly and stack up: all ~95 callouts across 46 docs pages now use one semantic
<Callout kind="note|tip|important|warning" title?>component (flat brand-tinted background, thin left rule, small uppercase label, light/dark variants) replacing two legacy systems — copy-pasted inline-styled divs and the blue/yellow/green.alert-cardclasses (CSS removed).warningis reserved for genuine hazards; availability/requirement boxes useimportantReview process
Four independent review lenses (facts / links & anchors / render & format / cross-page consistency) ran repeatedly over the diff until convergence: round 1 → 11 findings, round 2 → 6, round 3 → 3, round 4 → 0. Every factual claim added by the rewrite was verified against library source (e.g. grepping
libraries/flutter_inapp_purchaseandlibraries/kmp-iapforitms-apps/canOpenURLbefore rewording those sections).Preview
Full-page renders of the reworked pages (from the Vite dev server), committed under
.github/pr-previews/per the preview convention:Test plan
prettier --checkpasses on all nine pagestsc --noEmitpasses (packages/docs)bun run lintpasses (packages/docs)vite buildsucceedsbun run audit:docs— 0 drift🤖 Generated with Claude Code
Summary by CodeRabbit