THC of Olympia: Ordering App and Website
Native ordering, loyalty and a live menu for a licensed retailer, and a rebuilt website held in an isolation model strict enough that a mistake cannot reach production.
The app. A React Native and Expo app on Supabase for a working cannabis retailer, running against a point-of-sale feed that refreshes the catalogue every fifteen minutes so what customers browse matches what is actually on the shelf. Category navigation, search, filters, stock indicators and medical labelling sit over curated product photography and brand marks. The most interesting constraint is a platform one: Google Play's cannabis policy does not permit native ordering, so iOS orders natively while Android hands off to the responsive web checkout — one product, two paths, because the rules differ per store. Payment and physical ID verification deliberately stay at the register, where they legally belong. Loyalty links to the POS so points accrue against finalised sales rather than app-side state.
The website. A ground-up replacement for a licensed retailer's production website, developed on a noindexed preview surface with no write path to production. The safety model is the engineering. Production DNS, the store page and the shared backend are protected surfaces, and any operation touching them needs explicit per-action approval rather than standing access. The Content Security Policy is narrow enough to be load-bearing: inline styles prohibited, scripts and fonts same-origin, form-action none, and the single inline script — inert structured data — admitted only by a build-derived SHA-256 hash. A validator recomputes that hash on every build and rejects a stale policy, so the protection cannot quietly rot into a comment while deploys keep succeeding. Analytics is consent-gated and host-pinned, so no request reaches Google before acceptance and neither localhost nor the preview can pollute production data.
Category: web
Tech: Expo / React Native, TypeScript, Supabase (Postgres, Edge Functions, RLS), POS integration, iOS / Android, Cloudflare Pages, JavaScript, Content Security Policy, structured data, preview environments
Role: Designer and developer