Inspiration

Students can care about an assignment and still struggle to begin. When the work feels bigger than the next visible action, another crowded dashboard or broken streak can add pressure. StudyPebble makes the next step concrete and keeps essential study support free.

What it does

StudyPebble helps students move from "I have too much to do" to one concrete next step. Choose a course and task, complete a short focus sprint, and see progress accumulate as pebbles. The full plan-focus-complete loop stays free, with no login requirement or punitive streak.

Semester Compass adds a course-by-course recovery view built from saved tasks. RevenueCat manages one optional entitlement, semester_studio, with clear purchase, cancellation, current-access, and restore states. The paywall explains this boundary and always exposes restore and current-access actions.

How we built it

StudyPebble is an Android-first Expo and React Native application. Pure domain functions choose the next small step and calculate visible momentum. A versioned local repository preserves tasks and fails closed on malformed state. The purchase boundary is isolated behind a RevenueCat adapter using react-native-purchases, one current offering, and one entitlement.

The adapter also fails closed. LIVE Test Store behavior requires an Android development build, an environment-provided Test Store public SDK key, and explicit authorization. Missing configuration cannot silently unlock premium features or fall back to a fake purchase.

Evidence boundary

The browser flow is explicitly labeled DEMO_REPLAY; it is not used as native provider evidence. On August 31, 2026, an authorized Android API 36 emulator session exercised RevenueCat Test Store end to end:

the first simulated purchase was cancelled and access stayed unchanged; TEST VALID PURCHASE returned success without moving real money; the semester_studio entitlement activated and Semester Compass rendered; a separate current-access check kept the entitlement active; and restore returned LIVE / RESTORE / SUCCESS / entitlement true.

These are development-sandbox results, not production billing, app-store publication, subscription revenue, or a real-money charge. The browser DEMO_REPLAY does not contact RevenueCat or move money.

Challenges we ran into

The hardest part was not drawing a paywall. It was defining a monetization boundary that respects students and remains correct through purchase, cancellation, restore, stale state, and misconfiguration. We separated the free learning loop from the optional semester view, then made provenance and entitlement transitions visible enough to test.

Accomplishments that we are proud of

A focused mobile journey with no login requirement. A useful free core that is not weakened to force conversion. One understandable entitlement instead of overlapping premium states. A fail-closed RevenueCat boundary with explicit Test Store and replay provenance. 41 automated tests and 12 additional verification checks passing. Native capture of cancellation, simulated valid purchase, entitlement, current-access check, restore, free-core behavior, and persistence. A sanitized public repository at commit 814dc41. A verified 95-second 1080p narrated demo master.

What we learned

A subscription integration is a product contract, not a checkout button. The important decisions are what stays free, how restore is communicated, and how the app behaves when entitlement evidence is missing or stale. Designing those states early made both the user experience and implementation more coherent.

AI and Codex usage

StudyPebble does not use generative AI at runtime. Codex assisted with product scoping, implementation, test design, evidence review, security review, and submission preparation. RevenueCat lifecycle claims were accepted only after they were exercised on the Android development build against Test Store and matched the captured receipts.

How to test

With Node.js 22 and pnpm 11, clone the public repository and run: pnpm install --frozen-lockfile pnpm test pnpm verify pnpm export:web

The browser route is an explicitly labeled DEMO_REPLAY. Native RevenueCat testing requires an Android development build and the tester's own RevenueCat Test Store public SDK key. Without that configuration, the premium boundary fails closed; the free plan-focus-complete loop remains available.

What's next for StudyPebble

Add optional weekly reflection and portable semester export. Run accessibility and student feedback sessions with consent. Test the same fail-closed lifecycle on additional physical Android devices.

Built With

Share this project:

Updates

Submission history