Skip to main content
← Back to all work

The weekend pitmaster

A chef in Fargo got his weekends back

Paul smokes meats lakeside on weekends. His 'ordering system' was a phone buried in 40 text messages and a Venmo feed. I built him a native iOS + Android app with a custom backend that handles his entire weekend.

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

Before

Paul is a chef in Fargo, North Dakota who smokes meats lakeside on weekends. His 'ordering system' was a phone buried in 40 text messages and a Venmo feed. Off-the-shelf POS couldn't do it. A real dev firm would have charged $25K+. He needed custom software but couldn't pay enterprise prices.

What I 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.

Tech stack

The tools that shipped this.

FlutterFirebaseFirestoreFirebase AuthStripeTwilioCloud Functions

Dig into the numbers

Every hour, every role, every session — logged.

Scroll down for the full MasterLog breakdown on this project.

See the MasterLog ↓

MasterLog

smoke-shack

11 deliverables · 554 hrs

Expertise Delivered

Complexity

Routine
1
Complex
7
Architectural
3

Work Types

Feature
8
Bug Fix
2
Design
1

Project Timeline

Apr 5, 2026
368 hrs4 sessions
2:18 PMFeatureComplex
smoke-shack
-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
-Cook Edit Menu Overhaul: only shows active meats (read-only), bottom nav via nested Navigator, tap-to-edit price saves to weekly menu + meat library default, share button when published
-Meat Library Enhancements: search bar, ADD MEAT form (name/price/protein/description), toggle mode from edit menu, sort fix (requested first desc, then alphabetical)
-10% App Fee: subtotal + ceil(10%) rounded to nearest dollar, separate line item on receipt, flows to Firestore order + Venmo deep link
-Seed Bug Fix: try-catch around each seed step so cook user read failure doesn't block meat library seeding
-Customer Suggestions: shows all 36 meats with proper sort (was showing only 5)
flutterfirebasecook-uxguest-orderingpricingseed-fix
50 hrs of Junior Developer work
1:32 PMFeatureArchitectural
smoke-shack
-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
flutterfirebasecloud-functionsfcmtwilionotificationsfirestoreriverpoddeep-links
97 hrs of Junior Developer work
2:31 AMFeatureArchitectural
smoke-shack
-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
flutterfirebasefirestoreriverpodphone-authvenmodart
83 hrs of Junior Developer work
12:17 AMFeatureArchitectural
smoke-shack
-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
flutterfirebasestitchdesign-systemmobile-appportfolio
138 hrs of Junior Developer work
Apr 6, 2026
86 hrs2 sessions
3:23 PMFeatureComplex
smoke-shack
-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
-Meat photo thumbnails: shared MeatThumbnail widget replaces emoji icons across 8 screens (customer + cook)
-Profile settings: Notifications bottom sheet with SMS opt-in toggle + warning dialog, About sheet with privacy/terms + Aitheos tagline
-Lifetime protein tracker: OrderItem captures proteinPerLb, hero banner on Orders page shows total protein ordered
-Cook demand banner: menu overview shows top requested meats + voter count when no active menu
-Admin triple-tap fix: moved gesture zone to top-left corner so it works reliably
-Order history: graceful empty/error state with brand-voice copy
-Revenue tab icon changed from ... to $
-Firestore test data cleared, pickup locations updated (Lake House + Moorhead House), Cloud Functions deployed
flutterfirebasecloud-functionspickup-locationsdemand-signalprotein-trackerprofile-settingsux
45 hrs of Junior Developer work
7:42 PMDesignComplex
smoke-shack
-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
flutterfirebasestitchdesign-systemcloud-functionssafari-fixbroadcast
42 hrs of Junior Developer work
Apr 7, 2026
41 hrs2 sessions
2:47 PMBug FixComplex
smoke-shack
-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)
securityfirestore-rulesidorfile-uploadfirebasestorage-rules
8 hrs of Junior Developer work
2:29 AMFeatureComplex
smoke-shack
-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
-Created deploy pipeline (scripts/deploy.sh) with Flutter build + landing page entry point swap + Firebase deploy
-Integrated Smoked By Paul brand stamp across landing page hero, footer, favicon, app icons (iOS/Android/web), Flutter login screen, and OG social sharing image
-Fixed Flutter hash routing (usePathUrlStrategy) — clean URL paths instead of hash fragments
-Fixed router recreation bug that broke public pages (/privacy, /terms) — redirected to login incorrectly
-Content fixes: removed ND from locations, Tuesday drops, Tues-Friday ordering, Sun-Monday pickup, Meet Chef Paul, Paul Strand
-Renamed Paul to Chef Paul throughout the app (constants, chat screen)
-Recovered and committed orphaned changes from a crashed prior session
-Fixed horizontal overflow on landing page at narrow viewport widths
landing-pagebrandingresponsivedeployroutingflutter
33 hrs of Junior Developer work
Apr 8, 2026
57 hrs2 sessions
3:52 PMFeatureComplex
smoke-shack
-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
flutterfirebasepickup-locationsdirectionsloading-screencarouseldeploy
17 hrs of Junior Developer work
1:26 AMFeatureComplex
smoke-shack
-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
-Cloud Functions for stats aggregation (customer count, protein count, weekly lbs) with high water mark pattern for peak weekly lbs
-Share functionality: nav bar 'Spread the Rub' button + footer share CTA with native share API (mobile) and clipboard fallback, rotating cheeky snackbar messages
-Dynamic stats with floor values (25+ lbs, 35+ customers, 40+ proteins) that auto-upgrade when real data exceeds floors
-Landing page visual overhaul: stamp logo cleaned (sparkle removed, padding trimmed), Bebas Neue font for brand text, Paul's Instagram photo swapped in, diamond frame enlarged
-Brand copy updates: taglines to 'Wood-Fired & Vacuum-Sealed' / 'Real Wood. Real Smoke. Real Good.', location to 'Fargo-Moorhead & Pelican Rapids', removed 'elite' language
-Section 7 redesigned from 3-card app download to single focused CTA block
-Nav bar simplified: removed non-functional hamburger/cart, centered brand, added share button
-Firestore rules added for public stats collection
-Referral credit system spec parked in CLAUDE.md Phase 6 for future build
-Full production deploy: Firebase Hosting + 4 new Cloud Functions + Firestore rules + GitHub push
landing-pagefirestorecloud-functionsdynamic-contentsharingdesigndeploy
40 hrs of Junior Developer work
Apr 9, 2026
2 hrs1 session
11:46 PMBug FixRoutine
smoke-shack
-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
firestoreindexesog-imagelanding-pagedeploy
2 hrs of Junior Developer work