EdTech Platform

Common Assessment Platform

A comprehensive platform enabling school and district administrators to create standardized assessments, distribute them district-wide via SIS integration, monitor live sessions, and benchmark student performance with multi-level cross-hierarchy analytics.

Vue 3TypeScriptGoPythonPostgreSQLMongoDBSIS IntegrationReal-time

THE PROBLEM

School districts lacked a unified way to administer standardized assessments across all schools and grade levels. Teachers ran assessments in isolation — there was no cross-hierarchy visibility into how students performed relative to peers in other classrooms, schools, or demographic groups.

Without standardized benchmarking, districts couldn't identify systemic learning gaps, measure curriculum fidelity, or provide data-driven support to Professional Learning Communities. The result: instructional decisions based on incomplete data and no way to track accountability goals across the organization.

0 → 1

Product development in 4 months

4 Roles

District Admin, School Admin, Coordinator, Instructor

3-Level

District, school, and class-level reporting

ASSESSMENT LIFECYCLE

Each assessment follows a four-stage lifecycle. At every stage, the product experience is backed by deliberate engineering decisions.

Author

Create standards-aligned assessments with configurable settings: accommodations, integrity controls, performance bands, and accountability goals

Engineering

2-step settings form with 8 config sections. State-aware editing: RUNNING / SCHEDULED / COMPLETED each expose different editable fields — no accidental overwrites of live assessments

Distribute

Assign assessments to schools and classes district-wide via SIS integration or manual team selection

Engineering

SIS integration with term/course/school picker and automatic class mapping. Distribution criteria persisted as structured membership rules, not flat lists

Administer

Teachers start live sessions with join codes, real-time student progress tracking, and a secure testing environment

Engineering

Live game orchestration: lobby (join code + QR + pending approvals) → running (per-student progress, pause/resume, force-end) → summary. Lockdown browser + impersonation support

Analyze

Multi-level reports for teachers (class), school admins (school), and district admins (district) with AI-generated insights

Engineering

Cross-hierarchy L1 → L2 drill-down report system. 8+ widget types with desktop, mobile, and print rendering variants. Powered by a new Go analytics microservice

ROLE-BASED ACCESS

Four distinct user roles with cascading permissions. Available actions per assessment are computed dynamically from status + role at render time.

District Admin

District-level reports across all schoolsCreate, edit, and delete assessmentsManage members across all schoolsFull access to all features

School Admin

School-level reports (scoped to their school)Start sessions for their school's classesCannot create assessments

Assessment Coordinator

School-level reportsView and coordinate assessmentsBridge between district and teachers

Instructor

Start sessions for assigned classes onlyView own session resultsReport access controlled by admin settings

Dynamic Action System

Each assessment card computes its available actions at render time based on the assessment's current status and the viewer's role. Actions are split into primary CTAs and a secondary dropdown.

Start Session

Running, no sessions started

Admin, Creator

View Report

24h+ after start

Admin, Coordinator

View Sessions

Has active sessions

Any with activity

View Quiz

Creator or shared

Varies

Delete

Any status

Creator only

COMPONENT ARCHITECTURE

A self-contained Vue 3 package with its own routes, stores, services, and domain logic. The assessment flows through five major page-level components.

Listing

Tab-based list (Active / Scheduled / Ended), filters, search, role-aware actions

5 components

Settings

2-step creation: preferences (8 sections) + assignment (SIS or manual)

12 components

Sessions

Running and completed class sessions, settings summary, reopen modal

6 components

Teacher Dash

Live game: lobby with join code, running game with player cards, summary

15+ components

Reports

Cross-hierarchy L1/L2 reports, 8+ widgets, desktop/mobile/print

25+ components

Settings Form — 8 Configuration Sections

Details (Name, Quiz)

Schedule (Start/End, Duration)

Preferences (Timer, Jumble)

Integrity (Lockdown, Impersonation)

Reporting (Bands, Goals)

Accommodations (Read-Aloud, Calculator)

Other (Share, Hide Reports, Grade Sync)

Assignment (SIS / Manual Teams)

DATA FLOWS

Assessment Creation

Step 1: Configure Preferences

Name, quiz, schedule, integrity, accommodations, reporting bands, accountability goals

Step 2: Assign Distribution

SIS flow: search terms → courses → schools → preview class mapping. Or: manual team selection

Validation

isSafeToProceed() — validates all required fields, schedule conflicts, member criteria

API Call

Create assessment with full payload: settings + distribution criteria + schedule

Redirect to Sessions

Assessment created — navigate to session monitoring page

Live Game Session

Teacher clicks "Start Session"

Select classes from assignment list, configure accommodations per student

Backend creates games

One game per class — each gets a unique join code and room

Lobby (Waiting State)

Join Code + QR

Student List Panel

Pending Approvals Queue

Lockdown Browser Status

Teacher Controls

Student Instructions

Running (Active Game)

Per-Student Progress

Score, completion %

Pause / Resume

Via game service API

Force-End Students

Individual or bulk

Join Approval Queue

Approve / reject late joiners

Summary

Post-game overview — results compiled, sessions marked complete

Report Loading

Page mount

Fetch assessment data + performance band configuration

Determine report level

DISTRICT or SCHOOL — based on current user's role and permissions

Load L1 facets

Fetch available filter options: schools, classes, races for dropdowns

Parallel widget loading

8 widgets fetch data concurrently: overview, accuracy, performance bands, item analysis, deep dives, ungraded

User clicks entity → L2 drill-down opens

By Standard

By School

By Participation

L2 Side Drawer

District accuracy, performance bands, accountability goals — scoped to selected entity

REPORT ARCHITECTURE

The most complex subsystem — a cross-hierarchy reporting engine with 8+ widget types, L1/L2 drill-down, and three rendering variants.

L1 Report — Cross-Hierarchy Overview

District-wide or school-wide view with filterable widgets

Overview

Performance band summary with total accuracy

Accuracy Bars

Horizontal bars with district average comparison

Performance Bands

Distribution across band thresholds

Item Analysis

Per-question accuracy + response distribution

Standards Heatmap

Color-coded standards deep-dive with pagination

Questions Heatmap

Question-level deep-dive with sorting

Response Distribution

Per-option response breakdown

Ungraded Students

Schools/classes with pending evaluations

L2 Report — Drill-Down Side Drawer

Click any entity in L1 to open a scoped deep-dive

By Standard

Learning standard drill-down

By School

School → class → student

By Participation

Participation level breakdown

District AccuracyPerformance Band DistributionAccountability Goal TrackingStudent Impersonation View

Desktop

Full widget dashboard with interactive filters, heatmaps, and clickable drill-down

Mobile

Dedicated mobile widget set with filter sheets, summary sections, and side sheets

Print

Print-optimized layout with header, metadata, and static widget rendering

STORE ARCHITECTURE

Listing Store

Assessment list, search, filters, cursor-based pagination

~450 lines

Sessions Store

Running/completed sessions, settings, member management

~140 lines

Report Store

CA data loading, filter state, performance bands

~190 lines

L2 Report Store

Drill-down state: entity type, ID, name, visibility

~35 lines

Classes Store

Class list, selection, student lists, accommodations

~300 lines

User Store

Current user role detection and permission mapping

~90 lines

Listing Store — Deep Dive

The most complex store: concurrent tab fetching with cursor pagination and race condition prevention

State per Tab

RUNNING → hits[] + pagination cursor

SCHEDULED → hits[] + pagination cursor

COMPLETED → hits[] + pagination cursor

ALL → hits[] (search mode)

Key Patterns

  • Cursor-based pagination (searchAfter per tab)
  • AbortController per status tab
  • 500ms debounced search keyword
  • Deduplication by assessment ID
  • Filter composition (grade, subject, date, creator)

SERVICE LAYER

Three service layers: the legacy Node monolith for CRUD, a new Go microservice for analytics/reports, and a dedicated game service for live operations — migrated incrementally behind feature flags.

Legacy API (Node)

  • CRUD: create, read, update, delete
  • Search with v1/v2 pagination
  • Start assessment sessions
  • Class list and member management
  • SIS resource search

Analytics API (Go)

  • L1 facets and overview
  • Performance distribution by entity
  • Accuracy distribution by school/class
  • Item analysis + response distribution
  • Standards and questions deep-dive
  • Ungraded students tracking
  • Accountability goal tracking

Game Service

  • Pause / resume live games
  • Player join approval queue
  • Bulk approve / reject players
  • Force-end individual students
  • Real-time game state management

Feature-Flagged Migration Path

Node Monolith

V1 UI + V1 API

Feature Flag

Instant rollback

Go Microservice

V2 UI + Go API

KEY DECISIONS

Self-Contained Package Architecture

Common Assessments ships as its own Vue 3 package with dedicated routes, stores, services, and domain types. This gave the team full autonomy — no merge conflicts with other product teams, independent release cycles, and clear ownership boundaries in a monorepo with 10+ packages.

State-Aware Editing

A RUNNING assessment can only edit end time and duration. A SCHEDULED one can additionally change start time, integrity, and accommodations. A COMPLETED one can only update reporting config. This is enforced by a status-to-fields mapping that controls which form sections are editable — preventing accidental changes to live assessments.

Feature-Flagged Backend Migration

The legacy Node monolith was replaced with a Go microservice for analytics — but not all at once. Feature flags switch between V1 (Node) and V2 (Go) service layers, as well as corresponding V1/V2 UI components. This allowed zero-downtime migration with instant rollback if regressions appeared.

Cursor-Based Pagination + Abort Controllers

The listing page has 3 concurrent tabs (Active, Scheduled, Ended) that each paginate independently. Using cursor-based pagination (searchAfter) instead of offset pagination avoids drift on real-time data. Each tab has its own AbortController — switching tabs cancels the previous request, preventing race conditions.

Cross-Hierarchy L1/L2 Report Architecture

Rather than building separate report pages for district, school, and class views, a single report page adapts based on the user's role. L1 shows the overview with 8 widgets. Clicking any entity opens an L2 side drawer with scoped drill-down. This reduced the component surface area by ~60% while supporting all hierarchy levels.

PACKAGE ARCHITECTURE

Common Assessment Package

Self-contained: routes, pages, stores, services, domain logic

Shared CA Library

  • Shared CA types and interfaces
  • Shared services and API clients
  • Shared stores and utilities
  • Cross-package CA constants

Shared Platform Libraries

  • Domain types (classes, performance bands)
  • Service discovery and HTTP client
  • Analytics, routing, logging
  • Differentiation / accommodations

Design System

Reusable UI components and tokens

Editor Shared

Quiz viewer, assessment utilities

Back to all Projects

Built with Vue 3, TypeScript, Go, PostgreSQL, and MongoDB