The premise

Most "cross-platform" stories stop at the pitch. RippleUp is a shipping product: v5.3.3 in production, distributed as an Android APK and a self-contained Windows desktop app, built with Kotlin, Jetpack Compose, and Compose Multiplatform 1.6.11.

What the app does

RippleUp is a social-engagement platform: users self-report activities (with a 5-minute camera verification window), scan partner QR codes (live CameraX + MLKit barcode scanning), earn points and badges, and join events. Anti-abuse is built in — per-action cooldowns (45/30/90/120 min), 12 actions/day, 300 points/day.

The production backend

The cloud layer is a full Supabase setup: user accounts, sync, QR verification with location proof (who + where + map), admin review, badges, notifications, and event registration. The schema ships as SQL in the repo (schema.sql + security migration) with RLS and the approve/reject/badge pipelines as database logic — clone it, run two SQL files, connect, and you have the whole backend.

The desktop port is a genuinely native build

desktop/ is a Compose Multiplatform port with identical screens, verify flow, badges and sheets. The platform swaps are the interesting part:

  • Persistence: Room → atomic JSON store at ~/.rippleup/state.json (same schema, same HMAC tags)
  • Photo capture: camera intent → Swing JFileChooser
  • QR scan: live CameraX+MLKit → the same viewfinder; a click simulates scanning a partner QR
  • Auth storage: SharedPreferences → java.util.prefs

gradlew createDistributable produces a self-contained app with a bundled runtime — RippleUpDesktop.exe runs with no Java installed.

CI

GitHub Actions builds debug + signed release APKs on every push to main (keystore injected via secrets) and the desktop zip on every push touching desktop/ — releases are reproducible from the repo, not from someone's laptop.

Links

If you're fighting Compose Multiplatform's rough edges on desktop (persistence swaps, camera intents, packaging), the repo is a working reference — ask me anything in the issues.