A full-stack task management application consisting of a Node.js/Express backend and a native Android client, with push notification support via Firebase Cloud Messaging.
project/
├── backend/ # REST API server
└── android/ # Native Android app
Built with Express, TypeScript, Prisma ORM, and MySQL. Deployed on Vercel.
- Authentication — Register, login, logout, JWT access tokens + refresh tokens
- Tasks — Create, read, update, delete tasks with priority (
LOW,MEDIUM,HIGH) and status (PENDING,IN_PROGRESS,COMPLETED) - Categories — Organize tasks into color-coded, icon-tagged categories
- Reminders — Schedule reminders for tasks; processed every 5 minutes via a Vercel cron job
- Push Notifications — Firebase Cloud Messaging (FCM) token management for mobile push alerts
- Security — Helmet, CORS, rate limiting (1000 req / 15 min), bcrypt password hashing, Zod request validation
| Layer | Technology |
|---|---|
| Runtime | Node.js + TypeScript |
| Framework | Express |
| ORM | Prisma |
| Database | MySQL (PlanetScale-compatible) |
| Auth | JWT (access + refresh tokens) |
| Notifications | Firebase Admin SDK |
| Deployment | Vercel |
Prerequisites: Node.js 18+, a MySQL database, Firebase project
-
Install dependencies:
cd backend npm install -
Set up environment variables — create a
.envfile:DATABASE_URL="mysql://..." JWT_SECRET="your-access-token-secret" JWT_REFRESH_SECRET="your-refresh-token-secret" FIREBASE_PROJECT_ID="your-firebase-project-id" FIREBASE_PRIVATE_KEY="your-firebase-private-key" FIREBASE_CLIENT_EMAIL="your-firebase-client-email"
-
Push the database schema:
npm run db:push
-
Start the development server:
npm run dev
| Method | Endpoint | Auth | Description |
|---|---|---|---|
GET |
/api/health |
No | Health check |
POST |
/api/auth/register |
No | Register a new user |
POST |
/api/auth/login |
No | Login and receive tokens |
POST |
/api/auth/refresh |
No | Refresh access token |
POST |
/api/auth/logout |
No | Invalidate refresh token |
PUT |
/api/auth/fcm-token |
Yes | Update FCM device token |
GET/POST |
/api/tasks |
Yes | List / create tasks |
GET/PUT/DELETE |
/api/tasks/:id |
Yes | Get / update / delete task |
GET/POST |
/api/categories |
Yes | List / create categories |
GET/PUT/DELETE |
/api/categories/:id |
Yes | Get / update / delete category |
GET/POST |
/api/reminders |
Yes | List / create reminders |
DELETE |
/api/reminders/:id |
Yes | Delete a reminder |
POST |
/api/reminders/process |
Cron | Process and send due reminders |
| Command | Description |
|---|---|
npm run dev |
Start dev server with hot reload |
npm run build |
Compile TypeScript |
npm start |
Run compiled output |
npm run db:generate |
Regenerate Prisma client |
npm run db:push |
Push schema changes to database |
A native Android app built with Kotlin, Jetpack Compose, and a clean architecture (data / domain / presentation layers).
- Full task, category, and reminder management via the REST API
- Offline-first with Room local database
- Push notifications via Firebase Cloud Messaging
- Background sync with WorkManager
- JWT auth with automatic token refresh
| Layer | Technology |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 |
| Architecture | MVVM + Clean Architecture |
| DI | Hilt |
| Local DB | Room |
| Networking | Retrofit + OkHttp |
| Notifications | Firebase Messaging |
| Background work | WorkManager |
| State / async | Coroutines + Flow |
| Token storage | DataStore Preferences |
Prerequisites: Android Studio Hedgehog+, JDK 17, a Firebase project with google-services.json
-
Place your
google-services.jsoninandroid/app/. -
Set the backend base URL in
android/app/build.gradle.kts:buildConfigField("String", "BASE_URL", "\"https://your-api-url\"")
-
Open the
android/folder in Android Studio, sync Gradle, and run on a device or emulator (API 26+).
The backend is configured for Vercel deployment (vercel.json). A cron job runs POST /api/reminders/process every 5 minutes to deliver pending reminders.
vercel deploy