From eb0b77741860fd3cb3416d341c57a3cd7c024fd3 Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Fri, 11 Sep 2026 20:13:28 +0200 Subject: [PATCH] Remove all em-dashes from website content and documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace ' — ' with ', ' across 40 files. Hyphens (-) untouched. timecapsule, stefankoelle, LICENSE, CSS comments left as-is. --- AGENTS.md | 38 ++++++------- DESIGN.md | 36 ++++++------ PLAN.md | 24 ++++---- README.md | 2 +- SPEC.md | 40 +++++++------- code/index.njk | 4 +- hub/impressum.njk | 2 +- hub/index.njk | 6 +- infra/backup-strategy/index.njk | 14 ++--- infra/dev-environment/index.njk | 24 ++++---- infra/docker/index.njk | 58 ++++++++++---------- infra/index.njk | 2 +- infra/lxc/index.njk | 30 +++++----- infra/monitoring/index.njk | 12 ++-- infra/openwrt/index.njk | 10 ++-- infra/proxmox/index.njk | 32 +++++------ infra/synology/index.njk | 20 +++---- retro/amiga-hardware-landscape/index.njk | 16 +++--- retro/amiga-modern-platforms/index.njk | 12 ++-- retro/atari-mega-st-fleet/index.njk | 12 ++-- retro/atari-monitor-compatibility/index.njk | 12 ++-- retro/atari-networking-bbs/index.njk | 18 +++--- retro/batocera-living-room/index.njk | 10 ++-- retro/dos-486-tower/index.njk | 20 +++---- retro/et4000-experiment/index.njk | 10 ++-- retro/index.njk | 4 +- retro/mini-arcade-handheld-roundup/index.njk | 10 ++-- retro/mist-mister-fpga/index.njk | 10 ++-- retro/pimiga-journey/index.njk | 12 ++-- retro/retro-corner-snapshot/index.njk | 12 ++-- retro/the-a1200/index.njk | 18 +++--- scripts/github-aggregator/README.md | 2 +- smarthome/airplay-audio/index.njk | 4 +- smarthome/balkonpi/index.njk | 8 +-- smarthome/home-dashboard-controls/index.njk | 30 +++++----- smarthome/homematic-mqtt/index.njk | 2 +- smarthome/index.njk | 4 +- smarthome/kids-rfid-player/index.njk | 28 +++++----- smarthome/octoprint/index.njk | 8 +-- smarthome/tasmota-energy/index.njk | 6 +- 40 files changed, 311 insertions(+), 311 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index dc188bc..550e01a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# AGENTS.md — moonweb-site +# AGENTS.md, moonweb-site ## Projektuebersicht @@ -23,8 +23,8 @@ Monorepo fuer 6 statische Websites unter www.moonweb.org + stefankoelle.de, basi ### Andere Sites (nicht im Monorepo) -- 28k8.moonweb.org — 90er BBS/Scene-Archiv -- buildbroken.moonweb.org — .NET Open Space Blog Archiv +- 28k8.moonweb.org, 90er BBS/Scene-Archiv +- buildbroken.moonweb.org, .NET Open Space Blog Archiv ## Dateistruktur @@ -101,23 +101,23 @@ npm run build:moonweb # Moonweb + Timecapsule (fuer Deployment) ## Design-Prinzipien -1. **Header konsistent** — Identischer Site-Switcher auf allen Home-Sites -2. **Content flexibel** — Detailseiten duerfen eigenes Layout haben +1. **Header konsistent**, Identischer Site-Switcher auf allen Home-Sites +2. **Content flexibel**, Detailseiten duerfen eigenes Layout haben 3. **Accent-Farben:** hub=#3b6ea5, infra=#99333A, smarthome=#1f8a8a, code=#3E5098, retro=#8a6d3b (inlined in base.njk) -4. **Englisch** — Alle Sites komplett auf Englisch -5. **Keine Analytics** — Keine Tracking-Tools -6. **Sensible Daten** — Infra-Content wird manuell redigiert (keine IPs, Keys, Passwoerter) +4. **Englisch**, Alle Sites komplett auf Englisch +5. **Keine Analytics**, Keine Tracking-Tools +6. **Sensible Daten**, Infra-Content wird manuell redigiert (keine IPs, Keys, Passwoerter) ## URL-Struktur Alle Sites sind unter `www.moonweb.org` als Subverzeichnisse erreichbar: -- `www.moonweb.org/` — Hub (Root) -- `www.moonweb.org/infra/` — Infra -- `www.moonweb.org/smarthome/` — Smarthome -- `www.moonweb.org/code/` — Code -- `www.moonweb.org/retro/` — Retro -- `www.moonweb.org/timecapsule/` — Timecapsule (2001 Design) -- `www.moonweb.org/impressum/` — Impressum +- `www.moonweb.org/`, Hub (Root) +- `www.moonweb.org/infra/`, Infra +- `www.moonweb.org/smarthome/`, Smarthome +- `www.moonweb.org/code/`, Code +- `www.moonweb.org/retro/`, Retro +- `www.moonweb.org/timecapsule/`, Timecapsule (2001 Design) +- `www.moonweb.org/impressum/`, Impressum Cloudflare Redirects leiten alte Subdomains weiter: - `hub.moonweb.org/*` → `www.moonweb.org/*` @@ -145,10 +145,10 @@ npm run prebuild:cv # Alle Pre-Build Tasks (inkl. CV PDF) ``` Dateien: -- `stefankoelle/pdf/cv-style.css` — WeasyPrint-Stylesheet (A4, Typografie) -- `stefankoelle/pdf/build-pdf.sh` — Shell-Skript fuer PDF-Generierung -- `stefankoelle/cv-print.njk` — Standalone HTML-Template (nur CV-Content) -- `stefankoelle/pdf/cv.pdf` — Generiertes PDF (Output) +- `stefankoelle/pdf/cv-style.css`, WeasyPrint-Stylesheet (A4, Typografie) +- `stefankoelle/pdf/build-pdf.sh`, Shell-Skript fuer PDF-Generierung +- `stefankoelle/cv-print.njk`, Standalone HTML-Template (nur CV-Content) +- `stefankoelle/pdf/cv.pdf`, Generiertes PDF (Output) Wichtig: Das PDF wird via Eleventy-Passthrough ins Build-Output kopiert (`dist/stefankoelle/pdf/cv.pdf`). diff --git a/DESIGN.md b/DESIGN.md index 9ebe48a..284679f 100755 --- a/DESIGN.md +++ b/DESIGN.md @@ -1,57 +1,57 @@ -# moonweb.org Hub-Konzept (v5 — fast vollständig, letzte Lücken vor SPEC.md/PLAN.md) +# moonweb.org Hub-Konzept (v5, fast vollständig, letzte Lücken vor SPEC.md/PLAN.md) Status: Konzeptrunde nahezu abgeschlossen. Noch keine Umsetzung. -## 1. Header/Layout-Prinzip — final +## 1. Header/Layout-Prinzip, final Für alle Home-Bereich-Sites (infra, smarthome, code, retro) gilt ab jetzt ein klares Prinzip: -- **Header ist das Wichtigste** — identisch über alle vier Sites (Site-Switcher, Banner, Farbakzent der jeweiligen Domain). +- **Header ist das Wichtigste**, identisch über alle vier Sites (Site-Switcher, Banner, Farbakzent der jeweiligen Domain). - **Übersichtsseiten** (Domain-Root) folgen dem einheitlichen Card-Grid-Grundlayout. -- **Detailseiten/Subseiten** übernehmen den gleichen Header, dürfen darunter aber ein **eigenes, freieres Layout** haben (wie es bei `/ledmatrix/` auf stefankoelle.de heute schon der Fall ist — Pinbelegung, API-Doku, Fotos in freier Anordnung statt starres Card-Raster). +- **Detailseiten/Subseiten** übernehmen den gleichen Header, dürfen darunter aber ein **eigenes, freieres Layout** haben (wie es bei `/ledmatrix/` auf stefankoelle.de heute schon der Fall ist, Pinbelegung, API-Doku, Fotos in freier Anordnung statt starres Card-Raster). Das ist ein wichtiger Unterschied zu v3/v4: nicht "alles identisch", sondern **Header konsistent, Content-Layout pro Subseite flexibel**. -## 2. LEDMatrix-Migration — erledigt (Phase 5) +## 2. LEDMatrix-Migration, erledigt (Phase 5) - `/ledmatrix/` wurde vollständig ins Monorepo migriert und liegt unter `stefankoelle/de/ledmatrix/`. - Deploy erfolgt über IONOS SFTP alongside dem stefankoelle.de Onepager. - Die URL `stefankoelle.de/ledmatrix/` bleibt unverändert bestehen. -## 3. Detailtiefe pro Domain — final festgelegt +## 3. Detailtiefe pro Domain, final festgelegt | Domain | Detailseiten? | Regel | |---|---|---| -| smarthome | Ja, aber nur wenn genug Content da ist | Übersicht zeigt Aufbau des Smarthomes; ein Thema bekommt sofort eine Detailseite, wenn Daten vorhanden sind — sonst wird das Thema vorerst nur in der Übersicht erwähnt (kein Platzhalter-Zwang) | -| code | **Nie** | Nur Übersichtskarten + Link zu GitHub — bewusst kein Duplizieren von README-Inhalten | -| infra | Kaum, eher übersichtsorientiert | Hauptteil bleibt bewusst oberflächlich, da sensible Daten (IPs, Keys, interne Topologie) nicht öffentlich dürfen — siehe Punkt 4 | -| retro | Ja, aber bewusst rudimentär | Thema ist inhaltlich noch unausgereift — nur Grundgerüst anlegen, keine weitere Zeit investieren | +| smarthome | Ja, aber nur wenn genug Content da ist | Übersicht zeigt Aufbau des Smarthomes; ein Thema bekommt sofort eine Detailseite, wenn Daten vorhanden sind, sonst wird das Thema vorerst nur in der Übersicht erwähnt (kein Platzhalter-Zwang) | +| code | **Nie** | Nur Übersichtskarten + Link zu GitHub, bewusst kein Duplizieren von README-Inhalten | +| infra | Kaum, eher übersichtsorientiert | Hauptteil bleibt bewusst oberflächlich, da sensible Daten (IPs, Keys, interne Topologie) nicht öffentlich dürfen, siehe Punkt 4 | +| retro | Ja, aber bewusst rudimentär | Thema ist inhaltlich noch unausgereift, nur Grundgerüst anlegen, keine weitere Zeit investieren | -## 4. Infra-Sensitivität — Redaktionsregel (neu, wichtig für SPEC.md) +## 4. Infra-Sensitivität, Redaktionsregel (neu, wichtig für SPEC.md) -Da infra "eher oberflächlich" bleiben soll, braucht es eine einfache Faustregel, was rein darf und was nicht — sonst ist das bei der Migration der bestehenden Docs (Heimnetzwerk-Final etc.) jedes Mal eine Einzelfallentscheidung: +Da infra "eher oberflächlich" bleiben soll, braucht es eine einfache Faustregel, was rein darf und was nicht, sonst ist das bei der Migration der bestehenden Docs (Heimnetzwerk-Final etc.) jedes Mal eine Einzelfallentscheidung: - **Darf rein:** Architektur-Ebene (Proxmox + Synology + Docker-Host, VLAN-Konzept ohne konkrete interne IP-Pläne, welche Diensttypen laufen, welche Tools genutzt werden). - **Darf nicht rein:** konkrete IP-Adressen, WireGuard-Keys/Preshared-Keys, Passwörter, interne Hostnamen mit Rückschlussmöglichkeit, Backup-Ziele mit Zugangsdaten. Diese Regel gilt 1:1 auch für retro/smarthome, ist aber bei infra am relevantesten, weil dort die Rohdokumente (z. B. Heimnetzwerk-Final-v3.2, GL_Flint2_Final_v2) aktuell sehr konkret sind (u. a. reale IPs, WireGuard-Keys) und beim Übertragen aktiv gekürzt werden müssen. -## 5. Bilder/Assets — final +## 5. Bilder/Assets, final Alle Bilder bleiben **im GitHub-Repo** versioniert (kein separates Cloudflare R2/Images). Einfachster Weg, passt zum ohnehin geplanten Monorepo-Ansatz. -## 6. DNS — bereits bei Cloudflare +## 6. DNS, bereits bei Cloudflare Zone liegt schon bei Cloudflare, Pages-Anbindung ist damit ohne Zusatzschritt möglich. Offen bleibt nur, wohin die nackte Domain `moonweb.org` zeigt (siehe offene Frage 1 unten). -## 7. Übersetzung, Last-Updated, Analytics, Perplexity-Rückkanal — final +## 7. Übersetzung, Last-Updated, Analytics, Perplexity-Rückkanal, final - **Übersetzung:** einmaliger KI-gestützter Durchlauf pro Dokument bei der Migration, kein wiederkehrender Prozess. -- **Last-Updated-Anzeige:** einfachste Lösung — im Zweifel **gar keine Anzeige**. Stattdessen soll der Anspruch sein, dass Inhalte grundsätzlich aktuell gehalten werden, statt ein Datum zu zeigen, das dann veraltet wirkt. +- **Last-Updated-Anzeige:** einfachste Lösung, im Zweifel **gar keine Anzeige**. Stattdessen soll der Anspruch sein, dass Inhalte grundsätzlich aktuell gehalten werden, statt ein Datum zu zeigen, das dann veraltet wirkt. - **Analytics:** keine Statistik-Erfassung, weder Cloudflare Web Analytics noch anderes. - **Perplexity-Rückkanal:** zurückgestellt, wird später erneut betrachtet, keine Zeit jetzt investieren. -## 8. Offene Kleinigkeiten — beantwortet +## 8. Offene Kleinigkeiten, beantwortet Die vier ursprünglich offenen Punkte wurden inzwischen in SPEC.md/PLAN.md beantwortet: @@ -60,7 +60,7 @@ Die vier ursprünglich offenen Punkte wurden inzwischen in SPEC.md/PLAN.md beant 3. **Start-Reihenfolge:** Alle Sites gleichzeitig (PLAN.md §1: "launch simultaneously") 4. **Platzhalter-Verhalten:** Keine Platzhalter, ehrliche kurze Seiten + WIP-Hinweise (SPEC.md §5, retro/ hat WIP-Badge) -## 9. Gesamtstand — Konzept vollständig +## 9. Gesamtstand, Konzept vollständig Alle Entscheidungsgrundlagen sind in SPEC.md (was) und PLAN.md (wie/wann) umgesetzt: diff --git a/PLAN.md b/PLAN.md index 14f0020..3c34604 100755 --- a/PLAN.md +++ b/PLAN.md @@ -1,30 +1,30 @@ -# moonweb.org — Implementation Plan +# moonweb.org, Implementation Plan Companion to `SPEC.md`. Documents the completed migration from separate subdomain sites to a unified `www.moonweb.org` subdirectory structure. -## Phase 0 — Repo & tooling setup +## Phase 0, Repo & tooling setup 1. Created the `moonweb-site` monorepo. 2. Initialized Eleventy project structure per `SPEC.md §10`. 3. Set up `shared/_includes/base.njk` (header + card-grid) with accent colors inlined. 4. Verified local dev server works per site. -## Phase 1 — Content migration & authoring (per domain) +## Phase 1, Content migration & authoring (per domain) -1. **code** — GitHub aggregator, `_data/repos.json`, overview page grouped by subcategory. -2. **smarthome** — overview + detail pages where content exists. -3. **infra** — shallow overview with redaction pass (no IPs, keys, passwords). -4. **retro** — minimal overview with WIP notices. -5. **hub** — central index linking all sites, including redirect `.htm` files for old www.moonweb.org paths. -6. **timecapsule** — integrated from moonweb-www, preserves original 2001 design under `/timecapsule/`. +1. **code**, GitHub aggregator, `_data/repos.json`, overview page grouped by subcategory. +2. **smarthome**, overview + detail pages where content exists. +3. **infra**, shallow overview with redaction pass (no IPs, keys, passwords). +4. **retro**, minimal overview with WIP notices. +5. **hub**, central index linking all sites, including redirect `.htm` files for old www.moonweb.org paths. +6. **timecapsule**, integrated from moonweb-www, preserves original 2001 design under `/timecapsule/`. -## Phase 2 — CI/CD +## Phase 2, CI/CD 1. GitHub Actions workflow `build-deploy-moonweb.yml`: single Eleventy build for all moonweb sites + timecapsule build, deploy via IONOS SFTP. 2. GitHub Actions workflow `deploy-stefankoelle.yml`: stefankoelle.de build, deploy via IONOS SFTP. 3. Cloudflare redirect rules for old subdomains (`scripts/cloudflare/`). -## Phase 3 — Consolidation to www.moonweb.org +## Phase 3, Consolidation to www.moonweb.org All moonweb.org sites now live under `www.moonweb.org` as subdirectories: @@ -55,7 +55,7 @@ Cloudflare redirects forward old subdomains: - `.eleventyignore` excludes `stefankoelle/` and `timecapsule/` (built separately). - `build-pdf.sh` temporarily renames `.eleventyignore` for stefankoelle build. -## Definition of done — Achieved +## Definition of done, Achieved - All sites live under `www.moonweb.org` as subdirectories, deployed via IONOS SFTP. - `www.moonweb.org/code/` reflects the current GitHub repos via the `.moonweb.yml` aggregator. diff --git a/README.md b/README.md index d87780d..b312b33 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # moonweb-site -Monorepo for the **moonweb.org** homelab — six static sites built with [Eleventy](https://www.11ty.dev/), deployed to [IONOS SFTP](https://www.ionos.de/). +Monorepo for the **moonweb.org** homelab, six static sites built with [Eleventy](https://www.11ty.dev/), deployed to [IONOS SFTP](https://www.ionos.de/). ``` www.moonweb.org/ -> Central index & gateway diff --git a/SPEC.md b/SPEC.md index 47a9e8a..f293f50 100755 --- a/SPEC.md +++ b/SPEC.md @@ -1,4 +1,4 @@ -# moonweb.org — Specification +# moonweb.org, Specification Status: Migration complete. All sites live under `www.moonweb.org` as subdirectories, deployed via IONOS SFTP. @@ -36,9 +36,9 @@ Old subdomain redirects (via Cloudflare): |---|---|---|---| | hub | `/` | Gateway, links to everything, one-line description per destination | Minimal | | infra | `/infra/` | Shallow, structured overview of the stack: Proxmox, Synology, VLANs, Docker hosting, dev environment | Reference, high-level only | -| smarthome | `/smarthome/` | Why the homelab exists — sensors, automation, calendar/contacts sync, dashboards, media | Project storytelling | -| code | `/code/` | Curated, sorted GitHub catalog — overview only, always linking out to GitHub | Portfolio | -| retro | `/retro/` | Physical retro hardware collection (not software/demos — that's 28k8's domain) | Simple, factual | +| smarthome | `/smarthome/` | Why the homelab exists, sensors, automation, calendar/contacts sync, dashboards, media | Project storytelling | +| code | `/code/` | Curated, sorted GitHub catalog, overview only, always linking out to GitHub | Portfolio | +| retro | `/retro/` | Physical retro hardware collection (not software/demos, that's 28k8's domain) | Simple, factual | | timecapsule | `/timecapsule/` | Original www.moonweb.org content from 2001, preserved as-is | Retro 2001 design | ## 4. Design system @@ -49,7 +49,7 @@ Old subdomain redirects (via Cloudflare): - **Overview (index) pages** use a shared card-grid layout (clean card-grid with banner header, grouped card sections, sans-serif, generous whitespace, light theme only, no heavy JS). - **Detail/sub-pages** keep the same header but may use a freer layout below it. -Note: stefankoelle.de uses its own independent design — it does not follow this header-consistent principle. +Note: stefankoelle.de uses its own independent design, it does not follow this header-consistent principle. ### 4.2 Accent colors per domain @@ -63,31 +63,31 @@ Note: stefankoelle.de uses its own independent design — it does not follow thi ### 4.3 URL convention -`/section/slug/` — lowercase, hyphenated, trailing slash. All sites share a single Eleventy build with computed `pathPrefix` per section. +`/section/slug/`, lowercase, hyphenated, trailing slash. All sites share a single Eleventy build with computed `pathPrefix` per section. ## 5. Content depth rules (per domain) | Domain | Detail pages? | Rule | |---|---|---| -| smarthome | Yes, when there's enough content | Index shows how the smart home is structured; a topic gets a detail page immediately if enough data exists — otherwise it's mentioned in the overview only, no placeholder required | +| smarthome | Yes, when there's enough content | Index shows how the smart home is structured; a topic gets a detail page immediately if enough data exists, otherwise it's mentioned in the overview only, no placeholder required | | code | Never | Overview cards + link to GitHub only. No duplicating README content. | -| infra | Rarely | Deliberately shallow — most of the raw material is sensitive (see §6) | +| infra | Rarely | Deliberately shallow, most of the raw material is sensitive (see §6) | | retro | Yes, but minimal | Topic is still immature; create only a rudimentary overview, don't over-invest time | -General rule across all domains: **if content is too thin for a good detail page, skip the detail page — don't create a placeholder.** +General rule across all domains: **if content is too thin for a good detail page, skip the detail page, don't create a placeholder.** ## 6. Infra content redaction rule Because infra must stay shallow and public-safe: -- **Allowed:** architecture level — Proxmox + Synology + Docker host, VLAN concept without concrete internal IP plans, which service types run, which tools are used. +- **Allowed:** architecture level, Proxmox + Synology + Docker host, VLAN concept without concrete internal IP plans, which service types run, which tools are used. - **Not allowed:** concrete IP addresses, WireGuard keys/preshared keys, passwords, internal hostnames that allow inference, backup targets with credentials. This rule applies to any domain but is most relevant for infra, since the source documents currently contain real IPs and keys that must be actively stripped during migration. ## 7. Language -All sites in the monorepo are written **entirely in English**. Existing German source documents are translated once during migration via a single AI-assisted pass — not a recurring process. New `.moonweb.yml` metadata and generated content are authored in English from the start. +All sites in the monorepo are written **entirely in English**. Existing German source documents are translated once during migration via a single AI-assisted pass, not a recurring process. New `.moonweb.yml` metadata and generated content are authored in English from the start. ## 8. GitHub automation (www.moonweb.org/code/) @@ -104,13 +104,13 @@ summary: "Compact MVG/S-Bahn departure monitor with configurable stations." repo_url: "https://github.com/skoelle/mvg-departures" ``` -A local aggregator script reads `.moonweb.yml` from all repos via the GitHub API, and the result is committed into `_data/repos.json` inside the monorepo. This runs manually, on demand — no scheduled automation for now. +A local aggregator script reads `.moonweb.yml` from all repos via the GitHub API, and the result is committed into `_data/repos.json` inside the monorepo. This runs manually, on demand, no scheduled automation for now. ## 9. Content maintenance - infra, smarthome, retro, stefankoelle: **fully manual**, edited in vim, committed via git push. No automation. - code: the only automated piece is the GitHub aggregator described in §8. -- No "last updated" timestamps are shown anywhere — the goal is that content is simply kept current, not that staleness is displayed. +- No "last updated" timestamps are shown anywhere, the goal is that content is simply kept current, not that staleness is displayed. - No analytics/tracking of any kind on any site. - Images/assets live versioned directly in the monorepo (no external asset host). @@ -159,19 +159,19 @@ moonweb-site/ ## 11. Technical stack -- **Static site generator:** Eleventy (11ty) v3.1.6 — single config at root, computed `pathPrefix` per section, per-section collections. -- **Static site generator (timecapsule):** Eleventy v2.0.1 — separate config, preserves original 2001 design. -- **Templates:** Nunjucks (.njk) — shared `base.njk` layout, `card-grid.njk` for index pages, `sitemap.njk` for central sitemap. +- **Static site generator:** Eleventy (11ty) v3.1.6, single config at root, computed `pathPrefix` per section, per-section collections. +- **Static site generator (timecapsule):** Eleventy v2.0.1, separate config, preserves original 2001 design. +- **Templates:** Nunjucks (.njk), shared `base.njk` layout, `card-grid.njk` for index pages, `sitemap.njk` for central sitemap. - **Styling:** Custom CSS (`base.css`) with accent colors inlined as `