Skip to content

Greatness Club Career Platform

Changelog

Notable platform changes, in reverse chronological order. Sourced from CHANGELOG.md in the deployment.

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/changelog rendering this file via marked.
  • /admin/probe self-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/diagnostics now reports per-table row counts.
  • /api/stats admin-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 + /press stubs, 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-motion honored 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]/enrol with capacity guard, seats-left hint per cohort, and /thank-you post-enrol page with prefilled WhatsApp deep-link.
  • Static pages: /about, /faq (accordion), /contact, /privacy, /terms. All bilingual EN/AR.
  • Shared site Footer with 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, metadataBase from NEXT_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 /me when phone is missing.
  • Past-cohorts section on /me (status=completed | cancelled).
  • Cohort progress bar (X of N submitted) on /me cards 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]/edit forms.
  • /admin/lessons/new + /admin/lessons/[id]/edit forms.
  • "Mark cohort completed" button → bulk-inserts completions rows.
  • /admin/cohorts/[id]/submissions.csv route 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 to users.language_pref. KSA timezone (Asia/Riyadh) on every date.

Infra

  • Renamed src/middleware.tssrc/proxy.ts (Next.js 16 convention).
  • vercel.json (region fra1, baseline security headers, framework lock).
  • /api/health endpoint.
  • .github/workflows/ci.yml runs lint:strict + typecheck + test + build on PRs and pushes to main.
  • .github/workflows/ops.yml adds reconcile, apply-migration, reseed, verify, invite-students, import-day2-submissions as one-click manual jobs.
  • Added vercel.json regions, 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.
  • zod added; parseForm() helper in src/lib/forms.ts validates FormData for submitHomework and enrolInCohort.
  • marked for server-side markdown rendering of lesson body.
  • New lint:strict, test, test:watch npm scripts.

Changed

  • programs.tagline for 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]/enrol action — the previous pre-launch shape allowed over-enrolment past cohort.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.md updated 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.