Quellcode von www.lottes.dev — einem statischen, dreisprachigen (DE/EN/FR) Blog über Agentic AI, KI-Applikationen und Human-Machine Collaboration. Gebaut mit Eleventy, eigenem CSS und ohne Frontend-Framework.
Der Code ist MIT-lizenziert. Wer einen mehrsprachigen Eleventy-Blog aufsetzen will, kann sich hier bedienen — vor allem beim i18n-Setup, das in den meisten Eleventy-Startern fehlt.
Status: Dies ist meine persönliche Website, kein gepflegtes Theme-Paket. Es gibt keine Support-Zusage und keine Rückwärtskompatibilität zwischen Commits. Aktuell läuft das Projekt auf Eleventy 2 — eine Migration auf Eleventy 3 steht noch aus. Fork und Weiterverwendung sind ausdrücklich erwünscht, Issues und PRs beantworte ich, wenn ich Zeit habe.
- Eleventy 2
- Nunjucks + Markdown
- Eigenes CSS (Design-Tokens, Light/Dark), keine CSS-Frameworks
- Inter + Source Serif 4 (selbst gehostet via Fontsource)
- Pagefind (Suche)
- Eleventy Navigation + Pagination
- RSS/JSON Feed + ICS Kalender
- Dreisprachige Inhalte (DE/EN/FR) mit Sprachwechsel im Header, der auch auf Blog-Listings, Tag-Seiten und paginierten Seiten das richtige Pendant findet
- Blog inklusive Tags, Pagination und Feed (RSS + JSON)
- Volltextsuche über Pagefind, ohne externen Dienst
- Design-Token-System mit Light/Dark und
prefers-color-scheme-Fallback - Eigene Markdown-Container für Callouts, Alerts, Karten und Zitate
- ICS-Kalender-Ausgabe
- Deployment auf Netlify
- Node.js 20 empfohlen
- npm
git clone https://github.com/a-lottes/lottes.dev.git
cd lottes.dev
npm installnpm startnpm run buildBuild-Output liegt in _site/.
npm start: lokaler Dev-Servernpm run build: Produktionsbuild (inkl.postbuild)npm run debug: Eleventy Debug-Ausgabenpm run debugstart: Dev-Server mit Debug-Ausgabenpm run benchmark: Eleventy Benchmark-Ausgabe
content/: Seiten und Blog-Inhalte pro Sprache_data/: globale Daten, Metadaten, i18n-Strings_includes/: Layouts, Templates und Komponentenpublic/: statische Assets (CSS, JS, Bilder, Icons)_site/: generierter Output
Das CSS liegt in public/css/ und wird von _includes/layouts/base.njk inline gebundelt:
tokens.css: Design-Tokens (Farben, Fonts, Abstände) inkl. Light/Darkfonts.css:@font-facefür die selbst gehosteten Schriftenbase.css: Reset und Grundelementelayout.css: Layout-Primitives (.container,.grid,.cluster,.hero)prose.css: Artikeltypografie (.prose)components.css: Header, Nav, Cards, Footer usw.
JavaScript in public/js/ (vanilla, ohne Dependencies): theme.js (Light/Dark/System-Toggle),
nav.js (Menüs und Sprachwechsler), network.js (animiertes Netzwerk im Hero der Startseiten,
aktiviert über heroCanvas: true im Frontmatter).
- DE:
content/de/ - EN:
content/en/ - FR:
content/fr/
_data/i18n/de/index.js_data/i18n/en/index.js_data/i18n/fr/index.js
Für korrekte Zuordnung derselben Artikel in unterschiedlichen Sprachen wird translationKey im Frontmatter verwendet.
Beispiel:
translationKey: agent-workflow-in-practiceWenn ein Artikel keine Übersetzung hat, ist der Sprachlink im Header auf der Zielsprache deaktiviert.
Die Netlify-Konfiguration ist in netlify.toml hinterlegt:
- Build Command:
npm run build - Publish Directory:
_site - Node Version:
20
Wichtig: Im Netlify UI darf Publish Directory nicht auf public stehen, sonst wird nur die Asset-Struktur statt der generierten Website ausgeliefert.
- Datei im passenden Sprachordner unter
content/{lang}/...erstellen. - Frontmatter setzen (
title,layout, optionaleleventyNavigation). - Bei Navigationsseiten
eleventyNavigationsauber pflegen.
- Datei in
content/{lang}/blog/posts/anlegen. - Frontmatter mit
title,description,date,tagssetzen. - Bei mehrsprachigen Pendants den gleichen
translationKeyverwenden.
- Prüfen, ob die betroffenen Posts denselben
translationKeynutzen. - Prüfen, ob alle Sprachvarianten im passenden Ordner existieren.
In seltenen Fällen liegen alte Dateien noch in _site/.
rm -rf _site
npm run buildDieses Projekt ist kein Neubau von Null, sondern das Ergebnis einer Fork-Kette:
- eleventy-base-blog von Zach Leatherman — die Grundstruktur eines Eleventy-Blogs (Tags, Pagination, Feeds).
- eleventy-dsfr von DINUM/Etalab — das mehrsprachige Setup, die Navigations- und Übersetzungslogik sowie die Plugin-Auswahl (i18n, Kalender) stammen von hier.
- lottes.dev — das französische Staats-Designsystem (DSFR) wurde vollständig entfernt und durch ein eigenes Design-Token-System, eigene Layout-Primitives und eigene Komponenten ersetzt. Die CSS- und Komponentenschicht ist damit neu, das mehrsprachige Fundament nicht.
Ein paar Kommentare im Code verweisen noch auf das DSFR-Original — sie dokumentieren, was die jeweilige Datei ersetzt.
- Code: MIT — siehe
LICENSE.md. Das Copyright liegt anteilig bei DINUM/Etalab (Original-Template) und bei mir. - Weitere Lizenztexte der übernommenen Bestandteile:
LICENSES/ - Nicht mitlizenziert: Blogartikel unter
content/, Logos und Bilder inpublic/img/. Wenn du das Projekt als Basis nutzt, ersetze diese durch eigene Inhalte und tausche die Werte in_data/metadata.jsaus.