feat(docs): add "Who uses OpenIAP?" app showcase - #282
Conversation
Turn the empty showcase placeholder into a real app list driven by a single JSON file, so submissions land as a one-entry pull request. - Add packages/docs/showcase-apps.json as the list SSOT, seeded with the four apps submitted through issue #280 and the announcement thread - Render app cards on the home page (top 5 plus an inline submit card) and add a /showcase route listing every app with the submission requirements - Order apps by combined App Store and Google Play review count, falling back to Play installs. Apple reports userRatingCount per storefront and publishes no global total, so refresh-showcase-metrics.mjs sums ~170 storefronts and keeps previous numbers rather than writing a partial sweep - Normalize app icons to 256px webp with a shared rounded mask so store artwork with and without built-in corners renders identically - Link the library names in the section subtitle to their GitHub folders and style anchors inside .section-subtitle so they read as links - Document the flow in SHOWCASE.md and add the add-showcase-app skill for Codex and Claude Code Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 41 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThe docs site adds an OpenIAP showcase with app metadata, store metrics, responsive cards, a dedicated route, home-page highlights, submission guidance, image assets, and contributor workflows. ChangesShowcase app directory
Estimated code review effort: 3 (Moderate) | ~30 minutes Sequence Diagram(s)sequenceDiagram
participant Visitor
participant DocsApp
participant Showcase
participant ShowcaseAppCard
Visitor->>DocsApp: Open /showcase
DocsApp->>Showcase: Render Showcase page
Showcase->>ShowcaseAppCard: Pass showcase app entries
ShowcaseAppCard-->>Visitor: Display app metadata and platform links
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
.codex/skills/add-showcase-app/SKILL.md (1)
54-58: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDocument one supported Pillow setup for all showcase workflows.
Both workflows depend on Pillow, but neither file installs or declares it.
.codex/skills/add-showcase-app/SKILL.md#L54-L58: document the required Pillow setup for icon conversion..claude/skills/add-showcase-app/SKILL.md#L23-L24: reference the same setup for screenshot cropping.🤖 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 @.codex/skills/add-showcase-app/SKILL.md around lines 54 - 58, Document one shared, supported Pillow installation/setup for both showcase workflows: update .codex/skills/add-showcase-app/SKILL.md lines 54-58 to state the required setup before icon conversion, and update .claude/skills/add-showcase-app/SKILL.md lines 23-24 to reference that same setup before screenshot cropping. Keep the setup instructions consistent between both files.packages/docs/scripts/refresh-showcase-metrics.mjs (1)
60-62: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winSet an explicit deadline for fetch requests.
refresh-showcase-metrics.mjsis run with Node and callsfetchfromApple RApple`, but it does not pass a timeout signal. If a store URL stalls, the retry loop and stale-data preservation path do not run. Pass a timeout signal that matches the runtime.Proposed change
const response = await fetch(url, { headers: { 'User-Agent': USER_AGENT }, + signal: AbortSignal.timeout(15_000), });🤖 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/scripts/refresh-showcase-metrics.mjs` around lines 60 - 62, Update the fetch call in refresh-showcase-metrics.mjs to include an explicit timeout signal supported by the Node runtime, using the script’s existing timeout configuration or defining one consistent with its retry behavior. Preserve the current headers, retry loop, and stale-data handling while ensuring stalled requests abort and follow those paths.
🤖 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 @.codex/skills/add-showcase-app/SKILL.md:
- Line 147: Update the commit-message guidance in the showcase app instructions
to use a lowercase app slug after the docs tag, replacing the capitalized <App>
placeholder with a lowercase example such as recallai while preserving the
instruction not to commit, push, or open a PR.
In `@packages/docs/scripts/refresh-showcase-metrics.mjs`:
- Around line 142-149: Update the metric extraction and write flow around the
reviews parsing and the configured Play-source handling: throw when a configured
Play source has no parseable review count instead of allowing undefined to
become zero, while preserving existing metrics. Before writing updates, skip
entries that have neither ios nor android sources so valid web-only entries do
not overwrite metrics.
---
Nitpick comments:
In @.codex/skills/add-showcase-app/SKILL.md:
- Around line 54-58: Document one shared, supported Pillow installation/setup
for both showcase workflows: update .codex/skills/add-showcase-app/SKILL.md
lines 54-58 to state the required setup before icon conversion, and update
.claude/skills/add-showcase-app/SKILL.md lines 23-24 to reference that same
setup before screenshot cropping. Keep the setup instructions consistent between
both files.
In `@packages/docs/scripts/refresh-showcase-metrics.mjs`:
- Around line 60-62: Update the fetch call in refresh-showcase-metrics.mjs to
include an explicit timeout signal supported by the Node runtime, using the
script’s existing timeout configuration or defining one consistent with its
retry behavior. Preserve the current headers, retry loop, and stale-data
handling while ensuring stalled requests abort and follow those paths.
🪄 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: ea6bb329-e073-4635-906e-88a4322abc50
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (17)
.claude/launch.json.claude/skills/add-showcase-app/SKILL.md.codex/skills/add-showcase-app/SKILL.mdpackages/docs/SHOWCASE.mdpackages/docs/package.jsonpackages/docs/public/showcase/loader.webppackages/docs/public/showcase/martie.webppackages/docs/public/showcase/recallai.webppackages/docs/public/showcase/sudoku-rabbit.webppackages/docs/scripts/refresh-showcase-metrics.mjspackages/docs/showcase-apps.jsonpackages/docs/src/App.tsxpackages/docs/src/components/ShowcaseCards.tsxpackages/docs/src/lib/showcase.tspackages/docs/src/pages/home.tsxpackages/docs/src/pages/showcase.tsxpackages/docs/src/styles/home.css
Address CodeRabbit review on #282. - Treat the Play install block as the markup canary. It renders on every app page, so its absence means our selectors stopped matching and the script now throws instead of writing a zero over a real review count. - Keep a missing review element as a legitimate zero: Play omits it entirely for apps with few or no reviews, so throwing there would fail every newly released app. - Skip entries with no store links so web-only apps keep their recorded metrics. - Use a lowercase commit subject in the add-showcase-app example. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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/scripts/refresh-showcase-metrics.mjs`:
- Around line 146-160: Update the review parsing near the returned metrics so an
absent review element still produces ratings: 0, but a present review element
with an unparseable count throws an error instead of writing zero. Preserve the
existing install validation and ensure fixtures cover both missing reviews and
malformed review counts.
🪄 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: 30f3331d-25ac-4e30-91c1-d0e28554d581
📒 Files selected for processing (2)
.codex/skills/add-showcase-app/SKILL.mdpackages/docs/scripts/refresh-showcase-metrics.mjs
🚧 Files skipped from review as they are similar to previous changes (1)
- .codex/skills/add-showcase-app/SKILL.md
Follow-up to CodeRabbit review on #282. The install-block canary only proved that one selector still matched; review markup could drift on its own and write a zero over a real count. - Extract parsePlayMetrics as a pure function and distinguish an absent review element (a real zero, which Play renders for apps with few reviews) from a present-but-unreadable one (selector drift, now throws) - Refuse to drop an established positive rating to zero, whatever the readings looked like individually — losing a count is always a regression - Add fixtures covering populated, compact, absent, unreadable, chrome-only, and missing-install-block pages, wired into the docs pre-commit block - Guard the refresh flow behind a direct-invocation check so importing the module for tests performs no network calls and rewrites nothing Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Summary
Closes nothing — #280 stays open as the ongoing submission thread.
Changes
Data and ordering (
packages/docs)showcase-apps.json— the list SSOT. An entry is name, tagline, logo, library, and store links;ratings/installsare maintainer-managed.scripts/refresh-showcase-metrics.mjs(bun run showcase:metrics) — refreshes ordering metrics.userRatingCountper storefront and publishes no global total, so a US-only lookup reads0for an app reviewed mainly in Korea or Japan. The script sums ~170 storefronts.src/lib/showcase.ts— sorts byratingsdesc, then Playinstalls, then submission order.Neither store exposes download totals (Apple publishes no install data at all; Play reports only a bucket like
1K+), so review count is the one verifiable signal both stores share.UI (
packages/docs)src/components/ShowcaseCards.tsx— shared app card and inline submit card. Store links use the official brand glyphs from the already-installedreact-icons/si.src/pages/home.tsx— renders the top 5 apps plus the submit card in the same grid, with a "See all" link once the list outgrows it.src/pages/showcase.tsx+ route — full list with the submission requirements..section-subtitle agets accent styling so they read as links (they were previously indistinguishable from body text).Docs and tooling
packages/docs/SHOWCASE.md— public submission guide, including icon spec (square 512×512 PNG, corners applied by us) and how ordering works..codex/skills/add-showcase-app/(canonical) and.claude/skills/add-showcase-app/(adapter) — end-to-end procedure for turning a submission into a rendered card..claude/launch.json— docs dev-server config used by the skill's verification step.Preview
The showcase renders at
/(top 5) and/showcase(full list). Ranking after a full metrics sweep:Test plan
bun run typecheckpasses (docs)bun run buildpasses (docs)bun audit:docs— clean, 0 driftbun audit:parity— passedbun run showcase:metricscompletes with 0 storefront failures/showcaseverified rendering, icons loading, and store links resolving🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Chores