A web tool for Curtin University academics to audit unit assessments against the UDL Guidelines 3.0, framed around the Assessment 2030 (A2030) initiative.
Built as a prototype for an iSoLT grant collaboration with Luke (Teaching Support, Curtin University).
- Add assessments - describe your unit's assessments (Written Report, Portfolio, Interactive Oral, etc.) with optional brief upload (PDF or DOCX)
- Review checkpoints - AI pre-fills a UDL rating for each checkpoint based on your brief; you verify or override each rating
- See results - radar chart across 6 UDL dimensions, quick wins, longer-term improvements, and a downloadable PDF report
No login. No database. Session state only.
- Next.js 15 (App Router)
- TypeScript
- Tailwind CSS
- @react-pdf/renderer - client-side PDF generation
- Claude API (
claude-sonnet-4-6) - server-side only
npm install
cp .env.example .env.local # add your ANTHROPIC_API_KEY
npm run devOpen http://localhost:3000.
The whole app can also be built as one downloadable HTML file with no server at all - useful for workshops, or for running fully locally with Ollama:
npm run build:standalone # -> standalone-dist/udl-lens.htmlOpen the file in a browser (or host it anywhere static), click the ⚙ button, and pick a provider:
- Anthropic - your own API key; reads PDF briefs natively
- OpenAI-compatible - OpenAI, OpenRouter, or any
/v1/chat/completionsendpoint - Ollama - fully local; nothing leaves your machine. Optional bearer token covers proxied/remote Ollama setups.
Keys are stored only in the browser's local storage. Notes for Ollama: start it
with OLLAMA_ORIGINS="*" so the page can call it, and pull a model first
(e.g. ollama pull qwen3:8b). With non-Anthropic providers, PDF briefs are
parsed to text in the browser (scanned PDFs without a text layer need
Anthropic).
To hack on the standalone build: npm run dev:standalone, then open
http://localhost:5173/standalone/index.html.
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY |
Yes | Anthropic API key - get one at console.anthropic.com |
ANTHROPIC_MODEL |
No | Default model for all routes (default: claude-sonnet-4-6) |
EXTRACT_MODEL |
No | Model for brief extraction - Haiku is fine and cheaper |
PREFILL_MODEL |
No | Model for checkpoint pre-fill - test Haiku vs Sonnet |
SUGGESTIONS_MODEL |
No | Model for suggestions - Sonnet recommended |
TRUSTED_PROXY_HOPS |
No | Trusted reverse-proxy hops (default 1). Rate limit reads the X-Forwarded-For entry hops from the end so it can't be spoofed. Set 0 if you expose the port directly. |
Per-route vars take precedence over ANTHROPIC_MODEL. Omit them to use the default.
Node.js (any VPS, Railway, Render, etc.):
npm run build
npm startDocker (VPS or any host):
# 1. Grab the two files you need
curl -O https://raw.githubusercontent.com/michael-borck/udl-lens/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/michael-borck/udl-lens/main/.env.example
# 2. Add your API key
mv .env.example .env.local
nano .env.local # set ANTHROPIC_API_KEY=sk-ant-...
# 3. Run (pulls image automatically)
docker compose up -dOpen http://your-server:3000.
To update to the latest image: docker compose pull && docker compose up -d
No database, no migrations, no user accounts.
MIT - see LICENSE.