Changelog
All notable changes to the GCCP platform are recorded here. Format: Keep a Changelog. The project follows Semantic Versioning.
[Unreleased]
Added — late-session sprint
Schema (migration 002)
cohorts.live_session_url,cohorts.live_session_day_of_week(mon-sun check),cohorts.live_session_time_ksa(HH:MM check),cohorts.notes. ALTER TABLE … ADD COLUMN IF NOT EXISTS — safe to re-run.users.notes(admin-only operator scratchpad).
Admin power tools
/admin/changelogrendering this file via marked./admin/probeself-service email-deliverability test./admin/cohorts/[id]— Clone + Archive buttons./admin/programs/actions.ts— clone a program with all its lessons./admin/users/[id]operator-notes textarea (amber, persisted)./api/diagnosticsnow reports per-table row counts./api/statsadmin-gated aggregate counts.- Audit-log JSON on cohort archive, program clone, mark-paid, mark-pending.
Student dashboard
- Stats grid on
/me(programs / submissions / accepted / certificates). - Dedicated Certificates section with per-program "Open →" links.
/me/data-export— JSON download of the user's full record (profile, enrolments, submissions, completions, certificates).- Live-session card on
/me/[cohort-id]with day, time, KSA tag, Join button when URL is set.
Public + SEO
- Per-program rich metadata (
PROGRAM_KEYWORDS), Twitter card, OpenGraph type=article. - JSON-LD Course + CourseInstance structured data on program pages.
/careers+/pressstubs, footer links, sitemap entries.
Operations
src/lib/rate-limit.ts— in-memory sliding-window limiter.- 5-per-minute per-user rate limit on the enrol action; banner on
/me?e=rate_limited.
A11y
prefers-reduced-motionhonored site-wide (transitions disabled on request).- Print stylesheet hides interactive chrome and surfaces link destinations after each anchor.
Tests
- Test count: 44 → 64 across 8 files. Added
src/lib/markdown.test.ts,src/lib/forms.test.ts,src/lib/rate-limit.test.ts. Cost test expanded with Sonnet/Haiku price math and cache pricing.
Docs
docs/CONTRIBUTING.md(setup, conventions, PR process).docs/STYLE.md(voice, visual, copy rules).- This CHANGELOG entry.
Added — initial launch sprint
Public surface
- 10-Day AI Bootcamp program seed: 10 daily lessons + first cohort (May 2026, $149, capacity 40, status=open) + curriculum doc.
- Self-enrol flow at
/[program-slug]/enrolwith capacity guard, seats-left hint per cohort, and/thank-youpost-enrol page with prefilled WhatsApp deep-link. - Static pages:
/about,/faq(accordion),/contact,/privacy,/terms. All bilingual EN/AR. - Shared site
Footerwith links to all static pages, WhatsApp, and email. - Open Graph image (1200×630), favicon (SVG) and apple-icon
(code-generated PNG via
next/og). - App Router
sitemap.ts+robots.ts, per-page metadata,metadataBasefromNEXT_PUBLIC_SITE_URL.
Student dashboard
/me/profile— edit name, phone, language preference. Phone soft-validation. Saving language pref also writes the locale cookie.- Onboarding banner on
/mewhen phone is missing. - Past-cohorts section on
/me(status=completed | cancelled). - Cohort progress bar (X of N submitted) on
/mecards and on the cohort lesson list page. - Cohort countdown ("Starts in 6 days" / "Ended 3 days ago").
- WhatsApp CTA on pending-enrolment cards.
- Lesson detail: markdown rendering, prev/next sibling navigation.
Admin
/admin/cohorts/new+/admin/cohorts/[id]/editforms./admin/lessons/new+/admin/lessons/[id]/editforms.- "Mark cohort completed" button → bulk-inserts
completionsrows. /admin/cohorts/[id]/submissions.csvroute handler./admin/users— search by name/email + role select with self-demote guard.- Submissions filtered by lesson on the cohort page.
i18n
- Bilingual EN/AR via
src/i18n/{en,ar}.ts. Every public surface + static page + admin chrome translated. RTL flips automatically via root<html dir>. Locale cookie + optional sync tousers.language_pref. KSA timezone (Asia/Riyadh) on every date.
Infra
- Renamed
src/middleware.ts→src/proxy.ts(Next.js 16 convention). vercel.json(regionfra1, baseline security headers, framework lock)./api/healthendpoint..github/workflows/ci.ymlruns lint:strict + typecheck + test + build on PRs and pushes to main..github/workflows/ops.ymladdsreconcile,apply-migration,reseed,verify,invite-students,import-day2-submissionsas one-click manual jobs.- Added
vercel.jsonregions,env.example(the runbook had been referencing a missing file),.env*was already gitignored.
Tooling
- Vitest installed; 26 tests across
src/i18n/dict.test.ts,src/lib/phone.test.ts,src/lib/whatsapp.test.ts. zodadded;parseForm()helper insrc/lib/forms.tsvalidates FormData forsubmitHomeworkandenrolInCohort.markedfor server-side markdown rendering of lesson body.- New
lint:strict,test,test:watchnpm scripts.
Changed
programs.taglinefor Communication relabelled "Professional Communication — ongoing 6-week program".- Default homepage hero rebuilt with two-CTA layout for the two flagship products.
- Lesson labels: "Day N" for
ai-bootcamp, "Week N" elsewhere. - Admin cohort page now shows program slug-aware lesson labels.
- Enrol action redirects to
/thank-you(was/me?enrolled=1). - All date UI passes
timeZone: "Asia/Riyadh".
Fixed
- Capacity guard on
/[program-slug]/enrolaction — the previous pre-launch shape allowed over-enrolment pastcohort.capacity.
Docs
- New
docs/ARCHITECTURE.md,docs/RUNBOOK.md,docs/AI_BOOTCAMP.md. - Rewrote
README.md(was the create-next-app default). docs/PASTE_ORDER.mdupdated for the new seed files and the GitHub Actions ops path.
[0.1.0] — 2026-04-19
Initial bootstrap from the Prokolpo paste-block kit. Next 16 + Supabase + Tailwind v4 scaffold; first cohort of Communication Program (37 enrollees) running on manual WhatsApp invoicing.