MeasurePrep is a full-stack exam preparation, practice testing, scoring, and analytics platform for IELTS Academic, IELTS General Training, TOEFL iBT, and GRE.
Built with Next.js, NestJS, TypeScript, Prisma, MySQL, Redis, MinIO, and Docker, MeasurePrep provides timed mock exams, adaptive GRE testing, automated scoring, AI-assisted writing and speaking evaluation, detailed performance analytics, secure media delivery, and comprehensive exam-content management.
It is designed for developers, educators, language schools, test-preparation providers, assessment platforms, and organizations that need a modern computer-based testing and online examination system.
MeasurePrep is an independent practice platform and is not affiliated with, sponsored by, or endorsed by the British Council, IDP, Cambridge University Press & Assessment, or ETS.
MeasurePrep combines the candidate testing experience, scoring engine, analytics system, content management tools, and operational infrastructure required to run a complete online exam-practice platform.
Support for:
- IELTS Academic
- IELTS General Training
- IELTS diagnostic tests
- Reading
- Listening
- Writing
- Speaking
- IELTS band-score lookup
- Section-level performance analysis
- Answer review
- Weak-area identification
- Timed exam simulation
The platform supports realistic computer-based IELTS practice workflows including reading passages, listening media, writing tasks, speaking preparation, recording, and post-exam analysis.
TOEFL practice workflows include:
- Reading
- Listening
- Writing
- Speaking
- Timed section execution
- Automated objective scoring
- Writing and speaking evaluation workflows
- Score history
- Answer-level review
- Performance analytics
- Configurable scoring tables
The scoring architecture supports database-backed score conversion rather than embedding scoring rules directly into application code.
MeasurePrep supports both:
- GRE Verbal Reasoning
- GRE Quantitative Reasoning
GRE capabilities include:
- Adaptive section routing
- Difficulty-based progression
- Quantitative calculator
- Numeric-entry questions
- Quantitative comparison
- Multiple-choice questions
- Multi-select questions
- Timed sections
- Question flagging
- Score conversion
- Section analytics
Adaptive GRE routing can select a subsequent section based on the candidate's performance in the preceding section.
MeasurePrep provides a server-controlled testing environment designed for realistic timed practice.
Core exam-session capabilities include:
- Server-authoritative exam timers
- Redis-backed timer mirrors
- Automatic section expiration
- Automatic submission
- Reconnect recovery
- Debounced autosave
- Idempotent answer persistence
- Question navigation
- Question flagging
- Keyboard-friendly controls
- Private candidate notes
- Reading highlighting
- Section breaks
- Attempt recovery
- Submission protection
The database remains the authoritative source for section deadlines. Redis is used as a fast-access timer mirror rather than the source of truth.
This prevents browser-side timer manipulation from controlling the actual exam deadline.
Reading sections provide a dedicated examination interface with features such as:
- Split-screen passage and question layout
- Passage highlighting
- Question navigation
- Saved answers
- Private notes
- Question flags
- Automatic progress persistence
- Timed section handling
These capabilities are designed to reproduce the interaction patterns expected from modern computer-delivered standardized examinations.
Listening sections support protected audio delivery and controlled playback.
Capabilities include:
- Authenticated media access
- Protected audio assets
- Single-play listening workflows
- Timed listening sections
- Answer autosave
- Automatic section expiration
- Candidate-specific authorization
- Secure media ownership checks
Listening transcripts and answer-key information are excluded from active exam-session responses.
Writing tasks include:
- Timed writing sessions
- Live word count
- Paste blocking
- Autosave
- Deterministic validation
- Manual grading support
- AI-assisted scoring
- Structured scoring results
- Retry handling
- Manual-review fallback
- Persisted evaluation results
AI evaluation is optional and controlled through feature flags and environment configuration.
The application remains usable when AI scoring is unavailable.
Speaking workflows support:
- Preparation timers
- Response timers
- Browser recording
- Direct media upload
- Protected recording storage
- Candidate-specific access control
- Speech-to-text integration
- AI-assisted evaluation
- Manual-review fallback
Recorded speaking responses can be stored through the S3-compatible media layer provided by MinIO.
MeasurePrep includes support for adaptive assessment workflows.
The bundled GRE implementation can route candidates to different subsequent sections according to their performance in the preceding section.
The architecture separates:
- Test forms
- Sections
- Difficulty levels
- Candidate attempts
- Scoring
- Adaptive routing
This allows additional adaptive testing strategies to be implemented without redesigning the entire examination engine.
MeasurePrep supports multiple grading strategies.
Available matching and grading approaches include:
- Exact matching
- Case-insensitive matching
- Lightweight lemmatized matching
- Numeric tolerance
- Exact multi-select scoring
- Partial-credit multi-select scoring
- Manual scoring
- AI-assisted scoring
Different question types can therefore use scoring logic appropriate to their structure.
Optional AI functionality can assist with subjective responses such as writing and speaking.
The AI scoring architecture includes:
- OpenAI-compatible LLM endpoints
- Configurable model providers
- Structured output validation
- Deterministic prechecks
- Prompt persistence
- Raw-result persistence
- Retry handling
- Feature flags
- Global enable/disable controls
- Exam-level controls
- Manual-review fallback
- Failure handling
AI-generated results should be treated as practice estimates, not official exam scores.
AI scoring remains disabled unless both the required environment configuration and the corresponding application feature flags are enabled.
Speaking responses can optionally pass through a configurable speech-to-text provider.
Configuration supports:
STT_BASE_URL=
STT_API_KEY=
STT_MODEL=Transcription functionality must additionally be enabled through the relevant feature flag.
If transcription or AI scoring is unavailable, the platform can route the response to manual review.
MeasurePrep includes analytics for both candidates and content administrators.
Candidates can review:
- Score history
- Section scores
- Answer-level results
- Weak areas
- Skill performance
- Section timing
- Completion history
- Practice progress
Content administrators can analyze:
- Item difficulty
- Item discrimination
- Completion funnels
- Section timing
- Question performance
- Candidate reports
- Unclear-question reports
- Form performance
These analytics help identify both candidate weaknesses and problems in assessment content.
The assessment engine supports multiple question formats, including:
- Single choice
- Multiple select
- True / False / Not Given
- Matching
- Gap fill
- Numeric entry
- Quantitative comparison
- Essay
- Speaking task
The architecture allows additional question types and grading strategies to be introduced later.
MeasurePrep contains administrative tools for building and managing exam content.
Content editors and administrators can work with:
- Exams
- Sections
- Reading passages
- Questions
- Answer choices
- Answer keys
- Question types
- Scoring strategies
- Audio assets
- Test forms
- Linear forms
- Adaptive forms
- Difficulty levels
- Candidate previews
- Feature flags
- Analytics
- User roles
- Audit information
Bulk JSON import is also supported.
Import validation can report errors at individual-row level instead of failing the complete import without context.
Published forms that already have candidate attempts are treated as immutable.
Instead of modifying historical assessments, administrators create new versions.
This protects:
- Score reproducibility
- Historical analytics
- Candidate results
- Auditability
- Assessment consistency
The platform includes a complete account and authorization system.
Supported functionality includes:
- Email/password registration
- Login
- Email verification
- Password recovery
- SMTP email delivery
- Refresh-token rotation
httpOnlyauthentication cookies- Rate limiting
- Role-based authorization
Available roles include:
STUDENT
CONTENT_EDITOR
ADMIN
MeasurePrep includes multiple security controls relevant to online assessment systems.
These include:
- Server-authoritative exam deadlines
- Role-based authorization
- Authenticated media access
- Attempt ownership validation
- Hidden answer keys during active attempts
- Protected listening transcripts
- Protected correct-answer markers
- HTTP-only refresh-token cookies
- Refresh-token rotation
- Rate limiting
- Production secret validation
- HTTPS validation
- SMTP configuration validation
- Audit data
- Controlled media uploads
The production API rejects several unsafe deployment configurations, including insecure public URLs and inadequate production secrets.
MeasurePrep can record informational browser integrity events such as:
- Fullscreen changes
- Page visibility changes
- Window focus loss
These signals can support review and analytics.
They should not be treated as definitive evidence of misconduct on their own.
| Layer | Technology |
|---|---|
| Frontend | Next.js |
| UI Runtime | React |
| Backend | NestJS |
| Language | TypeScript |
| ORM | Prisma |
| Database | MySQL |
| Cache / Timers | Redis |
| Object Storage | MinIO / S3-compatible storage |
| Validation | class-validator / Zod |
| SMTP / Nodemailer | |
| API Documentation | Swagger / OpenAPI |
| Containers | Docker / Docker Compose |
| Reverse Proxy / TLS | Nginx |
| Package Manager | pnpm |
MeasurePrep uses a monorepo containing separate web, API, shared-type, database, infrastructure, and operational components.
.
├── apps/
│ ├── api/ # NestJS REST API
│ └── web/ # Next.js application
│
├── packages/
│ └── shared-types/ # Shared interfaces and Zod schemas
│
├── prisma/
│ ├── schema.prisma # Database schema
│ ├── migrations/ # Prisma migrations
│ └── seed.ts # Idempotent seed data
│
├── infra/
│ ├── docker-compose.yml
│ ├── docker-compose.prod.yml
│ └── nginx/
│
├── scripts/
│ ├── smoke.ps1
│ ├── backup.ps1
│ ├── restore.ps1
│ ├── generate-dev-certs.ps1
│ └── new-production-env.ps1
│
└── package.json
The backend exposes a versioned REST API through NestJS.
Default development endpoint:
http://localhost:3001/api/v1
Interactive Swagger / OpenAPI documentation is available at:
http://localhost:3001/api/docs
The API covers workflows including:
- Authentication
- Candidate sessions
- Exam forms
- Sections
- Questions
- Answers
- Autosave
- Submission
- Scoring
- Review
- Media
- Analytics
- Content administration
- Feature flags
MeasurePrep can run as a containerized development stack.
The host does not need local installations of MySQL, Redis, or MinIO when the Docker environment is used.
Install:
- Docker Desktop or Docker Engine
- Docker Compose
Docker Desktop users should use Linux containers.
Clone the repository:
git clone https://github.com/ildrm/quiz.git
cd quizCreate the development environment file.
Copy-Item .env.example .envcp .env.example .envBuild the application images:
docker compose --env-file .env -f infra/docker-compose.yml build api web migrate seedStart the complete stack:
docker compose --env-file .env -f infra/docker-compose.yml up -dCheck container status:
docker compose --env-file .env -f infra/docker-compose.yml ps -aExpected state:
mysql Up (healthy)
redis Up (healthy)
minio Up
mailpit Up
api Up
web Up
migrate Exited (0)
seed Exited (0)
After the stack starts:
| Service | URL |
|---|---|
| Web application | http://localhost:3000 |
| REST API | http://localhost:3001/api/v1 |
| Swagger API documentation | http://localhost:3001/api/docs |
| MinIO console | http://localhost:9001 |
| Development email inbox | http://localhost:8025 |
| Readiness endpoint | http://localhost:3001/api/v1/health/ready |
The development seed creates example accounts.
Email: student@exam.local
Password: Practice123!
Email: admin@exam.local
Password: Practice123!
These credentials are intended only for local development and testing.
Never use them in production.
The idempotent seed creates example content for:
- IELTS Academic
- IELTS General Training
- TOEFL
- GRE
It also initializes:
- Test forms
- Exam sections
- Questions
- Scoring tables
- Protected listening assets
- Adaptive GRE routes
- Development users
- Disabled-by-default AI feature flags
Running the seed repeatedly should not create duplicate baseline data.
Developers can run infrastructure services separately and start the Node.js applications locally.
Install dependencies:
corepack pnpm installGenerate the Prisma client:
corepack pnpm db:generateRun database migrations:
corepack pnpm db:migrateSeed the database:
corepack pnpm db:seedStart development servers:
corepack pnpm devRun TypeScript validation:
corepack pnpm typecheckRun tests:
corepack pnpm testCreate production builds:
corepack pnpm buildValidate Docker Compose:
docker compose --env-file .env -f infra/docker-compose.yml config --quietA PowerShell smoke-test script is included:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/smoke.ps1The smoke test verifies important integration workflows including:
- Authentication
- Database readiness
- Redis readiness
- SMTP readiness
- Password-reset email submission
- Answer autosave
- Deterministic scoring
- Answer review
- Protected listening media
- GRE adaptive routing
- TOEFL scoring
- Item reporting
- Analytics
- Feature-flag access
Exam deadlines are persisted in the database.
Redis mirrors active timers for fast access, but the database deadline remains authoritative.
The API validates deadlines during both reads and writes and can expire sessions even if the candidate disconnects.
Pending browser changes are flushed before manual section submission.
During an active attempt, candidate payloads do not expose sensitive assessment data such as:
- Answer keys
- Correct-option markers
- Listening transcripts
Those values become available only when appropriate after submission.
Listening media and speaking recordings require authenticated access.
The API verifies that the authenticated candidate owns the associated attempt before allowing candidate-specific media operations.
AI-assisted scoring requires both application configuration and feature activation.
Example configuration:
LLM_BASE_URL=
LLM_API_KEY=
LLM_MODEL=
AI_SCORING_ENABLED=trueThe corresponding AI_SCORING feature flag must also be enabled through the administration interface.
Speaking transcription additionally requires:
STT_BASE_URL=
STT_API_KEY=
STT_MODEL=and the TRANSCRIPTION feature flag.
If AI evaluation fails validation or a provider is unavailable, the attempt can be moved to:
MANUAL_REVIEW
This prevents external AI services from becoming a hard dependency for completing an assessment.
MeasurePrep is a practice and preparation system.
Scores produced by the platform are practice estimates and should not be represented as official scores issued by an examination provider.
The bundled exam forms were reviewed against official exam-format and scoring guidance on August 2, 2026.
Relevant official references include:
- IELTS Academic test format
- IELTS scoring guidance
- TOEFL iBT test content
- TOEFL score guidance
- GRE General Test structure
Exam formats and scoring systems can change.
New or materially modified assessment forms should therefore be checked against the latest official guidance before publication.
AI scoring should additionally be calibrated against qualified human raters before being used for consequential evaluation.
Create a production environment containing strong random credentials for:
- Database authentication
- JWT secrets
- Object storage
- SMTP
- Application services
A production environment can be generated with:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/new-production-env.ps1 `
-Domain practice.example.com `
-SmtpHost smtp.example.com `
-SmtpUser smtp-user `
-SmtpPassword 'provider-password' `
-EmailFrom 'MeasurePrep <no-reply@example.com>'Install trusted TLS certificates as:
infra/nginx/certs/fullchain.pem
infra/nginx/certs/privkey.pem
For local TLS testing, a temporary self-signed certificate can be generated with:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/generate-dev-certs.ps1Deploy using the production Compose configuration:
docker compose \
--env-file .env.production \
-f infra/docker-compose.yml \
-f infra/docker-compose.prod.yml \
build api web migrate seedThen start the services:
docker compose \
--env-file .env.production \
-f infra/docker-compose.yml \
-f infra/docker-compose.prod.yml \
up -dThe API performs production configuration validation and rejects several unsafe configurations, including example credentials, inadequate JWT secrets, non-HTTPS public URLs, and missing SMTP configuration.
Create a backup of MySQL and MinIO data:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/backup.ps1Backups are stored under the git-ignored:
backups/
directory using timestamped folders.
Restore a selected backup:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/restore.ps1 `
-BackupDirectory .\backups\YYYYMMDD-HHMMSS `
-ConfirmRestoreRestart the application afterward:
docker compose --env-file .env -f infra/docker-compose.yml restart api webAlways verify that the selected backup belongs to the intended environment before restoring it.
Rebuild application-owned Docker images:
docker compose --env-file .env -f infra/docker-compose.yml build api web migrate seedRestart the environment:
docker compose --env-file .env -f infra/docker-compose.yml up -dFollow application logs:
docker compose --env-file .env -f infra/docker-compose.yml logs -f api webStop the stack without removing persistent volumes:
docker compose --env-file .env -f infra/docker-compose.yml downIf Docker reports a dockerDesktopLinuxEngine error, restart Docker Desktop and try again.
docker desktop restartDevelopment services may require ports including:
3000
3001
3306
6379
9000
9001
8025
Stop conflicting services or modify the published ports in the Docker Compose configuration.
Inspect:
docker compose --env-file .env -f infra/docker-compose.yml logs migrate seedInspect:
docker compose --env-file .env -f infra/docker-compose.yml logs api webMeasurePrep can serve as a foundation for:
- IELTS practice websites
- TOEFL preparation platforms
- GRE preparation platforms
- Language-school assessment systems
- Online mock-exam services
- Computer-based testing platforms
- Adaptive testing systems
- Educational assessment software
- Exam analytics platforms
- AI-assisted assessment research
- Self-hosted examination systems
- EdTech products
- Test-preparation SaaS platforms
Many quiz applications focus only on displaying questions and calculating simple scores.
MeasurePrep is designed around the broader requirements of standardized exam preparation:
practice → timed assessment → autosave → submission → scoring → review → analytics → improvement
Its architecture combines:
- Realistic timed exam sessions
- Multiple standardized exam families
- Objective and subjective question types
- Adaptive assessment
- AI-assisted evaluation
- Secure media
- Candidate analytics
- Assessment analytics
- Content operations
- Production deployment tooling
This makes it suitable both as an exam-preparation application and as a foundation for more general computer-based assessment systems.
MeasurePrep is an independent software project.
It is not affiliated with, endorsed by, sponsored by, or officially connected with the British Council, IDP, Cambridge University Press & Assessment, Educational Testing Service (ETS), or any other examination provider.
IELTS, TOEFL, GRE, and other referenced examination names and trademarks belong to their respective owners.
Any scores generated by MeasurePrep are intended for practice and educational purposes and are not official examination results.
Contributions that improve the assessment engine, accessibility, security, analytics, documentation, exam workflows, testing, or developer experience are welcome when contribution access is available.
Before submitting substantial changes:
- Keep business logic testable and explicit.
- Preserve server-authoritative examination behavior.
- Do not expose answer keys during active attempts.
- Maintain backward compatibility where practical.
- Add or update tests for changed behavior.
- Run type checking and tests before submitting changes.
corepack pnpm typecheck
corepack pnpm test
corepack pnpm buildIELTS practice test, IELTS mock exam, IELTS preparation, IELTS Academic practice, IELTS General Training, TOEFL practice test, TOEFL iBT preparation, TOEFL mock exam, GRE practice test, GRE preparation, GRE mock exam, adaptive testing, computer-based testing, online examination system, exam simulator, assessment platform, test preparation software, AI exam scoring, AI assessment, writing evaluation, speaking evaluation, exam analytics, EdTech, Next.js, NestJS, TypeScript, Prisma, MySQL, Redis, MinIO, Docker.
MeasurePrep — practice, measure, understand, and improve exam performance.