Commit Graph

44 Commits

Author SHA1 Message Date
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
karim 70a6798404 cms: Schema-Migration bei jedem up nachziehen (forums/threads in Bestands-DB)
Problem: Init-Scripts (docker-entrypoint-initdb.d) laufen nur beim allerersten
DB-Start. Neue Tabellen aus schema.sql (forums/threads) landeten daher nicht in
einer bereits initialisierten Produktiv-DB → "relation public.forums does not
exist" auf der Dialog-Seite.

- docker-compose.yml: neuer einmaliger `migrate`-Service spielt das idempotente
  schema.sql als supabase_admin (Superuser, keine Owner-Konflikte) bei jedem
  `up` ein und lädt den PostgREST-Cache neu; cms wartet via
  service_completed_successfully darauf.
- routes/dialog.js: fehlende Tabelle führt nicht mehr zu rohem SQL-Fehler —
  leere Liste + server-seitiges Log statt 500 auf der Seite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 18:50:07 +02:00
karim bd85570259 dialog: Diskussionsplattform mit Foren, Rollen & Moderation + RLS-Fix
Auth/RLS-Fix (Schreiben gab 400):
- supabase.js: eigener supabaseAuth-Client für Login/Token-Check, damit
  signInWithPassword den Service-Daten-Client nicht prozessweit aufs
  User-Token umstellt (sonst lief insert als role=authenticated → RLS-Block).

Rollen (admin > editor > user):
- auth.js: roleOf() aus app_metadata.role + ADMIN_EMAILS, requireModerator.
- users.js: Rolle anzeigen/setzen über GoTrue app_metadata; .env-Admins fix.

Datenmodell (schema.sql):
- forums (Kategorien) + threads; Seed Allgemein/Projekte/Technik/Off-Topic
  und Sonder-Kategorie Beiträge. Library-Beiträge werden als Threads
  gespiegelt (dialog-store.syncLibrary).

API (routes/dialog.js, dialog-store.js):
- öffentlich: /api/forums, /api/forums/:slug, /api/recent, /api/thread
- eingeloggt: POST /api/threads (Thread starten, nur in Foren)
- Moderation: /api/mod/* (sperren/ausblenden), Admin: /api/admin/forums CRUD
- comments: Lock-Prüfung beim Schreiben, Moderation darf jede löschen.

Frontend:
- static/dialog.js: Router (Übersicht-Split-View | Forum | Thread),
  neuer Thread, Mod-Leiste, subtiles Login (dezente Zeile statt Formular).
- Admin-UI: Tabs Foren + Moderation, Rollen-Dropdown bei Autor:innen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 16:09:19 +02:00
karim 2749451107 cms/Dockerfile: TARGETARCH von BuildKit setzen lassen (kein fester amd64-Default)
Behebt arm64-Builds (z.B. Apple Silicon): vorher wurde immer amd64-Hugo
gezogen und scheiterte unter QEMU. amd64-LXC bleibt unverändert (auto).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:50:23 +02:00
karim 70341e71b1 journal: 2-Spalten-Karten-Raster statt Republik-Einspalter
- volle Breite (aus 72ch ausgebrochen), 2 Spalten, durchgehend 10px Abstände
  (zwischen Karten + zum Rand), mobil 1-spaltig
- Einträge als Karten (Hintergrund, Radius, Padding), linksbündig statt zentriert
- Cover-Bilder im 16:9-Format mit runden Ecken
- Snapshot des vorherigen Standes: Tag snapshot-journal-1col

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:43:36 +02:00
karim cc9d0a6855 footer: schwarz bis ganz unten (Body-Bottom-Padding raus, min-height:100vh) + Forum→Dialog
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:39:56 +02:00
karim 3594e78d4a dialog: Wortmeldungs-Zähler am „→ Dialog"-Link + Live via Polling (10s)
- Artikel-Link zeigt „→ Dialog · N" wenn Wortmeldungen existieren
- Widget lädt alle 10s nach, rendert nur bei Änderung neu (kein Flackern),
  pausiert im Hintergrund-Tab. Echtes Supabase-Realtime bleibt optional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:25:55 +02:00
karim 1284747341 dialog: Menü-Eintrag DIALOG + Übersicht aller Dialoge; Breite an andere Seiten angeglichen
- Menü: FORUM (extern) → DIALOG → /dialog/
- /dialog/ ohne ?thread zeigt Übersicht aller begonnenen Dialoge
  (GET /api/threads, Titel aus Inhaltsdateien, sortiert nach Aktivität)
- .dialog-page füllt jetzt die normale Inhaltsspalte (kein eigenes max-width/
  Padding mehr) → gleiche Breite wie andere Seiten
- Threads entstehen erst mit der ersten Wortmeldung

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:22:52 +02:00
karim 1ff2eb48f9 dialog: auf eigene Seite auslagern — Beitrag bleibt sauber
- single.html: eingebetteter Dialog raus, stattdessen „→ Dialog"-Link
- neue /dialog/-Seite (content/dialog.md + layouts/_default/dialog.html) mit
  Thread aus ?thread=, Rücklink zum Beitrag
- dialog.js liest Thread aus data-thread ODER ?thread=
- Styling: Pill-Link am Beitragsende, zentrierte Dialog-Seite

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:14:21 +02:00
karim e787961059 dialog: eigene Diskussion pro Beitrag (MVP, flach, eingeladene-only)
- DB: public.comments (thread, parent_id, user_id, author_name/-avatar, body, deleted)
- API: GET /api/comments (öffentlich lesen), POST/DELETE (eingeloggt),
  POST /api/auth/login (Token fürs Widget)
- Vanilla-Widget static/dialog.js: Karten mit Name+Bild, flacher Dialog mit
  optionalem Bezug (↳ Antwort auf), Inline-Login, Löschen (eigene/Admin)
- eingebettet in single.html (thread = Beitrags-Pfad), Styling im Theme-Look
- Autorname/-bild kommen aus dem Profil (data/authors.json)

Realtime (Supabase) folgt als nächster Schritt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 14:02:59 +02:00
karim 132503fc8b fix: Autor auf Journal-Liste nicht verlinken (verschachtelte <a> zerstörten Layout)
Der ganze Journal-Eintrag ist bereits ein <a>; ein Autor-<a> darin = ungültiges
nested-anchor → Browser bricht den Link auf, Einträge wurden höher. Autor dort
wieder als <span>. Der Autor-Link bleibt auf der Artikelseite (single.html),
wo es keinen umschließenden Link gibt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:42:18 +02:00
karim 07fdb6e726 Byline: kein Unterstrich; Link für Standard-Autor robust via E-Mail auflösen
- .byline-author/.journal-author: border-bottom entfernt; Stil nur noch auf
  echten Links (a.…), dezenter Hover statt Unterstrich
- Standard-Autor (ohne .Params.author) wird über site.Params.author.email in
  data/authors aufgelöst → Link greift unabhängig vom Namen, sobald Profil
  gespeichert ist; sonst Fallback auf urlize(Name)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:14:52 +02:00
karim 6a3b1b5b5e Autor-Seiten: /authors/<slug>/ (rundes Bild, Name, Bio, zentriert) + Byline-Link
- layouts/authors/single.html rendert die Autor-Seite zentriert
- Byline in single.html + index.html verlinkt den Autornamen zu /authors/<urlize name>/
  (nur wenn die Seite existiert)
- CMS-Profil-Speichern schreibt content/authors/<slug>.md (aus Name/Bio/Avatar)
  + data/authors.json und baut public neu → Seite & Links sofort live
- Autor-Seiten aus dem Inhalts-Editor ausgeblendet (über „Profil" verwaltet)
- custom.css: .author-page / -photo / -name / -bio + Byline-Link-Stil

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:07:26 +02:00
karim 2b682f5149 cms: hochgeladene Bilder sofort sichtbar (/images aus static/ servieren)
Uploads landen in static/images/, wurden aber erst nach Hugo-Build unter
/images/ ausgeliefert → Vorschau/Cover/Profilbild blieben leer. Jetzt serviert
der Server /images/* direkt aus static/ — sofort sichtbar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:55:44 +02:00
karim 47a70ea834 cms: Editor-Felder kompakter (32px statt 38px, engere Abstände)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:53:56 +02:00
karim 5704c0f94c cms: Upload-Bilder zu WebP konvertieren (sharp)
Raster-Uploads (jpg/png/…) werden zu WebP (q82), auf max. 2000px begrenzt,
EXIF-Rotation korrigiert — ~85% kleiner. SVG/GIF bleiben unangetastet.
Eindeutige Dateinamen verhindern Kollisionen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:47:16 +02:00
karim f42a69c7ed cms: Autoren-Verwaltung (Admin), Cover-Upload, einheitliche Feldhöhen
- Admin-only Seite „Autor:innen": Nutzer anlegen/Passwort setzen/löschen via
  GoTrue-Admin-API (/api/users, requireAdmin). /api/me liefert isAdmin → Nav
  zeigt den Punkt nur Admins.
- Cover-Bild: Upload-Knopf + Thumbnail (Bilder im Beitrag gingen schon über den
  WYSIWYG-Editor).
- Editor-Metazeile: einzeilige Felder + Dropdowns einheitlich 38px hoch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:40:31 +02:00
karim 10d803b7b3 cms: Publizieren nimmt Beitrag automatisch aus Entwurf (draft:false)
Bisher blieb ein Beitrag mit gesetztem Entwurf-Haken beim Publizieren aus dem
Live-Build ausgeschlossen → ging nie live. Jetzt setzt Publizieren draft:false,
speichert (Haken verschwindet, Status → Veröffentlicht), dann baut es live.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:33:55 +02:00
karim bd4b470877 cms: Rollen + Kollaboration (Admin sieht alles, Autoren nur eigene/geteilte)
- ADMIN_EMAILS (.env) = Admins, sehen/bearbeiten alles
- Autor:innen sehen nur Einträge mit ihrer Mail unter `authors:`; Ersteller wird
  beim Anlegen automatisch Autor
- Kollaboration: Feld „Autor:innen" im Editor → mehrere Mails = gemeinsamer Zugriff
- API erzwingt Zugriff bei list/read/save (403 ohne Recht)
- ADMIN_EMAILS in compose + LXC-Script (fragt Admin-Mail ab)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:22:06 +02:00
karim 35c2a122ae cms: WYSIWYG-Editor (Toast UI), Profilseite, ziehbare Vorschau, Pill-Optik
- echtes WYSIWYG statt Markdown-Sterne: Formatierung live, speichert Markdown,
  Bild-Upload via Toolbar. Editor nimmt den meisten Platz, Metadaten kompakt oben.
- Vorschau standardmäßig aus (kein toter Raum) + ziehbarer Trenner Editor↔Vorschau.
- Profilseite (Nav Inhalte/Profil): Profilbild-Upload + Kurztext, gespeichert als
  data/authors.json (vom Theme via site.Data.authors nutzbar).
- mehr Pill-Optik (Buttons, Suche, Chips), schwarze Topbar-Navigation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:10:31 +02:00
karim c780decdc3 cms: Sveltia-Einflüsse im Admin (Suche, fixierte Action-Leiste, Status-Chips, Vorschau-Toggle)
- Sidebar-Suche, Gruppen mit Zähler, zweizeilige Einträge mit Datum
- Editor-Kopf fixiert mit Speichern/Vorschau/Publizieren + Entwurf/Veröffentlicht-Chip
- Vorschau-Pane ein-/ausblendbar
- schwarze Topbar + Newsreader-Serif + Creme + Terracotta = Site-Look

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:58:47 +02:00
karim e2d986356c cms: dateibasiert + Editor im Decap/Sveltia-Look
- CMS liest/schreibt jetzt die echten content/**/*.md (gray-matter) statt DB:
  alle bestehenden Beiträge, Seiten und Rubriken erscheinen und sind editierbar.
  Supabase nur noch für Login.
- Admin neu: Collections-Sidebar (Beiträge/Seiten/Rubriken), an OPENBUREAU-Theme
  angeglichen (Newsreader-Serif, Creme, Terracotta, dunkle Topbar).
- Alle Frontmatter-Felder inkl. Farb-Dropdown mit Farbpunkten (Palette aus
  custom.css), Layout, Tags, summary, cover_image, external, toc, draft.
- Markdown-Toolbar: Fett/Kursiv/Unterstrichen/H2/H3/Link/Bild-Upload/Liste/Zitat/Code.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:51:49 +02:00
karim e7d820b83c site: aktueller Redesign-Stand (CSS, Layouts, Logo, Content-Feinschliff)
custom.css überarbeitet, hugo.yaml + Layouts angepasst, Logo (static/logo/)
und static/index.html ergänzt, Content-Korrekturen in library/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:26:58 +02:00
karim 8662970fe5 cms: Site beim Container-Start bauen (sonst 404 auf / vor erstem Publish)
public/ ist git-ignored und fehlt im frischen Clone — Entrypoint baut die
Hugo-Site einmal aus content/. Ausserdem: Script-Output stellt klar, dass
:8000 nur das API-Gateway ist (keine Web-UI).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:09:25 +02:00
karim 5a66c27e02 cms: Repo ist öffentlich — Token aus LXC-Script entfernen, Einzeiler
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 10:53:02 +02:00
karim 2c6caf4373 cms: LXC-Script interaktiv machen (Token/Storage/Bridge abfragen)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 00:28:52 +02:00
karim 60e5ef6844 cms: headless CMS vor Hugo (Supabase + Node-API + React-Admin)
All-in-One docker-compose-Stack (Muster von RAPPORT-SERVER gespiegelt):
db/auth/rest/kong + cms-Service (Node-API + Hugo-Binary 0.161.1 + Admin-SPA).

- DB-backed: posts-Tabelle kanonisch, MD ist generiertes Artefakt
- echte Hugo-Vorschau via draft:true + --buildDrafts → /_preview
- Publish: DB → content/library/<section>/<slug>.md → hugo build → live
- Bild-Upload nach static/images/, Supabase-Auth schützt /api/*
- Proxmox-LXC-Script: legt Container an, generiert Secrets, startet Stack

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 00:21:04 +02:00
karim 7a5be9250a republik-style redesign: dark masthead, hero block, palette, pills
- Dark full-bleed masthead with serif wordmark and stacked nav
- Hero entry treatment: full-bleed image bg with gradient overlay
- Per-section color system (data-section) + per-post override (data-color)
- Japanese accent palette (ajisai, sakura, suna, ichigo, yuyake, sora,
  kusa, kori, amagumo, yuki) — set via `color:` in front matter
- Tag pills replace hashtag-style tags; rendered as sibling of card link
  to avoid invalid nested <a> elements
- Single article: clean Republik-style header, no section rubric,
  tags as pills at bottom
- Cover image support (`cover_image:` in front matter):
    - wide mode: full-card banner above text
    - icon mode: small thumbnail right of text with colored card bg
- Library subsection header redesigned with section-colored stripe
- Dates use Swiss DD.MM.YYYY display (ISO retained in datetime attr)
- Custom Tokyo metro photo as demo cover image
2026-05-24 14:32:13 +02:00
karim af2b8c5060 show author on articles (single page byline + journal listing)
- Single page: 'von {Author} · {Date}' byline directly under H1 in
  mono, editorial-style. Falls back to site.Params.author.name.
- Journal listing: author appended to existing meta row.
- Bottom .time line cleaned: only renders if there's reading time
  or a meaningful lastmod, to avoid an empty meta strip.

Per-page override via 'author' frontmatter field; until set,
everything is credited to the site default author.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:58:57 +02:00
karim f586da8ba7 flarum.css: stronger overrides for serif body, hero, post structure
- Force serif on body/post/composer with broader, !important selectors
  to beat Flarum default cascade
- Hero + DiscussionHero: 2px text-colored bottom rule, larger title,
  italic serif subtitle for a present masthead
- Tag pill (e.g. "General") restyled: accent text on paper, sharp
  corners, mono caps, weighted
- Post divider darker; first post gets a top border for symmetry
- Avatar greyscale softened (30% instead of 80%) so identity reads
  without going washed-out

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:55:16 +02:00
karim 5a17cfc408 flarum.css: strip the literal '@import' word from header comment
Flarum's LESS parser scans the raw source for the strings '@import'
and 'data-uri' as a security check, even inside /* ... */ comments,
so the documentation comment itself was tripping the guard. Replaced
with a minimal one-liner; full instructions stay in README/chat.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:48:33 +02:00
karim 3e6888fbd4 flarum.css: drop @import, document two-step font load
Flarum's Custom Styles parser (LESS) blocks @import and data-uri for
security. Move the font loading to a <link> tag the user adds via
Flarum admin's "Custom Header" HTML field. CSS itself stays unchanged
beyond removing the import line.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:43:50 +02:00
karim 53028151ee add OPENBUREAU custom CSS for Flarum forum
Mirrors the editorial typography and color system of openbureau.ch
onto the Flarum instance (openstudio.kgva.ch). Paste into Flarum
admin → Appearance → Custom Styles. File is also served at
openbureau.ch/flarum.css once the site is deployed, so Flarum can
optionally @import the live URL instead.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:36:52 +02:00
karim 00c3343b1d init: scaffold OPENBUREAU site with shibui-derived theme
- Hugo site for openbureau.ch (Deutsch, i18n-ready for EN/IT)
- Theme themes/openbureau/ = local copy of shibui, customized via
  site-level layouts and assets to keep the theme reference clean
- Editorial typography stack: Newsreader serif body, Space Grotesk
  display, Inter for listings, IBM Plex Mono for technical meta
- Content structure: library/ (Theorie, Büroführung, Software) with
  manifest and colophon at root; software is a library category, not
  a separate top-level
- Three views over one source: Journal (chronological home),
  Library (atlas grouped by section + tag cloud), single articles

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:25:29 +02:00