James! is my own product — a multi-tenant digital wine & menu platform for restaurants and wine bars. Floor staff browse the list, menu and pairings on iPad; owners manage everything from a custom admin dashboard. v3 is a ground-up rebuild: multi-tenant, API-first and containerised from day one.

A wine list that sells
- Digital wine lists with vintages & pricing, plus full menu management.
- Dish–beverage pairings, so staff sell the right glass with the right plate.
- A tablet-first “ribbon” interface with drag-and-drop ad placement.
- Multi-tenant — many venues, row-level isolation, per-tenant branding.
- Offline sync, marketing tools, analytics, licensing & multi-language.

The v3 rebuild
v3 was rebuilt as a clean, API-first system. A FastAPI backend exposes a documented API and a custom admin dashboard; the iPad app is a separate Expo / React Native client. Multi-tenancy lives in the core — a shared database with row-level isolation — so onboarding a new venue is configuration, not a deployment. Schema changes ship through Alembic migrations, background work runs on Celery, and the whole thing is containerised so dev matches production.

The stack
- Frontend — Expo + React Native (TypeScript), iPad-first, with web & Android.
- Backend — FastAPI (Python), async SQLAlchemy & Pydantic, Alembic, JWT auth, Celery.
- Data & infra — MySQL 8, Redis, Docker on DigitalOcean, nginx + Let’s Encrypt.
- AI — OpenAI-powered assist.
A fair bit of untwisting: years of an evolving wine app turned into one clean, multi-tenant platform I’m happy to run for every venue.
