New to Claude Skills? Learn how to install them →

jeremylongshore on GitHub

PortalJS DCAT Integration

Free

Make your PortalJS portal harvestable by open data catalogs.

Get this skill

Free · Opens the source repo

What PortalJS DCAT Integration does

PortalJS DCAT Integration is designed to transform an existing PortalJS portal into a compliant data catalog suitable for harvesting by national and international open data portals. By leveraging the Data Catalog Vocabulary (DCAT), this skill enables the emission of standards-compliant DCAT catalog feeds in multiple formats including JSON-LD, Turtle, and RDF/XML. This process occurs at build time, ensuring that your datasets are readily accessible to external catalogs such as data.europa.eu and data.gov without requiring additional runtime configurations.

The skill operates by selecting one or more DCAT application profiles and mapping the metadata of each dataset accordingly. It requires a scaffolded PortalJS portal with specific files in place, including datasets.json and lib/metadata/. Furthermore, users must ensure that the DCAT core is already integrated into their portal. Once set up, the skill generates static feed files and performs conformance checks to validate that the emitted feeds meet the necessary standards.

This tool is particularly useful for developers and data managers who need to publish datasets in a way that aligns with open data initiatives. It simplifies the process of preparing datasets for harvesting, allowing users to focus on content rather than compliance. With built-in error handling and validation steps, users can quickly identify and resolve issues during the setup and build process, ensuring a smooth transition to a harvestable data catalog.

Whether you're working with EU, US, or national profiles, PortalJS DCAT Integration provides a robust solution for making your datasets discoverable and interoperable across various open data platforms.

When to use it

Use this skill when you have a PortalJS portal and need to make its datasets harvestable by open data platforms like data.europa.eu or data.gov.

When not to use it

This skill is not suitable for portals that do not have the required metadata structure or for datasets that do not need to comply with DCAT standards.

What you can build with it

EU Data Portal Compliance

Use this skill to prepare your PortalJS portal for harvesting by the EU's open data portal, ensuring compliance with DCAT-AP.

US Federal Data Harvesting

Implement this skill to enable your datasets to be harvested by US federal open data catalogs, adhering to DCAT-US standards.

Multi-Profile Data Cataloging

Utilize this skill to generate multiple DCAT feeds from a single PortalJS portal, accommodating various national profiles.

How to install PortalJS DCAT Integration

View source

1. Install with the skills CLI

npx skills add jeremylongshore/claude-code-plugins-plus-skills/portaljs-add-dcat --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by jeremylongshore

PortalJS — Add DCAT

Overview

Turn an existing PortalJS (portaljs-catalog) portal into a harvestable data catalog. PortalJS is Frictionless-native — a dataset is a Data Package (see portaljs-define-schema) — and DCAT is the serialization + harvest layer on top (lib/metadata/dcat.ts + lib/metadata/dcat-profiles.ts). This skill selects one or more DCAT application profiles, maps every dataset's metadata to them, and writes static feed files at build time — JSON-LD, Turtle, and RDF/XML — so external catalogs (data.europa.eu, data.gov, national portals) can harvest the datasets automatically, on any static host, with no runtime.

Prerequisites

  • A scaffolded PortalJS portal with datasets.json, package.json, and lib/metadata/ (the metadata-profile contract) present.
  • lib/metadata/dcat.ts (the DCAT-3 core) already in place — profiles augment it.
  • Node 18+ and npm available in the portal directory.
  • For DCAT-AP / DCAT-US: a publishing organization (name + homepage) and a contact (name + email) — both profiles require dct:publisher and dcat:contactPoint.
  • Optional but recommended: network access to run SHACL conformance checks against the official EU ITB validator or pyshacl.

Instructions

The canonical, full step-by-step workflow is .claude/commands/portaljs-add-dcat.md — the single source of truth. Read and follow it when executing. Summary:

  1. Gather input from $ARGUMENTS (interview if thin): portal directory (default .), profiles (default ["dcat-3"]), site URL, publisher, contact, license, themes, languages, access level.
  2. Validate the portal directory: confirm datasets.json, package.json, and lib/metadata/ exist; stop with an ERROR: if the metadata contract is missing.
  3. Ensure the DCAT profile layer is present — dcat-profiles.ts, dcat-rdf.ts, dcat-validate.ts — copying canonical versions from examples/portaljs-catalog if the portal predates this skill.
  4. Ensure scripts/generate-dcat.ts is wired to predev/prebuild and emits per-profile x serialization feeds from dcat.config.json.
  5. Write dcat.config.json with the gathered profiles, publisher, contact, license, themes, and access level.
  6. Add feed autodiscovery: a <link rel="alternate" type="application/ld+json"> to pages/_document.tsx pointing at /catalog.jsonld.
  7. Generate the feeds and check conformance: run npm run generate:dcat and surface any missing mandatory fields.
  8. Verify the RDF: confirm the JSON-LD parses, and cross-check that JSON-LD, Turtle, and RDF/XML agree; run SHACL validation (ITB for DCAT-AP, pyshacl for DCAT-US) when network/tooling allow.
  9. Verify the build with npx next build; fix errors before reporting success.
  10. Report the profiles emitted, feed paths, conformance status, and next steps (register with the harvester, run portaljs-deploy).

Output

  • Created/modified: dcat.config.json (committed config).
  • Generated (build artifacts, gitignored): public/catalog.jsonld /.ttl/.rdf (canonical feed), public/catalog.<profile>.{jsonld,ttl,rdf} per configured profile, public/catalog-feeds.json (feed index).
  • Modified: pages/_document.tsx (autodiscovery <link>), package.json (generate:dcat script wired to predev/prebuild).
  • Verified: feeds are valid JSON-LD/Turtle/RDF-XML, conformance status reported, npx next build passes.

Error Handling

SymptomCauseFix
NO_METADATA_CONTRACTlib/metadata/ not foundPortal predates the metadata-profile contract; scaffold with portaljs-new-portal or add lib/metadata first.
NO_DCAT_CORElib/metadata/dcat.ts not foundThe DCAT-3 core is missing; update the portal template before adding profiles.
BAD_CONFIGdcat.config.json is not valid JSONFix the syntax and re-run npm run generate:dcat.
UNKNOWN_PROFILEProfile id not in the registryUse one of dcat-2, dcat-3, dcat-ap, dcat-us, geodcat-ap, croissant, dcat-ap-se, dcat-ap-ch, dcat-ap-de, or register a national profile first.
Feed flagged non-conformantpublisher/contactPoint missing for DCAT-AP or DCAT-USAsk the user for the publishing organization and contact, add to dcat.config.json, regenerate.
DCAT-US SHACL rejects the publisherPublisher has no IRI (blank node)Set publisher.uri (or homepage) in dcat.config.json.
next build fails after config changeMalformed JSON in dcat.config.json or datasets.jsonPrint the build log, fix the JSON, rebuild before reporting success.

Examples

Example 1 — Default DCAT-3 feed, no national harvesting

/portaljs-add-dcat

Emits the canonical public/catalog.jsonld/.ttl/.rdf under the default dcat-3 profile, adds autodiscovery to _document.tsx, and wires generate:dcat into predev/prebuild. No publisher/contact required.

Example 2 — EU harvesting via DCAT-AP

/portaljs-add-dcat profiles=dcat-ap site=https://data.example.org

Prompts for publisher (name + homepage) and contact (name + email) since DCAT-AP requires both, writes them into dcat.config.json, and emits public/catalog.dcat-ap.{jsonld,ttl,rdf} plus the canonical feed with absolute links.

Example 3 — US federal harvesting via DCAT-US

/portaljs-add-dcat profiles=dcat-us site=https://data.example.gov

Requires an IRI-identified publisher (publisher.uri) for SHACL conformance; emits catalog.dcat-us.{jsonld,ttl,rdf} and validates against the DCAT-US 3.0 SHACL shapes with pyshacl when available.

Example 4 — Multiple profiles plus a national extension

/portaljs-add-dcat profiles=dcat-ap,dcat-ap-de site=https://daten.example.de

Emits both catalog.dcat-ap.* and catalog.dcat-ap-de.* feeds from one config; the first profile listed also becomes the canonical, un-suffixed catalog.jsonld/.ttl/.rdf.

Resources

Frequently asked questions about PortalJS DCAT Integration

Similar skills