A comprehensive full-stack event management system designed for college campuses, built with React Native (Expo) and Node.js + Express + MongoDB. Features include event creation, RSVP management, push notifications, QR code tickets, admin approval system, and real-time updates.
- Features
- Tech Stack
- Architecture
- Libraries & Dependencies
- Project Structure
- Prerequisites
- Installation
- Configuration
- Running the Application
- API Documentation
- Production Build
- Contributing
- License
Authentication & Authorization
- π± Student registration with comprehensive validation
- π Separate login for Students, Class Representatives (CR), and Admins
- π JWT token-based authentication with AsyncStorage
- πͺ Auto-login on app restart
- π Secure password change functionality
Event Management
- π Browse all approved events with pull-to-refresh
- π Search events by title, description, or organizer
- π·οΈ Filter by category (Technical, Cultural, Sports, Workshop, etc.)
- π Calendar view with visual event markers
- π Create events with image upload, date/time pickers
- βοΈ Edit/delete own created events
- β RSVP to events with capacity tracking
- β Cancel RSVP before event
- π₯ View attendee lists
- π "My Events" - Track created events and RSVPs
Push Notifications
- π Firebase Cloud Messaging (FCM) v1 API integration
- π Automated event reminders (24 hours and 1 hour before)
- π£ New event notifications
- β Event approval/rejection alerts
- π’ Event update notifications
- π In-app notification center with read/unread status
- β Production-ready push notifications with google-services.json
QR Code System
- ποΈ Generate QR code tickets for registered events
- πΈ Scan QR codes for attendance marking (Admin/CR)
- β¨ Visual ticket modal with event details
User Profile & Settings
- π€ View and edit profile information
- π Update contact details
- π Change password securely
- π Manage push notification tokens
- βοΈ Settings screen with notification preferences
- π§ͺ Test notification feature for debugging
- π Privacy controls and app preferences
Admin/CR Panel
- β‘ Event approval dashboard
- β Approve pending events
- β Reject events with reason
- π Event statistics (pending, approved, rejected)
- πΈ QR scanner for attendance
- π₯ View all registered users
UI/UX
- π¨ Modern, polished interface with consistent theme
- π Centralized color palette and typography
- π« Smooth animations and transitions
- β³ Loading states with ActivityIndicator
- β User-friendly error messages
- π± Responsive design for all screen sizes
- π Pull-to-refresh on all list screens
- πΌοΈ Image preview and caching
Sharing & Integration
- π€ Share event details via native share sheet
- πΊοΈ Open event location in Maps app
- π§ Contact organizer via email/phone
API & Architecture
- β‘ RESTful API with 35+ endpoints
- ποΈ MVC architecture (Models, Controllers, Routes)
- π JWT middleware for protected routes
- π‘οΈ Role-based access control (Student, CR, Admin)
- β Comprehensive input validation
- β Centralized error handling
- π CORS enabled for cross-origin requests
Database (MongoDB Atlas)
- π 3 main collections (Students, Events, Notifications)
- π Mongoose ODM with schema validation
- π Indexed fields for faster queries
- ποΈ Auto-delete old notifications (30 days TTL)
- π Population for referenced documents
Authentication & Security
- π bcryptjs password hashing (10 salt rounds)
- π« JWT token generation and verification
- β° 30-day token expiration
- π« Protected routes with auth middleware
- π€ Role-based authorization checks
Event Management System
- βοΈ CRUD operations for events
- π Event approval workflow (pending β approved/rejected)
- π₯ RSVP management with capacity tracking
- π« Prevent double RSVPs
- β Only admins/CRs can approve events
- π Notifications on event status changes
Push Notification Service
- π± Expo Push Notifications with Firebase Cloud Messaging (FCM) v1 API
- π₯ google-services.json configured for production builds
- π€ Automated reminders via cron jobs
- β° Hourly cron job checks upcoming events
- π¬ Send notifications to all event attendees
- π Handle invalid/expired push tokens
- β Tested and working on physical devices
Cron Job Scheduler
- β±οΈ Runs every hour (0 * * * *)
- π Checks events in next 24 hours and 1 hour
- π€ Sends push notifications via Expo
- β Tracks sent reminders (prevents duplicates)
- π Logs notification sending status
Image Upload (Cloudinary)
- πΈ Multer middleware for file handling
- βοΈ Cloudinary CDN for image storage
- πΌοΈ Image optimization and transformation
- π Returns CDN URL for database storage
Notification System
- π¬ In-app notification creation
- π Push notification sending
- π Track read/unread status
- ποΈ Auto-delete after 30 days
- π Query by user and read status
Deployment (Render)
- π Hosted on Render.com
- π Auto-deploy on git push
- π Environment variable management
- π Health check endpoints
- π Production-ready configuration
- React Native (0.72+) - Cross-platform mobile framework
- Expo (SDK 49+) - Development platform and build tool
- React Navigation (v6) - Stack, tab, and drawer navigation
- Axios - HTTP client for API calls
- AsyncStorage - Persistent local storage
- Expo Vector Icons - 10,000+ icons (Ionicons)
- Expo Notifications - Push notification handling
- Expo Image Picker - Camera and gallery access
- React Native Modal - Custom modal components
- Date/Time Pickers - Native date/time selection
- Node.js (18+) - JavaScript runtime
- Express.js (4.18+) - Web application framework
- MongoDB Atlas - Cloud NoSQL database
- Mongoose (7.0+) - MongoDB object modeling
- Render - Backend hosting platform (deployed)
- jsonwebtoken - JWT generation and verification
- bcryptjs - Password hashing with salt
- dotenv - Environment variable management
- cors - Cross-Origin Resource Sharing
- multer - Multipart form-data handling
- cloudinary - Cloud image storage and CDN
- expo-server-sdk - Push notification sending
- node-cron - Scheduled task automation
- MongoDB Atlas - Database hosting
- Render - Backend API hosting
- Cloudinary - Image CDN and storage
- Firebase - Push notification infrastructure (FCM v1 API)
- Expo - Push notification delivery and app builds
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Mobile Application β
β (React Native + Expo) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Screens β Components β Navigation β API Client β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β HTTP/HTTPS (Axios)
β JWT Auth Headers
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Backend API Server β
β (Node.js + Express.js) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Routes β Controllers β Middleware β Services β
βββββββ¬ββββββββββββ¬ββββββββββββββββ¬βββββββββββββββββ¬βββββββββββ
β β β β
βΌ βΌ βΌ βΌ
βββββββββββ ββββββββββββ βββββββββββββββ βββββββββββββββ
β MongoDB β βCloudinaryβ βExpo Push APIβ β Cron Jobs β
β Atlas β β (CDN) β β(Notif. Send)β β (Scheduler) β
βββββββββββ ββββββββββββ βββββββββββββββ βββββββββββββββ
Authentication Flow:
- User registers/logs in β Frontend sends credentials
- Backend validates β Generates JWT token
- Token stored in AsyncStorage
- All subsequent requests include JWT in headers
- Middleware verifies token before processing
Event Creation Flow:
- User fills event form β Image picked from gallery
- Image uploaded to Cloudinary β URL received
- Event data + image URL β Backend API
- Event saved to MongoDB with "pending" status
- Admin receives notification for approval
- Upon approval β All users receive push notification
Push Notification Flow:
- User grants notification permissions β Expo token generated
- Token sent to backend β Stored in user profile
- Cron job runs hourly β Checks upcoming events
- Notifications sent via Expo Push API β User devices receive
{
_id: ObjectId, // MongoDB auto-generated ID
name: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
unique: true,
lowercase: true
},
password: {
type: String,
required: true,
minlength: 6 // Hashed with bcryptjs
},
phone: {
type: String,
required: true
},
department: {
type: String,
required: true
},
year: {
type: String,
required: true // 1, 2, 3, 4
},
rollNumber: {
type: String,
required: true,
unique: true
},
role: {
type: String,
enum: ['student', 'cr', 'admin'],
default: 'student'
},
expoPushToken: {
type: String, // Expo push notification token
default: null
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
}{
_id: ObjectId,
title: {
type: String,
required: true,
trim: true,
maxlength: 200
},
description: {
type: String,
required: true,
minlength: 20
},
category: {
type: String,
required: true,
enum: ['Technical', 'Cultural', 'Sports', 'Workshop', 'Seminar', 'Competition', 'Other']
},
date: {
type: Date,
required: true
},
time: {
type: String,
required: true // Format: "10:00 AM"
},
location: {
type: String,
required: true
},
organizer: {
type: String,
required: true
},
capacity: {
type: Number,
required: true,
min: 1
},
image: {
type: String, // Cloudinary URL
default: null
},
attendees: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Student'
}],
createdBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Student',
required: true
},
status: {
type: String,
enum: ['pending', 'approved', 'rejected'],
default: 'pending'
},
rejectionReason: {
type: String,
default: null
},
remindersSent: {
day: { type: Boolean, default: false }, // 24h reminder sent
hour: { type: Boolean, default: false } // 1h reminder sent
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
}{
_id: ObjectId,
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Student',
required: true
},
title: {
type: String,
required: true
},
message: {
type: String,
required: true
},
type: {
type: String,
enum: ['event_approved', 'event_rejected', 'event_reminder', 'event_updated', 'new_event', 'rsvp_confirmation'],
required: true
},
event: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Event',
default: null
},
read: {
type: Boolean,
default: false
},
createdAt: {
type: Date,
default: Date.now,
expires: 2592000 // Auto-delete after 30 days
}
}Indexes:
Student: email (unique), rollNumber (unique)Event: date, status, category, createdByNotification: user, createdAt, read
{
"@react-navigation/native": "^6.1.7",
"@react-navigation/stack": "^6.3.17",
"@react-navigation/bottom-tabs": "^6.5.8",
"axios": "^1.4.0",
"expo": "~49.0.0",
"expo-image-picker": "~14.3.2",
"expo-notifications": "~0.20.1",
"react": "18.2.0",
"react-native": "0.72.3",
"react-native-modal": "^13.0.1",
"@react-native-async-storage/async-storage": "1.18.2",
"@expo/vector-icons": "^13.0.0"
}{
"express": "^4.18.2",
"mongoose": "^7.0.0",
"bcryptjs": "^2.4.3",
"jsonwebtoken": "^9.0.0",
"dotenv": "^16.0.3",
"cors": "^2.8.5",
"multer": "^1.4.5-lts.1",
"cloudinary": "^1.37.3",
"expo-server-sdk": "^3.7.0",
"node-cron": "^3.0.2"
}app2/
βββ backend/ # Node.js Backend
β βββ config/
β β βββ database.js # MongoDB connection setup
β βββ controllers/
β β βββ authController.js # Authentication logic
β β βββ eventController.js # Event CRUD operations
β β βββ notificationController.js # Notification handling
β βββ middleware/
β β βββ authMiddleware.js # JWT verification middleware
β βββ models/
β β βββ Student.js # User/Student schema
β β βββ Event.js # Event schema
β β βββ Notification.js # Notification schema
β βββ routes/
β β βββ authRoutes.js # Auth API endpoints
β β βββ eventRoutes.js # Event API endpoints
β β βββ notificationRoutes.js # Notification endpoints
β βββ .env # Environment variables
β βββ .gitignore
β βββ package.json
β βββ server.js # Express server entry
β βββ createAdmin.js # Admin creation script
β βββ README.md
β
βββ frontend/ # React Native App
β βββ api/
β β βββ api.js # Axios API client
β βββ components/
β β βββ Button.js # Custom button component
β β βββ InputField.js # Form input component
β β βββ LoadingSpinner.js # Loading indicator
β β βββ QRTicketModal.js # QR code modal
β βββ config/
β β βββ environment.js # API URL configuration
β βββ constants/
β β βββ theme.js # Colors, spacing, typography
β βββ screens/
β β βββ LandingPage.js # Welcome screen
β β βββ LoginScreen.js # Student login
β β βββ RegisterScreen.js # Student registration
β β βββ AdminLoginScreen.js # Admin/CR login
β β βββ DashboardScreen.js # Main event listing
β β βββ EventDetailsScreen.js # Event details view
β β βββ CreateEventScreen.js # Event creation form
β β βββ ProfileScreen.js # User profile
β β βββ NotificationsScreen.js # Notification list
β β βββ CalendarScreen.js # Calendar view
β β βββ MyEventsScreen.js # User's events
β β βββ AdminPanelScreen.js # Admin dashboard
β β βββ QRScannerScreen.js # QR scanner
β β βββ SettingsScreen.js # App settings
β βββ .gitignore
β βββ app.json # Expo configuration
β βββ eas.json # EAS Build configuration
β βββ package.json
β βββ App.js # Root component
β βββ README.md
β
βββ DOCS.md # Comprehensive documentation
βββ README.md # This file
βββ GETTING_STARTED.md # Setup guide
βββ BUILD_APK_GUIDE.md # Build instructions
βββ ARCHITECTURE.md # System architecture
β βββ api.js # API configuration & methods
βββ components/
β βββ Button.js # Custom button component
β βββ InputField.js # Custom input component
β βββ LoadingSpinner.js # Loading component
βββ constants/
β βββ theme.js # Colors, typography, spacing
βββ screens/
β βββ LandingPage.js # Welcome screen
β βββ LoginScreen.js # Login form
β βββ RegisterScreen.js # Registration form
β βββ HomeScreen.js # Dashboard
βββ .gitignore
βββ App.js # Main app with navigation
βββ app.json # Expo configuration
βββ babel.config.js
βββ package.json
Before you begin, ensure you have the following installed:
- Node.js (v18 or higher) - Download
- npm or yarn - Package manager
- Git - Version control
- Expo CLI -
npm install -g expo-cli - Android Studio or Xcode (for mobile emulators)
- MongoDB Atlas Account - Sign up
git clone <repository-url>
cd "Event Management/app2"cd backend
npm installcd ../frontend
npm install- Update
.envfile inbackend/directory:
# MongoDB Connection
MONGO_URI=mongodb+srv://samuel272lazar:root@123@cluster0.wpnllx4.mongodb.net/campusconnect?retryWrites=true&w=majority&appName=Cluster0
# JWT Secret Key (Change in production!)
JWT_SECRET=campusconnect_secret_key_2025_secure
# Server Configuration
PORT=5000
NODE_ENV=development- Update API URL in
frontend/api/api.js:
// For Android Emulator
const API_BASE_URL = 'http://10.0.2.2:5000/api';
// For iOS Simulator
const API_BASE_URL = 'http://localhost:5000/api';
// For Physical Device (replace with your computer's IP)
const API_BASE_URL = 'http://192.168.1.x:5000/api';
// For Production (Render deployment)
const API_BASE_URL = 'https://event-management-mini-project.onrender.com/api';To find your IP address:
- Windows:
ipconfigin Command Prompt - Mac/Linux:
ifconfigin Terminal
- Firebase Configuration (β
Already configured):
- Firebase project:
CampusConnect - Package name:
com.campusconnect.app google-services.jsonplaced infrontend/directory- FCM configured in
app.jsonwith notification permissions - Push notifications tested and working on physical devices
- Firebase project:
cd backend
npm startYou should see:
π ==========================================
π Server running in development mode
π Server started on port 5000
π API URL: http://localhost:5000
π ==========================================
β
MongoDB Connected: cluster0.wpnllx4.mongodb.net
π Database: campusconnect
cd frontend
npm startThis will open Expo DevTools in your browser.
- Android: Press
aor scan QR code with Expo Go app - iOS: Press
ior scan QR code with Camera app - Web: Press
w(limited functionality)
Production: https://your-app.onrender.com/api
Development: http://localhost:5000/api
POST /api/auth/registerRequest Body:
{
"name": "John Doe",
"email": "john@college.edu",
"password": "SecurePass123",
"phone": "9876543210",
"department": "Computer Science",
"year": "2",
"rollNumber": "CS2021001"
}Response (201):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "507f1f77bcf86cd799439011",
"name": "John Doe",
"email": "john@college.edu",
"role": "student"
}
}POST /api/auth/loginRequest Body:
{
"email": "john@college.edu",
"password": "SecurePass123"
}POST /api/auth/logout
Authorization: Bearer <token>GET /api/auth/profile
Authorization: Bearer <token>PUT /api/auth/profile
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "John Updated",
"phone": "9876543210",
"department": "Computer Science"
}PUT /api/auth/change-password
Authorization: Bearer <token>
{
"currentPassword": "OldPass123",
"newPassword": "NewPass456"
}PUT /api/auth/push-token
Authorization: Bearer <token>
{
"expoPushToken": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]"
}GET /api/events
GET /api/events?category=Technical
GET /api/events?search=hackathonGET /api/events/:idPOST /api/events
Authorization: Bearer <token>
Content-Type: multipart/form-data
{
"title": "Tech Fest 2025",
"description": "Annual technical festival",
"category": "Technical",
"date": "2025-12-15",
"time": "10:00 AM",
"location": "Main Auditorium",
"capacity": 200,
"organizer": "CS Department",
"image": <file>
}PUT /api/events/:id
Authorization: Bearer <token>DELETE /api/events/:id
Authorization: Bearer <token>POST /api/events/:id/rsvp
Authorization: Bearer <token>DELETE /api/events/:id/rsvp
Authorization: Bearer <token>GET /api/events/my-events
Authorization: Bearer <token>GET /api/events/my-rsvps
Authorization: Bearer <token>GET /api/events/admin/pending
Authorization: Bearer <admin-token>PUT /api/events/:id/approve
Authorization: Bearer <admin-token>PUT /api/events/:id/reject
Authorization: Bearer <admin-token>
{
"reason": "Does not meet guidelines"
}GET /api/auth/admin/users
Authorization: Bearer <admin-token>GET /api/notifications
Authorization: Bearer <token>PUT /api/notifications/:id/read
Authorization: Bearer <token>PUT /api/notifications/read-all
Authorization: Bearer <token>DELETE /api/notifications/:id
Authorization: Bearer <token>400 Bad Request:
{
"message": "Please provide all required fields"
}401 Unauthorized:
{
"message": "Not authorized, no token"
}403 Forbidden:
{
"message": "Not authorized as admin"
}404 Not Found:
{
"message": "Event not found"
}500 Internal Server Error:
{
"message": "Server error",
"error": "Error details..."
}The app uses a professional and modern color scheme:
| Color | Hex Code | Usage |
|---|---|---|
| Primary Purple | #6C63FF |
Primary buttons, headers |
| Coral Pink | #FF6584 |
Accent elements |
| Teal | #4ECDC4 |
Success states |
| Light Background | #F8F9FE |
App background |
| White | #FFFFFF |
Cards, surfaces |
| Dark Text | #2D3748 |
Primary text |
| Light Text | #A0AEC0 |
Secondary text |
- Backend deployed on Render and operational
- MongoDB Atlas database connected
- Push notifications configured with Firebase FCM
- google-services.json integrated for Android builds
- Tested successfully on physical Android devices
- All core features working (authentication, events, notifications)
Landing Page
- Welcome screen with animated features
- Login and Register buttons
Login Screen
- Email and password fields
- Form validation
- Role-based authentication
Register Screen
- Comprehensive registration form
- All student details (Name, USN, Email, etc.)
- Dropdown selectors for Year, Semester, Gender, Department
- Password strength validation
Home Screen
- User profile card with statistics
- Quick action buttons
- Upcoming events section
- Real-time event updates
Admin Panel
- Event approval dashboard
- User management
- Event statistics
- QR code scanner for attendance
- Password Hashing: bcryptjs with 10 salt rounds
- JWT Authentication: Secure token-based auth with 30-day expiration
- Input Validation: Comprehensive server-side and client-side validation
- CORS Protection: Configured for specific origins
- Environment Variables: Sensitive data in .env files
- Error Handling: No sensitive information exposed in error messages
- Firebase Security: google-services.json for secure push notifications
- Role-Based Access Control: Student, CR, and Admin authorization levels
- Open the app
- Click "Create Account"
- Fill in all fields with valid data
- Submit and verify success
- Use registered credentials
- Verify token storage
- Check automatic navigation to Home
- Try accessing
/api/auth/profilewithout token - Verify 401 response
- Add valid token and verify success
- Certificate Generation - Auto-generate participation certificates
- Analytics Dashboard - Detailed event analytics and insights
- Email Notifications - Nodemailer integration for email alerts
- SMS Notifications - Twilio integration for SMS reminders
- Social Media Integration - Share to Facebook, Twitter, LinkedIn
- Event Feedback System - Post-event ratings and reviews
- Attendance Tracking - QR code check-in/out system
- Event Chat - Real-time chat for event attendees
- Event Polls - Create polls for event attendees
- Dark Mode - System-wide dark theme
- Multi-language Support - i18n for regional languages
- Offline Mode - Cache events for offline viewing
- Advanced Filters - Filter by date range, location, etc.
- Map Integration - Google Maps for event locations
- Advanced Analytics - Charts and graphs for event data
- Bulk Operations - Bulk approve/reject events
- User Management - Ban/suspend users
- Event Templates - Reusable event templates
- Automated Reports - Weekly/monthly event reports
- Role Management - Custom roles and permissions
- GraphQL API - Replace REST with GraphQL
- WebSocket - Real-time updates without polling
- Redis Cache - Cache frequently accessed data
- Microservices - Split into independent services
- Docker - Containerize application
- CI/CD Pipeline - Automated testing and deployment
- Unit Tests - Jest/Mocha test coverage
- API Rate Limiting - Prevent API abuse
- CDN Integration - Faster static content delivery
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Want to create an installable APK for distribution? Follow our comprehensive guide:
π BUILD_APK_GUIDE.md - Complete APK building instructions
# Install EAS CLI (if not installed)
npm install -g eas-cli
# Navigate to frontend directory
cd frontend
# Login to Expo account
eas login
# Build production APK
eas build --platform android --profile production
# Download APK from Expo dashboard when complete
# https://expo.dev/accounts/YOUR_USERNAME/projectsBuild Profiles:
development- Development build with debuggingpreview- Preview APK for testingproduction- Production-ready signed APK
Important Notes:
- Backend is deployed on Render - Production API is live
- Update
frontend/config/environment.jswith Render API URL - Build typically takes 10-20 minutes
- APK will be available on Expo dashboard for download
Deployment Stack:
- Backend Hosting: Render (https://render.com)
- Database: MongoDB Atlas
- Image Storage: Cloudinary CDN
- Push Notifications: Expo Push API
π BUILD_APK_GUIDE.md - Detailed build instructions
π DOCS.md - Complete documentation
This project is licensed under the MIT License - see the LICENSE file for details.
Samuel Lazar (SammyBoy-09)
π§ Email: [Your Email]
π GitHub: @SammyBoy-09
π¦ Repository: Event-Management-Mini-Project
- React Native & Expo - Cross-platform mobile development
- MongoDB Atlas - Cloud database hosting
- Cloudinary - Image CDN and storage
- Expo Push Notifications - Push notification service
- Express.js Community - Backend framework
- Open Source Contributors - All the amazing libraries
For detailed guides and troubleshooting:
- π GETTING_STARTED.md - Setup guide
- π IMPROVEMENTS_ROADMAP.md - Future enhancements
- π PROJECT_ABSTRACT.md - Project overview and abstract
Need help? Open an issue in the GitHub repository!
Built with β€οΈ for Campus Event Management
Last Updated: December 4, 2025
- β
Notification Config Fixed - Removed deprecated
useNextNotificationsApi, updated to Android API 34 - β Backend Validation Updated - Removed 20-character minimum from event descriptions
- β UI Improvements - Moved test notification button to Settings screen for cleaner UX
- β Backend Health Endpoint - Added server warmup during splash screen for faster cold starts
- β Custom App Icon - Updated with professional branding (1024x1024)
- β Production Build v1.0.3 - All features tested and ready for deployment
- β Push Notifications - Working correctly in standalone APK builds with FCM
- β Auto-deploy - Backend updates automatically deploy to Render from GitHub