Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
53c2f32
Display "Orders handled by this employee" view in table mode
namedgraph Aug 28, 2026
0371bef
Borrow order master-detail UI ideas from Power Apps Northwind sample
namedgraph Aug 29, 2026
a2eeaa7
Present Northwind as a business application rather than a data browser
namedgraph Aug 29, 2026
250b827
Resolve root.ttl links against the application base in check-links.sh
namedgraph Aug 29, 2026
170f3b5
Property URI fix
namedgraph Aug 29, 2026
8d14efd
Model Northwind prices and deliveries with in-domain schema.org terms
namedgraph Aug 29, 2026
f946816
Put orderStatus, line totals and dispatch dates to work on the front …
namedgraph Aug 30, 2026
7a6fb5f
Stop dropping the one customer that has no postal code
namedgraph Aug 30, 2026
cd753a0
SKOS stylesheet cleanup
namedgraph Aug 30, 2026
85c2279
Document the ldh CLI, declarative packages and admin subdomain
namedgraph Aug 30, 2026
4e9403b
Update the app build examples to the current release
namedgraph Aug 30, 2026
7101ed8
Merge pull request #59 from AtomGraph/ft-northwind-traders-power-app
namedgraph Sep 2, 2026
95b2d1d
Sync docs with LinkedDataHub 5.9.0-5.11.0 and restructure the outline
namedgraph Sep 2, 2026
329c962
Render the static docs site with the LinkedDataHub design system
namedgraph Sep 2, 2026
218990b
Fix the default certificate path in the docs and packages installers
namedgraph Sep 2, 2026
b81aad6
Lean every docs example into the Northwind Traders case
namedgraph Sep 2, 2026
10eadbf
Replace the docs' media with typed visible placeholders
namedgraph Sep 2, 2026
4e29259
Embed live federated query blocks in the docs
namedgraph Sep 2, 2026
8db349a
Docs catch up with the 6.0 platform: ARIA tab groups, current XSLT id…
namedgraph Sep 3, 2026
818fb41
Alternative paths present as tab groups across the docs and demo apps
namedgraph Sep 3, 2026
081ea29
Enumerable facts trade their dash-lists for tables
namedgraph Sep 3, 2026
1fa05fd
Paired SPARQL examples stand as separate blocks, not columns in one pre
namedgraph Sep 3, 2026
3d6023b
XHTML literals return to canonical form so the docs validate again
namedgraph Sep 3, 2026
644746a
Canonical form is checked on its own, so Jena is free to move on
namedgraph Sep 3, 2026
7671913
Concept mappings link to the demo instance, where the concepts exist
namedgraph Sep 3, 2026
77118e3
The docs catch up with the design-system UI
namedgraph Sep 4, 2026
e1ffbf5
The docs follow the ldh verb-group renaming
namedgraph Sep 4, 2026
4ab28ca
The tutorial puts RDF files by name, letting the extension carry the …
namedgraph Sep 5, 2026
9f2a50a
The parameter table keeps only what a stylesheet may rely on
namedgraph Sep 6, 2026
4d5ecd0
History lives in Git alone, so SPARQL only ever sees the present
namedgraph Sep 6, 2026
90e50ab
The extension surface follows the bs2: clean break: the SKOS package …
namedgraph Sep 7, 2026
c4949d0
The stylesheet-override docs and the skos package track the platform'…
namedgraph Sep 8, 2026
2118416
Cities in a region show on a map, since every territory carries wgs84…
namedgraph Sep 9, 2026
5a3ebb8
The customers view carries its own title, so it never renders as an u…
namedgraph Sep 10, 2026
a2378b3
The documentation content and the static-site generator align with th…
namedgraph Sep 10, 2026
b3804f2
The docs track the design system's ldhc- to ac- class prefix rename.
namedgraph Sep 11, 2026
861794f
The package stylesheet stops importing the platform layout.
namedgraph Sep 11, 2026
06c9281
The SKOS ontology gains the views a taxonomy is navigated by, and a s…
namedgraph Sep 12, 2026
a099500
The SKOS package renders a concept tree in the content column.
namedgraph Sep 12, 2026
79a4c88
The SKOS hierarchy views read both assertion directions.
namedgraph Sep 12, 2026
abd4d48
The SKOS concept tree roots at the scheme.
namedgraph Sep 12, 2026
657f8e9
The SKOS concept tree renders in ReadMode alone.
namedgraph Sep 12, 2026
14977b4
The SKOS constructor declares its labels as rdf:langString.
namedgraph Sep 12, 2026
4b6a84e
The concept tree roots at the scheme and opens the path down to the c…
namedgraph Sep 12, 2026
cb98f3e
A concept is in its taxonomy's blocks whatever language it is labelle…
namedgraph Sep 12, 2026
b95dbcf
Lead paragraphs across the docs take the design system's own primitive
namedgraph Sep 12, 2026
20e6dc3
A package is named for what it does, and its stylesheet for the vocab…
namedgraph Sep 14, 2026
e9d4981
The documentation stylesheet stops dressing elements the design syste…
namedgraph Sep 14, 2026
5a0c2a6
Every reference table names itself, every header cell says what it he…
namedgraph Sep 14, 2026
bd95d25
The documentation stops contradicting itself about how a package is i…
namedgraph Sep 14, 2026
2de1c3c
The demo prose says what the data holds, and every container gets an …
namedgraph Sep 14, 2026
b23217d
Three definition lists that were really tables become tables, and six…
namedgraph Sep 14, 2026
4da9857
The tutorial's chart and view stop being hidden behind a tab.
namedgraph Sep 14, 2026
84badef
The dataspace example is a template, and federation says it works loc…
namedgraph Sep 14, 2026
de87a61
A screencast records a workflow being done, and leaves the page it wr…
namedgraph Sep 15, 2026
2445c87
Four rules a scene kept breaking, each fixed where it was assumed rat…
namedgraph Sep 15, 2026
811f543
Twenty-six empty placeholders become pictures, addressed by the hash …
namedgraph Sep 16, 2026
a59afd2
A shot is framed by its subject, and a run that writes brings its own…
namedgraph Sep 16, 2026
b8d8af0
How the documentation's pictures are taken is written down where the …
namedgraph Sep 16, 2026
c7f93be
Every view block carries a title, so it can be asked for by the name …
namedgraph Sep 16, 2026
8d4e49d
The scenes reach the app through its own controls, and the helpers le…
namedgraph Sep 16, 2026
724378b
What the scenes learned the hard way stops living in one person's head.
namedgraph Sep 16, 2026
b2fbb70
The probes that answered the questions, kept rather than retyped.
namedgraph Sep 16, 2026
701f181
Where a new row goes is worked out, not declared, and the docs say so.
namedgraph Sep 16, 2026
0e460c2
The taxonomy tree reports a failed load where it happened.
namedgraph Sep 16, 2026
34e5fb6
The Northwind model gives territories a constructor and lists what po…
namedgraph Sep 16, 2026
08cb603
Seven screencast scenes that open on their strongest state and close …
namedgraph Sep 16, 2026
365799e
The taxonomy package's aside rule contributes through ldh:RowHook ins…
namedgraph Sep 16, 2026
dc505c2
Every Northwind class that holds data gets a constructor.
namedgraph Sep 17, 2026
ca7a3ba
The docs describe the single-Fuseki, dataset-per-dataspace deployment…
namedgraph Sep 17, 2026
1dabce0
Merge pull request #61 from AtomGraph/ft-dataspace-datasets-docs
namedgraph Sep 17, 2026
5263e9f
The package README opens the value tier: a rule for the package's own…
namedgraph Sep 17, 2026
86af989
Supercut of one-gesture UI shots, and the scenes that feed it
namedgraph Sep 18, 2026
c1f6c5c
The supercut moves its camera instead of cutting. Every shot that con…
namedgraph Sep 20, 2026
ca28337
Three probes that answered this round's questions, kept: whether the …
namedgraph Sep 20, 2026
65182af
The retired vector mock's code, which the README already describes: t…
namedgraph Sep 20, 2026
ca0c71b
The probes behind the last two days' scenes, kept rather than retyped…
namedgraph Sep 20, 2026
59d795b
The type-query probe reads back the compose take's own query on its o…
namedgraph Sep 20, 2026
0626044
The docs catch up with LinkedDataHub 6.0.0. The CLI reference documen…
namedgraph Sep 20, 2026
416a7f1
Every app installs with the ldh CLI. install.sh is ldh admin make-pub…
namedgraph Sep 20, 2026
fcd5685
CLIENT_STYLESHEET joins the sef-compiler section: the client styleshe…
namedgraph Sep 20, 2026
415e78e
Taxonomy editor ontology update
namedgraph Sep 22, 2026
e506db5
Taxonomy editor ontology: every view hides while empty, and construct…
namedgraph Sep 23, 2026
f31fc28
Docs follow editable package ontologies.
namedgraph Sep 23, 2026
be67fce
Document conditional writes.
namedgraph Sep 25, 2026
a4711c2
Mark where the Import ontology form belongs.
namedgraph Sep 25, 2026
f93e660
Every demo, doc and package still spelled the namespaces the platform…
namedgraph Sep 25, 2026
1c2a7e3
Seventeen shots the rig could not take, and the three reasons it coul…
namedgraph Sep 25, 2026
39b38bb
Twenty-five documents told the reader to look at a screenshot that wa…
namedgraph Sep 25, 2026
9ba2316
The reader was told not to set two properties that no longer exist to…
namedgraph Sep 25, 2026
e1d79ec
The default triplestore was the one name on the page without a link t…
namedgraph Sep 25, 2026
f41bacc
Two version claims that 6.0 makes wrong, in opposite ways.
namedgraph Sep 25, 2026
3197a58
Every image reference said where the document sat, not where the file…
namedgraph Sep 25, 2026
84eb760
The shot that proves the override showed a page where the total was b…
namedgraph Sep 25, 2026
8c2dcf1
The last placeholder on the setup page was a terminal, and the harnes…
namedgraph Sep 26, 2026
0843019
ABS_PATH left the .env file, and the docs were still printing it.
namedgraph Sep 26, 2026
0ba9155
The version dropdown still called the current documentation v5.
namedgraph Sep 26, 2026
77cd0f1
There are no applications any more, only dataspaces.
namedgraph Sep 26, 2026
2a4baf7
The UNESCO install died hashing a stylesheet the package had replaced…
namedgraph Sep 27, 2026
33efec5
The screencast spawned ldh with the certificate option it no longer has.
namedgraph Sep 27, 2026
eccae4c
The setup screencast ran for 90 seconds, a minute of which was reques…
namedgraph Sep 27, 2026
3858c2d
The upload page still taught the File form; the drop is the way now.
namedgraph Sep 27, 2026
8fd0181
The prose outside the reference still said application where it meant…
namedgraph Sep 27, 2026
344f057
The UNESCO hero stacked its logo under the text; it is a feature row …
namedgraph Sep 27, 2026
e72d5bb
The Northwind employee portraits were the 8-colour originals at a few…
namedgraph Sep 28, 2026
1871254
The Northwind category art is upscaled too, and it is JPEG now rather…
namedgraph Sep 28, 2026
6a16404
Every constructor now carries what the import that populates its clas…
namedgraph Sep 28, 2026
6aa8a23
Merge branch 'develop' into screencast-supercut
namedgraph Sep 28, 2026
21b4e5a
The two supercut scenes catch up with a UI that waits to be asked. Si…
namedgraph Sep 28, 2026
ba56a80
The block swap shows both blocks. At 2x the chart block alone is tall…
namedgraph Sep 28, 2026
a7d6804
A query block draws its chart selects open and keeps only its editor …
namedgraph Sep 28, 2026
9fc7b62
The docs shoot's scratch container no longer appears in the stills. I…
namedgraph Sep 28, 2026
235ccf0
Finding 13: a block reorder by drag is refused with 412 and never sav…
namedgraph Sep 28, 2026
5cda8d2
The front page's hero loop and the captioned supercut are derived fro…
namedgraph Sep 28, 2026
3fdfbe6
The Product create form is shot again with its seven controls, after …
namedgraph Sep 28, 2026
441b4fd
The supercut and the hero loop show the Person form with the fields t…
namedgraph Sep 28, 2026
39442ec
The graph take records again against the current build, with the Pers…
namedgraph Sep 28, 2026
14d4762
The supercut and the hero loop are cut from the dark graph take that …
namedgraph Sep 28, 2026
3adcb0f
The graph take opens Rockville again, turning the page to reach it, a…
namedgraph Sep 28, 2026
b52ca29
The supercut closes on a title card the footage fades into.
namedgraph Sep 28, 2026
35dd633
The hire gets her portrait on camera: dropped on her document, picked…
namedgraph Sep 28, 2026
4058c4b
The supercut carries the hire's portrait: dropped on her document, pi…
namedgraph Sep 28, 2026
c1c311a
The supercut's captions are plain sentences.
namedgraph Sep 28, 2026
8070f63
The closing slide and the repository notes say dataspace where they m…
namedgraph Sep 28, 2026
8894128
The supercut has a soundtrack.
namedgraph Sep 28, 2026
454dc38
The hero render carries the soundtrack and the closing slide too.
namedgraph Sep 28, 2026
69c4308
The supercut is cut from takes recorded against the build with aligne…
namedgraph Sep 28, 2026
43d4181
The two numeric shot starts follow the re-recorded graph take.
namedgraph Sep 28, 2026
9d756fa
Five documentation shots showed the Northwind images as they were bef…
namedgraph Sep 28, 2026
80fe393
Merge pull request #62 from AtomGraph/screencast-supercut
namedgraph Sep 28, 2026
8bb188e
The packages reference still is re-shot as well, the last one showing…
namedgraph Sep 28, 2026
6c24dcf
Merge remote-tracking branch 'origin/develop' into develop
namedgraph Sep 28, 2026
37d6e00
The package registry installs public. Its installer skipped make-publ…
namedgraph Sep 28, 2026
7621f67
The concept tree scrolls to the concept it reveals. The tree scrolls …
namedgraph Sep 28, 2026
0ed9ece
The README describes the repository as it stands, and its demo pictur…
namedgraph Sep 28, 2026
e85fa1e
The UNESCO Thesaurus editing picture shows the language of every labe…
namedgraph Sep 28, 2026
bf2c377
An application moving off 5.x has a page to read, and the CSS referen…
namedgraph Sep 29, 2026
16bf724
Merge master into develop
namedgraph Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .github/workflows/check-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,25 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

# Jena 6 requires Java 21; the runner defaults to 17
- name: Set up Java 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'

- name: RDF syntax check
uses: AtomGraph/RDF-syntax-check@v1.0.5
with:
jena-version: 6.1.0

- name: Install Linux packages
run: sudo apt-get update && sudo apt-get install -y libxml2-utils

# riot checks rdf:XMLLiteral well-formedness; canonical form is only
# enforced up to Jena 4.7.0, so it is checked separately
- name: XMLLiteral canonical form check
run: ./check-xmlliterals.sh

- name: Check links
run: ./check-links.sh
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ linkeddatahub/.DS_Store
docs/docs.trix
docs/files.xml
docs/html
docs/timestamps.xml
155 changes: 93 additions & 62 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,80 +2,111 @@

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Repository Overview
## Repository overview

LinkedDataHub-Apps is a collection of data-driven applications built on LinkedDataHub. The repository contains system, demo, and user-submitted applications that are completely data-driven with no imperative code - only shell scripts for installation and SPARQL queries for data processing.
LinkedDataHub-Apps holds dataspaces built on LinkedDataHub. Every dataspace is a tree of RDF documents plus the files they carry, installed with the `ldh` CLI. There is no imperative code: behaviour lives in RDF (Turtle), SPARQL and XSLT, and shell only orchestrates CLI calls.

## Repository Structure
- `docs/` — the LinkedDataHub documentation, itself a LinkedDataHub app, published live at https://docs.linkeddatahub.com/ and as a static site under https://atomgraph.github.io/LinkedDataHub/linkeddatahub/docs/
- `demo/northwind-traders/` — Northwind Traders as a knowledge graph: faceted search, parallax navigation, CSV import, a 969-line namespace ontology with constructors, constraints and views
- `demo/copenhagen/` — Copenhagen open data on a map, imported from CSV
- `demo/unesco-thesaurus/` — the UNESCO Thesaurus as a SKOS editor; its model and stylesheet come from the taxonomy editor package
- `packages/` — the package registry published at https://packages.linkeddatahub.com/; one package so far, `editor/taxonomy`
- `lib/` — the shared installer: `install.mk` (the interactive `make install`) and `ldh-app.sh` (functions every `install.sh` sources)
- `screencast/` — the Playwright rig that produces the docs' screenshots and clips, and the Northwind screencast tracks
- `check-links.sh`, `check-xmlliterals.sh` — repository-wide validators, run by CI

- `/linkeddatahub/docs/` - Documentation for LinkedDataHub open-source and Cloud versions
- `/demo/northwind-traders/` - Knowledge Graph representation of Northwind Traders sample database with faceted search
- `/demo/city-graph/` - Geospatial browser for Copenhagen open data with type-colored geospatial overview
- `/demo/skos/` - Basic SKOS editor with custom UI theme for concept and schema management
## Prerequisites

Each demo application includes:
- Installation shell scripts
- SPARQL queries for data import and processing
- CSV data files (for data import)
- Custom ontologies and constraints (stored as .ttl files)
- Optional custom XSLT stylesheets and CSS
The `ldh` CLI, built from a LinkedDataHub checkout and put on `PATH`:

## Common Commands
```bash
cd ../LinkedDataHub/cli && mvn package && export PATH="$PWD/bin:$PATH"
```

The docs build additionally needs `riot` (Apache Jena), Docker (for `atomgraph/saxon`), `xmlstarlet`, `xmllint` and `python3`. The screencast rig needs Node, `ffmpeg`, `cwebp`, `vhs` and GNU `sha1sum`.

## Installing an app

### Installation
Applications use interactive Makefiles for installation:
```bash
make install # Interactive installation with prompts for BASE_URL, CERT_PATH, PASSWORD, PROXY_URL
make install # prompts for base URL, keystore path, keystore password and optional proxy URL
```

### Documentation (linkeddatahub/docs/)
`make install` is `lib/install.mk`, included by every app Makefile. It exports the answers as `LDH_BASE`, `LDH_CERT_FILE`, `LDH_CERT_PASSWORD` and `LDH_PROXY` — the variables the CLI reads — and runs the app's `install.sh` in that environment. No credential is put on a command line, so the password needs no escaping. To install unattended, export the four variables and run `./install.sh`.

Each `install.sh` sources `lib/ldh-app.sh` and is the app's own sequence of steps:

- `ldh admin make-public` — an authorization that makes the app readable by anyone
- `ldh_app_import_ns admin/model` — resets the namespace ontology document with `patch-ontology.ru`, appends `ns.ttl` under `@base <{base}ns>`, clears the ontology cache
- `ldh push --dir . "$LDH_BASE"` — PUTs every RDF file to the document its path spells and uploads every other file into its folder's document
- `ldh_app_import_csv . imports.csv` — one `ldh import csv` per manifest row (`query_filename,csv_filename,target,title`)
- app-specific steps: `ldh admin create authorization`, `ldh packages add`, `ldh import rdf`

**Re-runs converge but are not clean.** `ldh push` PUTs and the ontology is reset before re-import, so documents and the model end up the same. `make-public`, `create authorization` and every import are POSTs, so each run adds another authorization and another import record. Nothing probes for an earlier install.

### App layout

The file tree is the URL tree. `categories.ttl` installs to `{base}categories/`, the sibling folder `categories/` holds that document's uploads (and, by convention, its `.csv` and mapping `.rq`), and `root.ttl` is the base document itself. `.ldhignore` lists what is neither a document nor an upload — `admin/`, `Makefile`, `*.sh`, `*.csv`, repository screenshots — because the CLI skips nothing but hidden entries.

Mapping queries are `CONSTRUCT { GRAPH ?g { … } }` over CSV rows addressed as `<#column>`, and build every URI from the `$base` constant the platform binds. **Do not pin a hostname in a query or document**: a class is `BIND(uri(concat(str($base), "ns#School")) AS ?type)`, a query on the `<ns>` endpoint may use relative IRIs (`<ns#>`, `<sparql>`), and a query on the data endpoint cannot, since that endpoint parses with no base.

Media is content-addressed. `ldh push` uploads a file to `{base}uploads/{sha1}`, and a CSV column or a document references it by that hash, so the bytes must be final before anything references them.

## Documentation (`docs/`)

```bash
make validate # Validate documents
make ttl-to-html # Convert Turtle files to HTML
make install # push the docs to a LinkedDataHub instance
make validate # Turtle syntax and canonical XMLLiteral check
make check-links # resolve every relative link in the whole repository
make ttl-to-html # static site into docs/html/ (gitignored)
```

### Prerequisites
All installation scripts require LinkedDataHub CLI scripts in PATH:
Each `.ttl` is one page: a `dh:Container` or `dh:Item` with `rdf:_N`-ordered blocks, whose content is an XHTML `rdf:XMLLiteral`. The static build (`ttl-to-html.sh` + `ttl-to-html.xsl`) is a second renderer of the same sources and rewrites `uploads/{sha1}` to `files/{name}`, terminating on a hash it cannot find — a clean `make ttl-to-html` proves every baked hash resolves.

CI (`.github/workflows/check-docs.yml`) runs RDF syntax, canonical-XML and link checks on every push. The static build and the GitHub Pages deploy (`publish-docs.yml`) run only on pushes to `master` that touch `docs/`.

XHTML inside `rdf:XMLLiteral` must be exclusive canonical XML: attributes alphabetical, explicit end tags (`<br></br>`, `<img …></img>`), each start tag on one line. `check-xmlliterals.sh` diffs each literal against `xmllint --exc-c14n`.

### Documentation media (`screencast/`)

Screenshots and clips are produced by a scripted Playwright rig, never taken by hand.

```bash
export PATH="$(find bin -type d -exec realpath {} \; | tr '\n' ':')$PATH"
cd screencast
node docs/shoot.mjs --base … --cert-file … --cert-password-file … [--only reference]
make docs-publish # optimise docs/out/ into ../docs/, printing sha1 per published file
make docs-fill # point the .ttl sources at the published files (idempotent)
```

- `docs/manifest.mjs` is the shot list — one entry per `div.screenshot-placeholder` in the `.ttl` sources, keyed by its caption. New slots go there, not in the runner.
- Each entry's `want` is asserted after `act` and before the capture, so a shot that never reached its state is reported missed rather than written.
- `blocked` slots stay as placeholders with their reason recorded. Do not fill one by hand.
- The shoot writes **masters** — 2880px lossless PNG, a `.webm` and an `.mp4` per clip — into `docs/out/`, plus an `index.json`. It never edits a `.ttl`; `docs/fill.mjs` does.
- `make docs-publish` derives the web assets into `docs/`: stills to WebP at 2240px, `.mp4`s copied (already CRF 20 / `yuv420p` / faststart), `.webm`s dropped.

**Optimise before hashing.** Uploads are content-addressed at `{base}uploads/{sha1}`, so a reference is only valid for the bytes that ship — never hash a master.

References are absolute, `/uploads/{sha1}`: the `uploads/` namespace hangs off the base URI, outside the document hierarchy, so a relative path would encode the referring document's depth and break when it moves. They live inside canonical `rdf:XMLLiteral` bodies:

```xml
<img alt="The document tree with a container expanded" src="/uploads/{sha1}"></img>
<video aria-label="Browsing and navigating data" controls="controls" preload="metadata" src="/uploads/{sha1}"></video>
```

## Application Architecture

### Data-Driven Approach
- **Zero imperative code** - applications are entirely configuration-driven
- **SPARQL-based processing** - all data transformations use SPARQL queries
- **RDF/Turtle ontologies** - define application structure and constraints
- **Shell script orchestration** - only for installation and deployment tasks

### Key Components per Application
1. **Installation scripts** (`install.sh`) - Deploy application to LinkedDataHub instance
2. **Data import scripts** (`import-csv.sh`, `import-rdf.sh`) - Load data from CSV/RDF sources
3. **SPARQL queries** (`queries/` directory) - Define data processing and views
4. **Ontology files** (`admin/model/*.ttl`) - Define classes, properties, and constraints
5. **Configuration scripts** - Create containers, charts, and authorizations

### Application Flow
1. Install ontologies and model definitions
2. Create containers and authorization structures
3. Import data from CSV/RDF sources using SPARQL transformation queries
4. Create charts and views for data visualization
5. Configure access control and permissions

### Custom Styling (SKOS demo)
Some applications like SKOS use custom XSLT stylesheets and CSS that need to be mounted in LinkedDataHub configuration and require increased payload size limits.

## Important Notes

- **Installation scripts are NOT idempotent** - subsequent runs may add data but aren't guaranteed to succeed
- **Special characters in passwords** need to be escaped in shell scripts
- **Custom stylesheets** require LinkedDataHub configuration changes and Docker volume mounts
- **Access control** - some applications require requesting append/write access to create/edit data

## File Types and Conventions

- `.ttl` - Turtle RDF files for ontologies and data
- `.rq` - SPARQL query files
- `.csv` - Data import files
- `.sh` - Shell scripts for installation and deployment
- `Makefile` - Interactive installation and build targets
A clip is a `<video>`, never an `<object>`. Uploads are served with `Content-Security-Policy: default-src 'none'; sandbox` (the LNK-011 stored-XSS fix). An `<object>` loads the file as a nested *document*, so that CSP governs the document's own media load and Chrome blocks it. A `<video>` is a subresource of the page and loads normally. Images are unaffected for the same reason.

`docs/install.sh` ships them: `ldh push` uploads every non-ignored, non-RDF file to its folder's document at the content-addressed URI the sources already name.

## Packages (`packages/`)

A package is a `dh:Container` document whose `foaf:primaryTopic` is an `lds:Package` naming an `lds:ontology` and an `ac:stylesheet`. The directory path is the package URI: `packages/editor/taxonomy/` is `https://packages.linkeddatahub.com/editor/taxonomy/#this`. A dataspace imports it with one `ldh:import` triple (`ldh packages add`); the platform then materialises the ontology as an editable document under the admin `ontologies/` container and copies the stylesheet under `/static/com/linkeddatahub/packages/`, both once at import. See `packages/README.md` and `docs/reference/administration/packages.ttl`.

## File types

- `.ttl` — Turtle: documents, ontologies, data
- `.rq` — SPARQL mapping queries for imports
- `.ru` — SPARQL updates (the ontology reset)
- `.csv` — import data; `imports.csv` is the import manifest
- `.xsl` — package stylesheets and the docs' static renderer
- `.sh` — installers and validators
- `.webp` / `.mp4` — documentation media, published by `make docs-publish`
- `.ldhignore` — what `ldh push` must skip, gitignore-style, per subtree
Loading
Loading