Our own project · Case study
LithoCanvas Case Study A collector app from idea to backend
LithoCanvas is our own Android app for mineral and art collections. This case study shows how we built it: app architecture, backend, billing and privacy, planned the same way we plan client projects.
The app
Four screens
What we built
The app keeps collections, identifies photos on request and syncs everything with a backend of our own. Four decisions shape the architecture.
-
The collection lives on the device first
Records, photos and notes sit in a local SQLite database per account. Changes wait in a durable queue until they sync, so nothing is lost offline.
-
Identification through our own server
A photo leaves the device only after consent. A worker checks the request, counts quotas and calls the recognition provider. The provider key never ships in the app package.
-
Billing with server verification
Purchases go through Google Play. The backend verifies each purchase and decides which plan applies.
-
Account, export and deletion
Registration, password recovery by email, data export and account deletion were part of the scope from day one.
Tech stack
in detail
-
React Native 0.88
Bare React Native with React 19 and TypeScript 6. Android builds run locally through Gradle, without a cloud build service.
-
Expo SDK 58 modules
Camera, image picker, file system and notifications come in as individual modules.
-
expo-sqlite + Zustand
An account-bound database on the device, plus a queue for pending changes and deletions.
-
Cloudflare Workers
Sign-in, access checks, identification proxy, quotas, purchase verification, media, export and account deletion.
-
D1 + R2
Versioned D1 migrations for the schema and private R2 buckets for photos, both in the EU.
-
react-native-iap
Google Play purchases in the app, verification and plan status in the worker.
-
Cloudflare Email Service
Recovery emails go out through the worker's send_email binding.
Decisions that also matter in client projects
Migration
The backend moved from Supabase to Cloudflare Workers, D1 and R2. We verified the migration and then switched off the old resources.
Honest results
The app keeps your own observations apart from machine estimates. It does not invent confidence, provenance or value for a piece.
Clear subscription rules
Recurring costs, scan limits and what remains after cancellation are stated in the app. There is no trial that charges you later.