The native SwiftUI iPhone app for Potluck β the Singapore home-cook marketplace at potluckhub.io connecting home chefs with food lovers. Discover talented local cooks, browse their menus, and book authentic home-cooked dining experiences.
Companion to the Potluck web platform β the home-cook marketplace site potluckhub.io. This app talks directly to the production Potluck API (
api.potluckhub.io) β no mock data.
| Explore | Dishes | Chef Profile | Sign In |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Explore home chefs β featured carousel, full directory, search, and nine cuisine filters (Chinese, Western, Thai, Japanese, Korean, Malay, Indian, Halal, Vegetarian)
- Browse dishes β a photo-rich grid of menus across every chef, with prices and ratings
- Chef profiles β bio, specialties, social links, full menu, and verified diner reviews
- Booking flow β pick a date, guest count and special requests with a live price breakdown (incl. service fee)
- Accounts β register / sign in against the live API, with tokens stored securely in the Keychain
- My bookings β track requested and confirmed dining experiences
| Area | Choice |
|---|---|
| UI | SwiftUI (iOS 17+), NavigationStack, TabView |
| Networking | async/await URLSession, Codable, typed APIError |
| Auth | JWT access/refresh tokens persisted in the Keychain |
| State | ObservableObject view models per screen |
| Project gen | XcodeGen (project.yml) |
| Backend | Potluck REST API β https://api.potluckhub.io/api/v1 |
Potluck/
βββ App/ # @main entry, Theme (brand palette), RootView (tabs)
βββ Networking/ # APIClient, PotluckService (endpoints), Codable Models
βββ Auth/ # AuthManager (session) + Keychain wrapper
βββ Components/ # Reusable views (RemoteImage, RatingLabel, Pill, statesβ¦)
βββ Features/
βββ Explore/ # Chef discovery + chef detail
βββ Dishes/ # Menu grid + dish detail
βββ Booking/ # Booking request sheet
βββ Bookings/ # My bookings
βββ Profile/ # Auth sheet + profile
The API wraps every response in a { success, data, pagination? } envelope; APIClient
unwraps it generically. Prices are stored as integer cents and ratings sometimes arrive
as strings and sometimes as numbers β a FlexNumber decoder handles both.
Requires Xcode 16+ and XcodeGen (brew install xcodegen).
# Generate the Xcode project from project.yml
xcodegen generate
# Open and run
open Potluck.xcodeprojThe app points at the production API out of the box, so chefs and dishes load immediately.
# Archive
xcodebuild archive -project Potluck.xcodeproj -scheme Potluck \
-configuration Release -destination 'generic/platform=iOS' \
-archivePath build/Potluck.xcarchive
# Export a signed App Store IPA
xcodebuild -exportArchive -archivePath build/Potluck.xcarchive \
-exportOptionsPlist ExportOptions.plist -exportPath build/export
# Upload to App Store Connect
xcrun altool --upload-app -f build/export/Potluck.ipa -t ios \
--apiKey <KEY_ID> --apiIssuer <ISSUER_ID>- Bundle ID:
io.potluckhub.app - Version: 1.0
MIT




