Skip to content

Repository files navigation

Examora

CIDeploy WebsiteLicense: MPL-2.0

Examora is an open-source online examination platform for managed exams, programming assessments, and desktop-secured exam sessions.

The project is under active MVP development. Core backend domains are being implemented first, with the admin console, desktop client, judging pipeline, and public documentation evolving in parallel.

Documentation: https://coding-hui.github.io/examora/

What Examora Provides

  • Exam and paper management for administrators
  • Question bank workflows for objective and programming questions
  • Candidate exam sessions with answer persistence and submission tracking
  • Asynchronous judging through Redis-backed tasks
  • A sandbox runner boundary for code execution
  • Logto-oriented authentication design with Examora-owned business roles
  • A documentation website for architecture, lifecycle, API, and roadmap notes

Architecture

Examora Architecture

Examora is split into a small set of explicit runtime boundaries:

LayerComponentsResponsibility
Clientsapps/admin, apps/desktopAdministrator workflows and candidate exam experience
APIcmd/api, internal/api, domain servicesHTTP API, authentication, exam lifecycle, library management, judge orchestration
Workercmd/worker, internal/judge/workerAsynchronous judge task processing
Sandboxcmd/sandbox, internal/server/sandbox.goIsolated execution boundary exposed to the judge service
DataPostgreSQL or SQLite, RedisPersistence, queueing, token blacklist, task coordination
DocswebsitePublic documentation and project planning

Repository Layout

examora/
├── apps/
│ ├── admin/ # Umi/React administrator console
│ └── desktop/ # Tauri + Vue desktop exam client
├── cmd/
│ ├── api/ # Go API server entrypoint
│ ├── worker/ # Go judge worker entrypoint
│ └── sandbox/ # Go sandbox runner entrypoint
├── internal/
│ ├── api/ # HTTP handlers and API DTOs
│ ├── auth/ # Auth, RBAC, token, and Logto integration
│ ├── exam/ # Exam lifecycle and submissions
│ ├── infra/ # Config, database, Redis, logging, transactions
│ ├── judge/ # Judge services, queueing, sandbox client, worker
│ ├── library/ # Question and paper management
│ └── server/ # Runtime assembly for API, worker, and sandbox
├── packages/
│ ├── client/ # Shared frontend API client package
│ ├── types/ # Shared TypeScript contracts
│ └── utils/ # Shared TypeScript utilities
├── deploy/ # Dockerfiles and docker-compose stack
├── migrations/ # Database migration assets
├── website/ # Docusaurus documentation site
├── Makefile
└── go.mod

Prerequisites

  • Go 1.25 or newer
  • Node.js 20 or newer
  • pnpm 9 or newer
  • Docker and Docker Compose
  • Optional: golangci-lint for local linting

Quick Start

Start the local Docker stack:

docker compose -f deploy/docker-compose.yml up --build

The compose stack starts PostgreSQL, Redis, the API server, the judge worker, and the sandbox runner. The API listens on port 8080 by default.

For local backend development without rebuilding containers:

cp .env.example .env
docker compose -f deploy/docker-compose.yml up -d postgres redis
# In separate terminals as needed:
go run ./cmd/api
go run ./cmd/worker
go run ./cmd/sandbox

Configuration is read from environment variables. When running binaries directly, export values from .env in your shell or rely on the development defaults in internal/infra/config.

Frontend and Documentation

Admin console:

pnpm --dir apps/admin install
pnpm --dir apps/admin start
pnpm --dir apps/admin build

Documentation website:

pnpm --dir website install
pnpm --dir website start
pnpm --dir website build

The documentation site is deployed to GitHub Pages by .github/workflows/deploy-website.yml.

Common Development Commands

make infra-up # start the Docker Compose stack
make infra-down # stop the Docker Compose stack
make go-check # run Go tests with a local GOCACHE
make api # run the API server
make worker # run the judge worker
make sandbox # run the sandbox runner
make lint # run golangci-lint
make test# run Go tests

Additional direct checks:

go build ./...
go test ./...
pnpm --dir apps/admin build
pnpm --dir website build

Configuration

The main environment variables are documented in .env.example.

VariablePurpose
APP_HOST, APP_PORTAPI bind address
DATABASE_DSNPostgreSQL DSN or local SQLite path
REDIS_ADDR, REDIS_PASSWORD, REDIS_DBRedis connection settings
SANDBOX_ADDRSandbox runner URL used by judge services
LOGTO_ENABLED, LOGTO_ENDPOINT, LOGTO_APP_ID, LOGTO_API_AUDIENCELogto authentication settings
JWT_SECRETLocal JWT signing secret for development auth flows
ADMIN_DEFAULT_USERNAME, ADMIN_DEFAULT_DISPLAY_NAME, ADMIN_DEFAULT_EMAIL, ADMIN_DEFAULT_PASSWORDDefault super admin created on startup and protected from deletion

Do not commit real .env files or production credentials.

Security Model

  • Candidate-facing APIs must not expose answer_json, hidden tests, or scoring internals.
  • Published exams should be scored from immutable snapshots rather than mutable source questions.
  • Desktop anti-cheat events are audit signals, not proof of cheating.
  • The sandbox runner must remain isolated from PostgreSQL, Redis, and business credentials.

Please report sensitive security issues privately instead of opening a public issue.

Project Status

Examora is pre-1.0 software. APIs, schemas, package boundaries, and deployment details may change while the MVP is being finalized.

Near-term work is tracked in the public documentation roadmap:

Contributing

Contributions are welcome while the project is still taking shape.

Before opening a pull request:

  1. Keep changes focused and aligned with the current module boundaries.
  2. Add or update tests for scoring, snapshots, authentication, and judge-flow behavior.
  3. Run the relevant checks:
go build ./...
go test ./...
pnpm --dir apps/admin build
pnpm --dir website build

Pull requests should describe the motivation, scope, schema or API impact, and verification steps. Include screenshots for UI changes.

License

Examora is licensed under the Mozilla Public License 2.0.

About

Examora is an examination platform designed for secure desktop-based exams, multi-subject assessments, and programming assignments with sandboxed code judging.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages