, , , , ,

James!

James! is my own multi-tenant digital wine & menu platform for restaurants — rebuilt as v3: FastAPI, React Native, MySQL, all containerised.

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.
James! beverage list on iPad

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.

James! beverage detail view

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.