README.md
May 29, 2026 Β· View on GitHub
Important
π This repository has moved to Codeberg
Active development now happens at https://codeberg.org/Conduction/opencatalogi.
This GitHub mirror is read-only β issues, pull requests, and new commits should go to Codeberg.
Update your remote with: git remote set-url origin https://codeberg.org/Conduction/opencatalogi
OpenCatalogi
Publication management and catalog federation for Nextcloud β publish, discover, and share open data across organizations
OpenCatalogi turns Nextcloud into a publication platform for open data and government transparency. Create catalogs, manage publications with metadata and attachments, and federate them across organizations so that citizens, businesses, and other government entities can discover and access public information. The app supports the Dutch WOO (Open Government Act) and follows Common Ground principles for interoperability.
It connects to a federated directory of other OpenCatalogi instances, enabling cross-organization search and discovery without centralized infrastructure. A public-facing frontend can be deployed separately for citizen access, while administrators manage everything from within Nextcloud.
Requires: OpenRegister β all data is stored as OpenRegister objects (no own database tables).
Screenshots
![]() |
![]() |
![]() |
| Dashboard | Publications | Catalog |
Features
Publication Management
- Create & Edit Publications β Rich metadata editor for publications including title, summary, category, portal URL, and custom fields
- Attachments β Upload documents, images, and other files to publications with automatic metadata extraction
- Publication Status β Track publications through draft, published, and archived states
- Bulk Operations β Manage multiple publications at once with batch actions
- Download & Export β Generate downloadable packages of publications and their attachments
Catalog Federation
- Multiple Catalogs β Create and manage separate catalogs for different domains or departments (e.g., WOO documents, software, datasets)
- Federated Directory β Register your catalogs in a shared directory so other organizations can discover and subscribe to them
- Listings β Subscribe to external catalogs and synchronize their publications into your local search index
- Cross-Organization Search β Query publications across all federated catalogs from a single search interface
- Directory Sync β Background cron job keeps federated listings up to date automatically
Search & Discovery
- Faceted Search β Filter publications by category, organization, catalog, date range, and custom metadata fields
- Full-Text Search β Search across publication content and attached documents
- ElasticSearch Support β Optional ElasticSearch backend for high-performance search at scale
- Public Search API β RESTful endpoints for external frontends and third-party integrations
Content Management
- Pages β Create static content pages (about, contact, FAQ) served through the public API
- Menus β Define navigation menus for the public-facing frontend
- Glossary β Maintain a glossary of terms with definitions, shown alongside publications
- Themes β Configure visual themes for the public frontend with colors, logos, and styling
WOO Compliance
- Publication Categories β Predefined categories aligned with WOO information categories (decisions, reports, advice, etc.)
- Metadata Standards β Structured metadata following Dutch government open data standards
- Sitemap Generation β Automatic sitemaps per catalog and category for search engine indexing
- Robots.txt β Configurable robots.txt for controlling crawler access
Administration
- Organization Management β Configure the publishing organization with contact details and branding
- Settings Panel β Centralized admin settings for storage, publishing rules, and federation behavior
- Manual Import β Bulk import publications from external sources via the admin interface
- Version Info β View app version and configuration status from the settings page
Architecture
graph TD
A[Vue 2 Frontend] -->|REST API| B[OpenCatalogi Backend]
B --> C[OpenRegister API]
C --> D[(PostgreSQL JSON store)]
B --> E[Federation Directory]
E -->|sync| F[External OpenCatalogi Instances]
B --> G[ElasticSearch β optional]
H[Public Frontend β Tilburg WOO UI] -->|Public API| B
B --> I[Nextcloud Activity]
Data Model
| Object | Description | Standard |
|---|---|---|
| Publication | Core metadata wrapper for published information β title, summary, category, status | DCAT-AP |
| Attachment | File or document linked to a publication with its own metadata | DCAT Distribution |
| Catalogue | A named collection of publications with its own slug, organization, and settings | DCAT Catalog |
| Organisation | The publishing organization with contact info, logo, and branding | Schema.org Organization |
| Listing | A subscription to an external catalog from the federated directory | β |
Data standards: DCAT-AP (EU metadata), Schema.org, WOO information categories.
Directory Structure
opencatalogi/
βββ appinfo/ # Nextcloud app manifest, routes, navigation
βββ lib/ # PHP backend
β βββ Controller/ # REST API controllers (publications, catalogi, search, federationβ¦)
β βββ Service/ # Business logic (catalog, directory, publication, search, download)
β βββ Cron/ # Background jobs (DirectorySync, Broadcast)
β βββ Flow/ # Nextcloud Flow integration
β βββ Listener/ # Event listeners
β βββ Settings/ # Admin settings panel
βββ src/ # Vue 2 frontend β components, Pinia stores, views
β βββ catalogi/ # Catalog management views
β βββ publications/ # Publication editor and list views
β βββ search/ # Search interface
β βββ directory/ # Federation directory management
β βββ themes/ # Theme configuration
β βββ store/ # Pinia stores per entity
β βββ views/ # Route-level views
βββ docs/ # Documentation (users, admins, developers, schemas)
βββ img/ # App icons and screenshots
βββ docusaurus/ # Product documentation site (documentatie.opencatalogi.nl)
Requirements
| Dependency | Version |
|---|---|
| Nextcloud | 28 -- 33 |
| PHP | 8.1+ |
| PostgreSQL / MySQL 8+ / SQLite | β |
| OpenRegister | latest |
| System Cron | required for federation sync |
Installation
From the Nextcloud App Store
- Go to Apps in your Nextcloud instance
- Search for OpenCatalogi
- Click Download and enable
OpenRegister must be installed first. The app will attempt to install it automatically, or you can install OpenRegister manually.
From Source
cd /var/www/html/custom_apps
git clone https://github.com/ConductionNL/opencatalogi.git
cd opencatalogi
composer install --no-dev
npm install
npm run build
php occ app:enable opencatalogi
Development
Start the environment
docker compose -f openregister/docker-compose.yml up -d
To include the public frontend (Tilburg WOO UI):
docker compose -f openregister/docker-compose.yml --profile ui up -d
Frontend development
cd opencatalogi
npm install
npm run dev # One-time build (development mode)
npm run watch # Watch mode with auto-rebuild
npm run build # Production build
Code quality
# PHP
composer phpcs # Check coding standards
composer cs:fix # Auto-fix PHPCS issues
composer phpmd # Mess detection
composer psalm # Static analysis
composer phpmetrics # HTML metrics report
# Frontend
npm run lint # ESLint
npm run stylelint # CSS linting
# Full check (all tools)
composer check:strict # Runs lint, phpcs, phpmd, psalm, phpstan, tests
Tech Stack
| 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) |
| Search | ElasticSearch 8 (optional), SQL full-text (default) |
| mPDF for document generation | |
| Templates | Twig for content rendering |
| Quality | PHPCS, PHPMD, Psalm, PHPStan, phpmetrics, ESLint, Stylelint |
Documentation
Full documentation is available at documentatie.opencatalogi.nl
| Section | Description |
|---|---|
| User Guide | Publishing, searching, and managing publications |
| Administrator Guide | Catalog setup, directory configuration, themes, and metadata |
| Developer Guide | Local development setup, architecture, and API reference |
| Installation | On-premise, SaaS, and upgrade instructions |
| Schemas | JSON Schema definitions for publications, catalogs, and attachments |
Standards & Compliance
- Metadata standard: DCAT-AP (EU) for publication metadata interoperability
- WOO compliance: Publication categories aligned with Dutch Open Government Act requirements
- Common Ground: Follows Common Ground principles for federated, reusable government IT
- Accessibility: WCAG AA (Dutch government requirement)
- Authorization: RBAC via OpenRegister with organization-based multitenancy
- Federation: Decentralized directory protocol for cross-organization catalog sharing
- Localization: Dutch and English
Related Apps
- OpenRegister -- Object storage layer (required dependency)
- OpenConnector -- API gateway for importing data from external sources
- NL Design -- Design token theming for Dutch government styling
- DocuDesk -- Document generation from publication data
- Softwarecatalog -- GEMMA software catalog built on OpenCatalogi
License
This project is licensed under the EUPL-1.2.
Dependency license policy
All dependencies (PHP and JavaScript) are automatically checked against an approved license allowlist during CI. The following SPDX license families are approved for use in dependencies:
- Permissive: MIT, ISC, BSD-2-Clause, BSD-3-Clause, 0BSD, Apache-2.0, Unlicense, CC0-1.0, CC-BY-3.0, CC-BY-4.0, Zlib, BlueOak-1.0.0, Artistic-2.0, BSL-1.0
- Copyleft (EUPL-compatible): LGPL-2.0/2.1/3.0, GPL-2.0/3.0, AGPL-3.0, EUPL-1.1/1.2, MPL-2.0
- Font licenses: OFL-1.0, OFL-1.1
Dependencies with licenses not on this list will fail CI unless explicitly approved in .license-overrides.json with a documented justification.
Authors
Built by Conduction and Acato -- open-source software for Dutch government and public sector organizations.


