<https://docs.linkeddatahub.com/reference/command-line-interface/>
        a       <https://w3id.org/atomgraph/linkeddatahub/document-hierarchy#Item>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1>
                <https://docs.linkeddatahub.com/reference/command-line-interface/#content>;
        <http://purl.org/dc/terms/created>
                "2026-09-29T09:52:19.879Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
        <http://purl.org/dc/terms/creator>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this>;
        <http://purl.org/dc/terms/description>
                "The ldh CLI drives the same HTTP API as the UI and covers most UI actions";
        <http://purl.org/dc/terms/title>
                "Command line interface";
        <http://rdfs.org/sioc/ns#has_container>
                <https://docs.linkeddatahub.com/reference/>;
        <http://www.w3.org/ns/auth/acl#owner>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this> .

<https://docs.linkeddatahub.com/reference/command-line-interface/#content>
        a       <https://w3id.org/atomgraph/linkeddatahub#XHTML>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#value>
                "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n    <p class=\"ldh-body-lg\">The <samp>ldh</samp> CLI drives the same HTTP API as the UI and covers most UI actions</p>\n    <p>The LinkedDataHub CLI wraps the <a href=\"../http-api/\">HTTP API</a> into a single executable with convenient parameters.\n        It can be used for testing, automation, scheduled execution and similar tasks. Performing actions with the CLI is usually quicker than using the\n        <a href=\"../user-interface/\">user interface</a>, and easier to reproduce.</p>\n    <p>Some commands correspond to a single request to LinkedDataHub, others combine several into tasks with multiple interdependent requests, such as the CSV import.</p>\n    <p>You will need your <a href=\"../../get-started/get-an-account/\">WebID certificate</a> — either the <samp>.p12</samp> keystore or a PEM file holding it with its private key — as well as its password, among other arguments.</p>\n    <div>\n        <h2 id=\"install\">Install</h2>\n        <p>Every LinkedDataHub release attaches an <samp>ldh-&lt;version&gt;.tar.gz</samp> archive holding the launcher and the jar. It needs a Java 21 runtime and nothing else:</p>\n        <pre>tar -xzf ldh-&lt;version&gt;.tar.gz\nexport PATH=\"$PWD/ldh-&lt;version&gt;:$PATH\"\n\nldh --help</pre>\n        <p>To build from source instead, run <samp>make cli</samp> from the root of the LinkedDataHub repository, which prints the <code>export</code> line to run afterwards. It requires Java 21 and Maven and is the equivalent of:</p>\n        <pre>cd cli\nmvn package\nexport PATH=\"$PWD/bin:$PATH\"\ncd ..\n\nldh --help</pre>\n        <p>Either way, the self-contained <samp>ldh.jar</samp> is what the <samp>ldh</samp> launcher runs, and <samp>ldh --version</samp> reports the version it was built at. The CLI carries the same version as the platform.</p>\n        <p>If you use the CLI regularly, add the <code>export</code> line to your shell profile. Shell completion for bash and zsh is generated by the CLI itself:</p>\n        <pre>source &lt;(ldh generate-completion)</pre>\n        <div class=\"ac-alert va-informative\" role=\"status\">\n            <span class=\"ac-alert-ic\"><span aria-hidden=\"true\" class=\"msi outline\">info</span></span>\n            <div class=\"ac-alert-body\">\n                <p class=\"ac-alert-text\">The CLI talks to the HTTP API directly and embeds <a href=\"https://jena.apache.org/\" target=\"_blank\">Apache Jena</a>. Unlike the shell scripts it replaces, it needs no <samp>curl</samp>, <samp>python</samp> or Jena command line tools on <code>$PATH</code>.</p>\n            </div>\n        </div>\n        <div class=\"ac-alert va-warning\" id=\"deprecated-scripts\" role=\"status\">\n            <span class=\"ac-alert-ic\"><span aria-hidden=\"true\" class=\"msi outline\">warning</span></span>\n            <div class=\"ac-alert-body\">\n                <span class=\"ac-alert-title\">Deprecated shell scripts</span>\n                <p class=\"ac-alert-text\">The HTTP API shell scripts in the <samp>bin</samp> folder that <samp>ldh</samp> replaces are <strong>deprecated</strong>. The certificate and WebID tooling (<samp>webid-keygen.sh</samp>, <samp>webid-keygen-pem.sh</samp>, <samp>webid-uri.sh</samp>, <samp>webid-modulus.sh</samp>, <samp>server-cert-gen.sh</samp>) talks to no API and is not deprecated.</p>\n                <p class=\"ac-alert-text\">Migrating from a script to its command means dropping the <samp>.sh</samp> suffix, prefixing the invocation with <samp>ldh</samp> (the hyphenated name becomes a verb-object pair, e.g. <samp>admin/acl/create-group.sh</samp> becomes <samp>ldh admin create group</samp>), and passing the <samp>.p12</samp> keystore to <code>-f</code> instead of the <samp>.pem</samp> certificate.</p>\n            </div>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"authentication\">Authentication</h2>\n        <p>Commands authenticate with a WebID client certificate, read either from a PKCS12 keystore — the format produced by <samp>bin/webid-keygen.sh</samp> and shipped as <samp>ssl/owner/keystore.p12</samp> for the owner agent — or from a PEM file holding the certificate together with its private key, such as <samp>ssl/owner/cert.pem</samp>. The format is recognised from the file's content, not from its extension:</p>\n        <pre>ldh get \\\n  -c ./ssl/owner/keystore.p12 \\\n  -p \"$owner_cert_password\" \\\n  --accept text/turtle \\\n  \"https://localhost:4443/\"</pre>\n        <p>which, on the Northwind Traders dataspace, prints the root document's description:</p>\n        <pre>@prefix def:  &lt;https://w3id.org/atomgraph/linkeddatahub/default#&gt; .\n@prefix dct:  &lt;http://purl.org/dc/terms/&gt; .\n@prefix rdf:  &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .\n\n&lt;https://localhost:4443/&gt; a def:Root ;\n    dct:title \"Northwind Traders\" ;\n    dct:description \"Knowledge Graph representation of the Northwind Traders sample database\" ;\n    rdf:_1 &lt;https://localhost:4443/#overview-intro&gt; ;\n    # …\n    .</pre>\n        <div class=\"ac-alert va-warning\" role=\"status\">\n            <span class=\"ac-alert-ic\"><span aria-hidden=\"true\" class=\"msi outline\">warning</span></span>\n            <div class=\"ac-alert-body\">\n                <p class=\"ac-alert-text\">The CLI does not validate TLS server certificates, so self-signed development instances work out of the box. Do not point it at untrusted hosts.</p>\n            </div>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"parameters\">Parameters</h2>\n        <p>Parameters shared by most commands:</p>\n        <table>\n            <caption class=\"ac-vh\">Parameters every command accepts</caption>\n            <thead>\n                <tr>\n                    <th scope=\"col\">Parameter</th>\n                    <th scope=\"col\">Value</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th scope=\"row\"><samp>-c</samp>, <samp>--cert</samp></th>\n                    <td>PKCS12 keystore, or PEM file with the certificate and its private key, holding the WebID certificate of the agent</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\"><samp>-p</samp>, <samp>--cert-password</samp></th>\n                    <td>Password of the keystore, or passphrase of an encrypted PEM key. Not needed when the PEM key is unencrypted</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\"><samp>-b</samp>, <samp>--base</samp></th>\n                    <td>Base URI of the dataspace</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\"><samp>--proxy</samp></th>\n                    <td>The host the request is proxied through (optional). Use it with port 5443, on which client certificate authentication is always enabled — for example <samp>--proxy https://localhost:5443/</samp>.</td>\n                </tr>\n            </tbody>\n        </table>\n        <p>Other parameters are command-specific. Most commands take the URI of the document they act on as a default (positional) parameter.</p>\n        <h3 id=\"environment-variables\">Environment variables</h3>\n        <p>The repeated parameters can be set once in the environment instead of being passed to every command:</p>\n        <table>\n            <caption class=\"ac-vh\">Environment variables and the parameters they supply</caption>\n            <thead>\n                <tr>\n                    <th scope=\"col\">Variable</th>\n                    <th scope=\"col\">Parameter</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td><samp>LDH_CERT_FILE</samp></td>\n                    <td><code>-c</code>, <code>--cert</code></td>\n                </tr>\n                <tr>\n                    <td><samp>LDH_CERT_PASSWORD</samp></td>\n                    <td><code>-p</code>, <code>--cert-password</code></td>\n                </tr>\n                <tr>\n                    <td><samp>LDH_BASE</samp></td>\n                    <td><code>-b</code>, <code>--base</code></td>\n                </tr>\n                <tr>\n                    <td><samp>LDH_PROXY</samp></td>\n                    <td><code>--proxy</code></td>\n                </tr>\n            </tbody>\n        </table>\n        <pre>export LDH_CERT_FILE=./ssl/owner/keystore.p12\nexport LDH_CERT_PASSWORD=\"$owner_cert_password\"\nexport LDH_BASE=https://localhost:4443/\n\nldh create container --parent \"$LDH_BASE\" --title \"Categories\" --slug categories</pre>\n    </div>\n    <div>\n        <h2 id=\"output\">Output</h2>\n        <p>Commands that create or append to a document print its URL as the only line on standard output, so they compose in shell pipelines. All diagnostics go to standard error.</p>\n        <pre>item=$(ldh create item --container \"$LDH_BASE\" --title \"Example\" --slug example)</pre>\n        <p><samp>ldh push</samp> writes many documents in one run and prints one line per written document URL or upload URI, in write order; progress and skipped entries go to standard error, and the first failed request stops the run.</p>\n        <p>Exit codes are <samp>0</samp> on success, <samp>1</samp> on an HTTP error status or runtime failure (the message goes to standard error; add <code>--verbose</code> for a stack trace), and <samp>2</samp> on a usage error.</p>\n    </div>\n    <div>\n        <h2 id=\"usage\">Usage</h2>\n        <p>A usage message with the parameters of a command is printed when the command is run without required arguments, or with <code>--help</code>. Commands take named parameters and default (positional) parameters; either kind can be optional. For example:</p>\n        <pre>$ ldh add select\nMissing required options and parameters: '--title=TITLE', '--query-file=ABS_PATH', 'TARGET_URI'\nUsage: ldh add select [-h] [--verbose] [-b=BASE_URI] [-c=CERT_FILE]\n                      [--description=DESCRIPTION] [-p=PASSWORD]\n                      [--proxy=PROXY_URL] --query-file=ABS_PATH\n                      [--service=SERVICE_URI] --title=TITLE [--uri=URI]\n                      TARGET_URI\nAdds a SELECT query to a document.\n      TARGET_URI          URI of the document\n  -b, --base=BASE_URI     Base URI of the application (env: LDH_BASE)\n  -c, --cert=CERT_FILE    PKCS12 keystore or PEM with the WebID certificate and\n                            private key of the agent (env: LDH_CERT_FILE)\n      --description=DESCRIPTION\n                          Description of the query (optional)\n  -h, --help              Show this help message and exit.\n  -p, --cert-password=PASSWORD\n                          Password of the keystore, or passphrase of an\n                            encrypted PEM key (env: LDH_CERT_PASSWORD)\n      --proxy=PROXY_URL   The host this request will be proxied through\n                            (optional) (env: LDH_PROXY)\n      --query-file=ABS_PATH\n                          Path to the file with the query string\n      --service=SERVICE_URI\n                          URI of the SPARQL service (optional)\n      --title=TITLE       Title of the query\n      --uri=URI           URI of the query (optional, blank node if not set)\n      --verbose           Print stack traces of errors</pre>\n        <p>The optional parameters are marked with <samp>(optional)</samp>. In this case the default parameter is the URI of the document the query is appended to.</p>\n        <p>An <samp>add select</samp> invocation looks like this (with the <a href=\"#environment-variables\">environment variables</a> supplying the connection parameters):</p>\n        <pre>ldh add select \\\n  --title \"Products by sales\" \\\n  --query-file products-by-sales.rq \\\n  \"${LDH_BASE}products/\"</pre>\n    </div>\n    <div>\n        <h2 id=\"commands\">Commands</h2>\n        <p>Commands group by verb — <samp>create</samp>, <samp>add</samp> and <samp>remove</samp> make the single request they name, while <samp>import</samp> holds the composite workflows — plus the <samp>packages</samp> family and the <samp>admin</samp> scope. The following commands are currently supported:</p>\n        <table>\n            <caption class=\"ac-vh\">Commands grouped by purpose</caption>\n            <thead>\n                <tr>\n                    <th scope=\"col\">Purpose</th>\n                    <th scope=\"col\">Command</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\">Low-level (Graph Store Protocol)</th>\n                </tr>\n                <tr>\n                    <td><code>GET</code> request</td>\n                    <td><samp>ldh get</samp></td>\n                </tr>\n                <tr>\n                    <td><code>POST</code> request</td>\n                    <td><samp>ldh post</samp></td>\n                </tr>\n                <tr>\n                    <td><code>PUT</code> request</td>\n                    <td><samp>ldh put</samp></td>\n                </tr>\n                <tr>\n                    <td><code>PATCH</code> request</td>\n                    <td><samp>ldh patch</samp></td>\n                </tr>\n                <tr>\n                    <td><code>DELETE</code> request</td>\n                    <td><samp>ldh delete</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\">Documents</th>\n                </tr>\n                <tr>\n                    <td>Create container document</td>\n                    <td><samp>ldh create container</samp></td>\n                </tr>\n                <tr>\n                    <td>Create item document</td>\n                    <td><samp>ldh create item</samp></td>\n                </tr>\n                <tr>\n                    <td>Push a directory of RDF files and uploads into the document tree it maps to</td>\n                    <td><samp>ldh push</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\">Content</th>\n                </tr>\n                <tr>\n                    <td>Append object block (instance of <code>ldh:Object</code>) to document</td>\n                    <td><samp>ldh add object-block</samp></td>\n                </tr>\n                <tr>\n                    <td>Append XHTML block (instance of <code>ldh:XHTML</code>) to document</td>\n                    <td><samp>ldh add xhtml-block</samp></td>\n                </tr>\n                <tr>\n                    <td>Remove block from document</td>\n                    <td><samp>ldh remove block</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\">Instances of system classes</th>\n                </tr>\n                <tr>\n                    <td>Append uploaded file (instance of <code>nfo:FileDataObject</code>) to document</td>\n                    <td><samp>ldh add file</samp></td>\n                </tr>\n                <tr>\n                    <td>Append <code>CONSTRUCT</code> query (instance of <code>sp:Construct</code>) to document</td>\n                    <td><samp>ldh add construct</samp></td>\n                </tr>\n                <tr>\n                    <td>Append service (instance of <code>sd:Service</code>) to document</td>\n                    <td><samp>ldh add generic-service</samp></td>\n                </tr>\n                <tr>\n                    <td>Append result set chart (instance of <code>ldh:ResultSetChart</code>) to document</td>\n                    <td><samp>ldh add result-set-chart</samp></td>\n                </tr>\n                <tr>\n                    <td>Append <code>SELECT</code> query (instance of <code>sp:Select</code>) to document</td>\n                    <td><samp>ldh add select</samp></td>\n                </tr>\n                <tr>\n                    <td>Append SPARQL view (instance of <code>ldh:View</code>) to document</td>\n                    <td><samp>ldh add view</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\"><a href=\"../imports/\">Imports</a></th>\n                </tr>\n                <tr>\n                    <td>Create CSV import</td>\n                    <td><samp>ldh add csv-import</samp></td>\n                </tr>\n                <tr>\n                    <td>Import CSV data</td>\n                    <td><samp>ldh import csv</samp></td>\n                </tr>\n                <tr>\n                    <td>Create RDF import</td>\n                    <td><samp>ldh add rdf-import</samp></td>\n                </tr>\n                <tr>\n                    <td>Import RDF data</td>\n                    <td><samp>ldh import rdf</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\"><a href=\"../administration/\">Administration</a></th>\n                </tr>\n                <tr>\n                    <td>Add <code>owl:imports</code> to ontology</td>\n                    <td><samp>ldh admin add ontology-import</samp></td>\n                </tr>\n                <tr>\n                    <td>Clear the ontology cache, reloading one ontology if named</td>\n                    <td><samp>ldh admin clear ontology</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\"><a href=\"../administration/acl/\">Access control</a></th>\n                </tr>\n                <tr>\n                    <td>Add <a href=\"../administration/acl/#agents\">agent</a> to <a href=\"../administration/acl/#groups\">group</a></td>\n                    <td><samp>ldh admin add agent</samp></td>\n                </tr>\n                <tr>\n                    <td>Create <a href=\"../administration/acl/#authorizations\">authorization</a></td>\n                    <td><samp>ldh admin create authorization</samp></td>\n                </tr>\n                <tr>\n                    <td>Create <a href=\"../administration/acl/#groups\">group</a></td>\n                    <td><samp>ldh admin create group</samp></td>\n                </tr>\n                <tr>\n                    <td>Make the dataspace publicly readable by any agent</td>\n                    <td><samp>ldh admin make-public</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\"><a href=\"../administration/ontologies/\">Ontologies</a></th>\n                </tr>\n                <tr>\n                    <td>Add <a href=\"../administration/ontologies/#classes\">class</a></td>\n                    <td><samp>ldh admin add class</samp></td>\n                </tr>\n                <tr>\n                    <td>Add <code>CONSTRUCT</code> query</td>\n                    <td><samp>ldh admin add constructor</samp></td>\n                </tr>\n                <tr>\n                    <td>Create <a href=\"../administration/ontologies/#ontologies\">ontology</a></td>\n                    <td><samp>ldh admin create ontology</samp></td>\n                </tr>\n                <tr>\n                    <td>Add <a href=\"../administration/ontologies/#constraints\">property constraint</a></td>\n                    <td><samp>ldh admin add property-constraint</samp></td>\n                </tr>\n                <tr>\n                    <td>Add <a href=\"../administration/ontologies/#restrictions\">restriction</a></td>\n                    <td><samp>ldh admin add restriction</samp></td>\n                </tr>\n                <tr>\n                    <td>Add <code>SELECT</code> query</td>\n                    <td><samp>ldh admin add select</samp></td>\n                </tr>\n                <tr>\n                    <td>Import ontology</td>\n                    <td><samp>ldh admin import ontology</samp></td>\n                </tr>\n            </tbody>\n            <tbody>\n                <tr>\n                    <th colspan=\"2\" scope=\"rowgroup\"><a href=\"../administration/packages/\">Packages</a></th>\n                </tr>\n                <tr>\n                    <td>List available packages</td>\n                    <td><samp>ldh packages list</samp></td>\n                </tr>\n                <tr>\n                    <td>Import a package</td>\n                    <td><samp>ldh packages add</samp></td>\n                </tr>\n                <tr>\n                    <td>Drop a package import</td>\n                    <td><samp>ldh packages remove</samp></td>\n                </tr>\n            </tbody>\n        </table>\n        <p>Usage example. The Northwind categories CSV is uploaded into a document, so create the document first:</p>\n        <pre>doc=$(ldh create item \\\n  --container \"${LDH_BASE}categories/\" \\\n  --title \"Categories data\" \\\n  --slug categories-data)\n\nldh add file \\\n  --title \"categories.csv\" \\\n  --file categories/categories.csv \\\n  --content-type text/csv \\\n  \"$doc\"</pre>\n        <p><samp>add file</samp> prints the content-addressed URI of the upload (<samp>{base}uploads/{sha1}</samp>) rather than the document URI — the\n            <a href=\"../../tutorial/data/\">Data</a> stage of the tutorial feeds exactly that URI into a CSV import.</p>\n        <p>See also the <a href=\"../../user-guide/import-data/\">data import user guides</a>.</p>\n        <h3 id=\"request-bodies\">Request bodies</h3>\n        <p><samp>ldh put</samp> and <samp>ldh post</samp> read RDF from an optional <samp>FILE</samp> argument, recognizing the syntax from its extension (<samp>ldh put \"$LDH_BASE\" root.ttl</samp>), or from standard input, where <code>-t</code>/<code>--content-type</code> is required since a stream carries no name. Either way relative URIs resolve against the target URI. <samp>ldh patch</samp> reads a SPARQL 1.1 update from standard input, validates it and sends it verbatim.</p>\n        <h3 id=\"primary-topic\">What a document is about</h3>\n        <p><samp>ldh create item</samp> and <samp>ldh create container</samp> take <code>--primary-topic</code>, the resource the document is about, resolved against the created document's URI: <samp>'#this'</samp> names a fragment of the document itself, an absolute URI a resource described somewhere else. It writes the <code>foaf:primaryTopic</code> link only — the topic's own type and properties are the <a href=\"../administration/ontologies/#constructors\">constructor</a>'s business, and a vocabulary may refuse a topic without them.</p>\n        <pre>ldh create item \\\n  --container \"${LDH_BASE}products/\" \\\n  --title \"Masala Chai\" \\\n  --slug 78 \\\n  --primary-topic '#this'</pre>\n        <h3 id=\"push\">Pushing a directory</h3>\n        <p><samp>ldh push</samp> replays a directory into the document tree it maps to — the <a href=\"../../tutorial/app-as-repository/\">app as a repository</a> convention: one RDF file per document, a folder beside it for the files that document holds, and subfolders for its children.</p>\n        <pre>ldh push \"$LDH_BASE\"                              # the current directory\nldh push --dir demo/northwind-traders \"$LDH_BASE\"\nldh push --dry-run \"$LDH_BASE\"                    # print the plan, send nothing</pre>\n        <p>With <samp>D</samp> the URL of the directory being walked (the target URI for the pushed directory itself):</p>\n        <ul>\n            <li><samp>root.ttl</samp> at the top of the tree is <code>PUT</code> to the target URI. It describes the target document itself, so there is no separate step for it.</li>\n            <li>Any other RDF file <samp>name.ext</samp> is <code>PUT</code> to <samp>D/name/</samp>, with its relative URIs resolved against that URL.</li>\n            <li>Every other file is uploaded into <samp>D</samp>, as <samp>add file</samp> would: the file name as the title, the media type detected, the upload URI <samp>{base}uploads/{sha1}</samp>.</li>\n            <li>A subdirectory <samp>name</samp> maps to <samp>D/name/</samp>: its document is the RDF file <samp>name.ext</samp> beside it, its files are uploaded into that document, and its subdirectories recurse.</li>\n        </ul>\n        <p>A file is a document when Jena tells its RDF syntax from the file name and can parse it — <samp>.ttl</samp>, <samp>.nt</samp>, <samp>.rdf</samp>, <samp>.jsonld</samp>, <samp>.trig</samp> and the other registered extensions; <samp>.csv</samp>, <samp>.rq</samp>, <samp>.md</samp>, images and the like are uploads. Within a directory the order is the root document, then documents, then uploads, then subdirectories, each sorted by name, so a subdirectory's document exists before anything is uploaded into it. <code>PUT</code> replaces a document, so a repeated push converges: the document is rewritten and its uploads re-appended, not duplicated.</p>\n        <p>Entries whose name starts with <samp>.</samp> are never pushed. A <samp>.ldhignore</samp> file in any directory excludes entries from that directory's whole subtree, gitignore-style: a pattern without a <samp>/</samp> matches an entry's name at any depth beneath (<samp>*.sh</samp>, <samp>Makefile</samp>), a pattern with a <samp>/</samp> matches the path relative to the ignore file's directory (<samp>categories/unesco-mappings.ttl</samp>), and a trailing <samp>/</samp> restricts the pattern to directories (<samp>admin/</samp>). Nothing is excluded by default beyond hidden entries, so scripts and build output are listed there. Skipped entries are reported on standard error. <samp>--dry-run</samp> walks the tree, parses every document and prints the plan without sending a request or loading a certificate.</p>\n        <h3 id=\"memento\">Versioned documents</h3>\n        <p><samp>ldh get</samp> also exposes a <a href=\"../versioning/\">versioned</a> document's TimeMap, TimeGate and historical versions through\n            three mutually exclusive options — see the <a href=\"../versioning/#management\">versioning reference</a> for the options and examples.</p>\n        <h3 id=\"packages\">Packages</h3>\n        <p><a href=\"../administration/packages/\">Packages</a> are managed with the <samp>packages</samp> group: a dataspace imports a package with a single <code>ldh:import</code> triple, which <samp>ldh packages add</samp> declares and <samp>ldh packages remove</samp> retracts on the dataspace's <samp>settings</samp> document, while <samp>ldh packages list</samp> reads the registry catalog and marks the imported ones. See the <a href=\"../../user-guide/manage-packages/\">package management guide</a>.</p>\n    </div>\n    <p class=\"ldh-body-lg\">Find the <a href=\"https://github.com/AtomGraph/LinkedDataHub/tree/master/cli\" target=\"_blank\">CLI on GitHub</a>, or see it in action in the\n        <a href=\"../../tutorial/\">tutorial</a> and the <a href=\"https://github.com/AtomGraph/LinkedDataHub-Apps/tree/master/demo\" target=\"_blank\">demo apps</a>.</p>\n</div>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
