Index: CHANGELOG.de.md
===================================================================
--- CHANGELOG.de.md	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
+++ CHANGELOG.de.md	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -0,0 +1,164 @@
+# Änderungen — Klonkt
+
+Alle nennenswerten Änderungen an Klonkt. Neueste oben.
+Versionen folgen [SemVer](https://semver.org/lang/de/) (`1.0.0-beta.N` während der Beta).
+
+> **Zwei getrennte Versionsnummern — nicht verwechseln:**
+> - **App-Version** (dieses Changelog + Footer, `package.json`) = kosmetisch; bei jeder Release erhöhen.
+> - **Föderations-Proto** (`KLONKT_PROTO` in `CircleFederation.js`, derzeit **2**) = bestimmt, ob
+>   Klonkt-Sites in ihrem jeweiligen **Cirkel** föderieren können (Teil der signierten Grundlage).
+>   Eine App-Versions-Erhöhung ändert das Proto **nicht** und bricht somit keine Cirkels. Erhöhe das
+>   Proto **nur** bei Föderations-/Sicherheitsänderungen und rolle es dann im **Gleichschritt**
+>   auf alle Instanzen aus (inkl. der Democirkels), damit sie weiterhin zusammenarbeiten.
+
+## [Unreleased]
+
+### Hinzugefügt
+- Die Suche durchsucht jetzt auch **Titel** (nach Titel, Künstler und Album), nicht nur Beiträge.
+  Gefundene Titel sind direkt in der Ergebnisliste abspielbar, mit einem
+  „im Beitrag →"-Link zum Beitrag/Album/zur Playlist, in dem der Titel vorkommt.
+- Die Beitragssuche nutzt jetzt **Präfix-Matching**: tippe „astr" und du findest „astra"
+  (jedes Wort als Präfix, UND zwischen den Wörtern) — angenehmeres Suchen-während-du-tippst.
+- **Fediverse-Client**: folge Konten (WebFinger → signiertes Follow), eine
+  **Home-Timeline** (`/tijdlijn`) von denen, denen du folgst, ein **Benachrichtigungs-Posteingang**
+  (`/meldingen`) und ⭐-Like / 🔁-Boost / ↩-Antworten aus der Timeline heraus.
+- **Liken und Antworten über das Fediverse** bei einem Beitrag: Besucher geben nur
+  ihren eigenen Server ein (`@du@server` oder `server.com`) und wickeln es auf ihrem
+  eigenen Konto ab (`/authorize_interaction`).
+- **HTTP-Signaturen erzwungen** im Posteingang: unsignierte oder gefälschte
+  Aktivitäten werden abgewiesen — keine gefälschten Reaktionen/Likes/Follower mehr.
+- **Blockieren/Defederieren** eines Kontos oder einer ganzen Domain (`/blokkeren`).
+- **Live-Theme-Vorschau** in Verwaltung → Site-Einstellungen: Akzent, Theme und Palette
+  sofort sichtbar, bevor du speicherst.
+
+### Geändert
+- **Paletten überarbeitet** auf 8: die neutrale **Klonkt** (Weiß/Schwarz, goldener Akzent)
+  ist jetzt der Standard, dazu 7 echte Farb-Themes (Forest, Ocean, Teal, Lilac,
+  Sunset, Candy, Amber). Akzent-Auswahl aufgeräumt; der Klonkt-Hintergrund folgt
+  jetzt der gewählten Akzentfarbe.
+
+### Entfernt
+- **Hub-Modus** entfernt — Klonkt ist von nun an **solo oder Cirkels**. Ein
+  Kollektiv/Label erstellst du jetzt über **Cirkels** (föderierte einzelne Sites).
+- **Native Reaktionen + Google-Login** entfernt — Interaktion läuft jetzt vollständig
+  über das **Fediverse**.
+- **Lokale Favoriten (♥)** entfernt — ersetzt durch das ⭐ Fediverse-Like.
+
+### Behoben
+- Mini-Player: Springen + Scrollen zum spielenden Track funktioniert jetzt auch aus einem
+  **Album oder einer Playlist** (die Track-ID fehlte in der Wiedergabe-Queue).
+- Der gerade spielende Track erhält ein **dauerhaftes Highlight** im Beitrag.
+- Leere **Album-/Playlist-Cover** behoben (eine fehlende Referenz in der
+  WebP-Konvertierung) + sie fallen jetzt auf das Cover des ersten Tracks zurück.
+- Kaputtes **Avatar/Profilbild** in der Kopfzeile nach der WebP-Konvertierung: der Viewer-Avatar
+  (und die Rolle) wird jetzt frisch aus der Datenbank gelesen, sodass sich eine alte Sitzung
+  ohne erneutes Einloggen selbst wiederherstellt.
+
+### Behoben (früher)
+- Inline-Content-Layout auf Touch vereinfacht: keine Formatierungs-Toolbar/Rand mehr inline
+  (du bearbeitest ohnehin im Vollbild) — nur die Content-Vorschau + die Tippen-zum-Bearbeiten-Pille.
+- Konnte auf der Bearbeiten-Seite nicht scrollen: die Vollbild-Scroll-Sperre (overflow:hidden
+  auf html/body) blieb hängen. Sperre entfernt — das Vollbild-Frame deckt die Seite
+  bereits ab und auf Touch sind die Scrollbalken ausgeblendet.
+- Das Verlassen des Vollbilds scrollt jetzt an den Anfang des Contents (statt durchzuspringen
+  zum Footer).
+- Der „Tippen zum Bearbeiten"-Hinweis auf Touch ist jetzt eine Pille, die sticky unten am
+  Container klebt (über der Speichern-Leiste), statt unschön zentriert im Text.
+- Scrollbalken ausgeblendet auf Mobil & Tablet (Touch) — Scrollen funktioniert weiterhin,
+  nur die Balken-UI ist weg (keine verwirrenden/doppelten Balken).
+- Vollbild-Editor: kein doppelter Scrollbalken mehr — im Vollbild scrollt ausschließlich
+  das Textfeld; das Frame und die Seite (html+body) dahinter sind gesperrt.
+- Editor: das Bild springt nicht mehr beim Anklicken einer Formatierungsschaltfläche.
+  Auf Mobil ist das Schreibfeld jetzt eine begrenzte Scroll-Box mit der Formatierungs-Toolbar
+  STICKY oben: der Text scrollt darunter, die Toolbar bleibt immer im Blick, und
+  das Caret-Scrollen, das mobiles Chrome erzwingt, bleibt innerhalb der Box, statt die ganze
+  Seite springen zu lassen. (Plus: die Scrollposition wird rund um jeden
+  Formatierungsbefehl beibehalten.) `interactive-widget=resizes-content` wieder entfernt — das ließ
+  die Seite vor der Tastatur nach oben scrollen und brach die kb-open-Erkennung; die
+  Aktionsleiste + Vollbild regeln die Tastatur über den Visual Viewport.
+- Post-Editor auf Mobil: die Speichern/Abbrechen-Leiste bleibt jetzt knapp über der
+  Tastatur (sticky mit dynamischem Bottom-Offset = Maximum aus Tastatur- und
+  Audioplayer-Höhe), statt dahinter zu fallen oder mitten im Bild zu schweben.
+  Der Viewport skaliert mit der Tastatur mit (`interactive-widget=resizes-content`).
+- Mobile Tastatur vs. Layout (site-weit): sobald die Tastatur während des
+  Tippens öffnet, blenden sich die festen Unterleisten (Bottom-Tab + Mini-Player) aus, sodass
+  sie nicht mehr über dem Eingabefeld schweben oder es überlappen. Sie kehren zurück, sobald
+  die Tastatur schließt. (Erkennung über visualViewport → `body.kb-open`.)
+- Beitrag bearbeiten auf Mobil öffnete nicht mehr sofort die Tastatur: der Titel erhielt
+  nicht länger automatisch Fokus (`autofocus` entfernt). Auf dem Desktop fokussiert der Titel noch.
+- Beiträge schreiben auf Mobil: eine Formatierungsschaltfläche (fett/kursiv/…) stahl den Fokus aus dem
+  Textfeld → die Auswahl ging verloren (fett konnte nicht mehr ausgeschaltet werden) und die
+  Seite sprang nach unten. Die Toolbar hält den Fokus jetzt im Editor
+  (mousedown-preventDefault + Fokus ohne Scroll), sodass das Umschalten funktioniert und es keinen
+  Sprung mehr gibt. Toolbar-Taps sind auch schneller (touch-action: manipulation). Aktive
+  Formatierung ist jetzt deutlich mit der Akzentfarbe gefüllt (und :hover klebt nicht mehr auf
+  Touch), sodass sichtbar ist, ob z. B. fett an oder aus ist.
+
+### Hinzugefügt
+- Bilder → **WebP**: neue Uploads (Beitragsbilder/Cover, Avatar, Site-Foto,
+  Hub-Hero, Audio-Cover) werden automatisch in WebP umgewandelt (kleiner); bestehende
+  Bilder wurden in einem Durchgang umgewandelt und alle Referenzen aktualisiert.
+- Bilder sind **schwerer zu speichern** (Rechtsklick-„Speichern" + Ziehen
+  blockiert) — Reibung, kein wasserdichter Schutz.
+- Mini-Player (Desktop): Klick auf den spielenden Track → **springe zum Beitrag und scrolle
+  zu diesem Track** (mit Highlight); funktioniert auch für site-weite Tracks über eine Lookup.
+- Textfelder (`<textarea>`) wachsen jetzt site-weit mit dem Inhalt mit, statt intern
+  zu scrollen (Scrollen-im-Scrollen war verwirrend). Das Inline-Schreibfeld wächst
+  ebenfalls einfach mit; Tippen auf Mobil/Tablet geht ohnehin ins Vollbild.
+- Auf **Mobil & Tablet** (Touch) verhält sich der Inhalt wie ein Beitrag: inline ist er
+  **nicht tippbar** (Tap-Fläche mit „✎ Tippen zum Bearbeiten"-Pille). Ein Tipp öffnet eine
+  **Vollbild-Schreib-„Seite"** — mit echter Zurück-Schaltflächen-Unterstützung, sodass das
+  Browser-Zurück oder die **„✓ Fertig"-Schaltfläche** sie schließt und du wieder im Formular
+  stehst (alle Felder intakt), woraufhin du alles zusammen mit der normalen Speichern-Schaltfläche speicherst.
+- Schreibfenster kann auf **Vollbild** (Schaltfläche in der Editor-Toolbar, oder Escape zum
+  Zurückgehen) — angenehm für ablenkungsfreies Schreiben auf Mobil. Die Formatierungs-Toolbar
+  bleibt dabei immer oben im Blick, auch wenn die mobile Tastatur öffnet
+  (Frame folgt dem Visual Viewport).
+- Verwalter kann sein **Google-Konto verknüpfen** (Konto → Mit Google anmelden) und
+  sich danach auch mit Google anmelden. Sicher: Verknüpfen ist nur möglich, während du mit
+  Passwort angemeldet bist, und der Google-Login gewährt nur Verwaltung, wenn das exakte
+  verknüpfte Google-Konto (`google_sub`) übereinstimmt. Entkoppeln ist möglich, solange es ein
+  Passwort gibt.
+- Beiträge liken / favorisieren: angemeldete Benutzer können einen Beitrag mit einer ♥-Schaltfläche liken
+  (zeigt die Anzahl der Likes). Deine gelikten Beiträge stehen auf der neuen **Favoriten**-Seite
+  (`/favorieten`, Link im Kontomenü). Nicht angemeldet → die Schaltfläche führt zum Login.
+
+### Geändert
+- Beitrags-Navigation (Newer/Older) zeigt jetzt ein 📌, wenn der verlinkte Beitrag angepinnt ist.
+- Die Newer/Older-Beitragsnavigation steht jetzt auch auf der Fan-Gate (Login-Wall eines
+  fan-only-Beitrags), sodass ein Besucher nicht festhängt, sondern weiterblättern kann.
+  Navigation in ein gemeinsames Partial verschoben (`partials/post-nav.ejs`).
+- Login aufgeteilt: die öffentliche Login-Seite (`/auth/login`) zeigt für Besucher jetzt
+  **nur** Google-Login (Zuhörer/Fans). Der Verwalter-Login (Benutzername +
+  Passwort) ist verborgen auf `/auth/admin` (nirgends verlinkt).
+- Beitrags-Navigation (Newer/Older) behält jetzt auf jedem Beitrag dieselbe Zwei-Karten-Struktur:
+  fehlt ein neuerer/älterer Beitrag, dann steht dort ein dezenter ausgegrauter
+  Platzhalter („Neuester Beitrag" / „Ältester Beitrag") statt einer leeren Stelle.
+- Beim Öffnen eines verwandten/nächsten Beitrags springst du jetzt an den Anfang der
+  Seite (vorher: du bliebst an der alten Scrollposition hängen).
+
+## [1.0.0-beta.2] — 2026-06-19
+
+Erste Release, bei der wir die Version aktiv pflegen (sichtbar im Footer →
+klicke darauf für diese Seite). Föderations-Proto: **2** (unverändert).
+
+### Hinzugefügt
+- Release-Tracking: die Versionsnummer im Footer verlinkt auf diese Änderungen-Seite.
+- Acht Premium-Funktionen (Patreon-gated): Newsletter/Mailingliste, Download-für-E-Mail,
+  Release-Planung + fan-only Previews, EPK/Pressekit, Pro-Statistiken, Link-in-Bio +
+  Klick-Statistiken, einbettbarer Player und Show-Agenda + Notify-Me.
+- Newsletter-Anmeldefeld im Footer (an/aus in Verwaltung → Einstellungen).
+- SMTP-Einstellungen einstellbar in Verwaltung → Einstellungen (kein `.env`-Edit mehr nötig),
+  mit Testmail-Schaltfläche.
+
+### Geändert
+- Verwaltung → Einstellungen: Hub- und Cirkel-Konfiguration stehen jetzt direkt unter der Modus-Karte;
+  Formulare aufgeräumter (gestapelte Labels, full-width Inputs).
+- EPK/Pressekit zeigt die Top 10 der meistgehörten Titel.
+- Aufgeräumtere 404-Seite (mobilfreundlich) und deutlichere Login-Fehlermeldungen.
+
+### Behoben
+- Site-weiter Audioplayer erhielt keine Tracks (falsche Spalte in der Query).
+- Schaltflächentext wurde beim Hover unlesbar (gleiche Farbe wie die Schaltfläche).
+- Datumsauswahl folgt jetzt dem Theme.
+- htmx-Navigation aktualisiert die Adressleiste wieder; keine doppelte Kopfzeile bei zurück/vorwärts.
Index: CHANGELOG.md
===================================================================
--- CHANGELOG.md	(revision 0960c1d20ad342283da29370be69f7c966bfd51a)
+++ CHANGELOG.md	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -1,164 +1,164 @@
-# Wijzigingen — Klonkt
+# Changelog — Klonkt
 
-Alle noemenswaardige wijzigingen aan Klonkt. Nieuwste bovenaan.
-Versies volgen [SemVer](https://semver.org/lang/nl/) (`1.0.0-beta.N` tijdens de beta).
+All notable changes to Klonkt. Newest at the top.
+Versions follow [SemVer](https://semver.org/) (`1.0.0-beta.N` during the beta).
 
-> **Twee losse versienummers — niet verwarren:**
-> - **App-versie** (deze changelog + footer, `package.json`) = cosmetisch; bump elke release.
-> - **Federatie-proto** (`KLONKT_PROTO` in `CircleFederation.js`, nu **2**) = bepaalt of
->   Klonkt-sites in elkaars **cirkel** kunnen federeren (zit in de getekende grondslag).
->   Een app-versie-bump verandert de proto **niet** en breekt cirkels dus niet. Bump de
->   proto **alleen** bij federatie-/security-wijzigingen, en rol die dan in **lockstep**
->   uit naar álle instances (incl. de democirkels) zodat ze blijven samenwerken.
+> **Two separate version numbers — don't confuse them:**
+> - **App version** (this changelog + footer, `package.json`) = cosmetic; bump every release.
+> - **Federation proto** (`KLONKT_PROTO` in `CircleFederation.js`, now **2**) = determines whether
+>   Klonkt sites can federate into each other's **circle** (it's part of the signed basis).
+>   An app-version bump does **not** change the proto and therefore doesn't break circles. Bump the
+>   proto **only** for federation/security changes, and then roll it out in **lockstep**
+>   to all instances (including the democircles) so they keep working together.
 
 ## [Unreleased]
 
-### Toegevoegd
-- Zoeken doorzoekt nu ook **nummers** (op titel, artiest én album), niet alleen posts.
-  Gevonden nummers zijn direct afspeelbaar in de resultatenlijst, met een
-  "in post →"-link naar de post/album/playlist waarin het nummer voorkomt.
-- Posts-zoek gebruikt nu **prefix-matching**: typ "astr" en je vindt "astra"
-  (elk woord als prefix, AND tussen de woorden) — fijner zoeken-terwijl-je-typt.
-- **Fediverse-client**: volg accounts (WebFinger → ondertekende Follow), een
-  **home-tijdlijn** (`/tijdlijn`) van wie je volgt, een **meldingen-inbox**
-  (`/meldingen`), en ⭐-like / 🔁-boost / ↩-reageren vanuit de tijdlijn.
-- **Liken én reageren via de fediverse** op een post: bezoekers vullen alleen
-  hun eigen server in (`@jij@server` of `server.com`) en handelen het af op hun
-  eigen account (`/authorize_interaction`).
-- **HTTP-handtekeningen afgedwongen** op de inbox: ongetekende of vervalste
-  activiteiten worden geweigerd — geen nep-reacties/likes/volgers meer.
-- **Blokkeren/defedereren** van een account of een heel domein (`/blokkeren`).
-- **Live thema-preview** in Beheer → site-instellingen: accent, thema en palet
-  meteen zichtbaar vóór je opslaat.
+### Added
+- Search now also covers **tracks** (by title, artist and album), not just posts.
+  Found tracks are directly playable in the results list, with an
+  "in post →" link to the post/album/playlist the track appears in.
+- Posts search now uses **prefix matching**: type "astr" and you'll find "astra"
+  (each word as a prefix, AND between the words) — nicer search-as-you-type.
+- **Fediverse client**: follow accounts (WebFinger → signed Follow), a
+  **home timeline** (`/tijdlijn`) of who you follow, a **notifications inbox**
+  (`/meldingen`), and ⭐-like / 🔁-boost / ↩-reply from the timeline.
+- **Like and reply via the fediverse** on a post: visitors only fill in
+  their own server (`@you@server` or `server.com`) and handle it on their
+  own account (`/authorize_interaction`).
+- **HTTP signatures enforced** on the inbox: unsigned or forged
+  activities are rejected — no more fake replies/likes/followers.
+- **Block/defederate** an account or an entire domain (`/blokkeren`).
+- **Live theme preview** in Admin → site settings: accent, theme and palette
+  visible immediately before you save.
 
-### Gewijzigd
-- **Paletten herzien** naar 8: de neutrale **Klonkt** (wit/zwart, gouden accent)
-  is nu de standaard, plus 7 echte-kleur thema's (Forest, Ocean, Teal, Lilac,
-  Sunset, Candy, Amber). Accent-keuze opgeschoond; de Klonkt-achtergrond volgt
-  nu de gekozen accentkleur.
+### Changed
+- **Palettes revised** to 8: the neutral **Klonkt** (white/black, gold accent)
+  is now the default, plus 7 real-color themes (Forest, Ocean, Teal, Lilac,
+  Sunset, Candy, Amber). Accent choice cleaned up; the Klonkt background now
+  follows the chosen accent color.
 
-### Verwijderd
-- **Hub-modus** verwijderd — Klonkt is voortaan **solo of cirkels**. Een
-  collectief/label maak je nu via **Cirkels** (gefedereerde losse sites).
-- **Native reacties + Google-login** verwijderd — interactie loopt nu volledig
-  via de **fediverse**.
-- **Lokale favorieten (♥)** verwijderd — vervangen door de ⭐ fediverse-like.
+### Removed
+- **Hub mode** removed — Klonkt is now **solo or circles**. You now create a
+  collective/label via **Circles** (federated standalone sites).
+- **Native comments + Google login** removed — interaction now runs entirely
+  via the **fediverse**.
+- **Local favorites (♥)** removed — replaced by the ⭐ fediverse like.
 
-### Opgelost
-- Mini-speler: spring + scroll naar de spelende track werkt nu ook vanuit een
-  **album of playlist** (de track-id zat niet in de afspeel-queue).
-- De track die nu speelt krijgt een **blijvende highlight** in de post.
-- Lege **album/playlist-covers** hersteld (een gemiste verwijzing in de
-  WebP-conversie) + ze vallen nu terug op de cover van de eerste track.
-- Kapotte **avatar/profielfoto** in de kop na de WebP-conversie: de viewer-avatar
-  (en rol) wordt nu vers uit de database gelezen, dus een oude sessie herstelt
-  zichzelf zonder opnieuw inloggen.
+### Fixed
+- Mini player: jump + scroll to the playing track now also works from an
+  **album or playlist** (the track id wasn't in the playback queue).
+- The currently playing track now gets a **persistent highlight** in the post.
+- Empty **album/playlist covers** fixed (a missed reference in the
+  WebP conversion) + they now fall back to the cover of the first track.
+- Broken **avatar/profile photo** in the header after the WebP conversion: the viewer avatar
+  (and role) is now read fresh from the database, so an old session repairs
+  itself without logging in again.
 
-### Opgelost (eerder)
-- Inline content-layout op touch versimpeld: geen opmaak-toolbar/rand meer inline
-  (je bewerkt toch fullscreen) — alleen de content-preview + de tik-om-te-bewerken-pill.
-- Kon niet scrollen op de bewerk-pagina: de fullscreen scroll-lock (overflow:hidden
-  op html/body) bleef hangen. Lock verwijderd — het fullscreen-frame dekt de pagina
-  al af en op touch zijn de scrollbalken verborgen.
-- Fullscreen verlaten scrolt nu naar de top van de content (i.p.v. door te springen
-  naar de footer).
-- "Tik om te bewerken"-aanwijzing op touch is nu een pill die sticky onderaan de
-  container plakt (boven de Opslaan-balk) i.p.v. lelijk gecentreerd in de tekst.
-- Scrollbalken verborgen op mobiel & tablet (touch) — scrollen blijft werken,
-  alleen de balk-UI is weg (geen verwarrende/dubbele balken).
-- Fullscreen-editor: geen dubbele scrollbalk meer — in fullscreen scrollt alléén
-  het tekstveld; het frame en de pagina (html+body) erachter zijn vergrendeld.
-- Editor: het beeld verspringt niet meer bij het aanklikken van een opmaakknop.
-  Op mobiel is het schrijfveld nu een begrensde scroll-box met de opmaak-toolbar
-  STICKY bovenin: de tekst scrollt eronder, de toolbar blijft altijd in beeld, en
-  de caret-scroll die mobiel Chrome forceert blijft binnen de box i.p.v. de hele
-  pagina te laten verspringen. (Plus: scrollpositie wordt vastgehouden rond elk
-  opmaak-commando.) `interactive-widget=resizes-content` weer verwijderd — dat liet
-  de pagina omhoog scrollen voor het toetsenbord en brak de kb-open-detectie; de
-  actiebalk + fullscreen regelen het toetsenbord via de visual viewport.
-- Post-editor op mobiel: de Opslaan/Annuleren-balk blijft nu net bóven het
-  toetsenbord (sticky met dynamische bottom-offset = max van toetsenbord- en
-  audiospeler-hoogte), i.p.v. erachter te vallen of midden in beeld te zweven.
-  Viewport schaalt mee met het toetsenbord (`interactive-widget=resizes-content`).
-- Mobiel toetsenbord vs. layout (site-breed): zodra het toetsenbord opent tijdens
-  het typen, verbergen de vaste onderbalken (bottom-tab + mini-speler) zich, zodat
-  ze niet meer over het invoerveld zweven of het overlappen. Ze komen terug zodra
-  het toetsenbord sluit. (Detectie via visualViewport → `body.kb-open`.)
-- Post bewerken op mobiel opende niet meer meteen het toetsenbord: de titel kreeg
-  niet langer automatisch focus (`autofocus` weg). Op desktop focust de titel nog wel.
-- Posts schrijven op mobiel: een opmaakknop (vet/cursief/…) stal de focus uit het
-  tekstveld → de selectie ging verloren (vet kon niet meer uitgezet worden) en de
-  pagina sprong naar beneden. De toolbar houdt de focus nu in de editor
-  (mousedown-preventDefault + focus zonder scroll), dus toggelen werkt en er is geen
-  sprong meer. Toolbar-taps zijn ook sneller (touch-action: manipulation). Actieve
-  opmaak is nu duidelijk gevuld met de accentkleur (en :hover plakt niet meer op
-  touch), zodat zichtbaar is of bv. vet aan of uit staat.
+### Fixed (earlier)
+- Inline content layout on touch simplified: no formatting toolbar/border inline
+  anymore (you edit fullscreen anyway) — only the content preview + the tap-to-edit pill.
+- Couldn't scroll on the edit page: the fullscreen scroll lock (overflow:hidden
+  on html/body) stayed stuck. Lock removed — the fullscreen frame already covers the page
+  and on touch the scrollbars are hidden.
+- Leaving fullscreen now scrolls to the top of the content (instead of jumping
+  down to the footer).
+- The "tap to edit" hint on touch is now a pill that sticks to the bottom of the
+  container (above the Save bar) instead of being ugly-centered in the text.
+- Scrollbars hidden on mobile & tablet (touch) — scrolling still works,
+  only the bar UI is gone (no confusing/duplicate bars).
+- Fullscreen editor: no more double scrollbar — in fullscreen only the
+  text field scrolls; the frame and the page (html+body) behind it are locked.
+- Editor: the view no longer jumps when clicking a formatting button.
+  On mobile the writing field is now a bounded scroll box with the formatting toolbar
+  STICKY at the top: the text scrolls underneath it, the toolbar always stays in view, and
+  the caret scroll that mobile Chrome forces stays within the box instead of making the whole
+  page jump. (Plus: scroll position is held around each
+  formatting command.) `interactive-widget=resizes-content` removed again — it made
+  the page scroll up for the keyboard and broke the kb-open detection; the
+  action bar + fullscreen handle the keyboard via the visual viewport.
+- Post editor on mobile: the Save/Cancel bar now stays just above the
+  keyboard (sticky with a dynamic bottom offset = max of keyboard and
+  audio-player height), instead of falling behind it or floating in the middle of the screen.
+  Viewport scales with the keyboard (`interactive-widget=resizes-content`).
+- Mobile keyboard vs. layout (site-wide): as soon as the keyboard opens while
+  typing, the fixed bottom bars (bottom-tab + mini player) hide themselves, so
+  they no longer float over or overlap the input field. They come back as soon as
+  the keyboard closes. (Detection via visualViewport → `body.kb-open`.)
+- Editing a post on mobile no longer immediately opened the keyboard: the title no longer
+  gets automatic focus (`autofocus` removed). On desktop the title still focuses.
+- Writing posts on mobile: a formatting button (bold/italic/…) stole the focus from the
+  text field → the selection was lost (bold couldn't be turned off anymore) and the
+  page jumped down. The toolbar now keeps the focus in the editor
+  (mousedown-preventDefault + focus without scroll), so toggling works and there's no
+  more jump. Toolbar taps are also faster (touch-action: manipulation). Active
+  formatting is now clearly filled with the accent color (and :hover no longer sticks on
+  touch), so it's visible whether e.g. bold is on or off.
 
-### Toegevoegd
-- Afbeeldingen → **WebP**: nieuwe uploads (post-afbeeldingen/cover, avatar, site-foto,
-  hub-hero, audio-cover) worden automatisch naar WebP omgezet (kleiner); bestaande
-  afbeeldingen zijn in één keer omgezet en alle verwijzingen bijgewerkt.
-- Afbeeldingen zijn **lastiger op te slaan** (rechtsklik-"opslaan" + slepen
-  geblokkeerd) — frictie, geen waterdichte beveiliging.
-- Mini-speler (desktop): klik op de spelende track → **spring naar de post én scroll
-  naar die track** (met highlight); werkt ook voor site-brede tracks via een lookup.
-- Tekstvelden (`<textarea>`) groeien nu site-breed mee met de inhoud i.p.v. intern
-  te scrollen (scroll-binnen-scroll was verwarrend). Het inline schrijfveld groeit
-  ook gewoon mee; typen op mobiel/tablet gaat sowieso fullscreen.
-- Op **mobiel & tablet** (touch) gedraagt de inhoud zich als een post: inline is het
-  **niet typbaar** (tap-vlak met "✎ Tik om te bewerken"-pill). Eén tik opent een
-  **fullscreen schrijf-"pagina"** — met echte back-knop-ondersteuning, dus de
-  browser-back of de **"✓ Klaar"-knop** sluit 'm en je staat terug in het formulier
-  (alle velden intact), waarna je alles samen opslaat met de gewone Opslaan-knop.
-- Schrijfvenster kan op **volledig scherm** (knop in de editor-toolbar, of Escape om
-  terug te gaan) — fijn voor afleidingsvrij schrijven op mobiel. De opmaak-toolbar
-  blijft daarbij altijd bovenaan in beeld, ook als het mobiele toetsenbord opent
-  (frame volgt de visual viewport).
-- Beheerder kan z'n **Google-account koppelen** (Account → Inloggen met Google) en
-  daarna óók met Google inloggen. Veilig: koppelen kan alleen terwijl je met
-  wachtwoord bent ingelogd, en Google-login geeft alleen beheer als de exacte
-  gekoppelde Google-account (`google_sub`) matcht. Ontkoppelen kan zolang er een
-  wachtwoord is.
-- Posts liken / favorieten: ingelogde gebruikers kunnen een post liken met een ♥-knop
-  (toont het aantal likes). Je gelikete posts staan op de nieuwe **Favorieten**-pagina
-  (`/favorieten`, link in het accountmenu). Niet-ingelogd → de knop leidt naar de login.
+### Added
+- Images → **WebP**: new uploads (post images/cover, avatar, site photo,
+  hub hero, audio cover) are automatically converted to WebP (smaller); existing
+  images were converted in one go and all references updated.
+- Images are **harder to save** (right-click "save" + dragging
+  blocked) — friction, not watertight protection.
+- Mini player (desktop): click the playing track → **jump to the post and scroll
+  to that track** (with highlight); also works for site-wide tracks via a lookup.
+- Text fields (`<textarea>`) now grow site-wide with the content instead of scrolling
+  internally (scroll-within-scroll was confusing). The inline writing field also grows
+  along naturally; typing on mobile/tablet goes fullscreen anyway.
+- On **mobile & tablet** (touch) the content behaves like a post: inline it is
+  **not typable** (tap area with a "✎ Tap to edit" pill). One tap opens a
+  **fullscreen writing "page"** — with real back-button support, so the
+  browser back or the **"✓ Done" button** closes it and you're back in the form
+  (all fields intact), after which you save everything together with the normal Save button.
+- The writing window can go **fullscreen** (button in the editor toolbar, or Escape to
+  go back) — nice for distraction-free writing on mobile. The formatting toolbar
+  always stays at the top of the view, even when the mobile keyboard opens
+  (frame follows the visual viewport).
+- The admin can link their **Google account** (Account → Sign in with Google) and
+  then also log in with Google. Safe: linking is only possible while you're logged in
+  with a password, and Google login only grants admin access if the exact
+  linked Google account (`google_sub`) matches. Unlinking is possible as long as there's a
+  password.
+- Liking / favoriting posts: logged-in users can like a post with a ♥ button
+  (shows the number of likes). Your liked posts are on the new **Favorites** page
+  (`/favorieten`, link in the account menu). Not logged in → the button leads to the login.
 
-### Gewijzigd
-- Post-navigatie (Newer/Older) toont nu een 📌 als de gelinkte post vastgepind is.
-- De Newer/Older-postnavigatie staat nu óók op de fan-gate (login-wall van een
-  fan-only post), zodat een bezoeker niet vastloopt maar verder kan bladeren.
-  Nav verhuisd naar een gedeeld partial (`partials/post-nav.ejs`).
-- Login gesplitst: de publieke loginpagina (`/auth/login`) toont voor bezoekers nu
-  **alleen** Google-login (luisteraars/fans). De beheerders-login (gebruikersnaam +
-  wachtwoord) staat verborgen op `/auth/admin` (nergens gelinkt).
-- Post-navigatie (Newer/Older) houdt nu op elke post dezelfde twee-kaarten-structuur:
-  ontbreekt er een nieuwere/oudere post, dan staat er een subtiele uitgegrijsde
-  placeholder ("Nieuwste post" / "Oudste post") i.p.v. een lege plek.
-- Bij het openen van een gerelateerde/volgende post spring je nu naar boven van de
-  pagina (was: je bleef op de oude scrollpositie hangen).
+### Changed
+- Post navigation (Newer/Older) now shows a 📌 if the linked post is pinned.
+- The Newer/Older post navigation now also appears on the fan gate (login wall of a
+  fan-only post), so a visitor doesn't get stuck but can keep browsing.
+  Nav moved to a shared partial (`partials/post-nav.ejs`).
+- Login split: the public login page (`/auth/login`) now shows visitors
+  **only** Google login (listeners/fans). The admin login (username +
+  password) is hidden at `/auth/admin` (not linked anywhere).
+- Post navigation (Newer/Older) now keeps the same two-card structure on every post:
+  if a newer/older post is missing, there's a subtle grayed-out
+  placeholder ("Newest post" / "Oldest post") instead of an empty space.
+- When opening a related/next post you now jump to the top of the
+  page (was: you stayed stuck at the old scroll position).
 
 ## [1.0.0-beta.2] — 2026-06-19
 
-Eerste release waarbij we de versie actief bijhouden (zichtbaar in de footer →
-klik erop voor deze pagina). Federatie-proto: **2** (ongewijzigd).
+First release where we actively track the version (visible in the footer →
+click it for this page). Federation proto: **2** (unchanged).
 
-### Toegevoegd
-- Release-tracking: versienummer in de footer linkt naar deze wijzigingen-pagina.
-- Acht premium-functies (Patreon-gegate): nieuwsbrief/mailinglijst, download-voor-email,
-  release-planning + fan-only previews, EPK/perskit, pro-statistieken, link-in-bio +
-  klikstats, inbedbare speler, en show-agenda + notify-me.
-- Nieuwsbrief-aanmeldveld in de footer (aan/uit in Beheer → Instellingen).
-- SMTP-instellingen instelbaar in Beheer → Instellingen (geen `.env`-edit meer nodig),
-  met testmail-knop.
+### Added
+- Release tracking: the version number in the footer links to this changelog page.
+- Eight premium features (Patreon-gated): newsletter/mailing list, download-for-email,
+  release scheduling + fan-only previews, EPK/press kit, pro statistics, link-in-bio +
+  click stats, embeddable player, and show agenda + notify-me.
+- Newsletter signup field in the footer (on/off in Admin → Settings).
+- SMTP settings configurable in Admin → Settings (no more `.env` edit needed),
+  with a test-mail button.
 
-### Gewijzigd
-- Beheer → Instellingen: Hub- en Cirkel-config staan nu direct onder de Modus-kaart;
-  forms netter (gestapelde labels, full-width inputs).
-- EPK/perskit toont de top 10 meest beluisterde nummers.
-- Nettere 404-pagina (mobielvriendelijk) en duidelijkere login-foutmeldingen.
+### Changed
+- Admin → Settings: Hub and Circle config now sit directly under the Mode card;
+  forms tidier (stacked labels, full-width inputs).
+- EPK/press kit shows the top 10 most-listened tracks.
+- Nicer 404 page (mobile-friendly) and clearer login error messages.
 
-### Opgelost
-- Site-brede audiospeler kreeg geen tracks (verkeerde kolom in de query).
-- Knoptekst werd onleesbaar bij hover (zelfde kleur als de knop).
-- Datumkiezers volgen nu het thema.
-- htmx-navigatie werkt de adresbalk weer bij; geen dubbele kop bij terug/vooruit.
+### Fixed
+- The site-wide audio player got no tracks (wrong column in the query).
+- Button text became unreadable on hover (same color as the button).
+- Date pickers now follow the theme.
+- htmx navigation updates the address bar again; no double header on back/forward.
Index: CHANGELOG.nl.md
===================================================================
--- CHANGELOG.nl.md	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
+++ CHANGELOG.nl.md	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -0,0 +1,164 @@
+# Wijzigingen — Klonkt
+
+Alle noemenswaardige wijzigingen aan Klonkt. Nieuwste bovenaan.
+Versies volgen [SemVer](https://semver.org/lang/nl/) (`1.0.0-beta.N` tijdens de beta).
+
+> **Twee losse versienummers — niet verwarren:**
+> - **App-versie** (deze changelog + footer, `package.json`) = cosmetisch; bump elke release.
+> - **Federatie-proto** (`KLONKT_PROTO` in `CircleFederation.js`, nu **2**) = bepaalt of
+>   Klonkt-sites in elkaars **cirkel** kunnen federeren (zit in de getekende grondslag).
+>   Een app-versie-bump verandert de proto **niet** en breekt cirkels dus niet. Bump de
+>   proto **alleen** bij federatie-/security-wijzigingen, en rol die dan in **lockstep**
+>   uit naar álle instances (incl. de democirkels) zodat ze blijven samenwerken.
+
+## [Unreleased]
+
+### Toegevoegd
+- Zoeken doorzoekt nu ook **nummers** (op titel, artiest én album), niet alleen posts.
+  Gevonden nummers zijn direct afspeelbaar in de resultatenlijst, met een
+  "in post →"-link naar de post/album/playlist waarin het nummer voorkomt.
+- Posts-zoek gebruikt nu **prefix-matching**: typ "astr" en je vindt "astra"
+  (elk woord als prefix, AND tussen de woorden) — fijner zoeken-terwijl-je-typt.
+- **Fediverse-client**: volg accounts (WebFinger → ondertekende Follow), een
+  **home-tijdlijn** (`/tijdlijn`) van wie je volgt, een **meldingen-inbox**
+  (`/meldingen`), en ⭐-like / 🔁-boost / ↩-reageren vanuit de tijdlijn.
+- **Liken én reageren via de fediverse** op een post: bezoekers vullen alleen
+  hun eigen server in (`@jij@server` of `server.com`) en handelen het af op hun
+  eigen account (`/authorize_interaction`).
+- **HTTP-handtekeningen afgedwongen** op de inbox: ongetekende of vervalste
+  activiteiten worden geweigerd — geen nep-reacties/likes/volgers meer.
+- **Blokkeren/defedereren** van een account of een heel domein (`/blokkeren`).
+- **Live thema-preview** in Beheer → site-instellingen: accent, thema en palet
+  meteen zichtbaar vóór je opslaat.
+
+### Gewijzigd
+- **Paletten herzien** naar 8: de neutrale **Klonkt** (wit/zwart, gouden accent)
+  is nu de standaard, plus 7 echte-kleur thema's (Forest, Ocean, Teal, Lilac,
+  Sunset, Candy, Amber). Accent-keuze opgeschoond; de Klonkt-achtergrond volgt
+  nu de gekozen accentkleur.
+
+### Verwijderd
+- **Hub-modus** verwijderd — Klonkt is voortaan **solo of cirkels**. Een
+  collectief/label maak je nu via **Cirkels** (gefedereerde losse sites).
+- **Native reacties + Google-login** verwijderd — interactie loopt nu volledig
+  via de **fediverse**.
+- **Lokale favorieten (♥)** verwijderd — vervangen door de ⭐ fediverse-like.
+
+### Opgelost
+- Mini-speler: spring + scroll naar de spelende track werkt nu ook vanuit een
+  **album of playlist** (de track-id zat niet in de afspeel-queue).
+- De track die nu speelt krijgt een **blijvende highlight** in de post.
+- Lege **album/playlist-covers** hersteld (een gemiste verwijzing in de
+  WebP-conversie) + ze vallen nu terug op de cover van de eerste track.
+- Kapotte **avatar/profielfoto** in de kop na de WebP-conversie: de viewer-avatar
+  (en rol) wordt nu vers uit de database gelezen, dus een oude sessie herstelt
+  zichzelf zonder opnieuw inloggen.
+
+### Opgelost (eerder)
+- Inline content-layout op touch versimpeld: geen opmaak-toolbar/rand meer inline
+  (je bewerkt toch fullscreen) — alleen de content-preview + de tik-om-te-bewerken-pill.
+- Kon niet scrollen op de bewerk-pagina: de fullscreen scroll-lock (overflow:hidden
+  op html/body) bleef hangen. Lock verwijderd — het fullscreen-frame dekt de pagina
+  al af en op touch zijn de scrollbalken verborgen.
+- Fullscreen verlaten scrolt nu naar de top van de content (i.p.v. door te springen
+  naar de footer).
+- "Tik om te bewerken"-aanwijzing op touch is nu een pill die sticky onderaan de
+  container plakt (boven de Opslaan-balk) i.p.v. lelijk gecentreerd in de tekst.
+- Scrollbalken verborgen op mobiel & tablet (touch) — scrollen blijft werken,
+  alleen de balk-UI is weg (geen verwarrende/dubbele balken).
+- Fullscreen-editor: geen dubbele scrollbalk meer — in fullscreen scrollt alléén
+  het tekstveld; het frame en de pagina (html+body) erachter zijn vergrendeld.
+- Editor: het beeld verspringt niet meer bij het aanklikken van een opmaakknop.
+  Op mobiel is het schrijfveld nu een begrensde scroll-box met de opmaak-toolbar
+  STICKY bovenin: de tekst scrollt eronder, de toolbar blijft altijd in beeld, en
+  de caret-scroll die mobiel Chrome forceert blijft binnen de box i.p.v. de hele
+  pagina te laten verspringen. (Plus: scrollpositie wordt vastgehouden rond elk
+  opmaak-commando.) `interactive-widget=resizes-content` weer verwijderd — dat liet
+  de pagina omhoog scrollen voor het toetsenbord en brak de kb-open-detectie; de
+  actiebalk + fullscreen regelen het toetsenbord via de visual viewport.
+- Post-editor op mobiel: de Opslaan/Annuleren-balk blijft nu net bóven het
+  toetsenbord (sticky met dynamische bottom-offset = max van toetsenbord- en
+  audiospeler-hoogte), i.p.v. erachter te vallen of midden in beeld te zweven.
+  Viewport schaalt mee met het toetsenbord (`interactive-widget=resizes-content`).
+- Mobiel toetsenbord vs. layout (site-breed): zodra het toetsenbord opent tijdens
+  het typen, verbergen de vaste onderbalken (bottom-tab + mini-speler) zich, zodat
+  ze niet meer over het invoerveld zweven of het overlappen. Ze komen terug zodra
+  het toetsenbord sluit. (Detectie via visualViewport → `body.kb-open`.)
+- Post bewerken op mobiel opende niet meer meteen het toetsenbord: de titel kreeg
+  niet langer automatisch focus (`autofocus` weg). Op desktop focust de titel nog wel.
+- Posts schrijven op mobiel: een opmaakknop (vet/cursief/…) stal de focus uit het
+  tekstveld → de selectie ging verloren (vet kon niet meer uitgezet worden) en de
+  pagina sprong naar beneden. De toolbar houdt de focus nu in de editor
+  (mousedown-preventDefault + focus zonder scroll), dus toggelen werkt en er is geen
+  sprong meer. Toolbar-taps zijn ook sneller (touch-action: manipulation). Actieve
+  opmaak is nu duidelijk gevuld met de accentkleur (en :hover plakt niet meer op
+  touch), zodat zichtbaar is of bv. vet aan of uit staat.
+
+### Toegevoegd
+- Afbeeldingen → **WebP**: nieuwe uploads (post-afbeeldingen/cover, avatar, site-foto,
+  hub-hero, audio-cover) worden automatisch naar WebP omgezet (kleiner); bestaande
+  afbeeldingen zijn in één keer omgezet en alle verwijzingen bijgewerkt.
+- Afbeeldingen zijn **lastiger op te slaan** (rechtsklik-"opslaan" + slepen
+  geblokkeerd) — frictie, geen waterdichte beveiliging.
+- Mini-speler (desktop): klik op de spelende track → **spring naar de post én scroll
+  naar die track** (met highlight); werkt ook voor site-brede tracks via een lookup.
+- Tekstvelden (`<textarea>`) groeien nu site-breed mee met de inhoud i.p.v. intern
+  te scrollen (scroll-binnen-scroll was verwarrend). Het inline schrijfveld groeit
+  ook gewoon mee; typen op mobiel/tablet gaat sowieso fullscreen.
+- Op **mobiel & tablet** (touch) gedraagt de inhoud zich als een post: inline is het
+  **niet typbaar** (tap-vlak met "✎ Tik om te bewerken"-pill). Eén tik opent een
+  **fullscreen schrijf-"pagina"** — met echte back-knop-ondersteuning, dus de
+  browser-back of de **"✓ Klaar"-knop** sluit 'm en je staat terug in het formulier
+  (alle velden intact), waarna je alles samen opslaat met de gewone Opslaan-knop.
+- Schrijfvenster kan op **volledig scherm** (knop in de editor-toolbar, of Escape om
+  terug te gaan) — fijn voor afleidingsvrij schrijven op mobiel. De opmaak-toolbar
+  blijft daarbij altijd bovenaan in beeld, ook als het mobiele toetsenbord opent
+  (frame volgt de visual viewport).
+- Beheerder kan z'n **Google-account koppelen** (Account → Inloggen met Google) en
+  daarna óók met Google inloggen. Veilig: koppelen kan alleen terwijl je met
+  wachtwoord bent ingelogd, en Google-login geeft alleen beheer als de exacte
+  gekoppelde Google-account (`google_sub`) matcht. Ontkoppelen kan zolang er een
+  wachtwoord is.
+- Posts liken / favorieten: ingelogde gebruikers kunnen een post liken met een ♥-knop
+  (toont het aantal likes). Je gelikete posts staan op de nieuwe **Favorieten**-pagina
+  (`/favorieten`, link in het accountmenu). Niet-ingelogd → de knop leidt naar de login.
+
+### Gewijzigd
+- Post-navigatie (Newer/Older) toont nu een 📌 als de gelinkte post vastgepind is.
+- De Newer/Older-postnavigatie staat nu óók op de fan-gate (login-wall van een
+  fan-only post), zodat een bezoeker niet vastloopt maar verder kan bladeren.
+  Nav verhuisd naar een gedeeld partial (`partials/post-nav.ejs`).
+- Login gesplitst: de publieke loginpagina (`/auth/login`) toont voor bezoekers nu
+  **alleen** Google-login (luisteraars/fans). De beheerders-login (gebruikersnaam +
+  wachtwoord) staat verborgen op `/auth/admin` (nergens gelinkt).
+- Post-navigatie (Newer/Older) houdt nu op elke post dezelfde twee-kaarten-structuur:
+  ontbreekt er een nieuwere/oudere post, dan staat er een subtiele uitgegrijsde
+  placeholder ("Nieuwste post" / "Oudste post") i.p.v. een lege plek.
+- Bij het openen van een gerelateerde/volgende post spring je nu naar boven van de
+  pagina (was: je bleef op de oude scrollpositie hangen).
+
+## [1.0.0-beta.2] — 2026-06-19
+
+Eerste release waarbij we de versie actief bijhouden (zichtbaar in de footer →
+klik erop voor deze pagina). Federatie-proto: **2** (ongewijzigd).
+
+### Toegevoegd
+- Release-tracking: versienummer in de footer linkt naar deze wijzigingen-pagina.
+- Acht premium-functies (Patreon-gegate): nieuwsbrief/mailinglijst, download-voor-email,
+  release-planning + fan-only previews, EPK/perskit, pro-statistieken, link-in-bio +
+  klikstats, inbedbare speler, en show-agenda + notify-me.
+- Nieuwsbrief-aanmeldveld in de footer (aan/uit in Beheer → Instellingen).
+- SMTP-instellingen instelbaar in Beheer → Instellingen (geen `.env`-edit meer nodig),
+  met testmail-knop.
+
+### Gewijzigd
+- Beheer → Instellingen: Hub- en Cirkel-config staan nu direct onder de Modus-kaart;
+  forms netter (gestapelde labels, full-width inputs).
+- EPK/perskit toont de top 10 meest beluisterde nummers.
+- Nettere 404-pagina (mobielvriendelijk) en duidelijkere login-foutmeldingen.
+
+### Opgelost
+- Site-brede audiospeler kreeg geen tracks (verkeerde kolom in de query).
+- Knoptekst werd onleesbaar bij hover (zelfde kleur als de knop).
+- Datumkiezers volgen nu het thema.
+- htmx-navigatie werkt de adresbalk weer bij; geen dubbele kop bij terug/vooruit.
Index: src/routes/changelog.js
===================================================================
--- src/routes/changelog.js	(revision 0960c1d20ad342283da29370be69f7c966bfd51a)
+++ src/routes/changelog.js	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -2,5 +2,6 @@
  * Public changelog / release page.
  *
- * GET /changelog  -> renders CHANGELOG.md (the source of truth for releases).
+ * GET /changelog  -> renders the changelog in the visitor's language:
+ *   CHANGELOG.<lang>.md if a translation exists, else CHANGELOG.md (English base).
  */
 
@@ -11,18 +12,25 @@
 import { renderPage } from '../middleware/render.js';
 import { MarkdownService } from '../services/MarkdownService.js';
+import { resolveLang, t } from '../services/i18n.js';
+import { getSetting } from '../services/SettingsService.js';
 
 const router = express.Router();
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
-const CHANGELOG_PATH = path.join(__dirname, '..', '..', 'CHANGELOG.md');
+const ROOT = path.join(__dirname, '..', '..');
 
 router.get('/changelog', (req, res) => {
-  let html;
-  try {
-    html = MarkdownService.render(fs.readFileSync(CHANGELOG_PATH, 'utf8'));
-  } catch {
-    html = '<p>Geen wijzigingenoverzicht beschikbaar.</p>';
+  const lang = resolveLang(req, {
+    userLang: req.session && req.session.user && req.session.user.lang,
+    defaultLang: getSetting('default_lang'),
+  });
+  // Visitor's language if a translation exists, else the English base.
+  const files = [path.join(ROOT, `CHANGELOG.${lang}.md`), path.join(ROOT, 'CHANGELOG.md')];
+  let html = '';
+  for (const f of files) {
+    try { html = MarkdownService.render(fs.readFileSync(f, 'utf8')); break; } catch { /* try next */ }
   }
+  if (!html) html = `<p>${t(lang, 'changelog.empty')}</p>`;
   renderPage(req, res, 'pages/changelog', {
-    pageTitle: 'Wijzigingen',
+    pageTitle: t(lang, 'changelog.title'),
     bodyClass: 'on-changelog',
     changelogHtml: html,
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision 0960c1d20ad342283da29370be69f7c966bfd51a)
+++ src/services/i18n.js	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -101,4 +101,5 @@
     'setup.submit': 'Mijn site aanmaken',
     'setup.username_note': 'Dit wordt je adres op de fediverse en kun je later niet meer wijzigen:',
+    'changelog.title': 'Wijzigingen', 'changelog.empty': 'Geen wijzigingenoverzicht beschikbaar.',
     'auth.f_username': 'Gebruikersnaam (3-32 tekens, letters/cijfers/_-)',
     'auth.f_email': 'E-mail',
@@ -1117,4 +1118,5 @@
     'setup.submit': 'Create my site',
     'setup.username_note': 'This becomes your address on the fediverse and can’t be changed later:',
+    'changelog.title': 'Changelog', 'changelog.empty': 'No changelog available.',
     'auth.f_username': 'Username (3-32 chars, letters/digits/_-)',
     'auth.f_email': 'Email',
@@ -2129,4 +2131,5 @@
     'setup.submit': 'Meine Seite erstellen',
     'setup.username_note': 'Das wird deine Adresse im Fediverse und kann später nicht geändert werden:',
+    'changelog.title': 'Änderungen', 'changelog.empty': 'Kein Änderungsprotokoll verfügbar.',
     'auth.f_username': 'Benutzername (3-32 Zeichen, Buchstaben/Ziffern/_-)',
     'auth.f_email': 'E-Mail',
