Nuke your VTU course lectures. Blood for the GPA god.
CourseNuker automates marking VTU online course lectures as complete — parallel processing, smart retries, real-time progress, and a clean web UI.
"Not even close, baby." — The blade never dies.
- ⚡ Parallel Processing — Multiple lectures at once (configurable batch size)
- 🔄 Intelligent Retry Logic — Auto session refresh; failed lectures are retried with clear reasons
- 📊 Real-Time Progress — Server-Sent Events (SSE) for live updates
- 🎯 Job Queue — Multiple jobs queued and processed with concurrency control
- 🔐 Session Management — Auto re-authentication on 401/419/403
- 📈 Statistics — Redis-backed analytics (optional)
- 🖥️ Web UI + CLI + REST API
The hosted service has limited capacity and may occasionally be unavailable.
If it's down — don't wait. You have Git and Node. Run it locally in under 2 minutes.
- Git (to clone)
- Node.js 18+ (LTS recommended)
- Your VTU account credentials
1. Clone and install
git clone https://github.com/DragonBlade431/CourseNuker.git
cd CourseNuker
npm install2. Start the local server
npm run serve3. Open in browser
http://localhost:3000
That's it. The web UI is identical to the hosted version — enter your credentials, paste your course slug, and hit go. Nothing is stored anywhere; credentials are only used in memory for the duration of the job.
Finding your course slug: Go to your VTU course page. The slug is the last part of the URL, e.g.
https://online.vtu.ac.in/courses/1-social-networks→ slug is1-social-networks.
Redis is only used for the public hosted statistics counter. Running locally works perfectly without it — just skip any KV_REST_API_* env vars.
1. Infiltrate → Authenticates with VTU, stores session cookie
2. Scout → Lists all lectures across all modules
3. Execute → Sends progress updates in parallel batches
4. Retry → Re-attempts any lectures that survived the first wave
5. GG EZ → Counts completed vs skipped, explains every skip
Every skipped lecture tells you exactly why:
| Status | Reason | Retried? |
|---|---|---|
skip |
Zero duration — VTU has no content here | No — permanent data issue on VTU's side |
maxed |
Didn't reach 100% within the attempt limit | Yes — retried once |
error |
Network or server error during request | Yes — retried once |
npm run serve
# Open http://localhost:3000Fill in email, password, course slug → submit → watch the live log.
cp .env.example .env # fill in VTU_EMAIL, VTU_PASSWORD, VTU_COURSE_SLUG
npm startnpm run dev| Variable | Default | Required For | Description |
|---|---|---|---|
VTU_EMAIL |
— | CLI only | VTU account email |
VTU_PASSWORD |
— | CLI only | VTU account password |
VTU_COURSE_SLUG |
1-social-networks |
CLI only | Course URL slug |
VTU_BATCH_SIZE |
10 |
Optional | Lectures processed in parallel per batch |
VTU_MAX_ATTEMPTS |
50 |
Optional | Max progress-push attempts per lecture |
PORT |
3000 |
Optional | Server port |
MAX_CONCURRENT |
2 |
Optional | Max concurrent jobs (hosted only) |
KV_REST_API_URL |
— | Optional | Upstash Redis URL (statistics only) |
KV_REST_API_TOKEN |
— | Optional | Upstash Redis token |
Web server / REST API: credentials are passed in the request body — no
.envneeded.
CLI: credentials must be in.env.
POST /api/jobs — Submit a job
{
"email": "you@gmail.com",
"password": "yourpassword",
"courseSlug": "1-social-networks",
"batchSize": 10,
"maxAttempts": 50
}GET /api/jobs/:jobId — Poll job state
GET /api/jobs/:jobId/stream — SSE stream (real-time events)
| Problem | Fix |
|---|---|
Login failed |
Check your VTU credentials — same ones you use on the website |
Course not found |
Verify the slug from the VTU URL (e.g. 1-social-networks) |
Lectures stuck at maxed |
VTU API may be throttling — try a smaller batchSize (e.g. 5) or increase maxAttempts |
Network error / ECONNRESET |
Transient VTU outage — these are auto-retried; if persistent, try again later |
| Port 3000 already in use | Set PORT=3001 in your environment before running |
| Hosted site down | Run it locally — see Run It Yourself above |
CourseNuker/
├── automation.js # Core automation engine
├── server.js # Express server + job queue + SSE
├── index.js # CLI entry point
├── lib/
│ └── redis.js # Redis client & statistics helpers
├── frontend/
│ └── index.html # Web dashboard (served at /)
├── public/
│ └── index.html # Static fallback
├── package.json
└── .env.example # Configuration template
| Layer | Technology |
|---|---|
| Runtime | Node.js |
| Server | Express |
| HTTP Client | Axios + tough-cookie |
| Real-Time | Server-Sent Events (SSE) |
| Stats (optional) | Upstash Redis |
- Never commit your
.envfile — it's in.gitignorefor a reason - Credentials passed to the web UI are held in memory only for the duration of the job and never persisted
- Use HTTPS in any production/hosted deployment
PRs and issues welcome.
GitHub: DragonBlade431/CourseNuker
"If you want me to stop, then win."
The blade never dies. ⚔️