Skip to main content
CodeMentor AI
All courses

Changelog

What we shipped

Most recent first. Updates that affect what learners see on the platform — content, UX, payments, infrastructure.

2026-05-31

Light mode · per-lesson discussions · shareable level cards · 7 audit P0s closed

  • ☀ Light mode shipped across the whole site. Toggle in the top nav, persisted to localStorage with a pre-paint inline script so light-mode users never see a dark flash on first paint. Five rollout phases covered body + scrollbar + footer + nav + 14 deep components + rgba backdrops via color-mix() + a 111-file mass sweep of remaining chrome. Brand colors (blue / violet / green / amber) stay constant across both themes for wayfinding.
  • 💬 Per-lesson discussion threads. Every lesson now ends with a Stack-Overflow-style flat thread. Anonymous visitors read all comments + see a 'Sign in to join' nudge. Authenticated users post + edit + delete their own. RLS-scoped: viewers see non-hidden rows only; writers limited to their own user_id. Graceful degrade: thread shows empty state if the migration hasn't been applied yet so the page never breaks.
  • 🎉 Shareable level cards. When learners share their /u/<handle> profile on Twitter / LinkedIn / Slack the unfurl now renders a dynamic OG card with LVL N + Python-themed title ("Async pythonist", "FastAPI shipper", …) + total XP + day-streak + top 4 unlocked badges + invite CTA. Paired with a new 'Share my level' button on /dashboard that uses the native Web Share API on mobile and falls back to clipboard + Twitter intent on desktop.
  • 📈 SEO title tags now lead with 'Learn Python with an AI mentor' instead of the brand name 'CodeMentor AI'. Same swap across all 18 locales. learnpython.org dominates the head-keyword SERP and we were diluting our intent match by leading with the brand. Description metas synced to '1,300+ lessons' to match the build-time SSOT.
  • 🔧 Refund policy unified — /terms section 5 now states a 14-day worldwide refund guarantee, matching /help and /contact verbatim. Previous /terms language ('no partial refunds') directly contradicted the customer-facing promise. EU 16(m) waiver kept as a note but the 14-day refund right is preserved regardless of consumption.
  • ♿ /courses + /tracks gained <main id="main-content"> targets so the layout-level 'Skip to main content' link finally resolves on those routes. WCAG 2.4.1 bypass works keyboard-only end-to-end now. Also fixed the Foundations CTA subtitle on /courses that previously rendered hardcoded Ukrainian text for every locale.
  • 📊 Lesson count cleanup. Built src/lib/lesson-totals.ts as the single computed source of truth (PYTHON_TOTAL, FRONTEND_TOTAL, GRAND_TOTAL_DISPLAY = '1,300+') and replaced every hardcoded '1,350+' / '984' / '975' across home / pricing / /search / /stats / /courses / OG meta / sitemap / 18 message files. /docs API example also synced to the canonical 'Hello, World!' lesson title.
  • 🛠 Build pipeline unblocked — fixed 23 files with mismatched-quote bugs, 4 JSX-text "${X}" leaks rendering as "$1,300+", and reverted 10 OG-image files back to literal hex (next/og + satori does NOT support CSS variables; the Phase 5 theme sweep blindly converted them and broke prerender with 'Missing )' errors). Home OG runtime moved edge → nodejs to clear the 1 MB Hobby plan Edge function limit.
  • 🐚 New /shell page — Python REPL in your browser. A real CPython interactive prompt via Pyodide: >>> for the primary prompt, ... for continuation when Python's parser wants more input (def / class / if / for / while all work multi-line automatically because we use codeop.compile_command, not a JS-side heuristic). Up/Down walk localStorage history (200-entry cap), Shift+Enter for explicit newlines, Ctrl+L clears the screen. Pandas / numpy / scipy / matplotlib auto-load on first import. The /playground stays the right tool for 'one-file script' workflows; /shell is the right tool for 'try one expression, see it evaluate'.
2026-05-24

Trust audit closed + Python-first positioning + 3-intent picker

  • /stats lesson count now sums Python + frontend (was Python-only) — 1224 lessons across 13 tracks. Matches the '1200+' claim every other surface makes. /tracks page lesson claim computed at build time from the real Python total instead of a stale hardcoded number.
  • Foundations lesson count corrected from stale 165 / 160 → real 170 across /lp/[slug], /pricing student tier, cheatsheets header, /career-outcomes curriculum, and the /courses internal comment. AI Eng / FastAPI / System Design counts on /career-outcomes synced from stale 40 / 20 / 15 → real 101 / 101 / 101.
  • Module 9 of Foundations no longer renders each bonus lesson as its own module — the grouping loop was opening a new module on every iteration regardless of moduleTitle equality. Now collapses consecutive same-title lessons.
  • Home bento honest about runtimes — was "Pyodide runs real Python", now "Two runtimes, zero install. Skulpt boots fast for lesson editors. Pyodide (full CPython, pandas, numpy) powers /playground." Hit 18 locales.
  • Overpromise copy softened — "From zero to hired in 12 months" → "From zero to interview-ready — typical 12-month path"; "your first dev job" → "build job-ready Python skills"; roadmap subhead now says "most learners hit Senior in 9–18 months, depending on prior experience and effort". Hit 18 locales.
  • Python-first positioning — frontend tracks reframed as a sign-up bonus across home, /courses, manifest, OG image, and free-tier copy. Anon visitors landing on a free frontend lesson see a soft "🎁 Frontend is a free bonus on CodeMentor AI — the main product is Python" banner above the task. CTAs route to /register?next=… so the sign-up flow preserves return intent. Hit 18 locales.
  • 3-intent picker above the courses grid — "What are you here for?" with three cards (🐣 total beginner → lesson-01, 💼 job / portfolio → /paths/junior-backend-90-days, 🤖 AI / automation → /paths/ai-engineer-100-days). Reduces the catalogue paralysis the marketing audit flagged.
  • Pricing JSON-LD across course pages synced $19 → $12 (Pro monthly). Trial email-template fallback caught the same stale number. /api/embed/lesson/<id> no longer leaks quiz correctIndex + explanation — answer validation now goes through /api/check-answer which never returns the right index.
2026-05-23

Live AI tutor, home rebuild, GDPR consent, silent-bug sweep

  • Live AI tutor on every lesson — Google Gemini 2.5 Flash now powers the in-editor hint chat plus the global 🤖 Ask CodeMentor AI panel (bottom-left of every non-lesson page). Free tier, ~1500 req/day. Senior-dev + teacher persona handles both lesson hints and free-form 'any Python or programming question' chats. Persists chat history in localStorage; one-shot guard so React Strict Mode doesn't double-submit.
  • Home redesigned around the new prototype: typing headline ('Learn Python from zero / a real AI mentor / no videos, just code / your first dev job') + animated IDE demo that types a buggy n%2=0 then unfurls the AI-mentor explanation. Sticky-left roadmap + timeline-right (Foundations → Build → Senior), 6-card bento, in-line pricing toggle (Free / Pro / Student) with real Pro $12/mo $89/yr numbers.
  • Home in 18 languages — 131 new home_v2 keys hand-translated via the gtx pipeline (RU / UK / 16 others). Brand 'CodeMentor AI' preserved across all locales (no КодМентор ИИ accidents).
  • JavaScript track free lessons bumped 5 → 11 to match the home promise of '10 lessons per frontend track'. Lessons js-c1-01 through js-c1-10 + js-c2-01 sneak peek are now open without signup.
  • GDPR explicit-consent gate on newsletter signup. Unchecked-by-default checkbox + Privacy-policy link + audit-trail columns (consented / consent_text / consent_at / consent_ip) on every record. Migration queued at apps/web/supabase/migrations/20260523_newsletter_consent.sql.
  • Social-share unfurls fixed — the og:image meta on the home and 10 other pages pointed at /og-image.png, a file that never existed. Replaced with a dynamic /opengraph-image (next/og, 1200×630, brand-coherent gradient + bolt logo).
  • iOS 'Add to Home Screen' icon — added /apple-icon (180×180) plus a modern /icon (32×32). Brand bolt logo now shows on the iOS home screen instead of a generic page screenshot.
  • Fixed silently-broken routes — /lesson/<unknown> now returns a real 404 instead of rendering lesson-01 under whatever URL the visitor typed. Same for /courses/<unknown>. Six home course cards switched from /tracks/<slug> (frontend-only) and the wrong human-readable slugs (ai-engineering, system-design) to the real registered ones (ai-eng, sysdesign).
  • Accessibility — every section between the sticky header and the footer is now wrapped in a <main id='main-content'> landmark, with a keyboard-only Skip-to-content link at the top of <body>. WCAG 2.4.1 covered.
  • Security — RFC 9116 /.well-known/security.txt for vulnerability disclosure inbox. Cron endpoints (/api/cron/*) now return 401 Unauthorized when the secret is missing or wrong, instead of leaking the env-var name with a 500.
  • Sign-in / Sign-up / Sign-out buttons in the global nav now respect the active language — were hardcoded Ukrainian for every visitor.
  • Site-wide lesson-count reconciled — every page, manifest, OG image, and i18n string updated from the old '975' / '965' marketing number to '1200+', matching the actual catalogue total (1075 Python + 240 frontend = 1315 lessons, advertised as 1200+ for conservative round). Chrome / Android Web App Install banner now quotes the real count.
2026-05-19

Content infrastructure — guides, glossary, cheatsheets, matchmaker

  • /cheatsheet — 8 hand-curated pattern sheets (Python basics, FastAPI, pandas, AI engineering, system design, DevOps, interview prep, senior Python) with ~120 copy-ready snippets.
  • /glossary — 60 Python terms in plain English across 10 categories. Each term gets its own page with JSON-LD DefinedTerm + linked lesson.
  • /guides — 7 evergreen career guides (resume, portfolio, interviews, junior→mid, negotiation, remote work, bootcamp vs CS).
  • /match — 60-second path matchmaker quiz: 5 questions → 1 recommended learning path + 3 alternatives.
  • /community — Discord (env-gated), GitHub Discussions (env-gated), r/learnpython, Stack Overflow, support email.
  • /help — 23 Q&A across 6 categories with FAQPage JSON-LD for SERP rich-card eligibility.
  • Per-lesson Related-lessons strip — keeps learners moving instead of dead-ending after one lesson.
  • Streak recovery — Duolingo-pattern one-click save for a single missed day, gated server-side (30-day cooldown, ≥ 3 day streak).
  • Spaced repetition for quizzes — Leitner schedule (2/5/14/30/90 day intervals), /review queue UI, fire-and-forget POST from quiz/predict submits.
  • Visual progress map (/progress) + printable PDF report (/progress/print).
  • Embed API — public /api/embed/lesson/{id} + iframe-friendly /embed/lesson/{id} with frame-ancestors *, documented in /docs.
  • Trial transparency banner — day-N + charge-date info before the last-3-days warning, so users are never sandbagged.
  • Newsletter signup on every blog post + guide, gracefully no-ops until the migration is applied.
  • Settings — public profile (handle/bio/links) + daily email nudge toggle wired to existing APIs.
  • Path detail pages now emit HowTo JSON-LD with each stage as a HowToStep — Google step-by-step rich-result eligible.
  • hreflang per-URL across every indexable surface (lessons, blog, courses, paths, projects, guides, glossary, cheatsheet, help, etc.) — 18 languages + x-default.
  • Mobile lesson UI: TopBar trims to logo + title + lang switcher + bookmark + XP, hiding breadcrumbs + type pill + N/M + Python-status on viewports under 900px.
  • Lesson section anchors: every `## heading` gets a slugified id + copy-link button.
  • Lesson translation: mask-token-unmask so fenced + inline code blocks stay byte-perfect across the 18 languages.
  • Offline modes for project-review (self-rubric checklist) and mock-interview (15-question hand-curated bank) — no dead 'coming soon' screens when ANTHROPIC_API_KEY is absent.
  • /docs — public API reference for search, leaderboards, profiles, feeds, user data, embeds.
  • /stats — transparent platform counts pulled from the codebase at build time.
  • Project Studio Phase 3 — 6 new projects (file-organizer CLI, expense tracker, rate-limited gateway, GH PR bot, realtime chat, distributed queue). 12 projects total.
  • 4 new niche learning paths (data-analyst, build-saas-solo, devops-pivot, python-for-finance). 9 paths total.
  • Global Cmd+K / Ctrl+K search overlay — spotlight-style, covers lessons + glossary + cheatsheets + guides + projects + paths.
  • Dynamic per-page OG images on /guides, /paths, /projects — better social-share unfurls.
  • Custom /not-found page with 6 jumping-off tiles + ⌘K hint.
  • Copy-snippet button on every cheatsheet code block.
  • Resend email pipeline wired across all 4 cron routes — sends when RESEND_API_KEY arrives, logs only otherwise.
2026-05-16

Platform v2.0 — 1200+ lessons across 10 tracks, collapsible modules

  • Every advanced track expanded to 100 lessons (AI Engineering, FastAPI, Interview Prep, Data Science, System Design, Senior, DevOps, Creative). Foundations stays at 165.
  • Modules within each track are collapsible — first opens by default, the rest hide so the 100-row list doesn't overwhelm. Per-module 🎯 mission count + 🔓 FREE badge + completion %.
  • Lesson page header: full breadcrumb (Back › Track › Module › Lesson) + 'X / Y' position-in-track indicator.
  • New /tracks comparison page with level filters, recommended-order pill bar, and aggregate stats (1200+ lessons · 10 tracks · 18 languages).
  • Module titles translated to all 18 UI languages (1020 translations).
  • Per-track meta tags on /courses/[slug] — 9 dynamic SEO pages, each with its own title, description, OpenGraph card.
  • JSON-LD structured data — Organization + WebSite sitewide; Course schema per track; ItemList on /tracks. Rich-snippet eligible.
  • RSS 2.0 feed at /blog/rss.xml — auto-discovered by Feedly / NetNewsWire.
  • 2 new blog posts (10 total, hits the P1 milestone): AI Engineering Python 2026 stack + FastAPI vs Flask vs Django 2026.
  • Stripe trial flow: webhook handlers for customer.subscription.trial_will_end + invoice.payment_failed. Dashboard banner surfaces both states. Migration adds trial_end_warned_at + payment_failed_at columns.
  • Terms-content unified across 18 languages — card-required-for-trial messaging matches the actual Stripe policy (FTC negative-option compliance).
  • /api/health endpoint for uptime monitors.
2026-05-15

Creative track launch + autonomous content batches

  • 9th track 'Creative Challenges' — unusual lesson formats nobody else teaches: Code Detective (broken-codebase mysteries), AI Pair-Reversed (catch Claude's deliberate bugs), Time-Travel Refactor (Python 2.4 → modern), Bug Bounty, Code Golf, Refactor Master.
  • Launchd jobs for autonomous content generation: blog daily, lesson batch 3×/day, monitor every hour, design+legal weekly.
  • Apple Pay + Google Pay via Stripe Express Checkout — inline checkout, no redirect.
2026-05-14

Free tier expansion + module headers

  • First 15 Foundations lessons free (was 5). No signup required for /lesson/lesson-01.
  • Module headers added to Foundations — 8 thematic modules instead of one 165-row list.
  • Real beta testimonials replace fake 'students learning' counter.
  • /team landing page showing the 15-agent build pipeline.
2026-05-13

Platform v1.0 — multi-track curriculum

  • 8 themed tracks beyond Foundations: AI Engineering, FastAPI, Data Science, System Design, Senior, Interview Prep, DevOps. All proOnly initially.
  • 18-language UI with consistent terminology.
  • Live student counter, streak tracking, daily emails for retention.
  • Stripe Subscriptions with a 7-day free trial.

Follow along

New posts roughly weekly, platform updates several times per week. Subscribe via RSS or check this page.

📡 RSS feed📰 Blog RSSBlog →