#text

Sechs Sekunden bis zur Startseite

Sechs Sekunden bis zur Startseite

Manchmal merkt man erst, wie langsam eine Website geworden ist, wenn man sie selbst aufruft und plötzlich Zeit hat, sich einen Kaffee zu holen.

Genau so ging es mir mit meiner Seite hier: Die Startseite brauchte plötzlich bis zu sechs Sekunden, bis überhaupt etwas passierte. Um mich nicht falsch zu verstehen: bis der erste HTML-Response kam. Danach liefen CSS, JavaScript und Bilder völlig normal durch. Das Problem lag also ziemlich offensichtlich vor dem Browser, irgendwo auf dem Server.

Sechs Sekunden sind nicht nur für einen Androiden, sondern generell im Web eine Ewigkeit. Also habe ich mir Chatty dazugeholt, um mir beim Debuggen zu helfen.

Die Ausgangslage war schnell klar: Der erste Request auf hnz.io/ hing. Danach ging alles zügig weiter. Das spricht meistens dafür, dass der Server beim Rendern der Seite lange beschäftigt ist.

Mein erster Reflex war die klassische Performance-Lösung: Caching.

Der erste Versuch: Staticache

Kirby hat von Haus aus schon ein Caching-Modul an Board, ich habe mich aber zusätzlich noch für Staticache entschieden. Das berechnet im ebsten Fall eine Seite bis zur nächsten Änderung einmal vor und gibt dann die Vorberrechnete Version an die Browser weiter.

Zusätzlich habe ich die gzip-Komprimierung eingeschaltet. Gzip ist eine Technik, mit der Textantworten wie HTML oder CSS kleiner gemacht werden, bevor sie übertragen werden. Das spart Bandbreite und beschleunigt die Übertragung.

Der erste Test brachte allerdings eine kleine Überraschung: Die Startseite brauchte immer noch mehrere Sekunden.

Wenn Caching nicht hilft

Das war der Punkt, an dem klar wurde, dass der Cache gar nicht das eigentliche Problem löst.

Wenn eine Seite trotz Cache mehrere Sekunden braucht, dann passiert eines von zwei Dingen:

  • Entweder der Request landet gar nicht im Cache.
  • Oder der Request muss trotzdem noch viel dynamische Logik ausführen.

Raten bringt an dieser Stelle nichts. Also haben Chatty und ich angefangen zu messen.

Ein kleiner Performance-Schalter

Ich wollte eine möglichst leichte Lösung, etwas, das direkt auf dem Server mitläuft und nur dann aktiv ist, wenn ich es brauche und habe ich einen kleinen Schalter eingebaut.

Wenn man die Seite mit ?perf=1 aufruft und eingeloggt ist, schreibt die Anwendung Performance-Daten in ein Log. Zusätzlich erscheinen Timing-Informationen im HTTP-Header, die ich dann im Browser anzeigen kann.

Gemessen wurden drei Dinge:

  • Bootstrap: der Start von PHP und Kirby
  • Renderzeit: das eigentliche Erzeugen der HTML-Seite
  • Gesamtzeit: alles zusammen

Zusätzlich habe ich kleine Marker eingebaut, mit denen man bestimmte Stellen im Code messen kann. Wenn ein Snippet oder eine Funktion auffällig langsam ist, taucht sie im Log sofort auf.

Das Ganze ist im Grunde ein sehr einfacher Profiler. Nicht besonders elegant, aber extrem hilfreich.

Die Spur führt ins Rendering

Die Messungen zeigten ziemlich eindeutig, wo die Zeit verloren ging und zwar, und das hat mir ungemein geholfen, nich im Netzwerk, DNS oder im TLS-Handshakke. Die ganze Zeit ging für das PHP-Rendering der Seite drauf: Der Server war mehrere Sekunden damit beschäftigt, die Startseite zu berechnen, bevor überhaupt etwas an den Browser geschickt wurde.

Damit war klar, dass wir uns meine Templates und Snippets anschauen müssen. War ja irgendwie auch klar.

In Kirby sind Snippets kleine wiederverwendbare Template-Blöcke. Man kann sie sich wie Komponenten vorstellen, die HTML generieren.

Viele kleine Verzögerungen

Die Logs zeigten ein interessantes Muster: Der heftigste Block war die Liste der Beiträge auf der Startseite. Das Snippet, das die Feed-Karten erzeugt, brauchte mehrere Sekunden.

Innerhalb dieses Blocks tauchten immer wieder ähnliche Zeitwerte auf. Viele einzelne Schritte lagen jeweils bei ungefähr 300 Millisekunden.

Das klingt erstmal nicht dramatisch, aber wenn ein Feed zehn Beiträge hat und jeder Beitrag mehrere solcher Schritte ausführt, summiert sich das schnell auf mehrere Sekunden.

Ein Beispiel waren Social-Links aus dem IndieConnector. Dabei handelt es sich um Funktionen, die automatisch prüfen, ob ein Beitrag auf Mastodon oder Bluesky veröffentlicht wurde und welche URL dazu gehört. Die hatte ich mal auf die Schnelle eingebaut. Und nun ja.

Man sollte nichts auf die Schnelle einbauen.

Niemals.

Zwar ist die Auflösung auf einer Detailseite völlig okay. Im Feed bedeutet sie aber, dass dieselben Informationen mehrfach berechnet werden.

Dazu kamen kleine Dinge wie Bild-Fallbacks oder Kommentarzählungen, die ebenfalls für jeden Beitrag erneut ausgeführt wurden. Teilweise mehrfach.

Der entscheidende Schritt

Die Lösung bestand letztlich darin, zwei verschiedene Kontexte sauber zu trennen: Die Startseite ist ein Listing. Sie zeigt viele Beiträge gleichzeitig. In diesem Kontext muss alles möglichst leichtgewichtig sein.

Eine Detailseite dagegen zeigt nur einen einzigen Beitrag. Dort kann man sich mehr Rechenzeit leisten.

Also habe ich einige Funktionen im Feed bewusst abgeschaltet oder vereinfacht.

  • Social-Links werden im Listing nicht mehr komplett aufgelöst.
  • Kommentarzahlen greifen auf bereits berechnete Metriken zurück.
  • Einige Bildlogiken wurden reduziert.

Die Detailseiten behalten weiterhin die vollständige Funktionalität.

Das Ergebnis ist eine klare Trennung: Der Feed bleibt schnell, während Detailseiten alle Informationen anzeigen.

Und Chatty hat dabei geholfen, die kritischen Stellen zu identifizieren und die Messungen sauber auszuwerten.

Ein kleiner Nebeneffekt

Während wir ohnehin am Feed gearbeitet haben, habe ich auch die Bildgrößen angepasst.

Die Startseite lädt jetzt kleinere Vorschaubilder. Große Originale werden erst geladen, wenn man sie tatsächlich öffnet.

Das reduziert Bandbreite und sorgt dafür, dass der Browser weniger Arbeit beim Layout hat. Der eigentliche Performance-Gewinn kam aber weiterhin vom Server.

Was ich aus der Geschichte gelernt habe

Die wichtigste Lektion ist überraschend simpel:

  • Performanceprobleme löst man nicht durch Rumratwn, sondern durch Messungen Und die Spurensuche hat echt Spaß gemacht, war mein erstes Mal.
  • Caching ist hilfreich, aber kein Allheilmittel. Wenn der Flaschenhals im Rendering liegt, muss man verstehen, was genau dort passiert.
  • Oft sind es nicht große, offensichtliche Probleme, sondern viele kleine Kosten pro Eintrag.
  • Baue niemals auf die schnelle irgendetwas ein, ohne dir vorher Gedanken zu machen oder es zumindest zu testen.

Vom Rumfrickeln zum Medienstrom

Vom Rumfrickeln zum Medienstrom

Die letzten Wochen habe ich wieder im Hintergrund an meinem Kirby rumgeschraubt. Oder besser gesagt: rumschrauben lassen. Ich habe Codex mit meinem Visual Studio Code getestet und mal geschaut, wie dieses Vibe Coding so funktioniert. Und ich muss sagen: Zunächst wirkt es wie Zauberei, im Laufe des Projekts wird es dann etwas ernüchternder. Es fühlt sich eben an wie die Arbeit mit einer LLM, die schneller den Kontext verliert, als einem lieb ist, und ab und an schöne Dinge halluziniert. Im Endeffekt ging es trotzdem viel schneller als gedacht.

Mein ursprüngliches Ziel, das Layout komplett konsistent neu aufzuziehen, habe ich dabei allerdings etwas aus den Augen verloren. Manche Rundungen unterscheiden sich noch, manche Schriftgrößen stimmen noch nicht ganz. Aber ich bin auf jeden Fall auf einem guten Weg. Und ja, die Seite sieht jetzt anders aus. Beim ursprünglichen Layout habe ich mich noch stark an meiner alten micro.blog-Seite orientiert. Mit der Zeit und dem ganzen Rumfrickeln passiert es bei mir automatisch, dass ich mich Schritt für Schritt davon emanzipiere.

Was ich eigentlich noch gar nicht einbauen wollte, jetzt aber schon live ist, ist das Medientracking. Da habe ich mich natürlich auch wieder inspirieren lassen.

Felix hat auf seiner Seite einen River aufgesetzt, in den er alles reinschmeißt, was er gut findet oder konsumiert. Thomas hat mit seinem Recorder zwar eine andere Umsetzung, aber ein ähnliches Konzept. Das Leben zu loggen finde ich spannend. Auswertungen und Charts zu generieren finde ich ebenfalls großartig. Und jetzt gibt es das auch hier: Den Medienstrom.

Ich wollte mich dabei am IndieWeb orientieren, bin aber ehrlich gesagt noch in der Findungsphase. Es gibt jetzt die Bookmarks, in die alles reinkommt, was ich so lese und für veröffentlichenswert halte. Dann gibt es das Watchlog mit Videos für YouTube, Filme und Serien. Und schließlich noch den Audiofeed, in den ich alles werfe, was ich gerade höre. All das läuft jetzt im Medienstrom zusammen, den man auch, ich weiß zwar nicht genau warum, als RSS abonnieren kann.

Warum bin ich noch in der Findungsphase? Weil sich das für mich gerade so anfühlt, als wären das gleichzeitig auch Favoriten. Die Trennschärfe fehlt mir noch. Wenn alles klappt, sollen Einbindungen hier als Reposts gesehen werden. Eigentlich sollen sie das auch sein. Oder sind es doch Favoriten, weil ich auf einen bestimmten Text hinweisen möchte oder auf einen besonders guten Tröt? Ich bin da gerade selbst noch etwas verwirrt und hoffe, dass ich das alles so offen gebaut habe, dass ich es bei Bedarf schnell wieder umbauen kann.

Da ich mein eigenes Hirn aber gut kenne und weiß, dass es gerne den Weg des geringsten Widerstands geht, habe ich mir ein paar Prozesse ausgedacht, mit denen Inhalte automatisiert hier landen können. Oder zumindest ohne großen Aufwand.

Filme tracke ich über Letterboxd. Die bieten einen wirklich vernünftigen RSS-Feed an, in dem sogar schon eine TMDB-ID steht. Darüber kann ich mir über die TMDB-API noch zusätzliche Daten zu dem Film ziehen. Ein Importscript sorgt per Cron dafür, dass regelmäßig nachgeschaut wird und neue Filme automatisch hier auf der Seite erscheinen.

Bei Serien nutze ich trakt.tv und dessen API. Dort bewerte ich schnell eine Folge, die ich gesehen habe, und durch ein Importscript landet sie dann auch hier. Wenn ich noch schnell einen Kommentar schreiben möchte, geht das ebenfalls. Und wenn ich den Eintrag später auf die Startseite heben will, klappt das auch noch. Wie zum Beispiel hier.

Ganz automatisch funktioniert auch der Import über meinen RSS-Service Miniflux. Wenn ich dort einen Artikel markiere, habe ich hier einen Endpunkt eingerichtet, der die Daten per POST übergeben bekommt und dann entsprechend darstellt.

Und für den Rest habe ich mir tatsächlich Kurzbefehle auf meinem iPhone gebaut. Das Einrichten war ein ziemlicher Pain. Aber irgendwie hat es funktioniert. Und zwar sogar besser, als ich am Anfang erwartet hatte. Die Kurzbefehle nehmen einfach die URL aus der Zwischenablage, geben mir die Möglichkeit, einen Kommentar zu schreiben, und fragen dann ab, ob der Beitrag im entsprechenden Segment oder auch auf der Startseite veröffentlicht werden soll. So bekomme ich YouTube und Vimeo hier rein und generell Bookmarks, die ich nicht in meinem Feedreader finde.

Bei Podcasts habe ich es mir ehrlich gesagt etwas einfacher gemacht. Ich nutze die App Pocket Casts, die viele Verzeichnisse noch einmal selbst spiegeln. Die Daten hole ich mir dann einfach von dort. Falls ihr euch also fragt, warum meine Podcasts auf Pocketcast.com verlinken und nicht irgendwo anders: Das ist keine Empfehlung für die App oder sogar Werbung, es macht für mich einfach das Teilen leichter.

Deshalb habe ich jetzt auch drei Kurzbefehle. Einen für den Audiostream, einen für Bookmarks und einen für das Watchlog. Über „Teilen“ ist dann schnell ein Beitrag hier angelegt, der zumindest niemanden stört. Und mich freut.

Update für unser Smart Home

Update für unser Smart Home

Eigentlich wollte ich nur die Heizung anpassen. Stattdessen funkt jetzt die Waschmaschine, die Spülmaschine spricht wieder – und die LED-Kerzen wissen endlich, wann Sonnenuntergang ist.

Ich habe Zeit investiert und mich endlich mit unserem Home Assistant beschäftigt. Nicht ganz freiwillig, eher aus dem Zwang heraus, dass jetzt, nach fast einem Jahr in der neuen Wohnung, endlich alles so funktionieren sollte, wie ich es mir beim Einzug vorgestellt hatte. Auch die Heizungssteuerung.

Aber vorher habe ich mich natürlich mit ein paar Sidequests beschäftigt, um wieder in den Home-Assistant-Mode zu kommen:

  • Der erste Erfolg war im Keller: unsere Waschmaschine ist jetzt „smart“. Seit wir dort auch die Möglichkeit haben, Home Asssistant zu nutzen, läuft sie über einen innr-Smartplug, der auch den Stromverbrauch misst. Wenn der Verbrauch über eine gewisse Zeit auf null fällt, sendet Home Assistant eine Push-Nachricht auf unsere Handys: „Wäsche fertig!“, was mir ehrlicherweise mehr Lebensqualität bringt, als man denkt, oder mir lieb sein sollte.

  • Auch die Spülmaschine ist wieder eingebunden. Über den Server des Herstellers bekomme ich über Home-Assistant ebenfalls Benachrichtigungen, wenn sie fertig ist und ausgeräumt werden will. Es sind Kleinigkeiten, aber sie nehmen einem so viel Nachdenken ab.

  • Und unsere LED-Kerzen, die sonst über eine Infrarot-Fernbedienung laufen, gehen jetzt automatisch an, wenn das Licht nach Sonnenuntergang eingeschaltet wird. Das ist so ein Moment, wo man denkt: Ja, absolut sinnfrei, aber genau so sollte das sein.

Das eigentliche Mammutprojekt war aber die Heizung. Unser Wohnzimmer ist offen, Küche, Flur, Wohnbereich gehen ineinander über, und ich wusste lange nicht, wie man das effizient steuern kann. Jetzt habe ich einfach das Wohnzimmer als Referenztemperatur genommen, und Flur sowie Küche heizen mit einem kleinen Offset (aktuell ein Grad Unterschied) mit. Das Ganze läuft unabhängig von der Tado-Software: Jeder Raum hat jetzt eine Heiz- und Komforttemperatur, eine Absenktemperatur (nachts oder bei Abwesenheit) und eine Urlaubstemperatur. Getriggert wird das über Zeitpläne oder über die Präsenzkontrolle, also ob jemand überhaupt da ist.

Das war aber nicht meine Idee von Anfang an. Ich wollte am Anfang eigentlich ich nur einen kleinen Blueprint schreiben: Wenn ein Fenster geöffnet wird, soll die Heizung ausgehen – und beim Schließen wieder auf die vorherige Temperatur zurückspringen. Klingt simpel, war es aber nicht, weil Tado immer wieder auf seine eigenen Zeitpläne zurückspringen wollte. Jetzt speichere ich die aktuelle Temperatur in einer JSON-Datei, wenn ein Fenster geöffnet wird, und stelle sie beim Schließen wieder her.

Am Ende war das Wochenende zwar anstrengender als gedacht, aber ich habe jetzt das Gefühl, endlich die Kontrolle über meine eigene „Smartness“ zu haben. Letzten Winter hat mich Tado noch regelmäßig genervt, weil es nach dem Lüften einfach wieder seine und nicht unsere Temperatur eingestellt hat. Das fühlte sich an wie das Gegenteil von „smart“. Bin schon gespannt, welche Nebeneffekte das jetzt wieder hat.

Barrierefreiheit auf Knopfdruck (und KI)

Barrierefreiheit auf Knopfdruck (und KI)

Ich habe ein kleines Kirby-Plugin gebaut, das die Stellen übernimmt, die ich aus Zeitmangel wahrscheinlich seltenst ausgefüllt hätte, aber die schon auch wichtig sind: Via LLM von OpenAI kann ich jetzt Alt-Texte von Bildern per Button generieren lassen und wenn ich will, auch die Meta-Descriptions für Suchmaschinen. Und dabei habe ich wieder viel über Kirby gelernt und warum es eine gute Entscheidung war, zu wechseln.

Wenn ich etwas gar nicht schreiben würde, schreibe ich’s lieber mit LLMs, besonders da, wo Barrierefreiheit dranhängt. Nicht, weil ich es nicht könnte, sondern damit nichts liegen bleibt: Alt-Texte, Meta-Descriptions, diese stillen Pflichtfelder, die am Ende irgendwie auch wichtig sind, aber dafür auch noch einmal richtig viel Zeit kosten können, ohne das der eigentliche Beitrag davon auf den ersten Blick profitiert.

Aus dieser … nenne ich es einmal … Faulheit ist ein kleines Kirby-Plugin entstanden, das zwei Dinge zuverlässig erledigt: barrierefreie Alt-Texte für Bilder und sachliche Meta-Descriptions für Seiten. Auf Knopfdruck direkt im Panel.

Ich gebe dem Modell den vollen Kontext, setze Length-Guards und formatiere die Antwort passgenau: ca. 110 Zeichen für Alt, ca. 160 für Meta. Optional kann das Plugin das Bild als Data-URL mitschicken („Vision“), damit die KI nicht im luftleeren Raum rät.

Warum klappt das so erstaunlich gut? Weil Kirby Inhalte und Mediendaten wunderbar strukturiert. Alle Bild-Metadaten liegen in Sidecar-Contentdateien neben der Bilddatei, z. B. mein-foto.jpg.txt. Menschenlesbar, versionierbar, und serverseitig perfekt als Prompt-Kontext nutzbar.

Damit das sauber bleibt, habe ich zwei kleine Helfer daneben gelegt. Mein Plugin sync-meta hält Felder synchron, die sowohl in der Seiten-Contentdatei (default.txt) als auch in den Bild-Sidecars (bild.jpg.txt) vorkommen. Zum Beispiel liegt die Bildunterschrift bei einem Beitrag mit nur einem Bild in der Contentdatei, nicht in der Sidecar. Hintergrund ist, dass mein System historisch gewachsen ist und sich die Anforderungen, je besser ich Kirby kennenlerne, auch immer wieder anpassen.

Das Plugin exif-import sorgt dafür, dass Sidecars nicht leer starten: Beim Upload lese ich optional EXIF/IPTC aus und fülle Datum, Ort, Kamera, ggf. Caption vor – was immer das Asset hergibt. Danach muss die KI nicht mehr raten, sie ergänzt.

Der Generierungs-Flow ist bewusst serverseitig: Das Panel schickt nur IDs. Das Backend sammelt Kontext (Seitentitel, Teaser, Text, Bild-Captions, optional Geodaten), ergänzt auf Wunsch das Bild selbst und nutzt zentral gepflegte, nüchterne Prompts. Ton und Stil kann ich global in der config.php oder je Blueprint feinjustieren.

Wenn der Kontext zu dünn ist, breche ich ab, statt Floskeln zu produzieren. Und wenn ich „zu faul“ bin, drücke ich guten Gewissens auf „Vorschlagen“ – besser ein kurzer KI-Text als gar keiner. Genau dafür ist das da.

Am Ende schreibe ich weiterhin gern selbst, aber ich finde es sehr angenehm, Sachen zu automatisieren, die sonst aus Zeitgründen wegfallen würden. Barrierefreiheit profitiert (Alt-Texte sind da!) und mein Kopf bleibt frei für die Teile, die wirklich menschliche Aufmerksamkeit brauchen.

Stonehenge, Nebra und dann Duhnen

Stonehenge, Nebra und dann Duhnen

Stonehenge, Nebra und dann Duhnen

Wir waren ein paar Tage in Cuxhaven. Viel schöne Heide, Waldschatten, offener Strand. Und richtig gute Fischbrötchen, wenn man weiß wo.

Ich liebe ja diese Vergleiche, die mit ganz großen Namen ankommen.

Die Steinkreise im englischen Stonehenge, der Sonnenwagen von Trondholm, die Himmelsscheibe von Nebra - berühmte und rätselhafte Zeugnisse der Zeit vor rund 4000 Jahren. Fast ebenso alt und von ebenso rätselhafter Funktion - der doppelte Ringwall von Duhnen.

Blick durch ein Rohr auf das Licht und die umgebende Natur.
Verwachsener Blick auf den berühmten Twellberg-Grabhügel von Duhnen.
Twellberg-Grabhügel in Sahlenburg, umgeben von Wiesen und Bäumen unter einem bewölkten Himmel.
Der Twellberg-Grabhügel: Über Flatterband an einen Zaun gequetscht, leicht auf die Zehenspitzen und schon hat man dieses Duhner-Glanzlicht vor der Linse

Großartig, wirklich! Man merkt richtig, wie die Agentur oder die Verwaltungsmenschen damals geglüht haben. “Rätsel der Ringe!” - wahrscheinlich mit drei Ausrufezeichen im Pitchdeck und noch mehr Hoffnung. Heute: rotes Flatterband, kurz über der Grasnarbe, eine Bank, die in die falsche Richtung zeigt und überall Gestrüpp, gesäumt von Pipi-Taschentüchern. Vielleicht ist das die wahre Rätsel-Funktion: ein Monument dafür, wie schnell Pathos zuwachsen kann. Ich hab dann das Fernrohr fotografiert.

Aber generell habe ich Cuxhaven schon sehr gemocht. Ich mag die Mischung: Schatten im Wald, plötzlich offenes Heidefeld, dann wieder offener Strand mit Wind im Gesicht.

Der Cuxliner fährt zwischen Sahlenburg und Duhnen, ideal für Touristen. Fahrt kostet 7 Euro.
Zwischen Sahlenburg und Duhnen fährt der kleine Cuxliner hin und her. Ist aber eher Touri-Angebot als ÖPNV-Ersatz, denn eine einfache Fahrt kostet 7 Euro für Erwachsene.
Heidelandschaft mit Gehölz und Pfad im Naturschutzgebiet Duhner Heide bei Cuxhaven.
Ich mag die Heide-Landschaft, auch wenn ich gar nicht weiß, ob es dafür nicht schon zu viel Gehölz auf dem Bild gibt. Auf jeden Fall war der Entdeckungspfad bei Duhnen wirklich ein schöner Weg. Den anschließenden Fisch bei Blauths in Sahlenburg hätte man aber weglassen können.
Watt bei Cuxhaven im Sonnenuntergang
Watt bei Cuxhaven.

Duhnen selbst hat eine klassische Promenade, die einen als Touri von einem "der wichtigsten Fremdenverkehrsorte Niedersachsens am Wattenmeer" (Wikipedia) zumindest nicht überrascht. Und von Cux selbst haben wir die klassischen Touri-Spots mitgenommen.

Die Alte Liebe in Cuxhaven, ehemaliger Pier und heutige Aussichtsplattform am Hafen.
Die "Alte Liebe in Cuxhaven": Früher Pier, heute Aussichtsplattform.
Ein Schlepper fährt durch die bewegte Nordsee vor Cuxhaven, umgeben von Wellen und Himmel.
Ein kleines Lüftchen umwehte schon unsere Nasen.
Schloss Ritzelbüttel in Cuxhaven umgeben von roten Blumen im Vordergrund.
Schloss Ritzelbüttel in Cuxhaven.
Ehemaliger Wasserturm in Cuxhaven, heute genutzt für Ferienwohnungen und ein Café.
Ehemaliger Wasserturm. Jetzt Fewos und Café.

Wer gute Fischbrötchen will, der ist in der Kleinen Fischkiste gut aufgehoben, richtig lecker (und gerne auch ohne Remoulade, der Fisch gibts her). Nur leider gab's einmal am frühen Nachmittag keinen heißen Fisch mehr, dafür haben die dann am nächsten Tag besonders gut geschmeckt.

Bankpausen

Bei unserem kleinen Trip habe ich leider die Fotos der Bankpausen stark vernachlässigt. Es gab definitiv mehr.

Entspannende Bankpause an der Strandpromenade mit Blick auf die Nordsee und Strandkörbe.
Bankpause an der Strandpromenade in Duhnen.
Entspannte Bankpause im Kurpark mit Blick auf den Teich und die umliegende Natur.
30.09.2025Döse, Cuxhaven
Bankpause im Kurpark vor dem kleinen Zoo in Cuxhaven.