Craig A Holliday

Devpost Shipyard Creator Contest - Haus Chef Technical Documentation

Tech Stack

Frontend

  • React Native + Expo
  • TypeScript
  • Expo Router for navigation
  • React Hook Form + Zod for form state and validation
  • React Query for client data caching and mutation handling

Backend

  • Cloudflare Workers
  • Hono for API routing
  • BetterAuth for authentication
  • PostgreSQL (Neon) for primary data store
  • R2 for image storage

Payments

  • RevenueCat for subscription management and paywall access

Architecture

The app is a thin client that talks to an API worker. Scraping runs in separate workers so the main API stays fast.

Mobile App (Expo)
  ↓ HTTPS
API Worker (Hono)
  ├── PostgreSQL (recipes, plans, lists)
  ├── R2 (recipe images)
  ├── Recipe Scraper Worker (web recipes)
  └── Video Scraper Worker (YouTube/TikTok)

Why Edge Workers

Scraping is CPU heavy and flaky. Isolating it:

  • Prevents timeouts in the main API
  • Keeps app actions fast
  • Allows different retry/timeout rules per worker

Services

1) API Worker

Handles the core product:

  • Authentication
  • Recipes CRUD
  • Meal plan CRUD
  • Grocery list generation
  • Image presign for direct upload to R2
  • Proxying scrape requests to workers

2) Recipe Scraper Worker

Focused on recipe websites:

  • Fetches the HTML
  • Extracts structured JSON‑LD when present
  • Falls back to HTML parsing if needed
  • Returns a normalized recipe payload

3) Video Scraper Worker

Focused on social platforms:

  • YouTube & TikTok support
  • Metadata extraction + optional transcript fetch
  • Queue support for long-running scrapes

Data Flow

Import Flow

  1. User pastes a URL.
  2. API worker validates and forwards to the scraper worker.
  3. Scraper returns normalized recipe data.
  4. App fills the form with scraped content.
  5. User saves and the recipe is stored.

Upload Flow

  1. App requests presigned PUT URL from API worker.
  2. API signs R2 request and returns upload URL + public URL.
  3. App uploads directly to R2.
  4. App saves the photo URL on the recipe.

RevenueCat Integration

Recipe importing is the cost driver, so it’s the feature we gate. RevenueCat handles subscriptions and entitlements, and the app checks those entitlements to decide when to show the paywall.

Implementation notes:

  • SDK initialized on app start.
  • Paywall shown for TikTok import and for higher import limits.
  • Entitlements drive UI access to premium flows.