Build Your Future, One Opportunity at a Time : Your all-in-one opportunity tracker for internships, hackathons, and career growth
- Overview
- Live Demo
- Features
- Tech Stack
- System Architecture
- Database Schema
- Getting Started
- Environment Variables
- Deployment
- Project Structure
- API Documentation
- Screenshots
- Documentation
FutureTracker is a modern, full-featured SaaS application designed to help students and professionals track their career opportunities. Whether you're applying for internships, participating in hackathons, or managing multiple job applications, FutureTracker provides an intuitive interface to organize, track, and manage all your opportunities in one place.
- π Secure Authentication: Sign in with Google, GitHub, or email via Clerk
- β‘ Real-time Sync: Instant updates across all devices via Supabase Realtime
- π Visual Management: Kanban-style status board for easy progress tracking
- π Analytics Dashboard: Track success rates, trends, and conversion funnels
- π Deadline Management: Never miss an important deadline with calendar integration
- π PDF Reports: Export detailed reports for your records
- π Share links: Generate revocable read-only opportunity links with descriptions, deadlines, application CTAs, expiry, and optional passcode
- π§ Interview prep: Per-internship workspace for company research, Q&A, technical topics, STAR behavioral answers, and reflections β see
docs/interview-prep.md - π ATS resume hints: Client-side PDF/DOCX analysis with rule-based scoring on upload β see
docs/documents-and-ats.md - π€ AI Resume Checker: Agentic server-side pipeline (LLM-powered) that extracts a structured JSON Resume, enriches with GitHub signals, and scores across four categories with evidence β see
docs/ai-resume-checker.md - π’ Service status: Live uptime page linked from the app footer and navbar
- π± Responsive Design: Works seamlessly on desktop, tablet, and mobile
- Website Demonstration Video β walk through the UI, navigation, and primary flows.
- Code Demonstration Video β review the repository layout, component architecture, and deployment steps.
Frontend: https://futuretracker.online
Backend API: https://futurestack-api.onrender.com
Service Status: UptimeRobot status page
- π Authentication: Secure OAuth login with Google, GitHub, and email (powered by Clerk)
- π Dashboard: Real-time statistics, analytics, and upcoming deadline tracking
- β CRUD Operations: Create, read, update, and delete opportunities
- π Search & Filter: Quickly find opportunities by title, status, or category
- π Calendar View: Visual representation of all deadlines
- π Status Board: Kanban-style board with drag-and-drop status updates
- π Analytics: Charts for status distribution, weekly trends, conversion funnels, and deadline heatmaps
- π PDF Export: Generate professional reports with multiple export options
- π Opportunity sharing: Share redacted, read-only opportunity details at
/share/:tokenwithout requiring viewer sign-in - π Documents: Upload resumes, cover letters, and portfolio links; track which documents were used for each internship; optional ATS-style score on PDF/DOCX upload; optional AI Resume Check via agentic LLM pipeline
- π― Interview pipeline: Multi-round tracking for internships (OA β technical β HR β final) with timeline UI and auto-synced Kanban status β see
docs/interview-rounds.md - π§ Interview preparation: Tabbed prep workspace per internship (research, questions, topics, STAR behavioral, reflection) β see
docs/interview-prep.md - π¨ Modern UI: Clean, dark-themed interface with smooth animations
- π± Responsive: Fully responsive design for all screen sizes
- β‘ Real-time Updates: WebSocket-powered instant sync via Supabase Realtime
- π JWT Authentication: Secure API access with Clerk tokens
- π‘οΈ Row-Level Security: Data isolation at the database level
- π¦ Error Handling: Comprehensive error handling with user-friendly messages
- β³ Loading States: Skeleton loading indicators for premium UX
- π Toast Notifications: Instant feedback for all actions
- π― Auto-logout on 401: Expired sessions handled gracefully
| Technology | Version | Purpose |
|---|---|---|
| React | 19.2.0 | UI library with hooks |
| React Router DOM | 7.9.6 | Client-side routing |
| Tailwind CSS | 3.4.18 | Utility-first CSS framework |
| Clerk React | 5.59.2 | Authentication SDK |
| Supabase JS | 2.89.0 | Realtime subscriptions |
| Recharts | 3.6.0 | Data visualizations |
| Framer Motion | 12.23.24 | Animations |
| React Calendar | 6.0.0 | Calendar component |
| jsPDF | 3.0.3 | PDF generation |
| mammoth | 1.12.0 | DOCX text extraction (ATS scorer) |
| pdfjs-dist | 6.0.227 | PDF text extraction (ATS scorer) |
| Axios | 1.13.2 | HTTP client |
| Technology | Purpose |
|---|---|
| Node.js + Express | RESTful API server |
| Clerk SDK | JWT verification |
| Supabase Client | PostgreSQL database access |
Vercel AI SDK (ai) |
Provider-agnostic LLM layer (AI Resume Checker) |
@ai-sdk/google |
Google Gemini provider |
ollama-ai-provider |
Local Ollama / llama / qwen provider |
pdf-parse + mammoth |
Server-side PDF/DOCX text extraction |
| Zod | Structured LLM output validation |
| Service | Purpose |
|---|---|
| Clerk | OAuth authentication (Google, GitHub, Email) |
| Supabase | PostgreSQL database + Realtime WebSockets |
| Vercel | Frontend hosting |
| Render | Backend hosting |
| Google Gemini API | LLM for AI Resume Checker (Ollama works offline) |
| GitHub REST API | Resume enrichment with public repo signals (optional) |
flowchart TB
subgraph Browser["User Browser"]
React["React App (Vercel)"]
ClerkSDK["Clerk Auth SDK"]
SupaClient["Supabase Client<br/>(Realtime subscriptions)"]
Axios["Axios API Client"]
end
subgraph Backend["Express API (Render)"]
AuthMW["Auth Middleware<br/>(Clerk JWT verification)"]
Routes["REST Routes<br/>/api/*"]
Admin["Supabase Admin Client<br/>(user-scoped queries)"]
end
subgraph Services["External Services"]
Clerk["Clerk"]
PG[("Supabase PostgreSQL")]
RT["Realtime Engine"]
end
React --> ClerkSDK
React --> SupaClient
React --> Axios
ClerkSDK -.->|"OAuth / session"| Clerk
Axios -->|"JWT + API requests"| AuthMW
AuthMW --> Routes
Routes --> Admin
AuthMW -.->|"Verify token"| Clerk
Admin --> PG
SupaClient -.->|"WebSocket"| RT
RT -.-> PG
erDiagram
USERS ||--o{ OPPORTUNITIES : tracks
USERS ||--o{ DOCUMENTS : owns
USERS ||--o{ OPPORTUNITY_ROUNDS : owns
USERS ||--o{ SHARE_LINKS : creates
OPPORTUNITIES ||--o{ OPPORTUNITY_DOCUMENTS : uses
OPPORTUNITIES ||--o{ OPPORTUNITY_ROUNDS : has
DOCUMENTS ||--o{ OPPORTUNITY_DOCUMENTS : linked_to
USERS {
uuid id PK
text clerk_id UK
text email
text full_name
text avatar_url
timestamptz created_at
}
OPPORTUNITIES {
uuid id PK
uuid user_id FK
text title
text description
text link
date deadline
text category
text status
int current_round_number
int rejected_round_number
text notes
timestamptz created_at
timestamptz updated_at
}
OPPORTUNITY_ROUNDS {
uuid id PK
uuid opportunity_id FK
uuid user_id FK
int round_number
text round_type
date scheduled_date
text result
text notes
timestamptz created_at
timestamptz updated_at
}
DOCUMENTS {
uuid id PK
uuid user_id FK
text name
text type
text file_url
text version
boolean is_external
timestamptz created_at
}
OPPORTUNITY_DOCUMENTS {
uuid id PK
uuid opportunity_id FK
uuid document_id FK
timestamptz submitted_at
}
SHARE_LINKS {
uuid id PK
uuid user_id FK
text token_hash UK
text token_ciphertext
text token_iv
text token_auth_tag
jsonb snapshot
text snapshot_type
timestamptz expires_at
boolean is_active
int view_count
text passcode_hash
text passcode_salt
}
All tables use Row-Level Security (RLS) so each user only accesses their own data. Full SQL migrations live in docs/supabase-schema.sql and the feature-specific files below.
| Migration file | Feature |
|---|---|
docs/supabase-schema.sql |
Core users + opportunities |
docs/documents-migration.sql |
Document vault + ATS columns |
docs/opportunity-rounds-migration.sql |
Interview round pipeline |
docs/interview-prep-migration.sql |
Interview prep workspace |
docs/hackathon-collaboration-migration.sql |
Hackathon teams, tasks, ideas |
docs/share-links-migration.sql |
Dashboard share links |
- Node.js (v18 or higher)
- npm or yarn
- Clerk account (clerk.com)
- Supabase account (supabase.com)
-
Clone the repository
git clone https://github.com/Venkat-Kolasani/FutureStack.git cd FutureStack -
Install frontend dependencies
npm install
-
Install backend dependencies
cd backend npm install cd ..
-
Set up environment variables (see Environment Variables)
-
Start the backend
cd backend npm run dev -
Start the frontend (in a new terminal)
npm start
The app will open at http://localhost:3000
# Clerk Authentication
REACT_APP_CLERK_PUBLISHABLE_KEY=pk_test_...
# Backend API URL
REACT_APP_API_URL=http://localhost:3001/api# Server
PORT=3001
NODE_ENV=development
# CORS (Frontend URL)
CORS_ORIGIN=http://localhost:3000
# Clerk Authentication
CLERK_SECRET_KEY=sk_test_...
# Clerk JWT Public Key (recommended for production - see below)
# CLERK_JWT_PUBLIC_KEY=-----BEGIN PUBLIC KEY-----\nMIIB...\n-----END PUBLIC KEY-----
# Supabase Database
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=eyJ...- Push your code to GitHub
- Connect your repo to Vercel
- Add environment variables:
REACT_APP_CLERK_PUBLISHABLE_KEYREACT_APP_API_URL(your Render backend URL +/api)
- Deploy
- Create a new Web Service on Render
- Connect your GitHub repo, set root directory to
backend - Add environment variables:
NODE_ENV=productionCORS_ORIGIN(your Vercel frontend URL)CLERK_SECRET_KEYCLERK_JWT_PUBLIC_KEY(recommended - see note below)SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY
- Deploy
Setting CLERK_JWT_PUBLIC_KEY enables local JWT verification without network calls to Clerk's JWKS endpoint. This prevents TypeError: fetch failed errors that can occur on cloud platforms.
To get the key:
- Go to Clerk Dashboard > Configure > API Keys
- Click "Show JWT Public Key"
- Copy the entire PEM key
Format: If your hosting doesn't support multi-line env vars, replace newlines with \n:
-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----
The middleware automatically normalizes both formats.
futurestack/
βββ public/ # Static assets (incl. pdf.worker for ATS)
βββ src/
β βββ App.js # Routes, lazy loading, PostHog analytics
β βββ components/
β β βββ auth/ # ProtectedRoute
β β βββ common/ # Navbar, Footer, StatusIndicator, Modal, β¦
β β βββ dashboard/ # StatsCard, DeadlineWidget
β β βββ opportunities/ # Cards, forms, detail modal (rounds + prep entry)
β β βββ rounds/ # RoundTimeline, AddRoundModal
β β βββ interview-prep/ # Prep panels (questions, topics, STAR, β¦)
β β βββ documents/ # Upload, cards, ATS analysis UI
β β βββ hackathons/ # Team, ideas, tasks, checklist
β β βββ statusboard/ # Kanban columns + cards
β β βββ analytics/ # Rejection insights charts
β β βββ seo/ # react-helmet-async SEO component
β βββ hooks/useAuthToken.js # Clerk JWT β Axios interceptor
β βββ lib/ # supabase (realtime), analytics (PostHog)
β βββ pages/ # Route-level screens (see docs/CODEBASE_GUIDE.md)
β βββ services/api.js # All REST calls (opportunity, round, prep, β¦)
β βββ utils/ # dateHelpers, pdfExport, atsScorer
βββ backend/src/
β βββ app.js # Express app, rate limits, route mounts
β βββ middleware/auth.js # Clerk JWT verification
β βββ routes/
β β βββ opportunities.js # Opportunities CRUD
β β βββ opportunity-rounds.js # Nested interview rounds
β β βββ interview-prep.js # Prep workspace API
β β βββ documents.js # Document vault + upload
β β βββ hackathons.js # Team collaboration
β β βββ analytics.js # Dashboard analytics
β βββ validation/ # Request schemas per domain
β βββ lib/ # Supabase client, round sync helpers
βββ docs/ # Feature guides + SQL migrations
β βββ CODEBASE_GUIDE.md # Start here for code orientation
β βββ interview-rounds.md
β βββ interview-prep.md
β βββ documents-and-ats.md
β βββ DOCUMENTATION.md # Full architecture deep-dive
β βββ TESTING.md
βββ package.json
Orientation: docs/CODEBASE_GUIDE.md maps routes, services, and feature docs in one place.
- Development:
http://localhost:3001/api - Production:
https://futurestack-api.onrender.com/api
All endpoints except /health require a valid Clerk JWT token:
Authorization: Bearer <clerk_jwt_token>
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /health |
Health check | β |
| GET | /health/deps |
Supabase dependency check | β |
| GET | /me |
Current user info | β |
| GET | /opportunities |
List user's opportunities | β |
| GET | /opportunities/:id |
Get single opportunity | β |
| POST | /opportunities |
Create opportunity | β |
| PATCH | /opportunities/:id |
Update opportunity | β |
| DELETE | /opportunities/:id |
Delete opportunity | β |
| GET | /opportunities/:id/rounds |
List interview rounds (internships) | β |
| POST | /opportunities/:id/rounds |
Create round; returns { round, opportunity, rounds } |
β |
| PATCH | /opportunities/:id/rounds/:roundId |
Update round; returns synced payload | β |
| DELETE | /opportunities/:id/rounds/:roundId |
Delete round; returns synced payload | β |
| GET | /interview-prep/:opportunityId |
Get prep + questions + topics + behavioral | β |
| POST | /interview-prep/:opportunityId |
Create prep record | β |
| PUT | /interview-prep/:opportunityId |
Update research / reflection notes | β |
| POST/PUT/DELETE | `/interview-prep/:opportunityId/questions | topics | behavioral/...` |
| GET | /documents |
List documents | β |
| POST | /documents/upload |
Upload file (multipart) | β |
| POST | /documents/:id/assign |
Link document to opportunity | β |
| GET | /hackathons/:id/team |
Hackathon team workspace | β |
| GET | /analytics |
Dashboard analytics | β |
Full route tables: backend/README.md, docs/interview-prep.md, docs/documents-and-ats.md.
POST /api/opportunities
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Software Engineer Intern",
"description": "Full-stack development role",
"link": "https://example.com/apply",
"deadline": "2025-12-31",
"category": "internship",
"status": "applied",
"notes": "Prepare portfolio"
}Clean, modern landing page with animated hero section

Real-time statistics with color-coded cards:
Kanban-style board with 5 columns for visual progress tracking

Interactive calendar with deadline visualization

Flexible PDF export with multiple options

- Primary: Blue (#3B82F6) - Internships, Primary actions
- Secondary: Orange (#F97316) - Hackathons
- Success: Green (#10B981) - Selected status
- Warning: Yellow (#F59E0B) - Shortlisted status
- Danger: Red (#EF4444) - Rejected status, Errors
- Background: Gray-900 (#111827) - Dark theme
- Font Family: Inter, system-ui, sans-serif
- Headings: Bold, 2xl-3xl
- Body: Regular, sm-base
- Labels: Medium, sm
FutureStack is part of GSSoC 2026. Please read CONTRIBUTING.md before requesting an issue assignment or opening a PR.
| Doc | Purpose |
|---|---|
| Codebase guide | Start here β routes, services, golden rules, recent PRs |
| Devin Wiki | Canonical runbook, deployment, architecture decisions |
| Interview rounds | Multi-round pipeline, status sync, performance fix |
| Interview prep | Prep workspace API, UI tabs, testing |
| Documents & ATS | Document vault + client-side ATS scorer |
| DOCUMENTATION.md | Full architecture, auth flow, technical challenges |
| TESTING.md | CI commands, smoke checklist, per-feature tests |
| CONTRIBUTING.md | GSSoC workflow, PR rules |
| SECURITY.md | Security practices and review notes |
Built with β€οΈ by Venkat Kolasani
