Overview
ExamForge separates learner and administrator workflows into two Next.js applications while sharing a single ASP.NET Core API and PostgreSQL data model. Learners browse subjects and exams, work through practice sessions, and review results; administrators manage the structured content behind those experiences.
The repository is designed as an inspectable engineering project: frontend applications, backend layers, deployment configuration, tests, and planning documentation live together, with CI and Docker supporting repeatable delivery.
Problem
Exam preparation is not a single CRUD workflow. Learner attempts must protect answers before submission, preserve ownership, calculate results server-side, and support review, while administrators need a separate environment for drafting, publishing, and maintaining structured exam content.
Engineering scope
The repository covers the study and admin frontends, a .NET API split into API, Application, Domain, and Infrastructure projects, PostgreSQL persistence through Entity Framework Core, JWT authentication, tests, Docker configuration, CI, and structured operational logging.
System architecture
Separate frontend boundaries keep learner and content-management concerns independent. The API maps requests into application use cases, with domain rules isolated from framework and persistence details. Infrastructure implements EF Core and PostgreSQL concerns behind those boundaries.
Key system capabilities
Learner practice
Subject and exam discovery, practice sessions, answer submission, result review, and progress-oriented workflows.
Content administration
Dedicated tools for subjects, exams, sections, questions, explanations, tags, and publication status.
Protected assessment flow
Ownership checks, role protection, server-side score calculation, and correct-answer disclosure only after submission.
Operational diagnostics
Structured JSON logs, correlation IDs, slow-request events, bounded Docker log rotation, and provider-neutral logging calls.
Engineering decisions
Separate study and admin applications
- Problem
- Learner practice and editorial content management have different users, permissions, and interaction density.
- Decision
- Use two Next.js applications with one API contract and shared backend domain.
- Tradeoff
- The boundary keeps each experience focused, but adds coordination work when shared behavior or contracts change.
Relational exam modeling
- Problem
- Exams contain nested sections, questions, choices, versions, attempts, and publishing state that must remain consistent.
- Decision
- Model the domain in PostgreSQL through EF Core rather than storing an entire exam as unstructured JSON.
- Tradeoff
- Schema and migration work is more explicit, in exchange for constraints, queryability, and controlled evolution.
Provider-neutral observability
- Problem
- Requests and failures need to be traceable now without locking application code to a hosted telemetry vendor.
- Decision
- Use structured ILogger events, correlation scopes, and JSON console output managed by Docker.
- Tradeoff
- Local diagnostics are strong, while centralized retention and querying remain a future deployment concern.
Challenges & tradeoffs
- Keep correct answers and score calculation on the server side while still supporting responsive practice interactions.
- Maintain clean dependency direction across domain, application, infrastructure, and HTTP concerns.
- Coordinate two independently focused frontends against a shared, versioned API contract.
- Balance an extensible domain with an MVP scope that can be completed and inspected.
Technology
- 01Next.js
- 02TypeScript
- 03ASP.NET Core
- 04.NET 10
- 05PostgreSQL
- 06Entity Framework Core
- 07Docker
- 08GitHub Actions
Current outcome
- A working monorepo with study, admin, API, test, documentation, and deployment boundaries.
- A layered .NET solution with PostgreSQL persistence, JWT-based access control, and structured API diagnostics.
- An actively developed foundation; no unverified adoption, performance, or production metrics are claimed.
Links
The source repository is public. No verified public production URL is included at this time.
View repository