- Next.js API Routes provide Flask-like backend functionality
- Handles routing, middleware, and HTTP requests similar to Flask
- Unified TypeScript across frontend and backend
- File-based routing (like Flask's decorators)
- Built-in API route handlers
- Much easier to deploy to Vercel as Next JS project, unlike Flask
- Hot reload for faster development
- Built-in TypeScript support
- I have previous experience in Next JS framework.
Fitness Tracker is a full‑stack web app where authenticated users can log workouts, add exercises and sets, and view simple stats.
- Next.js 14 (App Router, API Routes)
- TypeScript
- Tailwind CSS
- NextAuth.js (Credentials provider)
- MongoDB Atlas + Mongoose ( Database )
- Zod ( Data Validation )
- API Routes:
src/app/api/**/route.ts - Pages:
src/app/** - Models:
models/ - DB connection:
lib/mongodb.ts - Auth config:
lib/auth.ts - Auth middleware:
src/middleware.ts
GET /api/workouts— List current user’s workoutsPOST /api/workouts— Create workoutGET /api/workouts/[id]— Get specific workoutPUT /api/workouts/[id]— Update workoutDELETE /api/workouts/[id]— Delete workoutGET /api/exercises— List exercisesPOST /api/exercises— Create exerciseGET /api/stats— Basic totals
All workout routes require authentication via NextAuth middleware.
- Zod validates incoming request bodies at the API boundary (clear error messages and types).
- Mongoose enforces schema constraints at the database level (persistence safety).
- This two‑layer approach ensures invalid data is caught before DB writes and keeps the DB consistent.
Where it lives:
- Create:
src/app/api/workouts/route.tsdefines Zod schemas for sets, exercises, and workouts - Update:
src/app/api/workouts/[id]/route.tsvalidates partial updates (title, date, notes, duration)
- Uses NextAuth Credentials provider for simple email/password auth.
- Session: JWT for stateless requests across API routes.
- Middleware (
src/middleware.ts) protects pages and APIs so only logged‑in users can use core features. - Client Navbar uses
useSession()so UI reflects auth state instantly.
User: email, password, name, createdAtWorkout: userId, date, title, notes, duration, exercises[]Exercise: workoutId, name, category, sets[]
- Create
.env.localin the project root with:
MONGODB_URI="your-mongodb-connection-string"
NEXTAUTH_SECRET="openssl rand -base64 32"
NEXTAUTH_URL="http://localhost:3000"
- Install and run:
npm install
npm run dev