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 logo

OpenCatalogi

Publication management and catalog federation for Nextcloud β€” publish, discover, and share open data across organizations

Latest release License Code quality Documentation


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 with publication statistics and activity overview Publication list with metadata and status columns Catalog detail view with publications and settings
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

ObjectDescriptionStandard
PublicationCore metadata wrapper for published information β€” title, summary, category, statusDCAT-AP
AttachmentFile or document linked to a publication with its own metadataDCAT Distribution
CatalogueA named collection of publications with its own slug, organization, and settingsDCAT Catalog
OrganisationThe publishing organization with contact info, logo, and brandingSchema.org Organization
ListingA 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

DependencyVersion
Nextcloud28 -- 33
PHP8.1+
PostgreSQL / MySQL 8+ / SQLiteβ€”
OpenRegisterlatest
System Cronrequired for federation sync

Installation

From the Nextcloud App Store

  1. Go to Apps in your Nextcloud instance
  2. Search for OpenCatalogi
  3. 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

LayerTechnology
FrontendVue 2.7, Pinia, @nextcloud/vue
BuildWebpack 5, @nextcloud/webpack-vue-config
BackendPHP 8.1+, Nextcloud App Framework
DataOpenRegister (PostgreSQL JSON objects)
SearchElasticSearch 8 (optional), SQL full-text (default)
PDFmPDF for document generation
TemplatesTwig for content rendering
QualityPHPCS, PHPMD, Psalm, PHPStan, phpmetrics, ESLint, Stylelint

Documentation

Full documentation is available at documentatie.opencatalogi.nl

SectionDescription
User GuidePublishing, searching, and managing publications
Administrator GuideCatalog setup, directory configuration, themes, and metadata
Developer GuideLocal development setup, architecture, and API reference
InstallationOn-premise, SaaS, and upgrade instructions
SchemasJSON 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
  • 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.