eTMA Handler is the BEAM edition of the Open University’s electronic Tutor Marked Assignment (eTMA) marking tool. Originally written in Java, this project migrates the marking workflow to Elixir/Phoenix for improved reliability, cross-platform distribution, and modern web capabilities.
The application processes student assignment submissions in .fhi format, provides a marking interface for tutors, and generates graded .docx files with feedback annotations.
-
Phoenix LiveView UI: Real-time, reactive marking interface
-
CubDB Storage: Crash-proof, pure-Elixir embedded database
-
Burrito Packaging: Single binary distribution for all platforms
-
File Watching: Automatic ingestion from Downloads folder
-
WASM Plugins: Sandboxed extension support
-
Post-Quantum Ready: Kyber key exchange (optional)
-
Offline First: Works without network connectivity
# Using Nix (recommended)
nix develop
mix setup
# Or manually
mix deps.get
mix assets.setup
mix assets.build# Development server
mix phx.server
# Or with Just
just dev
# Production release
just releaseThen open http://localhost:4000 in your browser.
-
Drop Files: Place
.fhifiles in your Downloads folder (or configured watch directory) -
Review: Files appear automatically in the eTMA Handler interface
-
Mark: Use the marking grid to assign grades and feedback
-
Export: Generate graded
.docxfiles for return to students
| Component | Technology |
|---|---|
Language |
Elixir 1.14+ / OTP 25+ |
Web Framework |
Phoenix 1.7 + LiveView |
HTTP Server |
Bandit |
Database |
CubDB (embedded) |
Frontend |
Tailwind CSS + Alpine.js |
Packaging |
Burrito (cross-platform binaries) |
File Parsing |
SweetXml |
Security |
Argon2id, XChaCha20-Poly1305 |
lib/
├── etma_handler/ # Core business logic
│ ├── application.ex # OTP Application
│ ├── assignments/ # Assignment CRUD
│ ├── marking/ # Marking logic
│ ├── parser/ # .fhi and .docx parsing
│ └── watcher/ # File system watcher
├── etma_handler_web/ # Phoenix web layer
│ ├── controllers/ # HTTP controllers
│ ├── live/ # LiveView modules
│ ├── components/ # UI components
│ └── router.ex # Routes
└── etma_handler.ex # Public APIConfiguration is managed through config/:
# config/config.exs
config :etma_handler,
watch_directory: System.get_env("ETMA_WATCH_DIR", "~/Downloads"),
storage_path: System.get_env("ETMA_DATA_DIR", "~/.local/share/etma_handler"),
auto_backup: true# Development build
just build
# Release build
just release
# Cross-platform binaries (via Burrito)
just release-all# Run all tests
just test
# With coverage
just test-coverage
# Specific test
mix test test/etma_handler/parser_test.exsBurrito creates self-contained binaries:
# Build for current platform
just release
# Build for all platforms
just release-all
# Output in _build/burrito/See CONTRIBUTING.adoc for guidelines.
MIT License - see LICENSE.txt for details.
See SECURITY.md for security policies and vulnerability reporting.