Four curated paths built from the best free resources on the internet. Pair them with DevNotes, Daily Bugs and peer reviews inside your workspace.
HTML & CSS fundamentals
MDN Web DocsJavaScript deep-dive
javascript.infoReact & component thinking
react.devTypeScript
TS HandbookStyling systems (Tailwind)
tailwindcss.comHow the internet works
roadmap.shPython or Node.js basics
freeCodeCampSQL & relational databases
SQLBoltREST APIs & auth
MDN HTTPPostgres in production
postgresql.orgPick a stack & build a CRUD app
The Odin ProjectAuth, sessions & security
OWASP Top 10Realtime features (websockets)
MDN WebSocketsTesting & CI
vitest.devDeploy & monitor
12factor.netCommand line mastery
MIT Missing SemesterGit & GitHub workflow
git-scm bookDocker fundamentals
docker docsLinux essentials
linuxjourney.comCI/CD pipelines
GitHub ActionsDevPulse turns teaching into a first-class activity. Every review comment you leave earns XP, builds your reputation and lands on your public portfolio.
Review peers' code line by line
Highlight exact lines, suggest fixes, praise elegant solutions.
Help beginners in Review Labs
ICT students post real code from real assignments — your feedback matters.
Earn XP for every contribution
+5 XP per review comment, up to 75 XP per daily bug solved.
// review-labs/submission-42.js
const result = users.filter(u => u.active)
L2 · suggestion · +3 upvotes
Nice! You could chain .map(u => u.name) here instead of the loop below — one pass, more readable.
.map(u => u.name);