A full-stack personal analytics dashboard to track your 75-day journey for competitive programming, internship preparation, and fitness goals.
- Daily Tracker - Log daily progress with checkboxes for each goal
- LeetCode - Contest participation & problems solved
- CodeChef - Daily problems & contest tracking
- Codeforces - Problems solved & rating updates
- Gym - Workout completion & type tracking
- Diet - Clean diet compliance & macro tracking
- Internship Prep - Study hours logging
- Save Solutions - Store problem title, link, code, and notes
- Monaco Code Editor - View saved code with syntax highlighting
- Copy Code - One-click copy functionality
- Multi-platform - Track LeetCode, CodeChef, Codeforces, GFG, HackerRank
- Tags & Difficulty - Organize problems by tags and difficulty
- Time Tracking - Log time spent on each problem
- Pre-built Templates - DSA, CP, OS, CN, OOPS, Development
- Topic-based Progress - Track progress by topics
- Custom Sheets - Create your own learning roadmap
- Visual Progress - See completion percentage per topic
- Link Problems to Sheets - Organize problems by sheet/topic
- Confetti Celebration - Animated celebration on completing daily goals
- Streak Counter - Visual streak display with fire animation
- Progress Ring - See your 75-day progress
- Motivational Messages - Dynamic messages based on streak length
- Dashboard - Overview with key stats & progress
- Problems Trend - Line chart showing cumulative problems
- Platform Distribution - Bar chart comparing platforms
- Difficulty Breakdown - Pie chart for problem difficulty
- Consistency Heatmap - GitHub-style activity visualization
- Codeforces Rating - Rating progression graph
- Weight Progress - Weight trend with target line
- Weekly weight logging
- Body fat percentage tracking
- Progress visualization
- Weekly average calculations
- Goal progress percentage
- JWT-based authentication
- Protected routes
- Persistent login state
- Profile management with logout
- π Dark theme
- β¨ Glassmorphism cards
- π Neon green accents
- π¬ Smooth Framer Motion animations
- π± Fully responsive layout
TrackAsap/
βββ backend/
β βββ src/
β β βββ config/
β β β βββ db.js # MongoDB connection
β β βββ controllers/
β β β βββ auth.controller.js # Auth logic
β β β βββ dailyLog.controller.js # Daily logs CRUD
β β β βββ physique.controller.js # Weight tracking
β β β βββ analytics.controller.js # Dashboard data
β β β βββ problem.controller.js # Problem tracking (NEW)
β β β βββ sheet.controller.js # Sheets/Roadmaps (NEW)
β β βββ middleware/
β β β βββ auth.middleware.js # JWT verification
β β β βββ error.middleware.js # Error handling
β β β βββ validate.middleware.js # Input validation
β β βββ models/
β β β βββ User.model.js # User schema
β β β βββ DailyLog.model.js # Daily log schema
β β β βββ PhysiqueLog.model.js # Weight log schema
β β β βββ Problem.model.js # Problem schema (NEW)
β β β βββ Sheet.model.js # Sheet/Roadmap schema (NEW)
β β βββ routes/
β β β βββ auth.routes.js
β β β βββ dailyLog.routes.js
β β β βββ physique.routes.js
β β β βββ analytics.routes.js
β β β βββ problem.routes.js # (NEW)
β β β βββ sheet.routes.js # (NEW)
β β βββ server.js # Express app entry
β βββ .env.example
β βββ package.json
β
βββ frontend/
β βββ public/
β β βββ favicon.svg
β βββ src/
β β βββ components/
β β β βββ layout/
β β β β βββ Layout.jsx
β β β β βββ Sidebar.jsx
β β β β βββ Header.jsx
β β β βββ ui/
β β β β βββ GlassCard.jsx
β β β β βββ StatCard.jsx
β β β β βββ ProgressRing.jsx
β β β β βββ Checkbox.jsx
β β β β βββ NumberInput.jsx
β β β β βββ Select.jsx
β β β β βββ LoadingSpinner.jsx
β β β βββ ProblemModal.jsx # Problem input form (NEW)
β β β βββ CodeViewer.jsx # Monaco editor view (NEW)
β β β βββ StreakAnimation.jsx # Streak celebration (NEW)
β β βββ lib/
β β β βββ api.js # Axios instance
β β βββ pages/
β β β βββ Login.jsx
β β β βββ Register.jsx
β β β βββ Dashboard.jsx
β β β βββ DailyTracker.jsx
β β β βββ Analytics.jsx
β β β βββ PhysiqueTracker.jsx
β β β βββ Profile.jsx
β β β βββ Sheets.jsx # Sheets/Roadmaps page (NEW)
β β β βββ Problems.jsx # Problems list page (NEW)
β β βββ services/
β β β βββ authService.js
β β β βββ dailyLogService.js
β β β βββ physiqueService.js
β β β βββ analyticsService.js
β β β βββ problemService.js # (NEW)
β β β βββ sheetService.js # (NEW)
β β βββ store/
β β β βββ authStore.js # Zustand auth state
β β β βββ dailyLogStore.js # Daily logs state
β β β βββ analyticsStore.js # Analytics data
β β β βββ physiqueStore.js # Weight tracking
β β β βββ problemStore.js # Problems state (NEW)
β β β βββ sheetStore.js # Sheets state (NEW)
β β βββ App.jsx
β β βββ main.jsx
β β βββ index.css # Tailwind + custom styles
β βββ index.html
β βββ vite.config.js
β βββ tailwind.config.js
β βββ package.json
β
βββ README.md
- Node.js 18+
- MongoDB (local or Atlas)
- npm or yarn
cd backend
npm install
# Create .env file
cp .env.example .env
# Edit .env with your values:
# PORT=5000
# MONGODB_URI=mongodb://localhost:27017/trackasap
# JWT_SECRET=your_super_secret_key
# JWT_EXPIRE=30d
# Start development server
npm run devcd frontend
npm install
# Create .env file (optional for custom API URL)
cp .env.example .env
# Start development server
npm run devVisit http://localhost:3000 to use the application.
{
name: String,
email: String (unique),
password: String (hashed),
startDate: Date, // 75-day challenge start
targetWeight: Number,
codeforcesHandle: String,
codechefHandle: String,
leetcodeHandle: String,
timestamps: true
}{
user: ObjectId,
date: Date,
dayNumber: Number (1-75),
leetcode: {
contestParticipated: Boolean,
problemsSolved: Number,
problemDifficulty: enum ['easy', 'medium', 'hard', 'none']
},
codechef: {
dailyProblem: Boolean,
contestParticipated: Boolean,
problemsSolved: Number
},
codeforces: {
problemsSolved: Number,
contestParticipated: Boolean,
rating: Number
},
gym: {
completed: Boolean,
workoutType: enum ['push', 'pull', 'legs', 'cardio', 'rest', 'other', 'none'],
duration: Number
},
diet: {
cleanDiet: Boolean,
calories: Number,
protein: Number,
notes: String
},
internshipPrep: {
completed: Boolean,
hoursSpent: Number,
topics: [String]
},
notes: String,
timestamps: true
}{
user: ObjectId,
date: Date,
weight: Number,
bodyFat: Number,
weekNumber: Number (1-11),
measurements: {
chest: Number,
waist: Number,
hips: Number,
arms: Number,
thighs: Number
},
notes: String,
timestamps: true
}| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register |
Register user |
| POST | /api/auth/login |
Login user |
| GET | /api/auth/me |
Get current user |
| PUT | /api/auth/profile |
Update profile |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/daily-logs |
Get all logs |
| POST | /api/daily-logs |
Create/Update log |
| GET | /api/daily-logs/:date |
Get log by date |
| DELETE | /api/daily-logs/:date |
Delete log |
| GET | /api/daily-logs/streak |
Get streak info |
| GET | /api/daily-logs/weekly-summary |
Get weekly stats |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/physique |
Get all weight logs |
| POST | /api/physique |
Add weight log |
| GET | /api/physique/progress |
Get progress summary |
| DELETE | /api/physique/:id |
Delete weight log |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/analytics/dashboard |
Dashboard overview |
| GET | /api/analytics/problems-trend |
Problems over time |
| GET | /api/analytics/platform-distribution |
Platform breakdown |
| GET | /api/analytics/difficulty-breakdown |
Difficulty stats |
| GET | /api/analytics/heatmap |
Activity heatmap |
| GET | /api/analytics/codeforces-rating |
CF rating history |
| GET | /api/analytics/weight-progress |
Weight chart data |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/problems |
Get all problems |
| POST | /api/problems |
Create problem |
| GET | /api/problems/:id |
Get problem details |
| PUT | /api/problems/:id |
Update problem |
| DELETE | /api/problems/:id |
Delete problem |
| GET | /api/problems/by-date/:date |
Get problems by date |
| GET | /api/problems/stats |
Get problem statistics |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/sheets |
Get all sheets |
| POST | /api/sheets |
Create sheet |
| GET | /api/sheets/templates |
Get available templates |
| GET | /api/sheets/:id |
Get sheet with problems |
| PUT | /api/sheets/:id |
Update sheet |
| DELETE | /api/sheets/:id |
Delete sheet |
| POST | /api/sheets/:id/topics |
Add topic to sheet |
| PUT | /api/sheets/:id/topics/:topicName |
Update topic progress |
// Streak is calculated based on completion score >= 60%
// A day is "active" if user completes at least 3/5 of:
// 1. LeetCode (solved problems or participated)
// 2. CodeChef (daily problem or contest)
// 3. Codeforces (solved problems or contest)
// 4. Gym (workout completed)
// 5. Diet (clean diet maintained)
const calculateCompletionScore = (log) => {
let score = 0;
const totalChecks = 5;
if (log.leetcode.problemsSolved > 0 || log.leetcode.contestParticipated) score++;
if (log.codechef.dailyProblem || log.codechef.contestParticipated) score++;
if (log.codeforces.problemsSolved > 0 || log.codeforces.contestParticipated) score++;
if (log.gym.completed) score++;
if (log.diet.cleanDiet) score++;
return Math.round((score / totalChecks) * 100);
};
// Current streak: Count consecutive days from today backwards
// where each day has completionScore >= 60%
// Longest streak: Maximum consecutive active days in all logs// Auth Store
const useAuthStore = create((set) => ({
user: null,
token: null,
isAuthenticated: false,
login: async (credentials) => { ... },
logout: () => { ... },
updateUser: async (data) => { ... },
}));
// Daily Log Store
const useDailyLogStore = create((set, get) => ({
currentLog: null,
selectedDate: today,
streak: { currentStreak: 0, longestStreak: 0 },
fetchLogByDate: async (date) => { ... },
saveLog: async (data) => { ... },
updateCurrentLog: (field, value) => { ... },
fetchStreak: async () => { ... },
}));
// Analytics Store
const useAnalyticsStore = create((set) => ({
dashboard: null,
problemsTrend: [],
platformDistribution: [],
fetchAll: async () => { ... },
}));- Set environment variables
- Build command:
npm install - Start command:
npm start
- Build command:
npm run build - Output directory:
dist - Set
VITE_API_URLenvironment variable
Backend:
PORT=5000
MONGODB_URI=mongodb+srv://...
JWT_SECRET=your_production_secret
JWT_EXPIRE=30d
NODE_ENV=productionFrontend:
VITE_API_URL=https://your-api-url.com/apiMIT License - feel free to use this for your own 75-day challenge!
Built with π for the grind. Stay consistent, track everything, achieve your goals!