A React Native mobile application built with Expo.
pennapps/
├── App.js # Main React Native app component (legacy)
├── app/ # Expo Router pages
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Map home screen with pins/bubbles
│ ├── create.tsx # Create private meetup
│ ├── meetup/[id].tsx # Meetup detail: chat + files
│ ├── share/[token].tsx # Link to share invite
│ └── join/[token].tsx # Auto-join via deep link
├── components/ # Reusable React components
│ ├── MapBubble.tsx # Map bubble component
│ ├── Chat.tsx # Chat interface
│ └── FilesTab.tsx # File sharing interface
├── lib/ # Core libraries and utilities
│ ├── supabase.ts # Supabase client configuration
│ ├── auth.ts # Authentication service
│ └── tokenCache.ts # Token caching utilities
├── utils/ # Helper functions
│ ├── bubbles.ts # Map bubble utilities
│ └── formatters.ts # Data formatting utilities
├── python-backend/ # Python FastAPI backend
│ ├── main.py # FastAPI entrypoint
│ └── requirements.txt # Python dependencies
├── app.json # Expo configuration
├── package.json # Node.js dependencies and scripts
├── assets/ # App icons and images
└── README.md # This file
- Node.js (v18 or later)
- npm or yarn
- Expo CLI (installed automatically with npx)
-
Clone the repository:
git clone <repository-url> cd pennapps
-
Install dependencies:
npm install
-
Start the Expo development server:
npm start # or npx expo start
- Web:
npm run web - iOS:
npm run ios(requires Xcode on macOS) - Android:
npm run android(requires Android Studio)
-
Navigate to the python-backend directory:
cd python-backend -
Create a virtual environment:
python3 -m venv venv
-
Activate the virtual environment:
# On macOS/Linux: source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install dependencies:
pip install -r requirements.txt
-
Start the FastAPI server:
uvicorn main:app --reload
The API will be available at http://localhost:8000
- Frontend: React Native with Expo Router
- App pages are in the
app/directory - Reusable components are in
components/ - Core utilities are in
lib/andutils/
- App pages are in the
- Backend: Python FastAPI
- Main API code is in
python-backend/main.py - Dependencies are listed in
python-backend/requirements.txt
- Main API code is in
- Configuration:
- Expo config is in
app.json - Assets (icons, images) are in the
assets/folder
- Expo config is in
This project supports both React Native (Expo) frontend and Python backend development. Make sure to:
- Install Node.js dependencies with
npm install - Set up Python virtual environment for backend development
- Follow the existing project structure
- Update this README when adding new features or changing setup requirements
- The original
App.jsis preserved for backward compatibility - New development should use the
app/directory structure with Expo Router - Gradually migrate existing functionality to the new structure
# Install dependencies
npm install
# Start the Expo development server
npx expo start# Navigate to backend directory
cd python-backend
# Create virtual environment
python3 -m venv venv
# Activate virtual environment
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Start the FastAPI server
uvicorn main:app --reload- Create a Supabase project at https://supabase.com
- Go to the SQL Editor
- Run the schema: Copy and paste
sql/schema.sqlinto the editor and execute - Run the seed data: Copy and paste
sql/seed.sqlinto the editor and execute
- Copy
.env.exampleto.env - Fill in your Supabase and Clerk credentials
- The app will work in mock mode if credentials are not provided
- Launch the app in Expo Go
- You should see the Map Home with seeded meetup pins
- Test the deep link:
pennapps://join/test123abc - Try creating a meetup and sharing the invite link
- Test reporting functionality and soft-ban behavior
- ✅ Map with bubbles showing attendee counts
- ✅ Deep link auto-join functionality
- ✅ Real-time chat and file sharing
- ✅ Reporting system with soft-ban enforcement
- ✅ Meetup archiving when ended
- ✅ File quota enforcement
- ✅ Authentication with Clerk (email + phone OTP)