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
- User pastes a URL.
- API worker validates and forwards to the scraper worker.
- Scraper returns normalized recipe data.
- App fills the form with scraped content.
- User saves and the recipe is stored.
Upload Flow
- App requests presigned PUT URL from API worker.
- API signs R2 request and returns upload URL + public URL.
- App uploads directly to R2.
- 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.