Skip to content

Roadmap

Wouter Meetsma edited this page Jun 23, 2026 · 49 revisions

Development Roadmap

🎯 Overview

RubricMaker is an offline-first rubric creation and grading tool for educators. This roadmap lists completed phases first (newest at the top of that section is the most recently shipped), then planned work.


βœ… Completed Phases

Phase 0: MVP & Core Features (Launched)

  • βœ… Rubric builder with multiple scoring modes (Total Points, Weighted, Single-Point)
  • βœ… Interactive grading interface with score modifiers
  • βœ… CEFR framework integration (Can-Do statements)
  • βœ… Student self-assessment & peer review
  • βœ… Essay assignments with rich text editor
  • βœ… Analytics dashboard with class statistics
  • βœ… Multi-format export (PDF, DOCX, CSV)
  • βœ… Student portal with shareable links
  • βœ… Offline-first architecture with localStorage
  • βœ… Basic theme customization

Phase 1: Cloud Sync & Collaboration (PR #128)

  • βœ… Sync conflict resolution β€” src/utils/syncMerge.ts, remote-as-baseline merge with LWW on rubrics, wired into all three hydration sites (startup, reconnect, OTP sign-in)
  • βœ… Cambridge English framework β€” CEFR ↔ exam mapping (src/data/cambridgeExams.ts), opt-in "B2 Β· FCE" badges, optional Cambridge Dictionary API vocabulary lookups
  • βœ… Theme bundles β€” 5 one-click presets (src/data/themes.ts), tonal accent scale via color-mix(), 5 decorative export fonts for PDF/DOCX

Phase 2: Infrastructure Stabilization (PR #131 + wiki updates)

  • βœ… 2.1 Multi-device e2e β€” second-browser-context Supabase fixture, propagation/LWW-race/network-partition specs (e2e/specs/18-multi-device-sync.spec.ts)
  • βœ… 2.2 LWW extended to every editable collection (rubrics, grades, peer reviews, classes, students, grade scales, comment snippets/bank, self-assessments, speaking sessions, analysis results); add/delete-only collections (attachments, exportTemplates, favoriteStandards) intentionally left on pending-queue protection only
  • βœ… 2.3 Wiki documentation pass β€” Cambridge + theming guides added to Features.md, conflict-resolution strategy documented in Supabase-Sync.md

Phase 3: EFL Classroom Enhancements (PR #134–#136)

  • βœ… 3.1 Speaking session recordings β€” IndexedDB blob store, local-only audio, DB-gated video, optional cloud sync with cascade delete
  • βœ… 3.2 Vocabulary profiling dashboard (/vocabulary) β€” per-student/class CEFR distribution charts, open CEFR word lists, CSV export
  • βœ… 3.3 Peer review analytics (/peer-analytics/:rubricId) β€” consistency scoring, leniency bias, inter-rater spread, comment heatmap
  • βœ… 3.4 Full testing environment (/tests, /test/:code) β€” MC/short-answer/open questions, auto-scoring, class-average adjustment, live proctoring monitor

Phase 3.5: Hot Text Questions & Standalone Essays Workspace (PR #140)

  • βœ… Hot-text question type β€” src/utils/clozeParse.ts parses {{cloze}} and [[hot-text]] syntax; scoring in testCalc.ts
  • βœ… Standalone /essays workspace (parallel to /tests) β€” prompt editor, rubric connector, per-student share links, submission-code import, reusable assignment templates (PR #143)

Phase 4: Admin & School Operations (PR #144–#146)

  • βœ… 4.1 Expanded statistics β€” multi-class Compare view, trend overlay, rule-based insights, track/year filters
  • βœ… 4.2 Activity dashboard (/activity-dashboard) β€” rubric/test/essay Γ— class grid, assign-from-view, submission count badges
  • βœ… 4.3 Admin hardening β€” teacher/admin/observer roles + RLS, pg_cron data retention, student soft-delete archive (restore/anonymize), audit log with CSV export
  • βœ… 4.4 SIS roster sync (partial) β€” CSV upsert + optional roster-removal sync; native Magister API integration still reserved for community contribution
  • βœ… 4.5 Self-hosting ops β€” docs/SELF_HOSTING_OPS.md, HestiaCP/Virtualmin guides

Phase 5: UI/UX Polish (PR #147–#153)

  • βœ… 5.1 Mobile grading β€” touch stepper alongside sliders, single-column ComparativeGrading reflow <768px, iPad CSS, mobile e2e
  • βœ… 5.2 WCAG 2.1 AAA β€” src/utils/contrastCheck.ts + enforcement test, accessible modals with focus trap/restoration, keyboard drag-and-drop, i18n'd skip link
  • βœ… 5.3 Help & documentation β€” page tours (Joyride) on 12 pages total, contextual tooltips (src/components/ui/HelpPopover.tsx) for score modifiers/LWW sync/proctoring flags
  • βœ… a11y test coverage β€” RubricBuilder/GradeStudent/ComparativeGrading added to the jest-axe page suite (PR #152, closing the Phase 5.2 follow-up)
  • βœ… Route-shaped skeleton loading for lazy routes and async actions (PR #153)

Phase 6: Strategic Features (PR #157)

Scoped down from the original proposal before implementation β€” see "Deferred from Phase 6" below for what was cut and why.

  • βœ… 6.1 Student Learning Paths β€” rule-based (no AI/LLM) rubric recommendations from CEFR-skill cohort gaps, consecutive-low-score intervention flagging, /students/:id/learning-path (src/utils/learningPathAggregator.ts)
  • βœ… 6.2 Rubric Marketplace (school-scoped) β€” publish/browse/clone/upvote within a school via the existing schools/school_members tables, /marketplace (supabase/migrations/040_rubric_marketplace.sql, src/pages/MarketplacePage.tsx)
  • βœ… 6.3 Integration Ecosystem (CSV import only) β€” Clever CSV and OneRoster CSV roster-import auto-detection added to the existing CSV import modal; LTI 1.3 LMS integration deferred (see below)
  • βœ… 6.4 Test Summary Export β€” per-question and per-skill/standard strong/weak breakdown, PDF/DOCX export (single + batch) from the test results page, feature parity with the rubric summary export (src/utils/testSummaryAggregator.ts)
  • βœ… 6.5 Report Card Improvement β€” consolidated PDF/DOCX report card per student combining rubric grades, standards coverage, learning goals, CEFR overview, and test summary, with section toggles and single/batch export from the Export page (src/utils/reportCardAggregator.ts)

Verification baseline (carried through every phase above): typecheck/lint clean, full unit suite green (1755+ tests), i18n parity across en/nl/fr/de/es, e2e suite green on chromium/firefox/webkit/mobile-chrome (pre-existing/environmental flakes tracked separately, not regressions).

Phase 7: Longitudinal & Historical Insight (PR #159)

  • βœ… 7.1 Multi-year student history β€” Student.pastClassMemberships recorded on every class change (manual move via Edit Student, and CSV sync-mode re-import transfers), with a confirmation summary before sync-mode CSV mutates anything; trail rendered on the student profile
  • βœ… 7.2 Rubric version diffing β€” "Compare" button per saved version opens a diff against the current rubric (criteria added/removed/changed, title/weight, level points/labels) (src/utils/rubricVersionDiff.ts, RubricVersionDiffModal.tsx); version history/snapshot/restore already existed
  • βœ… 7.3 Standards coverage gap analysis β€” class-level aggregator cross-references every linked standard against what's been graded, split into Assessed/Not yet assessed, surfaced on the Activity Dashboard (src/utils/standardsCoverageAggregator.ts, ClassCoverageGapPanel.tsx)

Phase 8: Collaboration & Department Workflow (PR #160)

  • βœ… 8.1 Co-grading & moderation β€” second-marker grade reuses the peer-review data model (StudentRubric with isPeerReview: true); src/utils/coGradingModerationQueue.ts flags disputes above a configurable point threshold; /moderation lists disputes with a per-criterion delta and keep/accept resolution
  • βœ… 8.2 Department rubric/comment-bank libraries β€” sharedWithSchool flag on rubrics and comment-bank items, read-only to every teacher in the same school (041_school_sharing.sql, mirrors the Phase 6 marketplace's school_members join pattern)
  • βœ… 8.3 Grading task assignment β€” batch-assign a class's ungraded submissions for a rubric to a colleague from the Activity Dashboard (GradingTask type, 042_grading_tasks.sql); completion is derived, not a stored flag
  • βœ… 8.4 Manual reordering β€” drag-and-drop reordering (src/utils/displayOrder.ts, @hello-pangea/dnd) on RubricList, TestListPage, EssayListPage, and the Activity Dashboard, per teacher

πŸ”­ Future Roadmap: Phase 8 and beyond

Each phase below groups proposals under one theme so they can be scoped and shipped independently. None of these involve AI/LLM content generation β€” that remains explicitly out of scope for this project.

Deferred from Phase 6

Two items from the original Phase 6 proposal were cut from scope before implementation, since neither could be built and verified in the implementation environment:

  • LTI 1.3 LMS integration (Canvas, Blackboard, Moodle) β€” needs a live LMS sandbox to verify OAuth/launch flows; CSV-based roster import (Clever, OneRoster) shipped instead as a same-outcome, locally-testable substitute for the common "get students into the app" need.
  • Public/cross-tenant rubric marketplace β€” shipped as school-scoped only (reuses schools/school_members); a public marketplace would need a moderation queue, abuse controls, and report/flag tooling that don't exist yet.

Both remain candidates for a future phase if there's demand.

Phase 8.5: Cohort-Based Filtering (Proposed β€” not yet scheduled)

Phase 8 (Collaboration & Department Workflow β€” co-grading/moderation, department libraries, grading task assignment, manual reordering) shipped in full; see PR #160 above. This item was scoped as part of that proposal but deferred as a separate follow-up.

A cohort is a group of students who share a track/entry-year (e.g. "Class of 2027") rather than a single current class. Statistics already filters by track/year per Phase 4.1, but only within one class at a time. Phase 7.1's Student.pastClassMemberships makes cohort membership derivable for free β€” a cohort is just every class a student has ever belonged to that shares the same entry-year/track tag, no new membership table needed.

  • Auto-derive cohorts from pastClassMemberships (entry-year and/or track), no manual cohort management UI needed for v1
  • Add a cohort filter (alongside the existing class filter) to the rubric/test list views and the Activity Dashboard, so a teacher can see a cohort's rubrics/tests/grading progress across every class it has passed through, not just its current one
  • Reuses the existing Statistics track/year filter UI pattern rather than introducing a new filter component

Phase 9: Accessibility & Reach Expansion

Phase 5 covered AAA contrast and keyboard nav inside the app shell; this phase extends reach further.

9.1 Additional locales

  • Expand beyond EN/NL/FR/DE/ES based on adopter demand (candidates: Portuguese, Polish, Turkish β€” common in EU language-education deployments)
  • RTL layout support (Arabic) β€” CSS logical properties audit, not a new framework

9.2 Installable offline app (PWA)

  • Service worker + manifest so the app installs to a home screen / desktop and launches without a browser chrome, while keeping the existing offline-first localStorage model unchanged
  • Useful for shared classroom devices

9.3 Dyslexia-friendly reading mode

  • Optional font/line-spacing preset (e.g. wider tracking, increased line-height) for rubric text and student-facing essay/test pages, toggled in Settings alongside the existing theme bundles

9.4 Expanded Exports

  • Essays written by students can be exported from HTML-code into Markdown, DOCX, and PDF.
  • Essays can be downloaded as separate documents or combined into a batch download (per class, or by selection)
  • Essays can be attached to the rubrics, and exported together. This can also include the grammar and vocabulary analysis.

Phase 10: Data Portability & School-System Interop

Closes the loop on "data leaves the device" use cases beyond JSON backup.

10.1 Gradebook export templates

  • Per-SIS CSV export presets (beyond the generic CSV in Phase 0) for common Dutch/EU school administration systems, so a Statistics export drops straight into the receiving gradebook's expected columns

10.2 Calendar/due-date sync

  • Export essay/test assignment due dates as a downloadable .ics file β€” no calendar API integration required, keeps the offline-first model intact

10.3 Read-only public API for institutional reporting

  • Optional, opt-in HTTP endpoint (Supabase Edge Function) exposing aggregated, anonymized class statistics for school-level reporting dashboards β€” gated behind the existing admin role, off by default

πŸ“Œ Known Issues & Technical Debt

Issue Impact Owner Priority
Native Magister SIS API integration (bulk import + live sync) not built β€” CSV path covers production use today School IT can't fully automate roster sync Reserved for community contribution Low
Multi-device e2e specs (18-multi-device-sync.spec.ts) require a local Supabase stack to verify outside CI; no Docker daemon in some dev sandboxes Slower local iteration on sync code β€” Low

πŸŽ“ Development Notes

Testing Standards

  • Unit tests: Vitest (coverage thresholds: 50% lines/statements, 37% functions/branches β€” see npm run coverage)
  • E2E tests: Playwright, including a dedicated mobile-chrome and supabase project
  • i18n: Parity tests across EN, NL, FR, DE, ES locales β€” new locales must pass the same parity check and be checked against existing UI layout for overflow
  • Accessibility: axe-core in CI (WCAG 2.1 AA minimum; AAA contrast enforced via contrastCheck.ts)
  • Performance: Offline-first validation; sync latency benchmarks for > 100 rubrics

Last updated: 23 June 2026 β€” Phase 8 shipped (PR #160): co-grading & moderation, department rubric/comment-bank sharing, grading task assignment, manual list reordering. 8.5 (cohort-based filtering) remains a fleshed-out proposal, not yet scheduled. Phases 9–10 remain themed proposals.

Clone this wiki locally