Index: scripts/export-archive.mjs
===================================================================
--- scripts/export-archive.mjs	(revision 624849742199055f381a103d5eb576f6ad16dded)
+++ scripts/export-archive.mjs	(revision a4fea5e841d954bbf2b59c93b892737fc487d4b5)
@@ -24,12 +24,18 @@
 import fs from 'fs';
 import path from 'path';
-import { kiesInstance, eisOrigin } from './instance-env.mjs';
+import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
 
 const args = process.argv.slice(2);
-const slug = args.find((a) => !a.startsWith('-'));
-const vlag = (naam) => { const i = args.indexOf(naam); return i >= 0 ? (args[i + 1] || true) : null; };
+// Twee namen, en ze zijn niet hetzelfde. De eerste is de INSTANCE (de map onder
+// de data-root, de systemd-unit); de tweede, optioneel, is de slug van de SITE in
+// die database. Laat je hem weg en er staat er precies een, dan is de keuze niet
+// dubbelzinnig en hoef je hem niet te weten.
+const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env', '--out', '--dir']);
+const instance = vrij[0];
+let slug = vrij[1] || null;
+const vlag = (naam) => vlaggen[naam] ?? null;
 
-if (!slug) {
-  console.error('gebruik: node scripts/export-archive.mjs <slug> [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');
+if (!instance) {
+  console.error('gebruik: node scripts/export-archive.mjs <instance> [site-slug] [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');
   process.exit(1);
 }
@@ -39,5 +45,5 @@
 let gekozen;
 try {
-  gekozen = kiesInstance(slug, {
+  gekozen = kiesInstance(instance, {
     dataRoot: typeof vlag('--data-root') === 'string' ? vlag('--data-root') : null,
     envPad: typeof vlag('--env') === 'string' ? vlag('--env') : null,
@@ -47,4 +53,21 @@
 
 const { buildArchive, zipArchive, writeArchiveDir } = await import('../src/services/ArchiveExportService.js');
+const { default: db } = await import('../src/config/database.js');
+
+// Geen slug gegeven? Dan mag de database het zeggen, mits het antwoord eenduidig is.
+if (!slug) {
+  let sites = [];
+  try { sites = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen tabel */ }
+  if (sites.length === 1) {
+    [slug] = sites;
+    console.log(`site niet opgegeven, en er staat er precies een: ${slug}`);
+  } else if (sites.length === 0) {
+    console.error(`in ${process.env.DATABASE_PATH || 'deze database'} staat geen enkele site.`);
+    process.exit(1);
+  } else {
+    console.error(`meerdere sites in deze database: ${sites.join(', ')}\nGeef er een op: node scripts/export-archive.mjs ${instance} <site-slug>`);
+    process.exit(1);
+  }
+}
 
 let uit;
Index: scripts/import-archive.mjs
===================================================================
--- scripts/import-archive.mjs	(revision 624849742199055f381a103d5eb576f6ad16dded)
+++ scripts/import-archive.mjs	(revision a4fea5e841d954bbf2b59c93b892737fc487d4b5)
@@ -17,8 +17,8 @@
 // en hoort een aparte, bewuste actie te zijn.
 
-import { kiesInstance, eisOrigin } from './instance-env.mjs';
+import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
 
 const args = process.argv.slice(2);
-const vrij = args.filter((a) => !a.startsWith('-'));
+const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env']);
 const [slug, bron] = vrij;
 
@@ -31,5 +31,5 @@
 // database bij import. Bij een IMPORT weegt dit zwaarder dan bij een export: in
 // de verkeerde database schrijven is niet terug te draaien.
-const vlag = (naam) => { const i = args.indexOf(naam); return i >= 0 ? (args[i + 1] || null) : null; };
+const vlag = (naam) => vlaggen[naam] ?? null;
 let gekozen;
 try {
Index: scripts/instance-env.mjs
===================================================================
--- scripts/instance-env.mjs	(revision 624849742199055f381a103d5eb576f6ad16dded)
+++ scripts/instance-env.mjs	(revision a4fea5e841d954bbf2b59c93b892737fc487d4b5)
@@ -94,2 +94,25 @@
   process.exit(1);
 }
+
+/**
+ * Argumenten splitsen in vrije woorden en vlaggen.
+ *
+ * Nodig omdat de naieve versie -- alles wat niet met een streepje begint is
+ * positioneel -- de WAARDE van een vlag als positioneel argument oppikt. Met
+ * `export-archive.mjs liz --data-root /var/lib/klonkt` werd /var/lib/klonkt de
+ * site-slug. Precies zo'n fout die pas opvalt als iemand hem gebruikt.
+ *
+ * @param {string[]} args
+ * @param {string[]} metWaarde  vlaggen die een waarde slikken
+ */
+export function splitsArgs(args, metWaarde) {
+  const vrij = [];
+  const vlaggen = {};
+  for (let i = 0; i < args.length; i += 1) {
+    const a = args[i];
+    if (!a.startsWith('-')) { vrij.push(a); continue; }
+    if (metWaarde.includes(a)) { vlaggen[a] = args[i + 1] ?? null; i += 1; continue; }
+    vlaggen[a] = true;
+  }
+  return { vrij, vlaggen };
+}
Index: src/services/ArchiveExportService.js
===================================================================
--- src/services/ArchiveExportService.js	(revision 624849742199055f381a103d5eb576f6ad16dded)
+++ src/services/ArchiveExportService.js	(revision a4fea5e841d954bbf2b59c93b892737fc487d4b5)
@@ -247,5 +247,15 @@
   const origin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
   const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
-  if (!site) throw new Error(`onbekende site: ${slug}`);
+  if (!site) {
+    // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn
+    // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je
+    // met een foutmelding die je liet raden. Zeg dus wat er wel in staat.
+    let bestaand = [];
+    try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ }
+    const wat = slug ? `onbekende site: ${slug}` : 'geen site opgegeven';
+    throw new Error(bestaand.length
+      ? `${wat}. In deze database staat: ${bestaand.join(', ')}`
+      : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`);
+  }
 
   const bestanden = new Map();       // pad -> Buffer
Index: src/services/ArchiveImportService.js
===================================================================
--- src/services/ArchiveImportService.js	(revision 624849742199055f381a103d5eb576f6ad16dded)
+++ src/services/ArchiveImportService.js	(revision a4fea5e841d954bbf2b59c93b892737fc487d4b5)
@@ -143,5 +143,15 @@
 
   const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(opts.slug);
-  if (!site) throw new Error(`onbekende site: ${opts.slug}`);
+  if (!site) {
+    // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn
+    // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je
+    // met een foutmelding die je liet raden. Zeg dus wat er wel in staat.
+    let bestaand = [];
+    try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ }
+    const wat = opts.slug ? `onbekende site: ${opts.slug}` : 'geen site opgegeven';
+    throw new Error(bestaand.length
+      ? `${wat}. In deze database staat: ${bestaand.join(', ')}`
+      : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`);
+  }
   const eigenOrigin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
   rapport.origin = manifest.origin || null;
