From 9ffbadb3dba2a46c9e7d9aa27d0a83b360942662 Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Fri, 11 Sep 2026 14:07:05 +0200 Subject: [PATCH] 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 --- AGENTS.md | 51 +++++++++--------- PLAN.md | 104 ++++++++++++++++++++----------------- README.md | 130 ++++++++++++++++++++-------------------------- SPEC.md | 153 ++++++++++++++++++++++++++++++------------------------ TODO.md | 133 ++++++++++++++++++++++------------------------- 5 files changed, 287 insertions(+), 284 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ec71fc6..ce2888a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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 diff --git a/PLAN.md b/PLAN.md index 41d248b..14f0020 100755 --- a/PLAN.md +++ b/PLAN.md @@ -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:`) 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. diff --git a/README.md b/README.md index 16260cb..8255441 100755 --- a/README.md +++ b/README.md @@ -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 (`/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: - | +-- validate dist// 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 | --- diff --git a/SPEC.md b/SPEC.md index 3355512..47a9e8a 100755 --- a/SPEC.md +++ b/SPEC.md @@ -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 `