Skip to main content
← Back to the ledger

Case study

Smoke Shack

Paul smokes meats lakeside on weekends. Picture oak smoke, a sunset on the water, and a phone in his pocket that won't stop buzzing. Cook or coordinate — pick one. He couldn't, so his weekends weren't weekends anymore. We shipped him the software that quieted the phone.

smokedbypaul.com
15Sessions
751 HrsHours
$77,889Market value
FlutterFirebaseFirestoreFirebase AuthStripeTwilioCloud Functions
Before

Forty-message text threads. A Venmo feed doubling as a ledger. Off-the-shelf POS couldn't handle the rotating menu or the pickup workflow, and a traditional dev firm would have priced a custom build at $25K+. Paul needed enterprise tooling at pit-master prices — the exact gap dev shops say is impossible.

What we built

Native iOS and Android apps backed by custom software that manages his entire customer base — weekly menu builder, customer ordering, payments via Stripe, pickup notifications via Twilio, customer communication, inventory tracking, and auto-generated grocery lists so he knows exactly what to buy.

After

Paul cooks. The software handles everything else. Orders come in through the app, payments clear automatically, customers get notified when their food is ready, and Paul gets his weekends back. Full-stack custom software at boutique prices, shipped in weeks — not the $25K+ a dev firm would charge.

iOS + Android + WebPlatforms shipped
40-text chaosReplaced
Paul's weekendsSaved per week
$4KProject price

Session timeline

The complete record.

DevOps 1Feature 11Bug Fix 2Design 1
Fri, Apr 171
DevOpsmobile-devexpand

Migrated iOS bundle ID from com.aitheos.smokeShack (globally taken) to com.aitheos.smokedbypaul (lowercase convention) · Updated Xcode project: bundle ID, team ID (HG4HARJBR5 Aitheos LLC), signing entitlements, push notification capabilities

Mon, Apr 131
Featureux-designerexpand

**Full design overhaul** across landing page + all Flutter screens: film grain, ember particles, breathing stamp, hero parallax, ghost text, count-up animations, scroll progress bar, 3D card tilt, glassmorphism price badges, card fade-in animations, branded bottom nav, custom page transitions, Hero shared-element transitions, breathing Pack with Theo CTA, gradient order summary, animated confirmation dialog, shimmer loading skeletons on all 11 data screens, custom EmberToast snackbar, branded dialogs, accessibility (Semantics labels, touch targets 44px+), responsive overflow protection, color token consistency fixes · **Pack with Theo iOS native voice** — conditional export pattern splitting voice service into web (proven, unchanged) + native (web_socket_channel + audioplayers with WAV-wrapped PCM). iOS now compiles and runs.

Sun, Apr 122
Featureexpand

Voice-first Pack with Theo: fixed 3 bugs (silent greeting, missing system prompt/tools, meat picker removal). Discovered Gemini Live AUDIO mode requires realtimeInput.text not clientContent for text input. Full system prompt with weekly menu context + 5 tool declarations now wired into setup payload via Cloud Run proxy. · Voice-first pause/resume UX: voice stays alive on pause (cost negligible), 10-min inactivity timeout with farewell audio, giant TAP ANYWHERE TO RESUME screen, screen exit auto-disconnects. No buttons needed — everything through Theo's voice.

Featureexpand

Planned Pack with Theo voice feature: researched Gemini 3.1 Flash Live, locked Enceladus as Aitheos-wide Theo voice, wrote vocab sheet and setup runbook · Phase 0 backend: PackagingSession Firestore schema, rules+indexes, 6 Cloud Function callables (packWithTheoStartSession + GetOrdersForMeat + MarkItemBagged + Pause + Resume + EndSession), mintTheoToken HTTP endpoint, GEMINI_API_KEY in Firebase secrets, org policy override for allUsers IAM, roles/datastore.user grant for Functions SA

Fri, Apr 101
Bug Fixexpand

OG share image: enlarged brand stamp on darkened brisket background so 'SMOKED BY PAUL' is readable in link previews\n- Landing page live-state bugfix: diagnosed silent failure of weeklyMenus query (where isPublished + orderBy publishedAt) and added missing Firestore composite index\n- Deployed both fixes to production

Thu, Apr 92
Featureexpand

Landing page carousel locked to horizontal-only swipe (touch-action: pan-x)\n- Animated BBQ loading screen with pulsing brand stamp, rotating cheeky messages, progress bar (20s timeout)\n- Cook pickup location management: full CRUD screen with add/edit/delete, address fields, map verification\n- Platform-aware directions helper: Apple Maps on iOS, Google Maps on Android/web\n- Customer directions button on checkout location cards and active order cards\n- Broadcast 'Orders Ready' now includes address with tappable Google Maps directions link in SMS/push\n- Tappable meat cards on Confirm & Publish wizard step to edit price/protein/description/callout\n- Pickup Locations entry points on cook menu overview and menu wizard Step 2\n- Deployed to production (smokedbypaul.com) and pushed to GitHub

Featureexpand

Dynamic Firestore carousel synced to weekly menu with 3-tier fallback (active menu → meat library → hardcoded favorites) · 4-state drop system (idle/live/cooking/pickup) with live countdown timer, dynamic badges, CTA buttons, cadence card highlighting

Wed, Apr 82
Bug Fixexpand

Fixed critical IDOR: orders restricted to owner+cook/admin, conversations to participants+cook/admin, messages check parent participants\n- File upload MIME allowlist (jpg/jpeg/png/webp) with SnackBar error on invalid type\n- Created storage.rules enforcing image/* content type and 5MB size limit\n- Broadcast message 1600-char cap with warning, cookId validated against users collection\n- Field projection (.select()) on customer query in onMenuPublished\n- Firebase Storage initialized, all rules deployed (Firestore + Storage + Cloud Functions)

Featureexpand

Built static landing page for smokedbypaul.com with Ember & Ash design system (hero, how it works, weekly cadence, meet Chef Paul, get the app CTAs, footer) · Responsive breakpoints for iPhone Mini/Pro/Air/Pro Max, iPad Mini, iPad Pro 9"/13", laptop, desktop

Tue, Apr 72
Featureexpand

Per-location pickup: customers choose pickup location at checkout, cook filters orders by location, per-location 'Orders Ready' alerts via Cloud Functions · No-menu demand signal page: replaced dead empty state with full meat voting page showing customer cravings

Designexpand

Stitch UI design overhaul: 12 screens redesigned (6 customer + 6 cook) matching 20 Stitch exports, 3 new shared widgets (ember_card, ember_button, meat_photo_card), theme updates\n- Broadcast-to-chat feature: onBroadcastCreated Cloud Function writes messages to customer chat threads, Message model with isBroadcast/broadcastId fields, gold broadcast bubble styling in chat UI\n- Safari/iOS web crash fix: try-catch FCM init, viewport meta tag, local CanvasKit bundling, loading screen with error handler\n- UX bug fixes: inline CTA on meat detail, back button, single drag handle, removed +1 phone prefix, Venmo URI encoding fix, chat bubble colors (gold vs orange), revenue icon swap, fee line item in order cards, PELICAN RAPIDS MN\n- Launch plan: Paul's real phone documented, App Store-first reveal strategy, launch sequence in CLAUDE.md

Mon, Apr 64
Featureexpand

Menu Setup Wizard: 3-step flow (pick meats → set details → confirm & publish) with post-publish share link and notification confirmation · Guest Ordering Flow: public /menu/:menuId route, guests browse and fill cart without auth, auth gate at checkout preserves cart via global cartProvider, returnPathProvider for post-login redirect, OG image + Twitter Card meta tags

Featureexpand

Shareable menu deep links (/menu/:menuId route, public read, share_plus native share sheet)\n- Pickup location/date management (providers, repository, bottom sheet pickers, Firestore writes)\n- Notification center wired to Firestore (broadcasts collection, live audience counts, dynamic hints)\n- Cloud Functions backend (onBroadcastCreated, onMenuPublished, onOrderCreated, weeklyReminder, finalHourReminder)\n- FCM client initialization (permission request, token save, foreground/background message handlers)\n- Twilio SMS integration (+1 701 404 8389, A2P 10DLC brand+campaign registered, Firebase secrets)\n- Cook menu overview page (past menus list, new menu creation flow)\n- Meat library + customer suggestions (36 meats with Stitch photos, vote/toggle, request tallies)\n- Expandable revenue order cards (full item breakdown, payment method, mark paid)\n- Order status cycling (added completed state: reserved→ready→picked up→complete→cancelled→reopen)\n- Alerts center UX (MESSAGE YOUR CUSTOMERS, dynamic audience tabs, contextual hint text)\n- Privacy policy + terms of service pages (/privacy, /terms, TCPA compliant, public routes)\n- Firestore security rules tightened (role-based cook/admin writes, public menu reads)\n- Web app deployed to smoke-shack.web.app + smokedbypaul.com domain DNS configured\n- Expanded seed data from 5 to 36 meats with Stitch photo URLs and additive seeding\n- Firebase upgraded to Blaze plan, Twilio account configured, all secrets stored

Featureexpand

Firebase project setup (smoke-shack on Spark plan, FlutterFire config, 3 app registrations)\n- Phone number auth flow (login, OTP verification, profile setup, GoRouter role-based routing)\n- Cook Orders screen (summary stats, payment split, filter chips, status management)\n- Messaging screens (chat thread UI, conversation list with unread badges)\n- Firestore data layer (4 repositories, 5 Riverpod providers, seed data with 5 meats/3 locations/1 menu)\n- Security rules + 3 compound indexes deployed\n- Wired 10 of 14 screens to real Firestore data\n- Customer profile screen (name, phone, sign out)\n- Cook menu write-back (toggle items on/off, publish menu to Firestore)\n- Wire messaging to Firestore (conversations + real-time messages)\n- Cart UX overhaul (0.5lb default, orange snackbars, cart banner on orders tab, auto-scroll on payment, required payment selection, order confirmation dialog with brand voice)\n- Venmo deep-link integration (logo, pre-filled amount + dynamic item list in note, @Paulski89)\n- Git + GitHub repo setup (aitheos/smoke-shack private, 164 files, 19.8K lines)\n- CLAUDE.md dev setup docs, Firebase project details, brand voice guide

Featureexpand

Full project interview, requirements gathering, and tech stack selection (Flutter + Firebase + Twilio)\n- CLAUDE.md project context, system architecture doc (Firestore data model, auth, notifications, security rules), screen map (24 screens)\n- Ember & Ash brand guide + 13 Stitch UI mockup screens + 36 stock meat/seafood photos\n- Flutter project scaffold with dependencies (Firebase, Riverpod, GoRouter, Google Fonts)\n- Full Ember & Ash dark theme translated to Flutter ThemeData (26 colors, 15 text styles, component themes)\n- 8 Firestore data models (User, MenuItem, WeeklyMenu, Order, PickupLocation, Conversation, Message, Notification)\n- Customer: weekly menu browse, pound stepper (0.25 lb increments), cart with real state management, checkout screen, order history\n- Cook: menu management with toggles + publish, grocery list with shrinkage calc, alerts center with Orders Ready button, revenue dashboard with 10% fee tracker\n- Admin demo toggle (triple-tap to switch customer/cook views), navigation shells, CartNotifier state management\n- Dev environment: Flutter 3.41.6, Firebase CLI 15.13.0, FlutterFire CLI 1.3.2 installed and configured