GDPR-compliant document anonymization, consent management, and metadata enrichment for Nextcloud
DocuDesk adds GDPR-safe document processing to Nextcloud. It anonymizes sensitive documents using AI-powered PII detection, tracks publication consent periods under the Dutch Wet Open Overheid (WOO), generates PDF documents from Twig templates, and automatically enriches document metadata — all without sending data to external cloud services.
Requires: OpenRegister — all data is stored as OpenRegister objects (no own database tables).
![]() |
![]() |
![]() |
| Dashboard | Anonymization | Consent Management |
- Local Processing Pipeline — All text extraction, entity recognition, and anonymization runs on your own instance; no data leaves your premises
- 3-Step Workflow — Upload, review detected entities, anonymize; inspect identified PII before committing
- Named Entity Recognition — Detect names, addresses, BSN numbers, and other sensitive data via Presidio / OpenAnonymiser
- Risk Level Assessment — Automatic risk classification per document using configurable thresholds
- Batch Processing — Process multiple documents in a single operation
- Objection Period Tracking — Enforce the minimum 4-week publication objection period required by the Wet Open Overheid
- Consent Lifecycle — Track each document through intake, objection period, consent decision, and publication
- Consent Dashboard — At-a-glance statistics on pending objection periods, decisions, and recent activity
- Audit Trail — Full history of every consent decision and status change
- PDF Generation — Create PDF documents from structured data using mPDF
- Twig Templates — Define reusable document templates with Twig syntax
- Metadata Enrichment — Automatic language detection, keyword extraction, and topic classification on upload
- OpenRegister Events — Listens to
ObjectCreated,ObjectUpdated, andObjectDeletedevents for automated enrichment - Nextcloud Dashboard Widgets —
AnonymizationWidgetandFileEntitiesWidgetfor quick overviews - Admin Settings — Configure register/schema bindings, consent period duration, and enrichment toggles
graph TD
A[Vue 2 Frontend] -->|REST API| B[PHP Controllers]
B --> C[AnonymizationService]
B --> D[ConsentService]
B --> E[MetadataService]
C --> F[OpenRegister TextExtractionService]
C --> G[Presidio / OpenAnonymiser]
D --> H[OpenRegister ObjectService]
E --> F
I[OpenRegister Events] -->|ObjectCreated/Updated| E
J[Nextcloud Files] --> C
| Object | Description |
|---|---|
| PublicationConsent | Consent record with objection period, notification, and decision |
| File | Nextcloud file with extracted metadata (language, keywords, entities, risk level) |
| Entity | Detected sensitive data point (person name, address, BSN, etc.) |
docudesk/
├── appinfo/ # Nextcloud app manifest, routes, navigation
├── lib/ # PHP backend — controllers, services, event listeners, widgets
│ ├── Controller/ # Anonymization, Consent, Metadata, Settings, Dashboard
│ ├── Service/ # AnonymizationService, ConsentService, MetadataService
│ ├── EventListener/ # OpenRegister object event integration
│ └── Dashboard/ # Nextcloud Dashboard widget definitions
├── src/ # Vue 2 frontend — components, Pinia stores, views
│ ├── views/ # Dashboard, anonymization, consent, settings
│ └── store/ # Pinia stores (consent, anonymization)
├── docs/ # Feature specs, architecture, API documentation
├── img/ # App icons and screenshots
├── l10n/ # Translations (en, nl)
└── website/ # Docusaurus documentation site (docudesk.app)
| Dependency | Version |
|---|---|
| Nextcloud | 28 – 33 |
| PHP | 8.1+ |
| OpenRegister | latest |
| Presidio / OpenAnonymiser | optional — for AI-powered entity recognition |
- Go to Apps in your Nextcloud instance
- Search for DocuDesk
- Click Download and enable
OpenRegister must be installed first. Install OpenRegister
cd /var/www/html/custom_apps
git clone https://github.com/ConductionNL/docudesk.git
cd docudesk
npm install
npm run build
composer install
php occ app:enable docudeskdocker compose -f openregister/docker-compose.yml up -d
# With AI services (Presidio, OpenAnonymiser):
docker compose -f openregister/docker-compose.yml --profile ai up -dcd docudesk
npm install
npm run dev # Watch mode
npm run build # Production build# PHP
composer phpcs # Check coding standards
composer cs:fix # Auto-fix issues
composer phpmd # Mess detection
composer phpmetrics # HTML metrics report
# Frontend
npm run lint # ESLint
npm run stylelint # CSS linting| Layer | Technology |
|---|---|
| Frontend | Vue 2.7, Pinia, @nextcloud/vue |
| Build | Webpack 5, @nextcloud/webpack-vue-config |
| Backend | PHP 8.1+, Nextcloud App Framework |
| Data | OpenRegister (PostgreSQL JSON objects) |
| mPDF 8 | |
| Templates | Twig 3 |
| NLP | Presidio, OpenAnonymiser (optional) |
| Quality | PHPCS, PHPMD, phpmetrics, ESLint, Stylelint |
Full documentation is available at docudesk.app
| Page | Description |
|---|---|
| Architecture | Technical architecture and design decisions |
| Features | Per-feature specification documents |
| API | REST API and integration documentation |
- GDPR / AVG: Privacy-by-design; all processing happens locally, no external cloud
- Wet Open Overheid (WOO): Enforces the mandatory 4-week publication objection period
- Rijksoverheid Data Sovereignty: 100% local processing — sensitive documents never leave your instance
- Accessibility: WCAG AA (Dutch government requirement)
- Authorization: RBAC via OpenRegister
- Audit trail: Full change history on all objects
- Localization: English and Dutch
- OpenRegister — Object storage layer (required dependency)
- OpenCatalogi — Publish anonymized documents in open catalogs
- Procest — Case management for document-related processes
EUPL-1.2
Built by Conduction — open-source software for Dutch government and public sector organizations.


