A web and mobile app for organizing and managing packing lists for trips, adventures, and activities. Create packs, categorize items, track weight and volume, and share with others. No account required for local use without cloud backup & sync.
- Smart Pack Organization: Hierarchical structure (Packs → Categories → Items)
- Weight & Volume Tracking: Support for multiple units (g, kg, oz, lb, ml, l) with conversions
- Drag & Drop: Intuitive item and category reordering on desktop and mobile
- Visual Capacity Indicators: See how full your bag is at a glance with circular progress charts
- Category Visibility: Hide categories from capacity calculations while keeping them in your pack
- CSV Import/Export: Import from LighterPack or other Pack-Pal users exported CSV files
- Pack Sharing: Share packs via public URLs
- Worn Weight Tracking: Mark items as worn to exclude from pack weight
- Email Authentication: Secure signup with email/password or Google Oauth (or use locally with no account!)
- Cross-Platform: Mobile (iOS/Android via React Native) and Web
- Frontend: React Native + Expo
- Language: TypeScript
- Backend: Supabase (PostgreSQL)
- State Management: Zustand
- Node.js 18+
- npm/bun or yarn
- Expo CLI
- Supabase account
cd Pack-Pal
npm install- Create a new project at supabase.com
- Go to Project Settings → API
- Copy your project URL and anon key
- Create a
.envfile in the root directory:
cp .env.example .env- Add your Supabase credentials to
.env:
Required environment variables:
EXPO_PUBLIC_SUPABASE_URL: Your Supabase project URLEXPO_PUBLIC_SUPABASE_KEY: Your Supabase anon public key
Run the SQL migrations in your Supabase project:
-
Go to your Supabase project dashboard → SQL Editor
-
Run the main schema:
- Copy contents of
supabase/schema.sql - Execute in SQL Editor
- Copy contents of
-
Run migrations in order:
supabase/migrations/20251112_add_pack_weight.sqlsupabase/migrations/20251112_add_category_is_hidden.sql
For Web:
npm run webFor iOS:
npm run iosFor Android:
npm run android-
Update Base URL:
- Edit
src/utils/helpers.ts - Change fallback in
getBaseUrl()to your production domain
- Edit
-
Build and Deploy:
# Build for web
npm run build:web
# Deploy (if using Vercel CLI)
vercel --prod- Set Environment Variables in Vercel:
- Go to Project Settings → Environment Variables
- Add
EXPO_PUBLIC_SUPABASE_URL - Add
EXPO_PUBLIC_SUPABASE_KEY
# Build for iOS
eas build --platform ios
# Build for Android
eas build --platform android
# Submit to stores
eas submit --platform ios
eas submit --platform android# Start development server
npm start
# Run on web
npm run web
# Run on iOS simulator
npm run ios
# Run on Android emulator
npm run android
# Lint code
npm run lint
# Format code
npm run format
# Build for production
npm run build:web- Verify
.envfile exists and has correct values - Restart development server after adding env variables
Contributions are welcome! Please feel free to submit an Issue or Pull Request.
MIT License - feel free to use this project for personal or commercial purposes.