Inspiration

Washington caps how much a 16- or 17-year-old can work in a school week. Most teens never see the statute. The person writing the schedule is usually the person breaking it. I wanted one place for "that shift felt wrong": the rule, a link to the published text, and the dollar amount.

What it does

Off the Clock is an Android app for teen workers in Washington.

  1. Log a shift by typing it in, or photograph the schedule your manager posted. OCR runs on the phone; the photo never leaves the device; nothing is saved until you confirm.
  2. Every shift runs through a rules engine built from chapter 296-125 WAC (as amended by WSR 26-11-048, effective July 1 2026), plus WAC 296-126-092 and RCW 49.46.130. Each problem quotes the statute and links the published text.
  3. Missed rest breaks, docked time, pay under the wage floor, and unpaid overtime are summed in integer cents and shown as one figure, with every problem listed underneath.

Finding violations is free. The paid unlock is a dated PDF evidence record: every shift, every rule broken, and the statute behind each one: the form you hand to someone else.

How I built it

  • Expo SDK 57, React Native 0.86 (New Architecture), TypeScript, expo-router
  • React Native Paper (Material 3), light and dark
  • On-device schedule scan via ML Kit (expo-mlkit-ocr)
  • Local-only storage (AsyncStorage). No account, no server, no upload.
  • Evidence PDF via expo-print + expo-sharing
  • 55 tests under plain node --test covering hours caps, breaks, wage floor, overtime, OCR regrouping, PDF escaping, WCAG AA contrast, and entitlement logic

Monetization with RevenueCat (Next Gen judges: read this)

Violation findings are free. The $4.99 Pro unlock is a dated PDF evidence export (entitlement: evidence_export). Parent pays via RevenueCat: in-app one-time purchase, or Web Purchase Link / Web Billing on Stripe with the same customer ID. The app refreshes entitlement when a parent already paid. Built against Test Store + Stripe test mode for Next Gen.

Key files: src/entitlement.ts, src/purchases.tsx, app/export.tsx. See also SANDBOX-PURCHASE-TERMS.md.

Challenges I ran into

Encoding chapter 296-125 into deterministic tests: daily/weekly caps, night cutoffs, and break math differ by age band. OCR from real posted schedules is messy; the parser has to refuse bad reads instead of inventing shifts. Connecting Web Billing to the same customer ID as the native SDK so a parent payment unlocks without a second account.

Accomplishments that I'm proud of

  • Working rules engine with statute citations (each hit links published WAC/RCW text)
  • Dual RevenueCat rails (SDK + Web Purchase Link) aimed at the actual payer (the parent)
  • On-device OCR with an explicit privacy boundary
  • 55 focused unit tests on the money and time math
  • MIT open-source repo ready for Next Gen review

What I learned

Labor rules are precise; an app that misquotes them is worse than no app. Monetizing discovery of underpayment would tax the person with the least power, so the free/paid split follows who holds the card. RevenueCat Web Billing is what makes "parent pays, teen unlocks" work without building a custom checkout.

What's next for Off the Clock

Ship a production Play Store build with live RevenueCat keys once eligible; expand coverage if other states publish similarly clear hour/break rules; keep the local-first privacy model.

Awards I am competing for

Next Gen Award: solo student submission judged on video + open-source code. This entry is a minor entrant with guardian consent; Next Gen is the eligible lane.

Built With

Share this project:

Updates

Submission history