Update all documentation for consolidated www.moonweb.org structure

- AGENTS.md: new file structure, single config, correct commands
- README.md: updated architecture, project structure, CI/CD docs
- SPEC.md: updated sitemap, design system, repository structure, tech stack
- PLAN.md: completed migration phases, remaining items
- TODO.md: current status, completed tasks, remaining items
This commit is contained in:
2026-09-11 14:07:05 +02:00
parent 01097ff89a
commit 9ffbadb3db
5 changed files with 287 additions and 284 deletions
+26 -25
View File
@@ -30,12 +30,11 @@ Monorepo fuer 6 statische Websites unter www.moonweb.org + stefankoelle.de, basi
```
moonweb-site/
├── hub/ # Eleventy-Config + index.njk
├── infra/ # Eleventy-Config + index.njk + 8 Subseiten
├── smarthome/ # Eleventy-Config + index.njk + 9 Subseiten
├── code/ # Eleventy-Config + index.njk
│ └── _data/repos.json
├── retro/ # Eleventy-Config + index.njk + 13 Subseiten
├── hub/ # Index + Redirects (.htm) + impressum.njk
├── infra/ # Index.njk + 8 Subseiten
├── smarthome/ # Index.njk + 9 Subseiten
├── code/ # Index.njk
├── retro/ # Index.njk + 13 Subseiten
├── timecapsule/ # Eleventy 2.x (eigene Config)
│ ├── eleventy.config.js
│ ├── package.json
@@ -53,15 +52,20 @@ moonweb-site/
├── shared/ # Gemeinsame Komponenten
│ ├── _includes/
│ │ ├── base.njk # Basis-Layout (Header, Site-Switcher, Footer)
│ │ ── card-grid.njk # Card-Grid Template
├── base.css
── theme-*.css
│ │ ── card-grid.njk # Card-Grid Template
│ └── sitemap.njk # Zentrale Sitemap
── base.css # Shared CSS (Layout, Cards, Typografie)
│ └── favicon/ # Favicon-SVGs pro Section
├── _data/
│ └── repos.json # GitHub-Aggregator Output
├── scripts/
│ ├── github-aggregator/
│ └── merge-moonweb.sh # Merge-Skript fuer Deployment
│ ├── github-aggregator/ # Python: liest .moonweb.yml -> repos.json
│ └── cloudflare/ # Redirect-Setup fuer alte Subdomains
├── .github/workflows/
│ ├── build-deploy-moonweb.yml # CI/CD: IONOS SFTP (www.moonweb.org)
│ └── deploy-stefankoelle.yml # CI/CD: IONOS SFTP (stefankoelle.de)
├── eleventy.config.js # Zentrale Eleventy-Config (alle moonweb Sites)
├── .eleventyignore # Schliesst stefankoelle/, timecapsule/ aus
├── DESIGN.md
├── SPEC.md
├── PLAN.md
@@ -72,10 +76,10 @@ moonweb-site/
## Technischer Stack
- **SSG:** Eleventy (11ty) v3.1.6 (hub, infra, smarthome, code, retro)
- **SSG:** Eleventy (11ty) v3.1.6 (hub, infra, smarthome, code, retro) - zentrale Config
- **SSG:** Eleventy v2.0.1 (timecapsule - retro 2001 Design)
- **Templates:** Nunjucks (.njk)
- **CSS:** Variables-basiert mit Accent-Farben pro Site
- **CSS:** Variables-basiert mit Accent-Farben (inlined in base.njk)
- **Deploy (moonweb):** IONOS SFTP
- **Deploy (stefankoelle):** IONOS SFTP
- **CI/CD:** GitHub Actions (2 Workflows)
@@ -86,23 +90,20 @@ moonweb-site/
npm install
cd timecapsule && npm install # Timecapsule Dependencies
npm run prebuild # Pre-Build Tasks (CV PDF generieren)
npm run dev:hub # localhost:8081
npm run dev:infra # localhost:8082
npm run dev:smarthome # localhost:8083
npm run dev:code # localhost:8084
npm run dev:retro # localhost:8085
npm run dev:stefankoelle # localhost:8086
npm run dev:timecapsule # localhost:8087
npm run build # Alle Sites bauen
npm run build:moonweb # Nur moonweb Sites (ohne stefankoelle)
npm run merge:moonweb # Sites mergen fuer Deployment
npm run dev # Moonweb Sites (localhost:8081)
npm run dev:stefankoelle # stefankoelle.de (localhost:8086)
npm run dev:timecapsule # Timecapsule (localhost:8087)
npm run build # Alle moonweb Sites
npm run build:stefankoelle # Nur stefankoelle
npm run build:timecapsule # Nur timecapsule
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
3. **Accent-Farben:** hub=#3b6ea5, infra=#99333A, smarthome=#1f8a8a, code=#3E5098, retro=#8a6d3b
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)
@@ -188,7 +189,7 @@ Benötigte Secrets:
## GitHub Aggregator
Das Skript `scripts/github-aggregator/aggregate.py` liest aus jedem public Repo unter `skoelle` die `.moonweb.yml` und generiert `code/_data/repos.json`.
Das Skript `scripts/github-aggregator/aggregate.py` liest aus jedem public Repo unter `skoelle` die `.moonweb.yml` und generiert `_data/repos.json`.
### .moonweb.yml Format
+57 -47
View File
@@ -1,64 +1,74 @@
# moonweb.org — Implementation Plan
Companion to `SPEC.md`. Defines order of work. All sites (hub, infra, smarthome, code, retro, stefankoelle) launch **simultaneously** — no staged rollout by domain.
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
1. Create the `moonweb-site` monorepo (private until first launch, then can stay private since Pages deploys the built output, not the source).
2. Initialize Eleventy project structure per `SPEC.md §10`.
3. Set up `shared/layout-base.njk` (header + card-grid) and one `theme-*.css` per accent color (hub, infra, smarthome, code, retro).
4. Verify local dev server works per site (`npm run dev:<site>`) before any content work starts.
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)
Work order within this phase is flexible since all domains launch together; suggested sequence based on how self-contained each domain's content is:
1. **code** — simplest case, no detail pages, no sensitive-data filtering needed.
- Add `.moonweb.yml` to each GitHub repo (see `SPEC.md §8`).
- Build the aggregator script, run it once, generate `code/_data/repos.json`.
- Build the overview page grouped by subcategory (Automation & Sync, Dev-Tools, Web Apps, Firmware/Hardware, Misc).
2. **smarthome** — overview first, detail pages only where content already exists.
- Draft the overview: how the smart home is structured (buttons/control, sensors, calendar, weather, media).
- For each existing topic with enough material (HomematicIP/MQTT, Tasmota, LED-Matrix *reference only, no migration*, M5Stack/WT32SC01 dashboards, WetterAPI, AirPlay, OctoPi, TubeArchivist), decide case by case: enough content → detail page; too thin → mention in overview only, no placeholder.
- Translate source material to English during authoring (one-time AI pass per document, per `SPEC.md §7`).
3. **infra** — overview only, redaction pass required.
- Draft a shallow, structured overview: Proxmox/pve2, Synology, VLANs, Fritz!Box mesh, SSO, Docker hosting model, plus the "how I work" section (OpenClaw/OpenCode setup, dev workflow).
- Apply the redaction rule from `SPEC.md §6` while translating — strip IPs, keys, credentials, internal hostnames from every source document before it becomes public content.
- Skip detail pages unless a topic can be described without any sensitive detail.
4. **retro** — minimal effort, rudimentary only.
- One overview page listing what hardware exists.
- Add "work in progress" notices for anything that isn't ready — better an honest short page than none.
5. **hub** — build last within this phase since it links to all the others.
- One-line description + link per destination (infra, smarthome, code, retro, stefankoelle, and external links to www.moonweb.org, 28k8.moonweb.org).
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
1. Write `.github/workflows/build-deploy.yml`: builds all five sites in one job (or matrix), then deploys each output folder to its corresponding Cloudflare Pages project via `wrangler pages deploy`.
2. Create five Cloudflare Pages projects (hub, infra, smarthome, code, retro), each bound to its target custom domain (DNS already on Cloudflare, no extra setup needed).
3. Do one full dry run per site locally before the first real deploy.
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 — Launch
## Phase 3 — Consolidation to www.moonweb.org
1. Deploy all five sites simultaneously.
2. Point the respective custom domains at their Pages projects.
3. Apex domain `moonweb.org` keeps redirecting to `www.moonweb.org` for now (no change in this launch).
4. Smoke-test cross-linking: hub → each site, site-switcher on infra/smarthome/code/retro, smarthome → external ledmatrix link, code cards → GitHub links.
All moonweb.org sites now live under `www.moonweb.org` as subdirectories:
## Phase 4 — Explicitly deferred (not part of this build)
| URL | Content |
|-----|---------|
| `www.moonweb.org/` | Hub (root) |
| `www.moonweb.org/infra/` | Infrastructure |
| `www.moonweb.org/smarthome/` | Smart Home |
| `www.moonweb.org/code/` | Code catalog |
| `www.moonweb.org/retro/` | Retro hardware |
| `www.moonweb.org/timecapsule/` | 2000s time capsule |
| `www.moonweb.org/impressum/` | Legal notice |
- Deciding on 28k8.moonweb.org's future (stay separate vs. eventual monorepo inclusion).
- Building any Perplexity-backchannel mechanism for reusing published site content in this project.
- Redirecting the apex domain from `www.moonweb.org` to `hub.moonweb.org`.
- Any analytics, "last updated" timestamps, or scheduled/automated content generation beyond the one-time GitHub aggregator run.
Cloudflare redirects forward old subdomains:
- `hub.moonweb.org/*``www.moonweb.org/*`
- `infra.moonweb.org/*` `www.moonweb.org/infra/*`
- `smarthome.moonweb.org/*``www.moonweb.org/smarthome/*`
- `code.moonweb.org/*``www.moonweb.org/code/*`
- `retro.moonweb.org/*``www.moonweb.org/retro/*`
## Definition of done for this build
### Technical consolidation
- All sites live on their respective platforms:
- hub, infra, smarthome, code, retro on Cloudflare Pages under their intended domains.
- stefankoelle.de on IONOS via SFTP deployment.
- code.moonweb.org reflects the current GitHub repos via the `.moonweb.yml` aggregator, grouped by subcategory.
- smarthome.moonweb.org gives an accurate picture of what's running on the homelab today, with detail pages only where content already existed.
- infra.moonweb.org describes the stack shallowly with zero sensitive data leaked.
- retro.moonweb.org exists with an honest, minimal overview (WIP notices allowed).
- hub.moonweb.org correctly links everything, including the external sites (www.moonweb.org, 28k8.moonweb.org).
- stefankoelle.de is a working onepager with CV, Projects, Languages, Impressum, and the LED Matrix documentation sub-page.
- Single `eleventy.config.js` at root with computed `pathPrefix` per section.
- Shared `base.njk` layout with inlined accent colors (no per-site theme CSS).
- Central `_data/repos.json` (moved from `code/_data/`).
- Central sitemap (`shared/_includes/sitemap.njk`) with all 36 pages.
- Single `robots.txt` at root.
- `.eleventyignore` excludes `stefankoelle/` and `timecapsule/` (built separately).
- `build-pdf.sh` temporarily renames `.eleventyignore` for stefankoelle build.
## 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.
- `www.moonweb.org/smarthome/` gives an accurate picture of what's running on the homelab.
- `www.moonweb.org/infra/` describes the stack shallowly with zero sensitive data leaked.
- `www.moonweb.org/retro/` exists with an honest, minimal overview.
- `www.moonweb.org/` correctly links everything.
- `stefankoelle.de` is a working onepager with CV, Projects, Languages, Impressum, and LED Matrix documentation.
- Old subdomains redirect via Cloudflare to new paths.
- Old www.moonweb.org content preserved under `/timecapsule/`.
## Remaining items
- Cloudflare redirect rules need activation (script ready, needs `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ZONE_ID` secrets, or manual dashboard setup).
- Google Search Console: new property `www.moonweb.org` not yet created.
- `moonweb-www` repository not yet archived.
+57 -73
View File
@@ -21,21 +21,26 @@ stefankoelle.de -> CV, career, personal site (LED Matrix docs)
```
+-------------------------------------------------------------------+
| GitHub Actions CI |
| +-----------+ +------------+ +-------------+ +---------+ +------+ |
| | build:hub | |build:infra | | build:smart | | build:... | | build:timecapsule | |
| +-----+-----+ +-----+------+ +------+------+ +----+----+ +----+----+ +--------+ |
| | | | | | | |
| v v v v v v |
| dist/hub/ dist/infra/ dist/smarthome/ dist/.../ dist/timecapsule/ |
+--------+---------------------------------------------------+--------------------+
| |
v v
+------------------+ +------------------+
| IONOS SFTP | | IONOS SFTP |
| (www.moonweb.org)| | (stefankoelle.de)|
+--------+---------+ +--------+---------+
v v
www.moonweb.org/* stefankoelle.de
| +-------------------+ +---------------------+ |
| | build-deploy- | | deploy-stefankoelle | |
| | moonweb | | | |
| +--------+----------+ +----------+----------+ |
| | | |
| v v |
| npm run build npm run build:stefankoelle |
| + build:timecapsule | |
| | | |
| v v |
| dist/ dist/stefankoelle/ |
+-----------+------------------------+-------------------------------+
| |
v v
+------------------+ +------------------+
| IONOS SFTP | | IONOS SFTP |
| (www.moonweb.org)| | (stefankoelle.de)|
+--------+---------+ +--------+---------+
v v
www.moonweb.org/* stefankoelle.de
```
---
@@ -47,9 +52,9 @@ stefankoelle.de -> CV, career, personal site (LED Matrix docs)
| **SSG** | [Eleventy 3.1.6](https://www.11ty.dev/) | Markdown/YAML-first, minimal JS, `_data` folders map directly to aggregator output |
| **SSG (timecapsule)** | [Eleventy 2.0.1](https://www.11ty.dev/) | Legacy 2001 design, CommonJS config |
| **Templates** | [Nunjucks](https://mozilla.github.io/nunjucks/) | Shared `base.njk` layout with site-switcher header, `card-grid.njk` for index pages |
| **Styling** | Custom CSS (variables-based) | `base.css` for shared layout, `theme-*.css` per domain accent color |
| **Styling** | Custom CSS (variables-based) | `base.css` for shared layout, accent colors inlined in `base.njk` |
| **Fonts** | [Lobster](https://fonts.google.com/specimen/Lobster) (Google Fonts) | Distinctive heading font across all sites |
| **CI/CD** | [GitHub Actions](https://github.com/features/actions) | Matrix build for all sites, artifact upload, merge step, parallel deploy |
| **CI/CD** | [GitHub Actions](https://github.com/features/actions) | Single build job, parallel SFTP deploy |
| **Deploy** | IONOS SFTP | Static hosting via SFTP upload |
| **DNS** | Cloudflare | DNS management + redirects from old subdomains |
| **GitHub Catalog** | Python aggregator | Reads `.moonweb.yml` from each repo, outputs `repos.json` |
@@ -63,27 +68,19 @@ stefankoelle.de -> CV, career, personal site (LED Matrix docs)
npm install # install Eleventy + deps
cd timecapsule && npm install # timecapsule has own deps (Eleventy 2.x)
npm run dev:hub # http://localhost:8081
npm run dev:infra # http://localhost:8082
npm run dev:smarthome # http://localhost:8083
npm run dev:code # http://localhost:8084
npm run dev:retro # http://localhost:8085
npm run dev:stefankoelle # http://localhost:8086
npm run dev:timecapsule # http://localhost:8087
npm run dev # all 7 in parallel
npm run dev # moonweb sites (localhost:8081)
npm run dev:stefankoelle # stefankoelle.de (localhost:8086)
npm run dev:timecapsule # timecapsule (localhost:8087)
```
Each site has its own minimal Eleventy config (`<site>/eleventy.config.js`). Live reload is built in.
### Build
```bash
npm run prebuild # pre-build tasks (CV PDF)
npm run build # builds all sites
npm run build:moonweb # builds moonweb sites only (excludes stefankoelle)
npm run build:hub # build single site
npm run merge:moonweb # merge all moonweb sites into dist/ for deployment
npm run build # builds all moonweb sites (hub, infra, smarthome, code, retro)
npm run build:stefankoelle # builds stefankoelle.de
npm run build:timecapsule # builds timecapsule
npm run build:moonweb # builds moonweb + timecapsule (for deployment)
```
---
@@ -92,18 +89,10 @@ npm run merge:moonweb # merge all moonweb sites into dist/ for de
```
moonweb-site/
├── hub/ # Central index & gateway
├── hub/ # Central index + redirect .htm files
├── infra/ # Infra overview + 8 detail pages
│ ├── backup-strategy/
│ ├── monitoring/
│ ├── dev-environment/
│ └── ...
├── smarthome/ # Smart home overview + 9 detail pages
│ ├── homematic-mqtt/
│ ├── tasmota-energy/
│ └── ...
├── code/ # GitHub catalog
│ └── _data/repos.json # populated by the aggregator
├── retro/ # Retro hardware + 13 detail pages
├── timecapsule/ # 2000s retro design (Eleventy 2.x)
│ ├── eleventy.config.js
@@ -111,27 +100,32 @@ moonweb-site/
│ └── src/
├── stefankoelle/ # CV, career, personal site
│ ├── eleventy.config.js
│ ├── index.njk # Onepager (CV, Projects, Languages)
│ ├── cv-print.njk # CV-only for PDF generation
│ ├── ledmatrix/ # LED Matrix WebServer documentation
│ └── assets/ # CSS, JS, images, favicons
│ ├── index.njk
│ ├── cv-print.njk
│ ├── ledmatrix/
│ └── assets/
├── shared/ # Shared components
│ ├── _includes/
│ │ ├── base.njk # base layout (header, site-switcher, footer)
│ │ ── card-grid.njk # card-grid template with emoji support
├── base.css # shared CSS (layout, cards, typography)
── theme-*.css # accent colors per domain
│ │ ── card-grid.njk # card-grid template
│ └── sitemap.njk # central sitemap template
── base.css # shared CSS
│ └── favicon/ # favicon SVGs per section
├── _data/
│ └── repos.json # populated by the GitHub aggregator
├── scripts/
│ ├── github-aggregator/ # Python: reads .moonweb.yml -> repos.json
│ └── merge-moonweb.sh # Merge script for deployment
│ └── cloudflare/ # redirect setup for old subdomains
├── .github/workflows/
│ ├── build-deploy-moonweb.yml # CI/CD: build + deploy to IONOS SFTP
│ └── deploy-stefankoelle.yml # CI/CD: stefankoelle.de to IONOS SFTP
├── DESIGN.md # Initial concept
├── SPEC.md # Full specification
├── PLAN.md # Implementation plan
├── TODO.md # Open items & workflow
── package.json # npm scripts for dev/build
│ ├── build-deploy-moonweb.yml # CI/CD: IONOS SFTP (www.moonweb.org)
│ └── deploy-stefankoelle.yml # CI/CD: IONOS SFTP (stefankoelle.de)
├── eleventy.config.js # single config for all moonweb sites
├── .eleventyignore # excludes stefankoelle/, timecapsule/
├── DESIGN.md
├── SPEC.md
── PLAN.md
├── TODO.md
└── package.json
```
---
@@ -145,24 +139,12 @@ Defined in `.github/workflows/build-deploy-moonweb.yml`:
```
push to main
|
+-- Build (matrix: hub, infra, smarthome, code, retro)
+-- Build
| +-- checkout -> setup-node (22) -> npm ci
| +-- npm run build:<site>
| +-- validate dist/<site>/ exists & non-empty
| +-- upload artifact (7-day retention)
|
+-- Build timecapsule
| +-- cd timecapsule && npm ci
| +-- npm run build (all moonweb sites in one Eleventy run)
| +-- npm run build:timecapsule
| +-- upload artifact
|
+-- Merge
| +-- download all artifacts
| +-- merge into dist/ (hub=root, others=subdirs)
| +-- upload merged artifact
|
+-- Deploy
+-- download merged artifact
+-- SFTP upload to IONOS /websites/moonweb/
```
@@ -223,7 +205,7 @@ Cloudflare redirects forward old subdomains:
2. Reads `.moonweb.yml` from each repo root
3. Filters for `category: code` entries
4. Sorts by subcategory + title
5. Writes combined result to `code/_data/repos.json`
5. Writes combined result to `_data/repos.json`
### `.moonweb.yml` schema
@@ -241,8 +223,9 @@ repo_url: "https://github.com/skoelle/mvg-departures"
### Manual run
```bash
export GITHUB_TOKEN=ghp_xxx
python scripts/github-aggregator/aggregate.py
python3 -m venv .venv
.venv/bin/pip install pyyaml
.venv/bin/python scripts/github-aggregator/aggregate.py
```
---
@@ -276,6 +259,7 @@ All moonweb sites are written **entirely in English**. The timecapsule uses the
| `PLAN.md` | Phased implementation plan |
| `TODO.md` | Open items, workflow, and current status |
| `README.md` | This file - project overview for GitHub |
| `AGENTS.md` | AI agent instructions for this codebase |
---
+86 -67
View File
@@ -1,63 +1,69 @@
# moonweb.org — Specification
Status: Concept finalized. This document defines *what* gets built. See `PLAN.md` for *how and in what order*.
Status: Migration complete. All sites live under `www.moonweb.org` as subdirectories, deployed via IONOS SFTP.
## 1. Purpose
A personal homelab hub consisting of a central index (`hub`) and several themed static sites, replacing the current unstructured presentation of infrastructure, smart home projects, and GitHub repos. cv (stefankoelle.de) remains external, linked from the hub and site-switcher.
A personal homelab hub consisting of a central index (`hub` at root) and several themed static sites, all served under `www.moonweb.org` as subdirectories. The old timecapsule content (2001 design) is preserved under `/timecapsule/`. cv (stefankoelle.de) remains external, linked from the hub and site-switcher.
## 2. Sitemap
```
moonweb-site (monorepo)
├── hub/ → hub.moonweb.org Central index & gateway
├── infra/ → infra.moonweb.org System architecture / stack overview
├── smarthome/ → smarthome.moonweb.org What the homelab actually runs, and why
├── code/ → code.moonweb.org Curated GitHub catalog
├── retro/ → retro.moonweb.org Physical retro hardware collection
── stefankoelle/→ stefankoelle.de CV, career, personal site (SFTP deploy)
├── hub/ → www.moonweb.org/ Central index & gateway
├── infra/ → www.moonweb.org/infra/ System architecture / stack overview
├── smarthome/ → www.moonweb.org/smarthome/ What the homelab actually runs, and why
├── code/ → www.moonweb.org/code/ Curated GitHub catalog
├── retro/ → www.moonweb.org/retro/ Physical retro hardware collection
── timecapsule/ www.moonweb.org/timecapsule/ 2001-era internet time capsule
└── stefankoelle/→ stefankoelle.de CV, career, personal site (SFTP deploy)
outside the monorepo, untouched:
├── www.moonweb.org finished, no overlap (2001-style internet time capsule)
├── 28k8.moonweb.org 90s BBS/scene archive, separate approach, may migrate later (undecided)
├── 28k8.moonweb.org 90s BBS/scene archive
├── buildbroken.moonweb.org .NET Open Space blog archive
```
Apex domain `moonweb.org` currently redirects to `www.moonweb.org`. This stays as-is for now; a later redirect to `hub.moonweb.org` is possible but out of scope for this build.
Old subdomain redirects (via Cloudflare):
- `hub.moonweb.org/*``www.moonweb.org/*`
- `infra.moonweb.org/*``www.moonweb.org/infra/*`
- `smarthome.moonweb.org/*``www.moonweb.org/smarthome/*`
- `code.moonweb.org/*``www.moonweb.org/code/*`
- `retro.moonweb.org/*``www.moonweb.org/retro/*`
## 3. Domain purposes
| Domain | Purpose | Tone |
|---|---|---|
| hub | Gateway, links to everything, one-line description per destination | Minimal |
| infra | Shallow, structured overview of the stack: Proxmox (PVE + pve2), Synology DS918+, VLANs, Fritz!Box mesh, SSO, plus how I work (OpenCode/OpenClaw dev environment) | Reference, high-level only |
| smarthome | Why the homelab exists — what's actually running on the homelab as smart home: sensors, automation, calendar/contacts sync, dashboards, media | Project storytelling |
| code | Curated, sorted GitHub catalog — overview only, always linking out to GitHub | Portfolio |
| retro | Physical retro hardware collection (not software/demos — that's 28k8's domain) | Simple, factual |
| Domain | URL | Purpose | Tone |
|---|---|---|---|
| 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 |
| timecapsule | `/timecapsule/` | Original www.moonweb.org content from 2001, preserved as-is | Retro 2001 design |
## 4. Design system
### 4.1 Header-consistent, content-flexible principle
- **Header is identical** across infra/smarthome/code/retro: site-switcher (hub · infra · smarthome · code · retro), domain accent color, consistent branding.
- **Overview (index) pages** use a shared card-grid layout (reference: clean card-grid layout 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 (reference: `/ledmatrix/` on stefankoelle.de today — pin tables, API docs, photos in free layout instead of a rigid card grid).
- **Header is identical** across all sites: site-switcher (home · infra · smarthome · code · retro · cv), section title (`moonweb.org` or `moonweb.org/smarthome`), domain accent color.
- **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 is now part of the monorepo but 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
| Domain | Accent |
|---|---|
| hub | Neutral blue |
| infra | Grey-blue |
| smarthome | Teal |
| code | Violet |
| retro | Own accent, still clean card-grid (no 90s styling — that belongs to 28k8) |
| Domain | Accent | Implementation |
|---|---|---|
| hub | Neutral blue (#3b6ea5) | Inlined `<style>` in base.njk |
| infra | Red (#99333A) | Inlined `<style>` in base.njk |
| smarthome | Teal (#1f8a8a) | Inlined `<style>` in base.njk |
| code | Violet (#3E5098) | Inlined `<style>` in base.njk |
| retro | Brown (#8a6d3b) | Inlined `<style>` in base.njk |
### 4.3 URL convention
`domain/slug/` — lowercase, hyphenated, trailing slash, matching the existing stefankoelle.de pattern (e.g. `/ledmatrix/`) so future detail pages stay consistent even if content later migrates between sites.
`/section/slug/` — lowercase, hyphenated, trailing slash. All sites share a single Eleventy build with computed `pathPrefix` per section.
## 5. Content depth rules (per domain)
@@ -77,20 +83,20 @@ 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.
- **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 (e.g. Heimnetzwerk-Final-v3.2, GL_Flint2_Final_v2) currently contain real IPs and keys that must be actively stripped during migration.
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.
## 8. GitHub automation (code.moonweb.org)
## 8. GitHub automation (www.moonweb.org/code/)
Each GitHub project repo gets a `.moonweb.yml` in its root:
```yaml
title: "MVG Departures"
category: code # code | smarthome | infra
subcategory: "Web Apps" # drives grouping on code.moonweb.org
subcategory: "Web Apps" # drives grouping on www.moonweb.org/code/
status: active
stack: [Python, FastAPI]
hosted_on: "Docker Host Debian (PVE)"
@@ -98,7 +104,7 @@ 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, an AI pass turns the raw YAML into readable card copy, and the result is committed into `code/_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
@@ -112,47 +118,60 @@ A local aggregator script reads `.moonweb.yml` from all repos via the GitHub API
```
moonweb-site/
├── hub/
├── infra/
├── smarthome/
├── code/
│ └── _data/repos.json # populated by the GitHub aggregator
├── retro/
├── stefankoelle/ # CV, career, personal site
├── hub/ # Index + Redirects (.htm) + impressum.njk
├── infra/ # Index.njk + 8 Subseiten
├── smarthome/ # Index.njk + 9 Subseiten
├── code/ # Index.njk
├── retro/ # Index.njk + 13 Subseiten
├── timecapsule/ # Eleventy 2.x (eigene Config)
│ ├── eleventy.config.js
│ ├── index.njk # Onepager (CV, Projects, Languages)
── cv-print.njk # CV-only for PDF generation
│ ├── ledmatrix/ # LED Matrix WebServer documentation
── assets/ # CSS, JS, images, favicons
├── shared/
│ ├── package.json
── src/
├── stefankoelle/ # Eleventy-Config + Onepager
── eleventy.config.js
│ ├── index.njk
│ ├── cv-print.njk
│ ├── ledmatrix/
│ └── assets/
├── shared/ # Shared components
│ ├── _includes/
│ │ ├── base.njk # shared header + footer layout
│ │ ── card-grid.njk # card-grid template
├── base.css # shared CSS variables and layout
── theme-*.css # one accent color file per domain
│ │ ├── base.njk # base layout (header, site-switcher, footer)
│ │ ── card-grid.njk # card-grid template
│ └── sitemap.njk # central sitemap template
── base.css # shared CSS
│ └── favicon/ # favicon SVGs per section
├── _data/
│ └── repos.json # populated by the GitHub aggregator
├── scripts/
── github-aggregator/ # reads .moonweb.yml from all repos
├── DESIGN.md # initial concept and design decisions
├── SPEC.md # what gets built (this document)
├── PLAN.md # how and in what order
├── TODO.md # open items and workflow
── .github/workflows/
├── build-deploy.yml # builds all sites, deploys to Cloudflare Pages
└── deploy-stefankoelle.yml # builds stefankoelle, deploys via IONOS SFTP
── github-aggregator/ # reads .moonweb.yml from all repos
│ └── cloudflare/ # redirect setup for old subdomains
├── .github/workflows/
│ ├── build-deploy-moonweb.yml # builds all moonweb sites, deploys to IONOS SFTP
│ └── deploy-stefankoelle.yml # builds stefankoelle, deploys via IONOS SFTP
── eleventy.config.js # single Eleventy config for all moonweb sites
├── .eleventyignore # excludes stefankoelle/, timecapsule/
├── DESIGN.md
├── SPEC.md
├── PLAN.md
├── TODO.md
└── package.json
```
## 11. Technical stack
- **Static site generator:** Eleventy (11ty) — markdown/YAML-first, minimal JS, `_data` folders map directly onto the `.moonweb.yml` aggregator output, low maintenance for five sites at this scale.
- **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 `<style>` in `base.njk`. No per-site theme CSS files.
- **Build:** entirely in GitHub Actions.
- **Deploy:** Cloudflare Pages — five separate Pages projects (one per public domain: hub, infra, smarthome, code, retro), since Cloudflare Pages binds one custom-domain set per project. stefankoelle.de deploys via IONOS SFTP. Two GitHub Actions workflows handle deployment.
- **Runtime:** fully static, no server-side code, no containers for the website itself (distinct from the actual homelab services running on the Docker host).
- **DNS:** already on Cloudflare — no additional setup step needed for Pages custom domains.
- **Local preview:** Eleventy's built-in dev server with live reload, run per-site (`npm run dev:<site>`) before any commit.
- **Deploy:** IONOS SFTP — all sites deployed to `/websites/moonweb/`, stefankoelle.de to `/websites/stefankoelle/`.
- **DNS:** Cloudflare — DNS management + redirects from old subdomains (hub.moonweb.org, etc.).
- **Runtime:** fully static, no server-side code, no containers for the website itself.
- **Local preview:** Eleventy's built-in dev server with live reload (`npm run dev` for all moonweb sites, `npm run dev:stefankoelle`, `npm run dev:timecapsule`).
## 12. Explicitly out of scope for this build
## 12. Explicitly out of scope
- Migrating 28k8.moonweb.org into the monorepo — undecided, revisit later, likely never.
- Any Perplexity-backchannel mechanism (website content reusable inside this project) — deferred, no time invested now.
- Any Perplexity-backchannel mechanism — deferred.
- Analytics of any kind.
- Automated content generation/translation pipelines beyond the one-time GitHub aggregator for code and the one-time translation pass during migration.
- Automated content generation/translation pipelines beyond the one-time GitHub aggregator for code.
+61 -72
View File
@@ -1,87 +1,76 @@
# TODO: Consolidation zu www.moonweb.org
# TODO: moonweb-site
## Uebersicht
## Status: Consolidation Complete
Alle moonweb.org Sites (hub, infra, smarthome, code, retro, timecapsule) unter `www.moonweb.org` als Subverzeichnisse vereinen. Deployment von Cloudflare Pages zu IONOS SFTP migrieren.
**URL-Struktur nach Migration:**
| URL | Inhalt |
|-----|--------|
| `www.moonweb.org/` | Hub (neue 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/` | Altes www (2001-Retro) |
| `stefankoelle.de/` | CV (bleibt separat) |
All moonweb.org sites are consolidated under `www.moonweb.org` as subdirectories, deployed via IONOS SFTP. PR #3 merged to main.
---
## Phase 1: Timecapsule in Monorepo integrieren
## Completed
- [x] 1.1 Dateien aus ../moonweb-www/src/ nach timecapsule/src/ kopieren
- [x] 1.2 timecapsule/eleventy.config.js erstellen (Eleventy 2.x)
- [x] 1.3 timecapsule/package.json erstellen (eigene Dependencies)
- [x] 1.4 timecapsule/src/_data/site.json anpassen (Domain mit /timecapsule/)
- [x] 1.5 Alle internen Pfade mit /timecapsule/ prefixieren
- [x] 1.6 Passthrough Copy in eleventy.config.js anpassen
- [x] 1.7 Build-Output pruefen (dist/timecapsule/)
### Phase 1: Timecapsule Integration
- [x] Copy files from moonweb-www/src/ to timecapsule/src/
- [x] Create timecapsule/eleventy.config.js (Eleventy 2.x)
- [x] Create timecapsule/package.json (own dependencies)
- [x] Adapt timecapsule internal paths with /timecapsule/ prefix
## Phase 2: Eleventy-Configs aller Sites anpassen
### Phase 2: Single Eleventy Config
- [x] Create root eleventy.config.js with computed pathPrefix per section
- [x] Delete 5 per-site eleventy.config.js files (hub, infra, smarthome, code, retro)
- [x] Delete scripts/merge-moonweb.sh
- [x] Update shared/_includes/base.njk (inlined accent colors, root CSS path)
- [x] Update hub/index.njk card hrefs (relative paths)
- [x] Update hub/impressum.njk (hosting sections correct)
- [x] Update parent values in detail pages to include section prefix
- [x] Add tags to all pages for Eleventy collections
- [x] 2.1 hub/eleventy.config.js: site.url auf www.moonweb.org
- [x] 2.2 infra/eleventy.config.js: site.url auf www.moonweb.org
- [x] 2.3 smarthome/eleventy.config.js: site.url auf www.moonweb.org
- [x] 2.4 code/eleventy.config.js: site.url auf www.moonweb.org
- [x] 2.5 retro/eleventy.config.js: site.url auf www.moonweb.org
- [x] 2.6 shared/_includes/base.njk anpassen
- [x] 2.7 hub/index.njk: Card-Hrefs relativieren
- [x] 2.8 hub/impressum.njk: Domain-Liste aktualisieren
### Phase 3: Build & Deploy
- [x] Create .github/workflows/build-deploy-moonweb.yml (single build job, SFTP deploy)
- [x] Delete old build-deploy.yml (matrix builds)
- [x] Update .eleventyignore (exclude stefankoelle/, timecapsule/, markdown)
- [x] Fix build-pdf.sh to temporarily rename .eleventyignore for stefankoelle build
- [x] Fix timecapsule build path (../dist/ not ../../dist/)
## Phase 3: Build-System anpassen
### Phase 4: Redirects & SEO
- [x] Create 20 redirect .htm files in hub/ for old www.moonweb.org paths
- [x] Create central sitemap.xml (36 pages)
- [x] Create single robots.txt at root
- [x] Set up Cloudflare redirect rules script (scripts/cloudflare/)
- [x] 3.1 package.json: Neue Scripts fuer timecapsule + merge
- [x] 3.2 scripts/merge-moonweb.sh erstellen
- [x] 3.3 Lokal Build testen (alle Sites)
### Phase 5: Bug Fixes
- [x] Fix card links on index pages (add section prefix to local hrefs)
- [x] Fix code repos missing (move repos.json to root _data/)
- [x] Fix favicons (use section-specific favicon.svg per site)
- [x] Fix header (show moonweb.org/smarthome instead of smarthome.moonweb.org)
- [x] Rename hub link to home in site-switcher nav
- [x] Remove redundant 404 pages, keep only root 404
- [x] Add missing beginning subpage redirects (news, report, sitemap)
- [x] Fix double-slash URLs in stefankoelle/index.njk
- [x] Remove unused theme-*.css files
- [x] Update stefankoelle link texts (replace old subdomain names with new paths)
## Phase 4: Deployment umstellen
- [x] 4.1 Neuen Workflow .github/workflows/build-deploy-moonweb.yml erstellen
- [x] 4.2 Alten Workflow .github/workflows/build-deploy.yml entfernen
- [ ] 4.3 Alten deploy-moonweb.yml in moonweb-www deaktivieren
## Phase 5: Cloudflare Redirects
- [x] 5.1 Redirect-Regeln einrichten (via GitHub Action)
| Quell-Domain | Ziel-URL | Type |
|-------------|----------|------|
| `hub.moonweb.org/*` | `https://www.moonweb.org/$1` | 301 |
| `infra.moonweb.org/*` | `https://www.moonweb.org/infra/$1` | 301 |
| `smarthome.moonweb.org/*` | `https://www.moonweb.org/smarthome/$1` | 301 |
| `code.moonweb.org/*` | `https://www.moonweb.org/code/$1` | 301 |
| `retro.moonweb.org/*` | `https://www.moonweb.org/retro/$1` | 301 |
**Umsetzung:** `scripts/cloudflare/setup-redirects.sh` + GitHub Action `cloudflare-redirects.yml`
**Benötigte Secrets:** `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ZONE_ID`
## Phase 6: SEO
- [ ] 6.1 Google Search Console: Neue Property www.moonweb.org
- [ ] 6.2 Sitemap submiten
## Phase 7: Cleanup
- [ ] 7.1 moonweb-www Repository archivieren
- [ ] 7.2 Cloudflare Pages Projects loeschen (nach Redirect-Test)
### Phase 6: Documentation
- [x] Update AGENTS.md for new structure
- [x] Update README.md for new structure
- [x] Update SPEC.md for new structure
- [x] Update PLAN.md for new structure
---
## Abgeschlossen
## Remaining
Alle Code-Aenderungen sind fertig. Nächste Schritte:
1. Commit auf feature/consolidate-www Branch
2. Push und PR erstellen
3. Deployen
4. Cloudflare Redirects einrichten
5. Google Search Console aktualisieren
### Cloudflare Redirects
- [ ] Activate redirect rules (needs `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ZONE_ID` secrets, or manual dashboard setup)
- [ ] Verify redirects work after activation
### SEO
- [ ] Create Google Search Console property for www.moonweb.org
- [ ] Submit sitemap
### Cleanup
- [ ] Archive moonweb-www repository
- [ ] Delete Cloudflare Pages projects (after redirect verification)
### Future
- [ ] Cross-linking stefankoelle.de <-> smarthome
- [ ] Consider moving LED Matrix to smarthome (when ready)