Developer learning that won't let you fake it.
Roadmaps you have to earn: server-graded exams gate every layer, and an AI mentor guides you through your weak spots.
Vahoha is a learning platform for developers who want proof they actually understood what they studied. Every roadmap layer is locked until you pass a server-graded exam on it; failing records your specific weak spots, and a personal AI mentor (grounded in your real progress and exam history) helps you close them before you retry. Community posts and coding challenges sit around that core loop. Built from scratch, solo, by Vahe Ohanyan. (Formerly called DevsWebs; the repository folder still uses the old name.)
| Layer | Technologies |
|---|---|
| Frontend | React 19, Vite 7, Tailwind v4, Zustand, Framer Motion, GSAP, CodeMirror |
| Backend | Node.js 22 (ESM), Express 5, MongoDB (native driver), WebSockets (ws), Zod |
| AI | Groq (openai/gpt-oss-120b) for the mentor, teach-back grading and exam-bank generation |
| Auth | JWT access tokens (15 min) + rotating httpOnly refresh cookie, bcrypt, Google and GitHub OAuth |
| Billing | Polar (Merchant of Record), signed webhooks. Built, not enforced (BILLING_ENFORCED=false) |
| Infrastructure | Redis, BullMQ, Cloudinary, isolated-vm (code-runner sandbox), Docker |
| Resend | |
| Testing | Vitest (unit, integration, API, security, performance, concurrency, WebSocket, queue), Playwright (E2E) |
| DX | Husky, lint-staged, ESLint, Swagger UI, nodemon |
The core loop
- Learning roadmaps: 15 categories of visual paths with tracks and layers. Each layer is locked until you pass its exam; progress is saved server-side
- Exam engine: server-graded multiple choice, 15 questions per attempt, pass mark 80. Answer keys never leave the server, choices are shuffled per attempt, unseen questions are served first, 3 attempts per day plus a cooldown after a fail
- AI mentor: per-user agent with tools into your progress, exam history and weak spots. Socratic (guides, doesn't hand over answers); streaming, sessions, 30 messages a day
- Teach-back: explain a topic in your own words and get it graded against a rubric. One slice shipped; the full voice exam is a spec (
docs/product/VOICE_EXAM_SPEC.md) - Mastery: per-topic status and a "next step" derived from exams, teach-back and challenge results
- Dev library: curated books, docs and guides mapped to roadmap layers
- Blog posts tagged to layers: a layer shows the posts written for it
Around it
- Coding challenges (Arena): catalog, sandboxed grading, community proposals with admin review, XP-priced hints
- Community: Markdown blog, profiles, follows, DMs and group chat over WebSockets, queue-backed notifications
- Billing: Polar checkout and subscription state (inert until enabled)
- Pilot analytics: 7 server-side events and an admin-only funnel (
GET /api/admin/funnel) - Search, OAuth, dark/light theme
- Node.js 22
- MongoDB (local or Atlas)
- Redis (local or Docker). Optional: set
REDIS_ENABLED=falseto skip it
npm install
# create backend/.env: see Environment Variables below (there is no .env.example yet)# Frontend + backend + Redis together
npm run dev:full
# Frontend only
npm run dev
# Backend only
npm run server
# Start Redis via Docker (if not already running)
npm run redisnpm run seed:roadmap # tracks and layers
npm run seed:challenges # Arena challenges
npm run seed:concepts # concept definitions for the mentor
npm run seed:rubrics # teach-back rubrics
node backend/seeders/examSeeder.js # exam banks via Groq; see docs/product/EXAM_INTEGRITY.md
npm run admin:grant -- you@example.com # make yourself an adminnpm run buildnpm run test:unit # Unit tests
npm run test:integration # Integration (real MongoDB via in-memory server)
npm run test:api # API contract tests
npm run test:websocket # WebSocket tests
npm run test:queue # BullMQ worker tests
npm run test:security # Security tests
npm run test:performance # Performance benchmarks
npm run test:concurrency # Race-condition and concurrency tests
npm run test:unit:coverage # Coverage report
npm run lintβββ backend/
β βββ app.js # Express app factory (helmet, CORS, routes)
β βββ server.js # Entry point (HTTP + WebSocket + workers)
β βββ config/ # DB (and indexes), Redis, Cloudinary, Swagger
β βββ routes/ # Route definitions
β βββ controllers/ # Route handlers
β βββ services/ # Business logic (exam engine, events, blogs, agent/β¦)
β βββ modules/ # Self-contained features: billing, mastery, coding-challenges, contact
β βββ middleware/ # authenticate, requireAdmin, validate, aiRateLimit
β βββ tools/ # Mentor tool definitions
β βββ seeders/ scripts/ # Content seeding and one-off maintenance
β βββ workers/ queues/ # BullMQ
β βββ websocket/ # Chat server
β βββ tests/ # unit | integration | api | security | perf | ws | queue
βββ src/
β βββ features/ # One folder per product area (Roadmap, AI-Agent, mastery, billing, β¦)
β βββ pages/ # Route-level pages
β βββ components/ # Shared UI
β βββ stores/ # Zustand state
β βββ data/roadmaps/ # Roadmap content, one JSON file per category
βββ constants/ # Shared constants (API base URL, categories)
βββ config/ # Vitest configs per test suite
βββ docs/ # Plans, specs and strategy (index below)
βββ public/ # Static assets
backend/.env:
# Server
PORT=5000
FRONTEND_URL=http://localhost:5173
NODE_ENV=development
# Database
MONGO_URI=
# Auth (note the capitalisation of JWT_Secret)
JWT_Secret=
JWT_REFRESH_SECRET=
GOOGLE_CLIENT_ID=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
# Redis (optional: REDIS_ENABLED=false skips it)
REDIS_ENABLED=true
REDIS_URL=
# AI
GROQ_API_KEY=
# Images and email
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
RESEND_API_KEY=
# Billing (see docs/engineering/BILLING.md); keep BILLING_ENFORCED=false during the pilot
POLAR_ACCESS_TOKEN=
POLAR_PRO_PRODUCT_ID=
POLAR_WEBHOOK_SECRET=
BILLING_ENFORCED=falseFrontend (.env): VITE_API_BASE_URL, VITE_WS_URL, VITE_GOOGLE_CLIENT_ID.
Other switches (MAINTENANCE_MODE, ALLOW_UNSAFE_RUNNER, WS_EXTRA_ORIGINS, CONTACT_INBOX) are explained in docs/DEPLOYMENT.md.
Swagger UI is available at /api-docs when the backend is running.
| Status | Milestone |
|---|---|
| β | Community platform: blogs, profiles, follows, real-time chat |
| β | Learning roadmap: server-side progress, locked layers |
| β | Dev library: curated resources linked to roadmap layers |
| β | Exam engine: server-graded layer exams, pass at 80 |
| β | AI mentor: tools into your progress, Socratic, sessions |
| β | Mastery map and learner context |
| β | Coding challenges (Arena): sandboxed grading, proposals |
| β | Billing: Polar, sandbox-verified, not enforced |
| β | Pilot analytics: events and funnel |
| π‘ | Exam banks: generator built; banks must be seeded and hand-checked per layer |
| π² | Voice exam (teach-back): specified, not built |
| π² | Public progress profiles, certificates, admin panel |
| π² | Real users: the pilot has not started |
Day-to-day status and the pre-pilot checklist: docs/PILOT_STATUS.md.
Backend on Render (render.yaml), frontend on Vercel (vercel.json), database on MongoDB Atlas. A Dockerfile is included for running the API in a container. Full steps: docs/DEPLOYMENT.md.
Full index: docs/README.md.
| Doc | What it is |
|---|---|
docs/strategy/VISION.md |
Business and product framing |
docs/PILOT_STATUS.md |
What's done, what's left before the first user |
docs/strategy/STARTUP_CRITIQUE_2026-10.md |
Brutally honest review of the project |
docs/strategy/STARTUP_REVIEW_2026-10.md |
Competitive review and 90-day plan |
docs/strategy/OUTREACH_KIT.md |
How to find and interview the first users |
docs/product/EXAM_INTEGRITY.md |
Anti-cheating plan and its honest limits |
docs/product/XP_SYSTEM.md |
XP ideas, each with a critique |
docs/engineering/ROADMAP_BUILD_PLAN.md |
Build status and phase plan |
docs/product/VOICE_EXAM_SPEC.md |
Spoken teach-back exam spec |
docs/engineering/BILLING.md |
Billing setup and operations |
docs/product/FUTURE_IDEAS.md |
Unscoped ideas, parked until the pilot |
docs/engineering/ARCHITECTURE.md, docs/engineering/SECURITY.md, docs/engineering/ISSUES.md |
Technical status |
docs/strategy/BUSINESS_MODEL.md, docs/strategy/GROWTH_PLAYBOOK.md, docs/strategy/ADVISORY_BOARD_REPORT.md, docs/strategy/STARTUP_ADVISOR_ANALYSIS.md |
Strategy |
docs/founder/ |
Founder-skill outputs: idea validation, personas, interview script, competitor matrix |
Built by Vahe β one laptop, one idea, every line of code.