Commit Graph

83 Commits

Author SHA1 Message Date
karim fc422c78d0 ui: Archiv/Library mit Titel oben, Archiv-Atlas zeigt 10 + 'alle →'; Logo +10%, Masthead-Abstände +20%
- Archiv-Root + Library-Übersicht bekommen einen section-title ganz oben.
- Archiv-Atlas: letzte 10 statt 6 pro Kategorie, 'alle in … →' am Block-Ende.
- Subsektionen rendern ihren Intro (.Content) nach dem Header.
- Wordmark clamp 140-200 → 154-220 (+10%); Header-Padding 0.4rem/2px → 0.48rem/2.4px,
  Logo↔Menü 0.1→0.12em (+20%).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:29:42 +02:00
karim 6e4bb06f5f content: Library-Texte an einspaltiges Layout anpassen (kein Sidebar-Filter mehr)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 23:58:22 +02:00
karim d5f35bb9f8 ui: Headings kleiner + Library als Archiv-Zwilling (Sidebar weg)
- section-title 2.6→1.9rem max, 800→700; single-header h1 3→2.2rem max, 800→700;
  single-summary 1.4→1.2rem. Ruhiger, redaktioneller, site-weit.
- Library raus aus der zweispaltigen Sonderform: Übersicht = .atlas (gruppiert,
  wie Archiv-Root), Eintrag = .single (wie Essay) mit Quellen + Fuss
  (Gruppe · weitere Einträge · bearbeiten). library-nav-Partial entfernt.
- Voll CI-konform: Archiv und Library teilen jetzt dasselbe Gerüst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 23:47:53 +02:00
karim ef024921ab library: Quellen-Fussnoten funktionieren (Beispiel auf 'Typus')
Library-Einzelseiten rendern ihren Text in .single-content → die Goldmark-
Fussnoten [^x] bekommen automatisch denselben 'Quellen'-Block wie die Essays.
Typus mit zwei echten Quellen versehen (Quatremère, Moneo).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 23:33:22 +02:00
karim 42de32888c content: Kontakt/Impressum/Datenschutz auf einer Seite (Impressum)
datenschutz.md in impressum.md gemerged (Kontakt · Verantwortlich · Datenschutz),
Alias /datenschutz/ → /impressum/ (kein toter Link). Footer: ein 'Impressum'-Link
statt 'Kontakt / Impressum' + 'Datenschutz'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 23:24:51 +02:00
karim fbf8ee1ebf ui: Menü schlanker — Manifest + Code in den Footer
Hauptmenü: JOURNAL · LIBRARY · ARCHIV · DIALOG. Manifest und Code (Repo)
wandern in die Footer-Linkleiste zu Colophon/Impressum/Datenschutz/RSS/Spenden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 22:25:29 +02:00
karim 790141bafe ia: Umbenennung — Library→Archiv, Wiki→Library (URLs, Content, Code)
Neue Informationsarchitektur:
- ARCHIV (/archiv) = die fertigen Texte (vormals Library): Essays mit Byline,
  Quellen/Zitieren, Dialog, Versionsverlauf. Section "archiv".
- LIBRARY (/library) = das verlinkte Werkstattwissen (vormals Wiki): zwei-
  spaltig mit Gruppen-Navigation + Filter. Section "library".

Umgesetzt:
- content/ + layouts/ verschoben (git mv), Menü (ARCHIV+LIBRARY, kein WIKI),
  Startseiten-Journal zieht jetzt Section "archiv", Querverweise umgeschrieben
  (/library→/archiv, /wiki→/library).
- CMS: files.js klassifiziert archiv/<sec>→beitrag, library/→biblio;
  stats.js + Admin (Typ "Library-Seite", KIND_LABEL, Pfade) nachgezogen.
- single.html: Byline/Provenance/Dialog an Section "archiv" gebunden.
- Beide Header zentriert (section-header) — einheitlicher Look.
- Interne Dialog-Werte (thread.kind='library', Forum "Beiträge") unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 22:13:50 +02:00
karim 54f03270d0 ui(wiki): vollbreiter Header wie Library (gleiche max-width), Spalten darunter
Wiki-Header (section-header) spannt jetzt die volle Spalte (grid-column 1/-1)
und die .wiki-Box hat dieselbe max-width/Zentrierung wie der normale Inhalt —
so fluchten Library- und Wiki-Header. Seitenleiste + Inhalt darunter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:30:44 +02:00
karim b4fdc8c200 fix(wiki): Header in die Inhaltsspalte → Titel fluchtet mit dem Text
Header war volle (schmalere, zentrierte) Inhaltsbreite, die zweispaltige Fläche
darunter aber breiter → Titel versetzt. Header jetzt in .wiki-page, Oberkante
mit der Seitenleiste gleichgezogen (margin-top:0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:25:22 +02:00
karim 0f80378a7c ui(wiki): Header wie die übrigen Sektionen (section-header), kein doppeltes 'Wiki'
- Übersicht: nur ein section-title (Rubrik 'Wiki' über Titel 'Wiki' entfernt)
- Einzelseite: Rubrik = Gruppe (z.B. Begriffe), Titel = Seitentitel
- Titel über die volle Breite (8px-Akzentlinie wie Library), Spalten darunter
- ungenutzte .wiki-rubric/.wiki-head CSS entfernt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 12:50:12 +02:00
karim 3dd8d5edd4 fix(wiki): Fuss als div statt footer — globales footer{} färbte ihn schwarz
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 12:30:54 +02:00
karim 0f574bf8a7 ui: Software-Rubrik als kuratierte Landing (Werkzeuge vs. Texte)
/library/software trennt jetzt 'Werkzeuge' (Beiträge mit externem Link wie
DOSSIER/RAPPORT, als Karten mit ↗ und Farbakzent) von 'Texte & Anleitungen'
(chronologisch). Andere Rubriken bleiben unverändert. dist/ ignoriert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 12:11:07 +02:00
karim 9c9b7e03bd admin: Übersicht-Dashboard, aufgewertete Nutzerverwaltung, Wiki-Autoren
- Neue /api/stats (Admin, read-only): Inhalte/Nutzer/Dialog-Kennzahlen
- Übersicht-View als Admin-Dashboard: Stat-Karten (klickbar) + Schnellzugriff
- Nutzerverwaltung: Avatar-Initiale, angelegt/zuletzt-aktiv, Rolle beim Anlegen,
  Inline-Passwort (statt prompt), Filter, Rollen-Badge; API liefert last_sign_in_at
- Wiki im Editor anlegbar: Typ 'Wiki-Seite' + Gruppe-Feld → content/wiki/<slug>.md;
  files.js klassifiziert wiki als eigene 'kind' (eigene Sidebar-Gruppe)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 12:09:10 +02:00
karim d9ba2f7bbe feature: Wiki — verlinktes Werkstattwissen mit Gruppen-Navigation
Neue Hugo-Sektion /wiki als 'effektives Wiki' im KISS-Sinn:
- Zweispaltiges Layout: gruppierte Seitenleiste (nach Frontmatter 'group')
  mit Live-Filter + Inhalt mit TOC und 'zuletzt bearbeitet'/bearbeiten-Link
- Übersichtsseite gruppiert alle Einträge; WIKI im Hauptmenü
- Seiten ohne group landen unter 'Allgemein' (robust)
- Start-Inhalte: Meta-Seite (wie es funktioniert), Typus (→ Bibliothek),
  Dateiablage/Benennung; Archetype setzt group/summary
- Bewusst dateibasiert: jede Seite verlinkt zur Bearbeitung ins Repo

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 11:56:35 +02:00
karim 37fdc9019c dialog: UX-Pass — Lade-Skelette, Avatar-Farben, Links, Cmd+Enter
- Dezente Lade-Skelette (Shimmer) in Übersicht/Forum/Thread statt leerem Pop-in
- Deterministische, ruhige Avatar-Farbe aus dem Namen (statt einheitlichem Grau)
- URLs in Wortmeldungen klickbar (sicher, ohne innerHTML)
- ⌘/Ctrl+Enter sendet; Textarea wächst mit dem Inhalt; Hinweis im Composer
- Enter im Thread-Titel springt ins Textfeld
- prefers-reduced-motion respektiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 11:49:09 +02:00
karim 1fb4556ac1 ui: Quellen-Block symmetrisch (Abstand oben=unten)
article-actions margin-top spacing-md -> spacing-sm, damit der Abstand
zitieren->Trennlinie gleich gross ist wie obere Trennlinie->Quellen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 11:44:05 +02:00
karim 9163f5c90d security: public Deploy härten (Reverse-Proxy, GoTrue-Rate-Limit, RLS-Revoke)
Für die öffentlich erreichbare Instanz (dev.openbureau.ch):

1. Reverse-Proxy nur /auth/* durchreichen — /rest, /storage, /realtime raus.
   PostgREST /rest/v1/ gab die komplette DB-Schema-Beschreibung (OpenAPI) preis;
   der Browser nutzt Supabase nur fürs Login, Daten laufen über /api/*.
   (Caddy-Block in create-openbureau-lxc.sh + proxmox/README.md angepasst.)
2. GoTrue GOTRUE_RATE_LIMIT_TOKEN_REFRESH=100 — bremst Brute-Force aufs /token,
   das public direkt gegen GoTrue läuft (nicht übers Node-Rate-Limit).
3. db/schema.sql: revoke all from anon/authenticated auf posts/comments/forums/
   threads; grants nur noch service_role. RLS bleibt so auch bei künftigen
   Policies dicht (Defense-in-Depth statt "RLS ohne Policy").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 05:11:19 +02:00
karim 50cec7a965 docs: Domain-/Reverse-Proxy-Deploy dokumentieren (SITE_DOMAIN + Caddy)
Hält den dev.openbureau.ch-Deploy reproduzierbar fest: SITE_DOMAIN-Env,
Env-Overrides (local-zfs, statische IP, CTID …) und der Caddy-Block mit
Pfad-Routing (/auth/* + /rest/* -> :8000, Rest -> :8080) samt
Login-User-Anlage. Der reale Caddyfile liegt im separaten dms-stack (VPS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 01:25:46 +02:00
karim f434885c28 proxmox: create-openbureau-lxc env-überschreibbar + domain-fähig
- Alle CONFIG-Werte per Env überschreibbar (ROOTFS_STORAGE, HOSTNAME,
  DISK_GB, RAM_MB, CORES, BRIDGE, IP, GATEWAY) — vorher teils hardcodet,
  was auf ZFS-Hosts (local-zfs statt local-lvm) non-interaktiv scheiterte.
- Neue Variable SITE_DOMAIN: setzt SITE_URL + API_EXTERNAL_URL auf
  https://<domain> (Same-Origin, Pfad-Routing am Reverse-Proxy) statt
  Container-IP. Abschluss zeigt passenden Caddy-Block.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 01:06:05 +02:00
karim b67b24a53c proxmox: Selbsthosting-Set (Dialog-Suite + Einzelskripte) + 2 Artikel
Geführter Installer proxmox/install.sh: erst Vorhaben wählen
(Komplettes Büro / 365+Synology ersetzen / nur Website / einzeln),
dann werden die nötigen LXCs der Reihe nach gebaut. Jeder Dienst ist
auch als eigenständiges, einzeln curlbares Skript verfügbar:

- proxmox/nextcloud-lxc.sh    Nextcloud AIO (ersetzt 365/Synology)
- proxmox/empty-lxc.sh        leerer Docker-LXC als Geruest
- proxmox/git-compose-lxc.sh  beliebiges Git-Repo (RAPPORT/DOSSIER)
- (OPENBUREAU: bestehendes cms/proxmox/create-openbureau-lxc.sh)

Gemeinsames Muster: unprivilegierter Debian-12-LXC mit nesting+keyctl,
Docker via get.docker.com, Dienst als Container/Compose. proxmox/README.md
dokumentiert beide Wege.

Dazu zwei Bibliotheksbeitraege (Hochparterre-Ton):
- server-im-eigenen-haus.md  — das Warum/Ziel
- proxmox-schritt-fuer-schritt.md — die Anleitung mit curl-Befehlen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 01:20:43 +02:00
karim b72f744963 content: Datenschutz-Seite + Footer-Link
Deutsche Datenschutzerklärung an die tatsächliche Praxis angepasst (self-hosted,
keine Tracker/Analytics, Server-Logs nur technisch, Dialog-Konto mit E-Mail/Name,
revDSG-Rechte, EDÖB). Footer: Datenschutz neben Kontakt/Impressum.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 05:11:10 +02:00
karim fcbe91c0da ui: Uhr-Icon explizit terracotta (Akzent), weiß beim Hover
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 04:03:07 +02:00
karim 1196f9adf6 ui: Versions-Banner in normaler Schrift (Inter/sans) statt Mono
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 03:18:13 +02:00
karim e62b4c3704 ui: zitieren als Link (↗), Versionen mit Uhr-Icon, interne Zitierweise als Option
- zitieren: kein Pill mehr — Link in der Pill-Schrift (Display) mit ↗ am Ende
- Versionen: Pill behält, davor ein monochromes Uhr-SVG (currentColor)
- Zitier-Formate: „intern" (OPENBUREAU-Hausformat inkl. Version) als dritte
  Option und Default, neben APA und DIN

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 03:11:39 +02:00
karim fce6c9eabc ui: zitieren+Versionen als Pills (wie Dialog), Quellen kompakter
- zitieren + Versionen jetzt Akzent-Outline-Pills wie Dialog (statt Links);
  „kopieren" in der Quellenangabe bleibt ein Link
- Quellen/Fußnoten: feste, vom Theme vererbte Zeilenhöhe (~26px) mit
  unitless line-height:1.5 überschrieben + kleinere Abstände → deutlich
  kompakter. Aktionsreihe-Abstände reduziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 02:54:16 +02:00
karim 6aa88a07a6 ui: Artikel-Fuß neu — zitieren als Link, Tags neben Dialog, Versionen-Liste
- zitieren: schlichter Link direkt unter den Quellen (statt Pill); klappt eine
  dezente, gesamthaft kopierbare Quellenangabe auf — wahlweise APA oder DIN
- Tags raus von unter den Quellen → in die Aktionsreihe, ganz rechts neben Dialog
- „Versionen" als Link eine Zeile darunter; Liste in voller Inhaltsbreite und
  normaler Schrift/Größe (statt mono-Box). Auswahl öffnet Diff/Fassung oben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 02:19:27 +02:00
karim f2aef5c89a feature: Versionsverlauf + Diff (rot/grün) komplett auf der Seite
- API: /api/history/diff liefert den Unified-Diff einer Fassung (git show)
- „Version vom <Datum>"-Pill (statt Marke oben + Git-Links) öffnet den Verlauf
  direkt auf openbureau: Liste der Fassungen → Diff rot/grün wie auf GitHub,
  Toggle „ganze Fassung anzeigen", Rücksprung. Keine externen Git-Links mehr.
- Pills neu: Dialog (Akzent-Outline, wie zuvor) + Version/Zitieren im Tag-Look
- CSS: Tag-Pills, Diff-Styling (d-add/d-del/d-hunk), alte Badge-Styles raus

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 02:06:43 +02:00
karim 0cc90ac295 ui: Dialog als Pill in die Provenance-Reihe, sticht durch Symbol+Akzent hervor
Dialog-Link in .provenance verschoben: → Dialog · Version · Verlauf · Zitieren
in einer Reihe, gleiche Pill-Form. Dialog (prov-dialog) hebt sich durch Pfeil
+ Akzentfarbe (Rahmen/Text, fett) ab, Hover füllt Akzent. Zähler-Script mit ins
Partial gezogen; alte .dialog-link-Klasse/-CSS entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:52:45 +02:00
karim 22c9b9ff61 ui: Provenance als Pills + Byline nur bei Library-Beiträgen
- Version/Verlauf/Zitieren als dezente Outline-Pills (wie Versions-Marke),
  „·"-Trenner entfernt
- Byline (Autor) + „Aktualisiert am" nur noch bei Library-Beiträgen; Seiten
  wie Manifest/Kontakt/Spenden/Colophon zeigen sie nicht mehr

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:42:28 +02:00
karim 0ce2c73004 feature: alte Versionen direkt auf openbureau anzeigen
- API (öffentlich): /api/history listet Git-Versionen eines Beitrags,
  /api/history/version rendert eine alte Fassung (marked + Fußnoten-Support),
  on-demand via git im CMS-Container — kein Vorbauen. Pfad/rev validiert.
- Versions-Marke neben dem Kopf jedes Library-Beitrags (zeigt bewusst die
  Fassung); öffnet den Verlauf, Auswahl ersetzt den Text + Rücksprung-Banner.
- CSS für Badge/Panel/Banner; marked als Dependency.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:38:48 +02:00
karim c6f5beaa7b ui: Zitieren zeigt Quellenangabe sichtbar + Copy-Fallback für HTTP
Vorher: stiller clipboard.writeText → tut auf HTTP/LAN nichts (Clipboard-API
nur in sicherem Kontext). Jetzt: Klick klappt ein Panel mit der lesbaren
Quellenangabe auf (user-select:all), „Kopieren" nutzt clipboard-API mit
execCommand-Fallback; schlägt das fehl, wird der Text markiert (manuelles
Strg/⌘+C).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:22:55 +02:00
karim a4ca05c88f ui: Fußnoten-Verweise kleiner + dezent unterstrichen
sup auf 0.62em verkleinert; .footnote-ref bekommt feine Unterstreichung
(0.5px, 0.2em Offset) statt gar keiner.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:14:54 +02:00
karim 656da26347 content: 3 Musterbeiträge (Fußnoten/Quellen) + Forum-Seed-Wortmeldungen
- content/library/**/muster-*.md: Typus und Modell, Im Offenen arbeiten,
  Die Werkzeugkette — mit echten Fußnoten/Quellen, demonstrieren auch
  Provenance/Zitieren und Dialog am Artikel
- seed-demo.sql: Wortmeldungen auf den Musterbeiträgen (thread = Beitrags-URL)
  + DELETE-Hinweis für die d-Kommentare

Test-/Demo-Inhalt — vor dem späteren Full-Wipe leicht entfernbar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 01:09:26 +02:00
karim c3c8c9639f feature: lebende Dokumente — Fußnoten/Quellen + Provenance/Zitieren
- Fußnoten (Goldmark [^1], schon nativ) gestylt: ruhiges Schriftbild,
  automatische „Quellen"-Überschrift statt <hr>
- provenance.html-Partial bei Library-Beiträgen: Version → Commit, Verlauf
  (Gitea), „Zitieren"-Knopf (kopiert Quellenangabe in die Zwischenablage)
- repoURL-Param (git.openbureau.ch) für die Provenance-Links

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:56:28 +02:00
karim 9f9071d23f content: Kontakt/Impressum-Seite + Footer-Link
- content/impressum.md: Kontakt (E-Mail/Dialog) + Impressum (Karim Varano,
  Fluhmühlerain 1, 6015 Luzern, Privatperson)
- footer: „Kontakt"-Mailto → /impressum/ („Kontakt / Impressum")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:26:37 +02:00
karim 272d30357f ops: update.sh — Update im LXC in einem Befehl
Kapselt git pull + Deploy-Config + Neustart, damit die Migrationsschritte
nicht mehr per Hand nötig sind:
- kong.yml vor dem Pull auf die Vorlage zurücksetzen (kein Konflikt), danach
  CORS-Origin aus SITE_URL rendern
- chown -R 1000:1000 (non-root-Container darf schreiben)
- git safe.directory für root auf dem uid-1000-Repo
- docker compose up -d --build + kong reload + Healthcheck

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:47:35 +02:00
karim f97999c3c0 perf/test: Build-Coalescing teilen, syncLibrary drosseln, API-Tests
- coalesce.js: generisches Serialisieren+Koaleszieren je Key; buildSite() in
  hugo.js nutzt es → Publish/Preview/Profil starten nie überlappende Hugo-
  Prozesse, schnelle Folge-Aufrufe lösen nur einen Trailing-Build aus
- dialog-store: syncLibrary() gedrosselt (60s-TTL) statt bei jedem Forum-Read
  Filesystem-Walk + Upsert; Publish forciert Sync (force:true)
- test/: node:test-Suite (19 Tests) für safeRel/normAuthors/urlFor/hasAccess,
  roleOf + lokale JWT-Verifikation, Rate-Limiter, Coalescing; npm test

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:14:36 +02:00
karim 8404165f5c perf/ops: Auth-Latenz, Zähl-View, DB-Backup, Schreib-Limit, Asset-Cache
- auth: Supabase-JWT lokal verifizieren (hono/jwt, HS256) statt GoTrue-
  Roundtrip pro Request; JWT_SECRET in cms-env, Remote-Fallback wenn ungesetzt
- dialog: comment_stats-View (group by thread) ersetzt Full-Table-Scan +
  JS-Aggregation bei jedem Forum-Aufruf
- ops: scripts/backup-db.sh (pg_dump, rotiert) + täglicher Cron im Proxmox-
  Script — Dialog-Daten liegen nur in Postgres, nicht in Git
- security: Rate-Limit auf Schreib-Endpunkte (/api non-GET, 60/min je Nutzer)
- perf: Cache-Control (1 Woche) auf statische Assets, HTML bleibt frisch

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 23:01:12 +02:00
karim d0b5c6f670 dialog: optionaler Forum-Demo-Seed (db/seed-demo.sql)
Beispiel-Threads + Wortmeldungen für die Forum-Kategorien, bewusst getrennt
von der Migration (Produktion startet leer). Idempotent über feste UUIDs +
ON CONFLICT DO NOTHING; manuell einspielbar, DELETE-Block zum Entfernen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 22:18:27 +02:00
karim 2650913050 security: Härtung der CMS-API + Deployment
App-Level:
- Security-Header (secureHeaders) global; /images/* mit strikter CSP+sandbox
  → bösartiges SVG kann kein JS im Origin ausführen
- Body-Limit 256 KB auf /api/*; Login-Rate-Limit (10/5min) gegen Brute-Force
- Upload: 8-MB-Limit + Format-Verifikation (sharp-Metadaten, SVG/GIF-Signatur)
- Comment-Längenlimit (10k) gegen DB-Bloat
- DB-Fehler nicht mehr roh ausliefern (serverError-Helper)
- Profil-PUT koalesziert Hugo-Builds (kein Build-Sturm)

Infra:
- Container läuft non-root (USER node, uid 1000) + Proxmox-Repo-chown
- Ports binden per Default auf 127.0.0.1 (BIND_ADDR-Escape-Hatch)
- Kong-CORS auf SITE_URL beschränkt statt "*"
- README: Härtungs- + Migrationshinweise

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 22:05:57 +02:00
karim 6d20be036a dialog: Position/Rolle + Breadcrumb-Nav + nüchterne Wortmeldungen, Footer voll-breit
- comments: author_role (Position bei OPENBUREAU) aus authors.json gespeichert/ausgeliefert
- schema: comments.author_role hinzugefügt
- dialog.js: Breadcrumb (Dialoge › Forum), volles Datum/Uhrzeit, Box→Trennlinien-Layout
- css: Footer voll-breit (Flex statt Grid), Balken zwischen Header/main/Footer entfernt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 19:37:50 +02:00
karim 7b25f644a2 ui: kurzer Inhalt vertikal zentriert (Rahmen-Layout)
body:not(.is-home) main als Flex-Spalte mit justify-content: safe center —
kurze Seiten zeigen den Inhalt mittig zwischen Header und Footer (gleiche
Lücke oben/unten), langer Inhalt scrollt normal von oben (safe → start).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 11:40:47 +02:00
karim 4f4eccd475 ui: Footer kompakt + Balken entfernt (Breadcrumb-Linie, Header/Inhalt-Abstand)
- Footer auf allen Seiten so flach wie auf Journal (padding 0.55rem, row-gap 0.2rem)
- Breadcrumb ohne Trennlinie und ohne großen Abstand (war der „Balken" über dem Footer)
- Artikel-Top-Abstände reduziert (Inhalt sitzt enger unter dem Header)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 10:35:16 +02:00
karim af587af851 ui: App-Rahmen-Layout auf allen Seiten (Header/Footer fix, main scrollt intern)
Statt Seiten-Scroll jetzt überall der Journal-„Rahmen": body height:100dvh +
overflow:hidden, Header oben / Footer unten fix, main scrollt INTERN mit
verstecktem Scrollbalken. Dadurch:
- keine Seiten-Scrollbar → Header/Footer reichen schwarz bis an den rechten Rand
  (kein weißer scrollbar-gutter-Streifen mehr)
- Footer immer unten, Inhalt im Rahmen dazwischen
- nichts hat sichtbare Scrollbalken

Inhalt 72ch-zentriert in der vollbreiten Scroll-Fläche; Hero-Bild füllt die
volle Breite (kein 100vw-Hack mehr); Breadcrumb wandert in main (scrollt mit).
Mobil: normaler Seiten-Scroll (kein 100dvh-Rahmen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 05:36:45 +02:00
karim 309d12f8a2 ui: Sticky-Footer auf allen Seiten — Body von Grid auf Flex-Spalte
Nicht-Home-Seiten nutzten ein Grid-Sticky-Layout, das den Footer durch die
zusätzliche Breadcrumb-Zeile (impliziter Grid-Row) nicht zuverlässig unten
hielt. Body jetzt durchgehend Flex-Spalte wie Home: min-height:100dvh,
main flex:1 → Footer klebt unten. Inhaltsspalte (72ch + 1.75rem Gutter) per
max-width/margin-inline zentriert, Header/Footer volle Breite (eigenes inneres
Raster zentriert deren Inhalt), Full-Bleed-Hero rechnet sich weiter korrekt aus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 05:21:12 +02:00
karim f82214719a ui: Header/Footer/Journal/Dialog überarbeitet + Logo
Header/Masthead:
- neuer Wortmark logo.svg; Home als Full-Height-Flex (zwei eigenständig
  scrollbare Journal-Spalten, Footer klebt unten)
- kompakte Masthead; scrollbar-gutter:stable auf html → kein weißer Streifen
  links und kein Logo/Menü-Versatz zwischen den Seiten

Journal-Home:
- zwei Spalten, eckige Karten in natürlicher Höhe; Bild als Block (Inline-
  Whitespace-Lücke behoben)

Footer:
- Lizenzen AGPL-3.0 / CC BY-SA verlinken auf /lizenz/ (eigene Seite);
  „Hosted in Lucerne" (Link zur Autor-URL); keine Underlines; flush unten;
  kein Open-Source-Fließtext mehr, kein Name im Copyright

Dialog:
- schlichte Foren-Auflistung statt Karten; kompaktes Login; kleinerer
  „→ Dialog"-Button (nur noch auf Library-Artikeln); einheitliche Fontgrößen;
  weniger Abstand zum Header, Trennlinien entfernt

Config: CODE-Menü → git.openbureau.ch; params.author.url

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 04:47:36 +02:00
karim f146fc7cff content: Lizenz- und Spenden-Seiten
- /lizenz/agpl-3.0/ + /lizenz/cc-by-sa-4.0/ mit den offiziellen Volltexten
  (Code unter AGPL-3.0, Inhalte unter CC BY-SA 4.0) + /lizenz/-Übersicht
- /spenden/ mit LOGO-OB und Hinweis, wofür Spenden verwendet würden

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 04:46:28 +02:00
karim 822266be6c header: Wortmark auf finales LOGO-OB.svg (Pfade) umgestellt
- LOGO-OB.svg: Honk-Schriftzug in Kurven umgewandelt (10 <path>, keine
  Font-Referenz) → rendert korrekt als Hintergrundbild, hellgrau auf der
  schwarzen Masthead. Hintere Rechtecke füllen die Buchstaben-Punzen hellgrau.
- ungenutzte logo-ob2.svg (lebender Text) entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 20:39:01 +02:00
karim 58ede9005d ui: Journal als Masonry (unabhängige Spalten) + Wortmark auf eigenes SVG
- Journal-Startseite: .journal-list von Grid auf Multi-Column umgestellt —
  linke/rechte Spalte packen unabhängig (keine gemeinsame Zeilenhöhe mehr),
  break-inside:avoid hält Karten zusammen. Mobil: eine Spalte.
- Wortmark: eigenes logo-ob2.svg als Hintergrund (Honk-Webfont wieder raus).
  Hinweis: SVG enthält noch lebenden Honk-Text — für korrektes Rendern als
  Hintergrundbild müssen die Buchstaben in Kurven umgewandelt werden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 20:33:21 +02:00
karim c2dd9d3ffb ui: Journal-Karten kompakt (kein Höhen-Stretch) + Wortmark „openbureau" in Honk
Journal-Startseite:
- Karten-Kontext (.journal-list) nimmt die alten Vollflächen-Panel-Regeln
  zurück: kompakte 2-Spalten-Karten statt min-height:70vh + Hero-Padding.
- Cover-Bild als 16/9-Block OBEN statt absolutem Overlay; Text darunter,
  linksbündig, dunkle Schrift (kein Weiß-auf-Bild mehr).
- align-items:start → keine Zeilen-Stretchung; ein höherer Eintrag zieht den
  Nachbarn nicht mehr mit.

Header:
- Wortmark ist jetzt sichtbarer Kleintext „openbureau" in Honk
  (expressive COLRv1-Color-Font), self-gehostet als static/fonts/honk-latin.woff2
  + @font-face. Ersetzt das bisherige logo.svg-Hintergrundbild.

Beides nur per API/Build geprüft, nicht visuell (kein Headless-Browser).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 20:03:20 +02:00