UPS e-Recruit is a secure, campaign-driven PWA for end-to-end Uganda Prisons Service recruitment, supporting online applications, OCR-assisted document verification, offline interview operations, scoring, ranking, quotas, medicals, selection, training intake, reporting, and audit trails.
# Uganda Prisons Service e-Recruit
UPS e-Recruit is a secure, campaign-configurable recruitment platform.
## Architecture
- `apps/api`: Laravel 13 modular application/API, PostgreSQL persistence, Redis cache/queue, private S3-compatible documents, Sanctum tokens, MFA, scoped RBAC, append-only hash-chained audit.
- `apps/web`: Vue 3 + TypeScript installable PWA for applicants and staff, including controlled offline field queues in IndexedDB.
- `services/document-worker`: bounded Python 3.12 FastAPI worker for document decoding, quality checks, deskewing, OCR, confidence, boxes and extracted fields. OCR is assistive and never an automatic rejection authority.
- `infra`: Nginx and operational scripts.
- `docs`: architecture, security, operations, acceptance and go-live evidence.
The supplied `Resources/logo.png` is the official in-app logo. Square favicon/PWA assets are derived from it under `apps/web/public/icons`.
## Development quick start
Requirements: Docker Desktop with Compose v2. The root ports are configurable in `.env.example`.
```sh
cp .env.example .env
cp apps/api/.env.example apps/api/.env
docker compose build
docker compose up -d
docker compose exec api php artisan key:generate --force
docker compose exec api php artisan migrate --seed --force
```
Open `
localhost`. Mailpit is at `
localhost` and MinIO development console at `
localhost`.
Demo staff accounts are disabled by default. For an isolated development database only, set `SEED_DEMO_USERS=true` in `apps/api/.env`, reseed, and immediately change the documented development-only password `ChangeMe!2026`. Privileged demo accounts still require MFA enrolment on first login.
## Quality gates
```sh
docker compose exec api php artisan test
docker compose exec api php vendor/bin/pint --test
docker compose exec web npm test
docker compose exec web npm run build
docker compose exec document-worker ruff check .
docker compose exec document-worker pytest -q
```
Run b …