Find what to order — not just where to eat.
Bytez is a dish-first food review app for iOS. Most apps tell you where to go. Bytez answers the question people actually ask at the table: "What dish should I get?"
- Explore nearby restaurants — Map + scrollable list, with restaurants that have Bytez reviews surfaced at the top
- Dish-level reviews — Rate individual dishes with tags, photos, and detailed notes
- Dish Summary — Search a dish within a restaurant and see an aggregated "quick verdict" (avg rating, top tags, latest photo) before diving into individual reviews
- Dish suggestions — When writing a review, see previously reviewed dishes at that restaurant to keep naming consistent
- Favorites — Save reviews from other users to revisit later
- Profiles — Avatar upload, display name, bio, and light/dark/system appearance toggle
| Layer | Tech |
|---|---|
| UI | SwiftUI (iOS 17+) |
| Maps | MapKit (MKLocalSearch, annotations, detail views) |
| Backend | Supabase — Auth, Postgres, Storage |
| Auth | Email/password, Sign in with Apple, Google OAuth |
| Images | PhotosPicker, Supabase Storage, in-memory caching |
- Xcode 15+
- iOS 17+ Simulator or device
- A Supabase project (free tier works)
git clone https://github.com/YOUR_USERNAME/bytez.git
cd bytezCreate a file at th26/Secrets.swift:
import Foundation
enum Secrets {
static let supabaseURL = "https://YOUR_PROJECT_REF.supabase.co"
static let supabaseAnonKey = "YOUR_ANON_KEY"
}
⚠️ Do not commit this file. It's already in.gitignore.
Run the following in your Supabase SQL Editor:
-- Profiles
create table profiles (
id uuid primary key references auth.users(id),
username text unique,
display_name text,
bio text,
avatar_url text,
settings jsonb,
created_at timestamptz default now()
);
-- Restaurants
create table restaurants (
id uuid primary key default gen_random_uuid(),
name text not null,
address text,
city text,
latitude double precision,
longitude double precision,
mapkit_id text unique,
created_at timestamptz default now()
);
-- Reviews
create table reviews (
id uuid primary key default gen_random_uuid(),
user_id uuid references profiles(id) not null,
restaurant_id uuid references restaurants(id) not null,
dish_name text not null,
rating int not null check (rating between 1 and 5),
review_text text,
photos text[],
tags text[],
created_at timestamptz default now(),
updated_at timestamptz
);
-- Saved Reviews
create table saved_reviews (
user_id uuid references profiles(id) not null,
review_id uuid references reviews(id) not null,
saved_at timestamptz default now(),
primary key (user_id, review_id)
);Also create two Storage buckets: avatars and foods (both public).
Open th26.xcodeproj in Xcode, select a simulator, and hit Run.
th26/
├── th26App.swift # App entry point, auth state routing
├── ContentView.swift # Explore tab, map, bottom sheet, tab bar
├── Auth/
│ ├── AuthManager.swift # Supabase Auth wrapper
│ └── LoginView.swift # Sign in / sign up UI
├── Models/
│ ├── DataModels.swift # Codable structs (Profile, Restaurant, Review, etc.)
│ └── DataManager.swift # Supabase CRUD operations
├── Views/
│ ├── RestaurantDetailView.swift # Restaurant page + dish search + reviews
│ ├── NewReviewView.swift # Create review form with dish suggestions
│ ├── Components/
│ │ ├── ReviewCard.swift # Review display with photos, tags, actions
│ │ ├── AvatarView.swift # Cached avatar component
│ │ └── BrandMark.swift # Bytez logo
│ └── Tabs/
│ ├── FavoritesView.swift
│ ├── MyReviewsView.swift
│ └── ProfileView.swift
├── StorageManager.swift # Image uploads to Supabase Storage
├── LocationManager.swift # CoreLocation wrapper
└── SupabaseClient.swift # Shared Supabase client instance
- Smarter dish matching (aliases, synonyms, fuzzy search)
- "What should I order?" ranking per restaurant
- Tag-based filters (spicy, healthy, late-night)
- Shareable dish cards
- Real-time location onboarding (beyond demo mode)
- Social features (follow users, activity feed)
People don't want "more reviews" — they want faster confidence. Yelp and Google tell you a restaurant is 4.2 stars, but that doesn't help when you're staring at a 40-item menu. Bytez flips the model: search by dish, see what others actually ordered, and make a decision in seconds.
MIT — do what you want, just don't blame us if you order the wrong thing.
Built with ☕ and 🍜 @ TAMU.