iOS app for spontaneous challenges and local events — React Native (Expo), Node.js (Express), Firebase, and JWT-secured APIs.
SPONTA helps people try new experiences, complete challenges, and connect with others nearby. We combine structured challenges, events, light gamification, and optional AI-generated challenges.
| Live demo | Screen recording in this README · Google Drive (full quality) |
| Stack | React Native / Expo · Express · Firebase (Auth, Firestore, Storage) · JWT · Google Generative AI (challenge generation & verification flows) |
| CI (optional) | Workflow template in docs/github-actions-ci.yml — copy to .github/workflows/ci.yml and push (GitHub token needs the workflow scope; run gh auth refresh -s workflow if the push is rejected) |
We built SPONTA as a four-person team:
| Name | Focus |
|---|---|
| Anuvrat | Frontend |
| Suraj | Frontend |
| Arnav | Backend, product direction, API design |
| Sukrit | Backend |
Backend: Owned the Express API surface end to end: authentication (Firebase ID tokens, JWT session pattern), REST design for challenges, events, users, notifications, and community posts, Firebase Admin integration, validation and error handling, and AI-assisted challenge generation and verification (Gemini). Middleware (Helmet, CORS, Morgan), operational endpoints such as /health, and structured services/controllers/routes.
Product: Defined the overall app concept, feature priorities, and how flows should feel for users; aligned the team on scope across onboarding, challenges, social, and location-aware experiences.
Collaboration: Coordinated contracts with frontend teammates (payloads, auth headers, error shapes) and documented setup and environment expectations in-repo.
Still frames from the demo recording (see Demo for the full walkthrough).
![]() |
![]() |
![]() |
![]() |
The recording below is stored in this repository so it plays inline on GitHub.
View on Google Drive (full-quality file).
flowchart LR
subgraph client [iOS client]
Expo[Expo / React Native]
FB_SDK[Firebase client SDK]
end
subgraph backend [Backend]
API[Express API]
Admin[Firebase Admin SDK]
AI[Gemini API]
end
subgraph firebase [Firebase]
Auth[Authentication]
FS[Firestore]
Storage[Cloud Storage]
end
Expo --> FB_SDK
Expo -->|HTTPS + JWT| API
FB_SDK --> Auth
API --> Admin
Admin --> FS
Admin --> Storage
API --> AI
- The mobile app uses Firebase for client auth and talks to Express for domain logic (challenges, events, friends, feed, notifications).
- The API verifies Firebase ID tokens, issues/refreshes JWTs for API access, and uses Firebase Admin for trusted reads and writes.
- Sponta AI paths use Google Generative AI for generating challenge ideas and supporting verification-related flows.
The following reflects the current Express API and supporting services (see backend/src/routes).
Core infrastructure
GET /health— service status- JSON body parsing, centralized error handling, 404 handler
- Helmet, CORS, request logging (Morgan)
Authentication (/api/auth)
POST /signup,POST /signup-email,POST /signin(with Firebase token)POST /verify-phone,GET /me,POST /refresh-token
Challenges (/api/challenges)
- List, filter, categories, nearby, daily challenge, detail, user progress
POST /:id/accept,POST /:id/complete- AI:
GET /generate/info,POST /generate,POST /generate/batch
Users (/api/users)
- Profile get/update, stats, friends (request, accept, remove), completion history
Events (/api/events)
- List, nearby, detail, participants, create/update/delete (creator), join/leave
Notifications (/api/notifications)
- List, unread count, mark read / read-all, delete, streak reminder hook
Posts (/api/posts)
- Community feed, CRUD for posts, likes
Frontend coverage varies by screen; the items above are grounded in the committed server code.
Later and cross-cutting work includes deeper social (leaderboards, recommendations), richer gamification (badges, rewards store), analytics, and production hardening. Several roadmap themes overlap with partial implementations today; see the API section for what the backend already exposes.
- React Native with Expo (iOS)
- Firebase (client): Authentication, Firestore, Storage
- React Navigation, Expo Location / Camera / Notifications, React Hook Form
- Node.js, Express
- Firebase Admin SDK
- JWT, Helmet, Morgan
- Google Generative AI (
@google/generative-ai) for challenge generation and related services
Platform: iPhone and iPad (iOS).
SPONTA/
├── frontend/
├── backend/
│ ├── server.js
│ └── src/
│ ├── routes/
│ ├── controllers/
│ ├── services/
│ ├── middleware/
│ ├── models/
│ └── config/
├── docs/
│ ├── sponta-demo.mp4
│ └── screenshots/
├── CONTRIBUTING.md
├── SETUP.md
└── README.md
git clone https://github.com/7arnav1/SPONTA.git
cd SPONTA
# Backend API (from repo root)
cd backend && npm install
# Create backend/.env from SETUP.md (Firebase Admin, JWT secret, ports, AI keys as needed).
npm start
# New terminal — iOS app (macOS + Xcode / Simulator recommended)
cd frontend && npm install && npm run iosFirebase project, GoogleService-Info.plist, and backend .env values are required for a fully working stack. Full steps: SETUP.md.
We use feature branches and personal branches (anuvrat, arnav, sukrit, suraj). Integrate via pull requests into the team’s mainline (main or final-main on this fork). See CONTRIBUTING.md.
- Minimum iOS 13+
- Expo Go or dev build; Xcode for Simulator
- EAS Build / App Store Connect when shipping
Create a Firebase project, enable Auth (including phone as configured), Firestore, and Storage; register the iOS app (com.sponta.app); add a backend service account to .env. Details: SETUP.md.
- Meaningful commits and clear PR descriptions
- Branching model above; reviews before merge
- Manual testing on Simulator and devices; API checks with curl or Postman
- Optional CI: see docs/github-actions-ci.yml
- Do not commit
.envor service account keys - Validate inputs on the server; authenticate protected routes consistently
This project is private and proprietary.
Team workflow and CI expectations: CONTRIBUTING.md.



