- TypeScript 81.1%
- Vue 12.5%
- Python 3.2%
- CSS 2.2%
- JavaScript 0.7%
- Other 0.3%
A save with a non-empty changeDescription but no content changes and no forceNewVersion previously skipped the cheap cachedState-only path and minted a permanent, empty assessment_versions row. An editor could script this to grow the shared table without bound. Gate the cheap path on !forceNewVersion instead of !changeDescription: a changeDescription alone no longer creates a version; an explicit empty checkpoint must go through forceNewVersion, which is owner-gated (isRestore). A labeled save with real edits still creates a distinct (non-consolidated) version. |
||
|---|---|---|
| .claude | ||
| .claude-plugin | ||
| .github | ||
| apps | ||
| containers | ||
| docs | ||
| packages/assessment-core | ||
| schemas | ||
| script | ||
| scripts | ||
| sources | ||
| tests/e2e | ||
| .containerignore | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .prettierrc.json | ||
| CHANGELOG.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| DCO.md | ||
| eslint.config.ts | ||
| LICENSE | ||
| LICENSES.txt | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| publiccode.yaml | ||
| pyproject.toml | ||
| README.md | ||
| SECURITY.md | ||
| uv.lock | ||
PAR Assessments
Webapplicatie voor het uitvoeren van Pre-scan-, DPIA- en IAMA-assessments, volgens het Rijksmodel DPIA en het IAMA (Impact Assessment Mensenrechten en Algoritmes) van de Nederlandse overheid. Gebouwd met het RVO component library.
Kenmerken
- Pre-scan, DPIA en IAMA invullen in de browser als losstaande applicatie
- Samenwerken aan Pre-scans, DPIA's en IAMA's via Invulhulpen:
- Samenwerken aan assessments met meerdere gebruikers
- Projectbeheer met rollen (eigenaar, bewerker, kijker)
- Voortgang opslaan en later hervatten
- PDF-export van ingevulde assessments
Architectuur
pnpm monorepo:
| Package | Omschrijving |
|---|---|
packages/assessment-core |
Gedeelde assessment-engine: formulierweergave, navigatie, validatie, PDF-export |
apps/boekhouding-frontend |
Vue 3 SPA — projectbeheer, samenwerken, Keycloak-login |
apps/boekhouding-backend |
Fastify REST API — PostgreSQL, JWT-authenticatie |
apps/standalone-form |
Standalone formulier — draait zonder backend, exporteert als single HTML |
sources/ |
YAML-bronbestanden voor Pre-scan-, DPIA- en IAMA-assessments |
Technologie
- Frontend: Vue 3 (Composition API), TypeScript, Vite, Pinia
- Backend: Fastify 5, Drizzle ORM, PostgreSQL 17
- Auth: Keycloak (OIDC), JWT-verificatie via
jose - Styling: RVO Design System
- Standalone: Vite single-file build — alles (HTML, CSS, JS) in één bestand
- PDF: pdfmake
Aan de slag
Vereisten
- Volledige stack: Podman of Docker
- Standalone formulier: Node.js 22+ en pnpm (via
corepack enable)
Volledige stack
Start PostgreSQL, Keycloak en de applicatie met één commando. Wil je alleen een formulier invullen zonder backend? Zie Standalone formulier.
podman compose -f containers/compose.dev.yaml up -d
pnpm db:seed # testdata laden (idempotent)
| Service | URL |
|---|---|
| Frontend | http://localhost:5174 |
| Backend API | http://localhost:3000 |
| Standalone formulier | http://localhost:5175 |
| Keycloak admin | http://localhost:8080 (admin / admin) |
Testgebruikers: sam@example.com / welkom123, noor@example.com / welkom123
De seed maakt drie projecten aan (een pre-scan met antwoorden, een DPIA met versiegeschiedenis, en een leeg project) gekoppeld aan de testgebruikers. Database-migraties draaien automatisch bij het starten van de backend container.
Standalone formulier
Voor ontwikkeling zonder backend (vereist Node.js 22+ en pnpm):
corepack enable
pnpm install
pnpm dev
Bouwen
pnpm build:standalone # Standalone HTML-bestand
pnpm build:backend # Backend
pnpm build:frontend # Frontend
Commando's
| Commando | Omschrijving |
|---|---|
pnpm dev |
Start standalone formulier |
pnpm dev:backend |
Start backend (vereist PostgreSQL) |
pnpm dev:frontend |
Start frontend |
pnpm db:generate |
Genereer database-migraties |
pnpm db:migrate |
Voer migraties uit |
pnpm db:seed |
Vul database met testdata (idempotent) |
pnpm lint |
Lint de code |
Assessment-bronbestanden
De sources/ directory bevat de assessment-definities in YAML:
| Bestand | Omschrijving |
|---|---|
prescan.yaml |
Pre-scan DPIA-definitie |
dpia.yaml |
Volledige DPIA-definitie |
iama.yaml |
IAMA-definitie |
begrippenkader_dpia.yaml |
Begrippenlijst met tooltips |
begrippenkader_iama.yaml |
Begrippenlijst IAMA / Algoritmekader |
YAML verwerken
Vereist uv (Python package manager).
# Valideer en genereer JSON voor standalone formulier
uv run script/run_all.py \
--schema schemas/assessment-definition.v1.schema.json \
--source sources/dpia.yaml \
--begrippen-yaml sources/begrippenkader_dpia.yaml \
--output-json form-app/src/assets/DPIA.json \
--output-md docs/questions/questions_DPIA.md
Domeinkennis-plugin (AI-assistent)
Voor ontwikkelaars en redacteuren die in de editor (Claude Code / Cursor) aan déze repo werken is er een Claude-plugin met domeinkennis over de assessment-definities: schema's, begrippenkaders, RVO-styling en een validatie-agent. Het is een hulpmiddel bij het bouwen en onderhouden van de definities en applicatie — niet een invul-assistent voor eindgebruikers die een pre-scan, DPIA of IAMA uitvoeren.
Installeren:
/plugin marketplace add MinBZK/par-dpia-form
/plugin install assessments@assessment-tools
Zie het ontwerp en de verantwoording van de marketplace en plugin.
Standaarden en compliance
Invulhulpen conformeert aan de volgende overheidsstandaarden:
| Standaard | Status |
|---|---|
| NL GOV API Design Rules | URI-versioning (/api/v1/), application/problem+json, security headers, API-Version header |
| WCAG 2.2 AA | Gedeeltelijk — actieve verbetering, zie toegankelijkheidsverklaring |
| BIO2 | JWT audience-validatie, rate limiting, input-validatie, security headers |
| AVG / GDPR | Dataminimalisatie, RBAC, auditlog, privacyverklaring |
| EUPL-1.2 | Open source licentie conform open-tenzij beleid |
Privacy en gegevensverwerking
Zie docs/gegevensverwerking.md voor een overzicht van verwerkte persoonsgegevens, rechtsgrond en bewaartermijnen.
Documentatie
- Product Decision Records — productbeslissingen en achtergrond
- Gegevensverwerking — privacy en dataminimalisatie