Skip to content

feat(docs): add "Who uses OpenIAP?" app showcase - #282

Merged
hyochan merged 3 commits into
mainfrom
feat/docs-showcase-section
Aug 5, 2026
Merged

hyochan merged 3 commits into
mainfrom
feat/docs-showcase-section

Conversation

@hyochan

@hyochan hyochan commented Aug 5, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Replace the empty "Who uses OpenIAP?" placeholder with a real app list driven by a single JSON file
  • Seed it with the four apps submitted through Who uses OpenIAP? — submit your app to the showcase 📱 #280 and the announcement thread
  • Order apps by combined App Store + Google Play review count, summed across every App Store storefront
  • Add a repeatable submission path: one-entry pull request, issue comment, or email

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/installs are maintainer-managed.
  • scripts/refresh-showcase-metrics.mjs (bun run showcase:metrics) — refreshes ordering metrics.
    • Apple reports userRatingCount per storefront and publishes no global total, so a US-only lookup reads 0 for an app reviewed mainly in Korea or Japan. The script sums ~170 storefronts.
    • Apple throttles bursts, so failed storefronts are retried in later rounds; if any still fail the script keeps the previous numbers rather than writing a partial, under-counted sweep.
    • Google Play already reports a global review count, so it needs no equivalent pass.
  • src/lib/showcase.ts — sorts by ratings desc, then Play installs, 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-installed react-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.
  • Icons are normalized to 256px webp with a shared rounded mask, so store artwork with and without built-in corners renders identically.
  • Library names in the section subtitle now link to their GitHub folders; .section-subtitle a gets 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:

1. Sudoku Rabbit (146)   App Store in 31 markets + Play
2. Martie (12)           App Store KR + Play
3. Loader (9)            App Store in 7 markets
4. RecallAI (0)          newly released, no reviews yet

Test plan

  • bun run typecheck passes (docs)
  • bun run build passes (docs)
  • bun audit:docs — clean, 0 drift
  • bun audit:parity — passed
  • bun run showcase:metrics completes with 0 storefront failures
  • Home and /showcase verified rendering, icons loading, and store links resolving

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added an OpenIAP app showcase with featured apps, app details, platform links, ratings, and install metrics.
    • Added a dedicated showcase page with submission guidance and removal information.
    • Updated the homepage to highlight featured apps and link library names to their repositories.
    • Added showcase app images and a streamlined submission workflow.
  • Documentation

    • Added guidance for submitting, updating, and removing showcase apps.
  • Chores

    • Added tools for refreshing showcase ratings and installation metrics.

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>
@hyochan hyochan added 📖 documentation Improvements or additions to documentation 🎯 feature New feature 🌟 showcase Who uses OpenIAP? app showcase labels Aug 5, 2026
@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@hyochan, you've reached your PR review limit, so we couldn't start this review.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e8a62d21-dd8a-4d9f-858c-5851774e7c62

📥 Commits

Reviewing files that changed from the base of the PR and between a76d775 and 56d4eb9.

📒 Files selected for processing (4)
  • .husky/pre-commit
  • packages/docs/package.json
  • packages/docs/scripts/refresh-showcase-metrics.mjs
  • packages/docs/scripts/refresh-showcase-metrics.test.mjs
📝 Walkthrough

Walkthrough

The 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.

Changes

Showcase app directory

Layer / File(s) Summary
Showcase data and metrics
packages/docs/showcase-apps.json, packages/docs/src/lib/showcase.ts, packages/docs/scripts/refresh-showcase-metrics.mjs
Adds showcase app metadata, validation, featured-app selection, store metric aggregation, retry handling, persistence, and ranking output.
Showcase rendering and navigation
packages/docs/src/components/ShowcaseCards.tsx, packages/docs/src/pages/showcase.tsx, packages/docs/src/pages/home.tsx, packages/docs/src/App.tsx, packages/docs/src/styles/home.css, packages/docs/public/showcase/*
Adds reusable app and submission cards, the /showcase page, home-page featured apps, navigation, link styling, and four WebP app icons.
Contribution workflow and documentation
.codex/skills/add-showcase-app/SKILL.md, .claude/skills/add-showcase-app/SKILL.md, packages/docs/SHOWCASE.md
Documents app submission, icon preparation, metrics refresh, build verification, rendering checks, approval, and removal procedures.
Local documentation tooling
.claude/launch.json, packages/docs/package.json
Adds a Bun launch configuration and the showcase:metrics script.

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
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the new documentation app showcase, which is the main change in the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/docs-showcase-section

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
.codex/skills/add-showcase-app/SKILL.md (1)

54-58: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document 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 win

Set an explicit deadline for fetch requests.

refresh-showcase-metrics.mjs is run with Node and calls fetch from Apple R Apple`, 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

📥 Commits

Reviewing files that changed from the base of the PR and between 5c7ad7e and 2c5a373.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (17)
  • .claude/launch.json
  • .claude/skills/add-showcase-app/SKILL.md
  • .codex/skills/add-showcase-app/SKILL.md
  • packages/docs/SHOWCASE.md
  • packages/docs/package.json
  • packages/docs/public/showcase/loader.webp
  • packages/docs/public/showcase/martie.webp
  • packages/docs/public/showcase/recallai.webp
  • packages/docs/public/showcase/sudoku-rabbit.webp
  • packages/docs/scripts/refresh-showcase-metrics.mjs
  • packages/docs/showcase-apps.json
  • packages/docs/src/App.tsx
  • packages/docs/src/components/ShowcaseCards.tsx
  • packages/docs/src/lib/showcase.ts
  • packages/docs/src/pages/home.tsx
  • packages/docs/src/pages/showcase.tsx
  • packages/docs/src/styles/home.css

Comment thread .codex/skills/add-showcase-app/SKILL.md Outdated
Comment thread packages/docs/scripts/refresh-showcase-metrics.mjs Outdated
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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 2c5a373 and a76d775.

📒 Files selected for processing (2)
  • .codex/skills/add-showcase-app/SKILL.md
  • packages/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

Comment thread packages/docs/scripts/refresh-showcase-metrics.mjs Outdated
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>
@hyochan
hyochan merged commit 56a72c1 into main Aug 5, 2026
14 checks passed
@hyochan
hyochan deleted the feat/docs-showcase-section branch August 5, 2026 01:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📖 documentation Improvements or additions to documentation 🎯 feature New feature 🌟 showcase Who uses OpenIAP? app showcase

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant