A warm, social iPhone app for pet lovers. Share moments, discover other pets, and build a community around the animals you love.
- 📸 Feed — scroll through pet moments from people you follow
- 🐶 Pet profiles — add your pets with photos, breed, bio, and personality
- ✍️ Create posts — share photos, pick a mood, tag your pet
- ❤️ Likes & comments — react to and discuss posts
- 🔍 Discover — explore pets, places, and trending spots
- 💬 Chat — message other pet owners (in progress)
| Layer | Technology |
|---|---|
| iOS app | Swift, SwiftUI |
| Backend | Supabase (PostgreSQL, Auth, Storage) |
| Design | Custom design system — warm cream, orange accents, rounded components |
git clone https://github.com/halflkaka/pawpal.git
cd pawpal
open PawPal.xcodeprojSelect an iPhone simulator (iPhone 16 or later) and hit ⌘R.
Create a free project at supabase.com. You'll need the Project URL and Anon key.
Apply the SQL migrations in supabase/ in order using the Supabase SQL editor.
Your project needs these tables: profiles, pets, posts, post_images, likes, comments, follows — plus a public storage bucket named post-images.
Also apply the storage policy migration for post-images uploads. Image posting needs both table RLS and Storage storage.objects policies.
Create PawPal/SupabaseConfig.swift:
enum SupabaseConfig {
static let urlString = "https://YOUR_PROJECT.supabase.co"
static let anonKey = "YOUR_ANON_KEY"
}Do not commit this file.
Build and run in Xcode. Register an account, add a pet, and create a post.
PawPal/
├── Models/
│ ├── AppUser.swift # Authenticated user session
│ ├── RemotePost.swift # Post with images, likes, comments
│ ├── RemotePet.swift # Pet profile data
│ ├── RemoteComment.swift # Comment with author info
│ └── PostDraft.swift # Draft post state
├── Services/
│ ├── AuthService.swift # Auth protocol + Supabase implementation
│ ├── AuthManager.swift # Auth state manager (@Observable)
│ ├── PostsService.swift # Feed loading, post creation, likes, comments
│ ├── PetsService.swift # Pet CRUD
│ ├── ProfileService.swift # Profile loading and upserting
│ ├── FollowService.swift # Follow/unfollow, follower counts
│ └── SupabaseConfig.swift # Project URL and anon key (not committed)
├── Views/
│ ├── PawPalDesignSystem.swift # Design tokens, colors, reusable components
│ ├── ContentView.swift # Root auth state router
│ ├── MainTabView.swift # 5-tab navigation shell
│ ├── FeedView.swift # Home feed with post cards
│ ├── CreatePostView.swift # Post creation flow
│ ├── ProfileView.swift # User profile, pet management, post grid
│ ├── ContactsView.swift # Discover screen
│ ├── CommentsView.swift # Comments sheet
│ ├── AuthView.swift # Login and registration
│ └── ChatListView.swift # Chat list (in progress)
├── Storage/
│ └── SwiftDataModels.swift # Local models (unused — Supabase is source of truth)
└── PawPalApp.swift # App entry point
PawPalTests/
└── PawPalTests.swift # Unit tests (models, validation logic)
PawPalUITests/
├── PawPalUITests.swift # UI tests (launch, critical flows)
└── PawPalUITestsLaunchTests.swift # Launch performance baseline
supabase/
├── 001_schema.sql # Core tables
├── 002_indexes.sql # Query indexes
├── 003_rls.sql # Row-level security policies
├── 004_storage.sql # Storage bucket setup
├── 005_auth_profile_trigger.sql # Auto-create profile on signup
└── 006–011_*.sql # Incremental schema migrations
docs/
├── database.md # Schema design and table guide
├── pr-template.md # PR description standard
├── testing.md # QA process and test commands
└── sessions/ # Dated working docs from agent sessions
.claude/
├── agents/dev-team.md # PM / designer / dev / QA agent configs
└── skills/pr-workflow.md # PR creation workflow
xcodebuild test -project PawPal.xcodeproj -scheme PawPal \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro'See docs/guides/qa-and-testing.md for the full QA process.
| Doc | What it covers |
|---|---|
docs/testing.md |
How to validate changes |
docs/database.md |
Schema design and table guide |
docs/pr-template.md |
PR description standard |
docs/product.md |
Product vision, target user, and core principles |
docs/decisions.md |
Architectural and product decisions and their reasoning |
docs/scope.md |
What is in scope, deferred, and off-limits |
docs/known-issues.md |
Known bugs, gaps, and tech debt |
Build fails — Supabase config missing
Create PawPal/SupabaseConfig.swift with your project URL and anon key.
Login or feed not working Check that your Supabase URL and anon key are correct, migrations are applied, and RLS policies are in place.
Images not loading after posting
Confirm the post-images storage bucket exists and has public read access.
Posting with images fails with new row violates row-level security policy
The base posts table RLS may already be correct, but image posts also require Storage policies for the post-images bucket. This repo now includes supabase/012_add_post_images_storage_policies.sql for that. Apply it in Supabase SQL Editor if your live project was created before the migration existed. The current migration uses owner = auth.uid() for Storage writes, which matches Supabase's own Storage policy pattern more reliably than checking a path prefix. Without those Storage policies, text-only posts can work while image posts fail.