Six-person software-engineering course project · 2025
TaskAdventure
A task manager that turns getting things done into an RPG.
- React
- Vite
- Express
- MongoDB
- JWT
- Cypress

task → XP
the core game loop
a full-stack task loop with a small RPG reward system
TaskAdventure turns normal CRUD actions into a lightweight progression loop. A task carries a difficulty and one of six social-stat categories; completing it awards deterministic XP that changes the corresponding stat and overall level.
It is a six-person software-engineering course project, not an AI system. The useful technical story is how a team-built MERN app was structured, migrated, authenticated, tested, and configured for Vercel and Render deployment.
the task loop around one user account
Account + session
Users sign up, log in, and send a one-day JWT on protected API requests.
Task CRUD
Create, edit, complete, and organize tasks by date, difficulty, and social-stat category.
XP + levels
Easy, medium, and hard tasks award different XP; per-stat and overall progress turns completion into a game loop.
Navigation + themes
A shared MUI app shell connects task, stats, calendar, profile, and contact surfaces in light or dark mode.
the MERN system by responsibility
React + Vite
Runs the routed frontend and replaced the slower, deprecated Create React App setup.
Material UI + CSS Modules
Provides the shared shell and component system while keeping page-specific styles scoped.
Express
Exposes auth, task, stats, user, calendar, and contact routes behind middleware.
MongoDB + Mongoose
Stores users, tasks, stats, calendar events, and contact messages as per-user documents.
JWT + bcrypt
Hashes credentials, signs one-day sessions, and attaches user identity to protected requests.
Cypress
Provides four committed browser specs for login, signup, protected routes, and navigation.
GitHub Actions
Runs lint, builds, and the configured test command for the monorepo. The committed behavioral coverage comes from Cypress rather than a Jest unit suite.
From task to progress
A task stores its label, date, difficulty, social stat, completion state, and user. Completing it updates deterministic XP and level progress. This is gamification, not machine learning.

Moving the frontend to Vite
I migrated the project away from Create React App, then reorganized flat frontend and backend files into clearer page, component, route, controller, model, and middleware boundaries.
Testing journeys, not isolated buttons
I introduced Cypress end-to-end coverage around signup, login, and user flows. Auth and database code were team work; my contributions included validation, documentation, and the testing foundation.

the foundational and cross-stack work I led
I had the largest single commit share and focused on project foundations, structure, frontend modernization, shared navigation, selected backend/user flows, and the E2E testing pattern.
- Migrated the frontend from Create React App to Vite and moved styling toward CSS Modules.
- Refactored flat frontend/backend code into pages/components and routes/controllers/models/middleware.
- Built the MUI app shell, drawer, username display, and persistent light/dark theme.
- Added signup validation, auth-flow sequence diagrams, user/stats routes, and level-pacing adjustments.
- Introduced Cypress specs for login, signup, protected-route, and navigation flows.
six people working through sprints and pull requests
The team used sprint branches, user stories, Figma/UML artifacts, pull requests, linting, and CI. Some final product features, including the calendar and recent stats-page design, were teammate-owned. They remain part of the system tour because they complete the user experience.
a few more pages from the process



results, with context
full stack
React and Express connected to a per-user MongoDB data model.
committed Cypress specs
Login, signup, protected routes, and navigation gained browser-level checks.
light + dark
The task loop remains consistent across both visual modes.
Migration, project structure, auth, API boundaries, and browser tests all met in one app. If I returned to it, I would centralize the duplicated XP rules, finish unit coverage, and move token storage away from localStorage. The old hosted database no longer resolves, so I link the repository rather than presenting the deployment as live.