Back to projects

Project ยท 2026

Grind

Offline-first interview-prep drill (system design, coding, behavioral, company-specific) built on Leitner spaced repetition. Universal Expo app for iOS, Android, and web, with optional Supabase cloud sync, a global leaderboard, and a RevenueCat premium tier layered behind an on-device state seam.

  • TypeScript
  • React Native
  • Expo
  • Supabase
  • RevenueCat
  • PWA

Problem

Interview prep is scattered: system design here, LeetCode there, behavioral stories in a doc, and company-specific quirks in your head. I wanted one app that drilled all of it on a schedule, worked offline, and kept my data on-device.

Approach

A universal Expo app (iOS, Android, and web from one codebase) built on Leitner spaced repetition:

  • Framework-agnostic domain logic lives in a @grind/core package (types, SRS, gamification, sessions) with zero React or DOM imports, guarded by a jest check.
  • The app supplies its own on-device StatePort backend, so a signed-out, free user gets the full offline experience with no network required.
  • An optional Supabase account adds cloud sync and a global leaderboard; a RevenueCat premium tier gates behavioral and company-specific decks. Both are additive behind the same state seam.
  • The web target ships as an installable offline PWA.

Highlights

  • One codebase targets iOS, Android, and web.
  • Offline-first: studying never requires the network.
  • Leitner spaced repetition schedules reviews so weak answers resurface sooner.
  • Cloud sync, leaderboard, and premium decks layer in without touching the offline core.