diff --git a/.eleventyignore b/.eleventyignore new file mode 100644 index 0000000..8f47361 --- /dev/null +++ b/.eleventyignore @@ -0,0 +1,17 @@ +stefankoelle/ +timecapsule/ +scripts/ +.tmp/ + +# Root markdown files (not templates) +/*.md + +# Hub static redirect files (handled by passthrough copy) +hub/hardware.html +hub/users.html +hub/index2.html +hub/index3.html +hub/new.html +hub/links.html +hub/infos.html +hub/start.html diff --git a/.github/workflows/build-deploy-moonweb.yml b/.github/workflows/build-deploy-moonweb.yml new file mode 100644 index 0000000..43ed77c --- /dev/null +++ b/.github/workflows/build-deploy-moonweb.yml @@ -0,0 +1,118 @@ +name: Build & Deploy moonweb.org + +on: + push: + branches: [main] + paths-ignore: + - 'stefankoelle/**' + - '.github/workflows/deploy-stefankoelle.yml' + pull_request: + branches: [main] + paths-ignore: + - 'stefankoelle/**' + - '.github/workflows/deploy-stefankoelle.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + NODE_VERSION: "22" + +jobs: + build: + name: Build moonweb sites + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: ${{ env.NODE_VERSION }} + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Build all moonweb sites + run: npm run build + + - name: Build timecapsule + run: npm run build:timecapsule + + - name: Validate build output + run: | + echo "Build output:" + find dist -maxdepth 2 -type f | sort | head -40 + echo "..." + echo "Total files:" + find dist -type f | wc -l + + # Verify key directories exist + for dir in "" infra smarthome code retro timecapsule; do + if [ -n "$dir" ] && [ ! -d "dist/$dir" ]; then + echo "Error: dist/$dir not found" + exit 1 + fi + done + + - name: Upload build artifact + uses: actions/upload-artifact@v7 + with: + name: dist-moonweb + path: dist/ + retention-days: 7 + + deploy: + name: Deploy to IONOS + needs: build + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + steps: + - name: Download build artifact + uses: actions/download-artifact@v8 + with: + name: dist-moonweb + path: dist/ + + - name: Deploy via SFTP + uses: wlixcc/SFTP-Deploy-Action@v1.2.6 + with: + local_path: './dist/*' + server: ${{ secrets.IONOS_SFTP_HOST }} + username: ${{ secrets.IONOS_SFTP_USER }} + password: ${{ secrets.IONOS_SFTP_PASSWORD }} + remote_path: '/websites/moonweb/' + port: 22 + sftp_only: true + + summary: + name: Deploy Summary + needs: deploy + runs-on: ubuntu-latest + if: always() + steps: + - name: Print deployment summary + run: | + echo "## Deployment Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${{ needs.deploy.result }}" = "success" ]; then + echo "moonweb.org deployed successfully!" >> $GITHUB_STEP_SUMMARY + else + echo "Deployment failed. Check the deploy jobs for details." >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Sites" >> $GITHUB_STEP_SUMMARY + echo "| Site | URL |" >> $GITHUB_STEP_SUMMARY + echo "|------|-----|" >> $GITHUB_STEP_SUMMARY + echo "| hub | https://www.moonweb.org/ |" >> $GITHUB_STEP_SUMMARY + echo "| infra | https://www.moonweb.org/infra/ |" >> $GITHUB_STEP_SUMMARY + echo "| smarthome | https://www.moonweb.org/smarthome/ |" >> $GITHUB_STEP_SUMMARY + echo "| code | https://www.moonweb.org/code/ |" >> $GITHUB_STEP_SUMMARY + echo "| retro | https://www.moonweb.org/retro/ |" >> $GITHUB_STEP_SUMMARY + echo "| timecapsule | https://www.moonweb.org/timecapsule/ |" >> $GITHUB_STEP_SUMMARY + +# Required repo secrets: +# IONOS_SFTP_HOST — IONOS SFTP server hostname +# IONOS_SFTP_USER — IONOS SFTP username +# IONOS_SFTP_PASSWORD — IONOS SFTP password diff --git a/.github/workflows/build-deploy.yml b/.github/workflows/build-deploy.yml deleted file mode 100644 index 59232bd..0000000 --- a/.github/workflows/build-deploy.yml +++ /dev/null @@ -1,139 +0,0 @@ -name: Build & Deploy moonweb-site - -on: - push: - branches: [main] - paths-ignore: - - 'stefankoelle/**' - - '.github/workflows/deploy-stefankoelle.yml' - pull_request: - branches: [main] - paths-ignore: - - 'stefankoelle/**' - - '.github/workflows/deploy-stefankoelle.yml' - -# Cancel in-progress runs for the same branch -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_VERSION: "22" - -jobs: - build: - name: Build ${{ matrix.site }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - site: [hub, infra, smarthome, code, retro] - steps: - - uses: actions/checkout@v7 - - - uses: actions/setup-node@v7 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "npm" - - - name: Install dependencies - run: npm ci - - - name: Build ${{ matrix.site }} - run: npm run build:${{ matrix.site }} - - - name: Validate build output - run: | - if [ ! -d "dist/${{ matrix.site }}" ]; then - echo "Error: dist/${{ matrix.site }} not found" - exit 1 - fi - if [ -z "$(ls -A dist/${{ matrix.site }} 2>/dev/null)" ]; then - echo "Error: dist/${{ matrix.site }} is empty" - exit 1 - fi - echo "Build output:" - find dist/${{ matrix.site }} -type f | head -20 - - - name: Upload build artifact - uses: actions/upload-artifact@v7 - with: - name: dist-${{ matrix.site }} - path: dist/${{ matrix.site }} - retention-days: 7 - - deploy: - name: Deploy ${{ matrix.site }} - needs: build - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' && github.event_name == 'push' - strategy: - fail-fast: false - matrix: - include: - - site: hub - cf_project: moonweb-hub - - site: infra - cf_project: moonweb-infra - - site: smarthome - cf_project: moonweb-smarthome - - site: code - cf_project: moonweb-code - - site: retro - cf_project: moonweb-retro - steps: - - name: Download build artifact - uses: actions/download-artifact@v8 - with: - name: dist-${{ matrix.site }} - path: dist/${{ matrix.site }} - - - name: Create wrangler.toml for Worker - run: | - echo 'name = "${{ matrix.cf_project }}"' > wrangler.toml - echo 'compatibility_date = "2024-01-01"' >> wrangler.toml - echo '' >> wrangler.toml - echo '[assets]' >> wrangler.toml - echo 'directory = "./dist/${{ matrix.site }}"' >> wrangler.toml - echo 'not_found_handling = "404-page"' >> wrangler.toml - - - name: Deploy to Cloudflare Workers - uses: cloudflare/wrangler-action@v4 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: deploy - - summary: - name: Deploy Summary - needs: deploy - runs-on: ubuntu-latest - if: always() - steps: - - name: Print deployment summary - run: | - echo "## Deployment Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [ "${{ needs.deploy.result }}" = "success" ]; then - echo "✅ All sites deployed successfully!" >> $GITHUB_STEP_SUMMARY - else - echo "❌ Deployment failed. Check the deploy jobs for details." >> $GITHUB_STEP_SUMMARY - fi - echo "" >> $GITHUB_STEP_SUMMARY - echo "### Sites" >> $GITHUB_STEP_SUMMARY - echo "| Site | URL |" >> $GITHUB_STEP_SUMMARY - echo "|------|-----|" >> $GITHUB_STEP_SUMMARY - echo "| hub | https://hub.moonweb.org |" >> $GITHUB_STEP_SUMMARY - echo "| infra | https://infra.moonweb.org |" >> $GITHUB_STEP_SUMMARY - echo "| smarthome | https://smarthome.moonweb.org |" >> $GITHUB_STEP_SUMMARY - echo "| code | https://code.moonweb.org |" >> $GITHUB_STEP_SUMMARY - echo "| retro | https://retro.moonweb.org |" >> $GITHUB_STEP_SUMMARY - -# Required repo secrets: -# CLOUDFLARE_API_TOKEN — Cloudflare API token with Workers:Edit permission -# CLOUDFLARE_ACCOUNT_ID — Cloudflare account ID -# -# Required one-time setup (see PLAN.md Phase 2): -# Create Cloudflare Workers and bind custom domains. -# DNS is already on Cloudflare (SPEC.md §4.6). -# diff --git a/.github/workflows/cloudflare-redirects.yml b/.github/workflows/cloudflare-redirects.yml new file mode 100644 index 0000000..f3df3fb --- /dev/null +++ b/.github/workflows/cloudflare-redirects.yml @@ -0,0 +1,58 @@ +name: Setup Cloudflare Redirects + +on: + workflow_dispatch: + inputs: + action: + description: "Action to perform" + required: true + default: "apply" + type: choice + options: + - apply + - status + - dry-run + - delete + +env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }} + +jobs: + redirects: + name: Cloudflare Redirects + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Validate secrets + run: | + if [ -z "$CLOUDFLARE_API_TOKEN" ]; then + echo "Error: CLOUDFLARE_API_TOKEN secret is not set" + exit 1 + fi + if [ -z "$CLOUDFLARE_ZONE_ID" ]; then + echo "Error: CLOUDFLARE_ZONE_ID secret is not set" + exit 1 + fi + + - name: Run ${{ inputs.action }} + run: | + case "${{ inputs.action }}" in + status) + ./scripts/cloudflare/setup-redirects.sh --status + ;; + dry-run) + ./scripts/cloudflare/setup-redirects.sh --dry-run + ;; + delete) + ./scripts/cloudflare/setup-redirects.sh --delete + ;; + *) + ./scripts/cloudflare/setup-redirects.sh + ;; + esac + +# Required repo secrets: +# CLOUDFLARE_API_TOKEN — API token with Dynamic Redirects Write permission +# CLOUDFLARE_ZONE_ID — Zone ID for moonweb.org (found in Cloudflare dashboard) diff --git a/.gitignore b/.gitignore index 941bc11..50884a5 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ dist/ .DS_Store *.swp *.swo +timecapsule/_site/ +timecapsule/node_modules/ +.tmp/ diff --git a/AGENTS.md b/AGENTS.md index f0ddc14..ec71fc6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,18 +1,19 @@ # AGENTS.md — moonweb-site -## Projektübersicht +## Projektuebersicht -Monorepo für 5 statische Websites unter moonweb.org + stefankoelle.de, basierend auf Eleventy (11ty). +Monorepo fuer 6 statische Websites unter www.moonweb.org + stefankoelle.de, basierend auf Eleventy (11ty). -### Websites (Cloudflare Pages) +### Websites (IONOS SFTP) -| Site | Domain | Zweck | Status | -|------|--------|-------|--------| -| hub | hub.moonweb.org | Zentrale Indexseite, verlinkt alles | Fertig | -| infra | infra.moonweb.org | Infrastruktur-Übersicht (Proxmox, Synology, Netzwerk) | Übersicht + 3 Detailseiten | -| smarthome | smarthome.moonweb.org | Smart Home Projekte und Dashboards | Übersicht + 6 Detailseiten | -| code | code.moonweb.org | GitHub-Projekte (aggregiert via .moonweb.yml) | Fertig (14 Repos) | -| retro | retro.moonweb.org | Physische Retro-Hardware | Nur Übersicht (WIP) | +| Site | URL | Zweck | Status | +|------|-----|-------|--------| +| hub | www.moonweb.org/ | Zentrale Indexseite, verlinkt alles | Fertig | +| infra | www.moonweb.org/infra/ | Infrastruktur-Uebersicht (Proxmox, Synology, Netzwerk) | Uebersicht + 8 Detailseiten | +| smarthome | www.moonweb.org/smarthome/ | Smart Home Projekte und Dashboards | Uebersicht + 9 Detailseiten | +| code | www.moonweb.org/code/ | GitHub-Projekte (aggregiert via .moonweb.yml) | Fertig | +| retro | www.moonweb.org/retro/ | Physische Retro-Hardware | Uebersicht + 13 Detailseiten | +| timecapsule | www.moonweb.org/timecapsule/ | 2000er Internet-Zeitkapsel (altes Design) | Fertig | ### Externe Sites (SFTP-Deployment) @@ -22,19 +23,23 @@ Monorepo für 5 statische Websites unter moonweb.org + stefankoelle.de, basieren ### Andere Sites (nicht im Monorepo) -- www.moonweb.org — 2000er Internet-Zeitkapsel - 28k8.moonweb.org — 90er BBS/Scene-Archiv +- buildbroken.moonweb.org — .NET Open Space Blog Archiv ## Dateistruktur ``` moonweb-site/ ├── hub/ # Eleventy-Config + index.njk -├── infra/ # Eleventy-Config + index.njk + 3 Subseiten -├── smarthome/ # Eleventy-Config + index.njk + 6 Subseiten +├── 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 +├── retro/ # Eleventy-Config + index.njk + 13 Subseiten +├── timecapsule/ # Eleventy 2.x (eigene Config) +│ ├── eleventy.config.js +│ ├── package.json +│ └── src/ # 2001er Retro-Content ├── stefankoelle/ # Eleventy-Config + Onepager │ ├── eleventy.config.js │ ├── _includes/ @@ -52,10 +57,11 @@ moonweb-site/ │ ├── base.css │ └── theme-*.css ├── scripts/ -│ └── github-aggregator/ +│ ├── github-aggregator/ +│ └── merge-moonweb.sh # Merge-Skript fuer Deployment ├── .github/workflows/ -│ ├── build-deploy.yml # CI/CD: Cloudflare Pages (5 Sites) -│ └── deploy-stefankoelle.yml # CI/CD: IONOS SFTP (stefankoelle.de) +│ ├── build-deploy-moonweb.yml # CI/CD: IONOS SFTP (www.moonweb.org) +│ └── deploy-stefankoelle.yml # CI/CD: IONOS SFTP (stefankoelle.de) ├── DESIGN.md ├── SPEC.md ├── PLAN.md @@ -66,10 +72,11 @@ moonweb-site/ ## Technischer Stack -- **SSG:** Eleventy (11ty) v3.1.6 +- **SSG:** Eleventy (11ty) v3.1.6 (hub, infra, smarthome, code, retro) +- **SSG:** Eleventy v2.0.1 (timecapsule - retro 2001 Design) - **Templates:** Nunjucks (.njk) - **CSS:** Variables-basiert mit Accent-Farben pro Site -- **Deploy (moonweb):** Cloudflare Pages (5 separate Projects) +- **Deploy (moonweb):** IONOS SFTP - **Deploy (stefankoelle):** IONOS SFTP - **CI/CD:** GitHub Actions (2 Workflows) @@ -77,32 +84,54 @@ moonweb-site/ ```bash npm install -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 build # Alle Sites bauen +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 ``` ## Design-Prinzipien 1. **Header konsistent** — Identischer Site-Switcher auf allen Home-Sites -2. **Content flexibel** — Detailseiten dürfen eigenes Layout haben +2. **Content flexibel** — Detailseiten duerfen eigenes Layout haben 3. **Accent-Farben:** hub=#3b6ea5, infra=#99333A, smarthome=#1f8a8a, code=#3E5098, retro=#8a6d3b 4. **Englisch** — Alle Sites komplett auf Englisch 5. **Keine Analytics** — Keine Tracking-Tools -6. **Sensible Daten** — Infra-Content wird manuell redigiert (keine IPs, Keys, Passwörter) +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 + +Cloudflare Redirects leiten alte Subdomains weiter: +- `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/*` ## stefankoelle.de - Eigene Eleventy-Config (nicht shared base.njk) - Eigenes CSS-Design (nicht moonweb design system) - Onepager mit Anchor-Links (bleibt so) -- Deploy via SFTP auf IONOS `/deploy/stefankoelle/` -- CV-Partial zentral pflegbar (einmal aendern → Web + PDF aktualisieren) +- Deploy via SFTP auf IONOS `/websites/stefankoelle/` +- CV-Partial zentral pflegbar (einmal aendern -> Web + PDF aktualisieren) - LED Matrix als eigene Seite unter stefankoelle.de/ledmatrix/ ### CV PDF Generierung @@ -116,7 +145,7 @@ npm run prebuild # Alle Pre-Build Tasks (inkl. CV PDF) Dateien: - `stefankoelle/pdf/cv-style.css` — WeasyPrint-Stylesheet (A4, Typografie) -- `stefankoelle/pdf/build-pdf.sh` — Shell-Skript für PDF-Generierung +- `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) @@ -124,21 +153,22 @@ Wichtig: Das PDF wird via Eleventy-Passthrough ins Build-Output kopiert (`dist/s ### CSS Cache-Busting -CSS-Dateien werden als Passthrough kopiert (kein Hash im Dateinamen). Bei CSS-Änderungen muss der Query-String in der `?v=N` Inkludierung erhöht werden: +CSS-Dateien werden als Passthrough kopiert (kein Hash im Dateinamen). Bei CSS-Aenderungen muss der Query-String in der `?v=N` Inkludierung erhoeht werden: - `stefankoelle/index.njk`: `` - `stefankoelle/ledmatrix/index.njk`: `` -Bei jeder CSS-Anpassung `?v=N` um 1 erhöhen, sonst cached der Browser die alte Datei. +Bei jeder CSS-Anpassung `?v=N` um 1 erhoehen, sonst cached der Browser die alte Datei. ## CI/CD -### Cloudflare Pages (moonweb) -`.github/workflows/build-deploy.yml` baut hub, infra, smarthome, code, retro. +### IONOS SFTP (www.moonweb.org) +`.github/workflows/build-deploy-moonweb.yml` baut alle moonweb Sites (hub, infra, smarthome, code, retro, timecapsule) und deployed per SFTP. Benötigte Secrets: -- `CLOUDFLARE_API_TOKEN` -- `CLOUDFLARE_ACCOUNT_ID` +- `IONOS_SFTP_HOST` +- `IONOS_SFTP_USER` +- `IONOS_SFTP_PASSWORD` ### IONOS SFTP (stefankoelle.de) `.github/workflows/deploy-stefankoelle.yml` baut stefankoelle.de und deployed per SFTP. @@ -150,9 +180,11 @@ Benötigte Secrets: ## Offene Punkte -- retro/ ist bewusst rudimentär gehalten +- retro/ ist bewusst rudimentaer gehalten - Querverlinkungen stefankoelle.de <-> smarthome (zukuenftig) - Ledmatrix ggf. nach smarthome verschieben (when ready) +- Cloudflare Redirects einrichten (nach Deploy) +- Google Search Console: Neue Property www.moonweb.org ## GitHub Aggregator @@ -191,10 +223,10 @@ python3 -m venv .venv ## Text / Stil -- Keine Em-Dashes (—) verwenden, stattdessen umformulieren (Komma, Satzzeichen, neu formulieren) +- Keine Em-Dashes verwenden, stattdessen umformulieren (Komma, Satzzeichen, neu formulieren) ## Python / pip -- Niemals `pip install` direkt ausführen +- Niemals `pip install` direkt ausfuehren - Immer ein virtuelles Umfeld (`.venv`) anlegen und darin arbeiten - `python3 -m venv .venv` im Projektverzeichnis diff --git a/README.md b/README.md index d513416..16260cb 100755 --- a/README.md +++ b/README.md @@ -1,88 +1,67 @@ -# 🌙 moonweb-site +# moonweb-site -Monorepo for the **moonweb.org** homelab — five static sites built with [Eleventy](https://www.11ty.dev/), deployed to [Cloudflare Pages](https://pages.cloudflare.com/). +Monorepo for the **moonweb.org** homelab — six static sites built with [Eleventy](https://www.11ty.dev/), deployed to [IONOS SFTP](https://www.ionos.de/). ``` -hub.moonweb.org → 🏠 Central index & gateway -infra.moonweb.org → 🏗️ Infrastructure overview (Proxmox, Synology, Docker) -smarthome.moonweb.org → 🏡 Smart home projects & dashboards -code.moonweb.org → 💻 Curated GitHub project catalog -retro.moonweb.org → 🕹️ Physical retro hardware collection -stefankoelle.de → 👤 CV, career, personal site (LED Matrix docs) +www.moonweb.org/ -> Central index & gateway +www.moonweb.org/infra/ -> Infrastructure overview (Proxmox, Synology, Docker) +www.moonweb.org/smarthome/ -> Smart home projects & dashboards +www.moonweb.org/code/ -> Curated GitHub project catalog +www.moonweb.org/retro/ -> Physical retro hardware collection +www.moonweb.org/timecapsule/ -> 2000s internet time capsule (retro design) +stefankoelle.de -> CV, career, personal site (LED Matrix docs) ``` -> **Other sites** (not in this monorepo): [www.moonweb.org](https://www.moonweb.org) (2000s time capsule), [28k8.moonweb.org](https://28k8.moonweb.org) (90s BBS archive). +> **Other sites** (not in this monorepo): [28k8.moonweb.org](https://28k8.moonweb.org) (90s BBS archive), [buildbroken.moonweb.org](https://buildbroken.moonweb.org) (.NET Open Space blog). --- -## 📐 Architecture +## Architecture ``` -┌─────────────────────────────────────────────────────────────┐ -│ GitHub Actions CI │ -│ ┌───────────┐ ┌────────────┐ ┌─────────────┐ ┌─────────┐ │ -│ │ build:hub │ │build:infra │ │ build:smart │ │ build:… │ │ -│ └─────┬─────┘ └─────┬──────┘ └──────┬──────┘ └────┬────┘ │ -│ │ │ │ │ │ -│ ▼ ▼ ▼ ▼ │ -│ dist/hub/ dist/infra/ dist/smarthome/ dist/…/ │ -└────────┬───────────────────────────────────────────┬────────┘ - │ │ - ▼ ▼ -┌──────────────────┐ ┌─────────────────┐ -│ Cloudflare Pages │ │ IONOS SFTP │ -│ (5 sites) │ │ (stefankoelle) │ -└────────┬─────────┘ └────────┬────────┘ - ▼ ▼ - hub / infra / ... stefankoelle.de ++-------------------------------------------------------------------+ +| 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 ``` --- -## 🛠️ Tech Stack +## Tech Stack | Layer | Technology | Why | |-------|-----------|-----| -| **SSG** | [Eleventy 3.1.6](https://www.11ty.dev/) | Markdown/YAML-first, minimal JS, `_data` folders map directly to aggregator output, low maintenance for 5 sites | +| **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, no build step needed | +| **Styling** | Custom CSS (variables-based) | `base.css` for shared layout, `theme-*.css` per domain accent color | | **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 5 sites, artifact upload, parallel deploy | -| **Deploy** | [Cloudflare Workers](https://workers.cloudflare.com/) | Static asset hosting via `wrangler pages deploy`, one worker per site | -| **DNS** | Cloudflare | Already managing DNS — zero additional setup for Pages custom domains | +| **CI/CD** | [GitHub Actions](https://github.com/features/actions) | Matrix build for all sites, artifact upload, merge step, parallel 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` | -| **Runtime** | Fully static | No server-side code, no containers, no database — pure HTML/CSS/JS | +| **Runtime** | Fully static | No server-side code, no containers, no database | --- -## 🎨 Design System - -### Header-consistent, content-flexible - -- **Header is identical** across all home-section sites: site-switcher (hub · infra · smarthome · code · retro · cv), domain accent color, Lobster title font. -- **Index pages** use a shared card-grid layout with grouped sections. -- **Detail pages** keep the same header but use a freer layout below it (e.g., pin tables, API docs, photos in free arrangement). - -### Accent colors - -| Domain | Color | Hex | -|--------|-------|-----| -| hub | Neutral blue | `#3b6ea5` | -| infra | Grey-blue | `#99333A` | -| smarthome | Teal | `#1f8a8a` | -| code | Violet | `#3E5098` | -| retro | Warm brown | `#8a6d3b` | - -### Emojis - -Each card on index pages has an emoji for visual navigation — consistent across hub, infra, smarthome, code, and retro. - ---- - -## 🚀 Local Development +## Local Development ```bash 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 @@ -90,8 +69,9 @@ 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 6 in parallel +npm run dev # all 7 in parallel ``` Each site has its own minimal Eleventy config (`/eleventy.config.js`). Live reload is built in. @@ -100,83 +80,96 @@ Each site has its own minimal Eleventy config (`/eleventy.config.js`). Liv ```bash npm run prebuild # pre-build tasks (CV PDF) -npm run build # builds all 5 → dist// +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 ``` --- -## 📦 Project Structure +## Project Structure ``` moonweb-site/ -├── hub/ # 🏠 Central index & gateway -├── infra/ # 🏗️ Infra overview + 3 detail pages +├── hub/ # Central index & gateway +├── infra/ # Infra overview + 8 detail pages │ ├── backup-strategy/ │ ├── monitoring/ -│ └── dev-environment/ -├── smarthome/ # 🏡 Smart home overview + 6 detail pages +│ ├── dev-environment/ +│ └── ... +├── smarthome/ # Smart home overview + 9 detail pages │ ├── homematic-mqtt/ │ ├── tasmota-energy/ -│ ├── balkonpi/ -│ ├── airplay-audio/ -│ ├── octoprint/ -│ └── tubearchivist/ -├── code/ # 💻 GitHub catalog +│ └── ... +├── code/ # GitHub catalog │ └── _data/repos.json # populated by the aggregator -├── retro/ # 🕹️ Retro hardware (WIP) -├── stefankoelle/ # 👤 CV, career, personal site +├── retro/ # Retro hardware + 13 detail pages +├── timecapsule/ # 2000s retro design (Eleventy 2.x) +│ ├── eleventy.config.js +│ ├── package.json +│ └── 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 -├── shared/ # 🔧 Shared components +├── 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 ├── scripts/ -│ └── github-aggregator/ # 🐍 Python: reads .moonweb.yml → repos.json -│ ├── aggregate.py -│ ├── example.moonweb.yml -│ └── README.md +│ ├── github-aggregator/ # Python: reads .moonweb.yml -> repos.json +│ └── merge-moonweb.sh # Merge script for deployment ├── .github/workflows/ -│ └── build-deploy.yml # ⚙️ CI/CD: build + deploy to Cloudflare -├── DESIGN.md # 📋 Initial concept (German) -├── SPEC.md # 📋 Full specification (English, 159 lines) -├── PLAN.md # 📋 Implementation plan -├── TODO.md # 📋 Open items & workflow +│ ├── 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 ``` --- -## 🔄 CI/CD Pipeline +## CI/CD Pipeline -### Cloudflare Pages (moonweb sites) +### IONOS SFTP (www.moonweb.org) -Defined in `.github/workflows/build-deploy.yml`: +Defined in `.github/workflows/build-deploy-moonweb.yml`: ``` push to main - │ - ├── Build (matrix: hub, infra, smarthome, code, retro) - │ ├── checkout → setup-node (22) → npm ci - │ ├── npm run build: - │ ├── validate dist// exists & non-empty - │ └── upload artifact (7-day retention) - │ - └── Deploy (matrix: 5 Cloudflare Workers) - ├── download artifact - ├── generate wrangler.toml - └── wrangler pages deploy + | + +-- Build (matrix: hub, infra, smarthome, code, retro) + | +-- 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: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/ ``` **Required secrets:** -- `CLOUDFLARE_API_TOKEN` — Workers:Edit permission -- `CLOUDFLARE_ACCOUNT_ID` — Cloudflare account ID +- `IONOS_SFTP_HOST` +- `IONOS_SFTP_USER` +- `IONOS_SFTP_PASSWORD` ### IONOS SFTP (stefankoelle.de) @@ -184,12 +177,12 @@ Defined in `.github/workflows/deploy-stefankoelle.yml`: ``` push to main (paths: stefankoelle/**) - │ - ├── Build stefankoelle - │ └── npm run build:stefankoelle - │ - └── Deploy via SFTP - └── lftp mirror → IONOS /deploy/stefankoelle/ + | + +-- Build stefankoelle + | +-- npm run build:stefankoelle + | + +-- Deploy via SFTP + +-- SFTP upload to IONOS /websites/stefankoelle/ ``` **Required secrets:** @@ -199,7 +192,30 @@ push to main (paths: stefankoelle/**) --- -## 🐍 GitHub Aggregator (code.moonweb.org) +## URL Structure + +All moonweb.org sites are accessible under `www.moonweb.org` as subdirectories: + +| 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 | + +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/*` + +--- + +## GitHub Aggregator (www.moonweb.org/code/) `scripts/github-aggregator/aggregate.py` automatically builds the project catalog: @@ -214,7 +230,7 @@ push to main (paths: stefankoelle/**) ```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)" @@ -229,42 +245,41 @@ export GITHUB_TOKEN=ghp_xxx python scripts/github-aggregator/aggregate.py ``` -> **Deliberately manual** — no scheduled CI job. The catalog is refreshed on demand, not on every push. - --- -## 📏 Content Rules +## Content Rules | Site | Detail pages? | Rule | |------|--------------|------| -| smarthome | ✅ Yes | When enough content exists — no placeholder cards | -| infra | ⚠️ Rarely | Deliberately shallow — sensitive data (IPs, keys, passwords) stripped | -| code | ❌ Never | Overview cards + GitHub links only — no README duplication | -| retro | 🔨 Minimal | Still WIP — honest minimal overview, no over-investment | +| smarthome | Yes | When enough content exists - no placeholder cards | +| infra | Rarely | Deliberately shallow - sensitive data (IPs, keys, passwords) stripped | +| code | Never | Overview cards + GitHub links only - no README duplication | +| retro | Minimal | Honest minimal overview, no over-investment | +| timecapsule | Static | 1:1 migration of original 2001 design, no changes | **Infra redaction rule:** Architecture-level only (Proxmox, Synology, Docker, VLAN concept). No concrete IPs, WireGuard keys, passwords, internal hostnames. --- -## 🌍 Language +## Language -All five sites are written **entirely in English**. German source documents are translated once during migration (AI-assisted). New content is authored in English from the start. +All moonweb sites are written **entirely in English**. The timecapsule uses the original 2001 English content. --- -## 📚 Documentation +## Documentation | File | Purpose | |------|---------| -| `DESIGN.md` | Initial concept and design decisions (German) | -| `SPEC.md` | Complete specification — what gets built (English) | +| `DESIGN.md` | Initial concept and design decisions | +| `SPEC.md` | Complete specification - what gets built | | `PLAN.md` | Phased implementation plan | | `TODO.md` | Open items, workflow, and current status | -| `README.md` | This file — project overview for GitHub | +| `README.md` | This file - project overview for GitHub | --- -## 📄 License +## License [![CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) diff --git a/TODO.md b/TODO.md index 49f8433..4e0751c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,76 +1,87 @@ -# TODO — moonweb-site Offene Items +# TODO: Consolidation zu www.moonweb.org -Stand: 2026-08-14 +## Uebersicht -## Aktueller Status +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. -| Phase | Status | Bemerkung | -|-------|--------|-----------| -| Phase 0 — Repo & Tooling | ✅ fertig | Eleventy 3.1.6, CI/CD, .gitignore erweitert | -| Phase 1 — Content | ✅ fertig | hub, code, infra, smarthome komplett, retro bewusst rudimentär | -| Phase 2 — CI/CD | ✅ fertig | build-deploy.yml mit Caching + Validation + Summary | -| Phase 3 — Launch | ✅ fertig | Cloudflare Pages live, Smoke-Test bestanden | -| Phase 4 — Deferred | ⏸️ zurückgestellt | 28k8, Analytics | -| Phase 5 — stefankoelle.de | ✅ fertig | Ins Monorepo migriert, Eleventy-Build, SFTP-Deployment | +**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) | -## Offene Items +--- -### P4 — Deferred (nicht dringend) +## Phase 1: Timecapsule in Monorepo integrieren -- [ ] 28k8.moonweb.org Zukunft klären -- [ ] Perplexity-Rückkanal -- [ ] Apex-Domain Redirect (moonweb.org → hub.moonweb.org) -- [ ] PDF-Build fuer CV (WeasyPrint, lokal testen) -- [ ] Querverlinkungen stefankoelle.de <-> smarthome -- [ ] Ledmatrix ggf. nach smarthome verschieben -- [ ] **Dotnet Home-Automation-Projekt beschreiben** — Interne .NET Core Software für Kommunikation auf buttons.html und InfluxDB. Code muss erst aufgeraeumt und nach GitHub publiziert werden, dann Beschreibung auf stefankoelle.de und ggf. smarthome ergänzen. +- [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/) -### Offene Entscheidungen +## Phase 2: Eleventy-Configs aller Sites anpassen -- [ ] **stefankoelle.de SFTP: `delete_remote_files`?** — Derzeit werden beim Deploy nur Dateien hochgeloaden, alte bleiben liegen. Mit `delete_remote_files: true` waere jeder Deploy ein sauberes Image (alles weg + neu). Kurzer Ausfall moeglich. Entscheidung offen. +- [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 -## Schon erledigt (Stand 2026-08-14) +## Phase 3: Build-System anpassen -### stefankoelle.de Migration (2026-08-14) -- [x] Eleventy-Config + package.json erweitert -- [x] Onepager-Layout mit Anchor-Links beibehalten -- [x] CV-Partial (zentral fuer Web + PDF) -- [x] CSS ausgelagert + modernisiert (Custom Properties, box-sizing) -- [x] Assets in assets/ verschoben -- [x] Ledmatrix als eigene Seite integriert -- [x] Alte Dateien geloescht (index.html, browserconfig.xml, sitemap.txt) -- [x] Deployment-Workflow fuer IONOS SFTP -- [x] Cloudflare-Workflow um stefankoelle erweitert (paths-ignore) +- [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) -### Vorherige Erledigungen (Stand 2026-08-13) -- [x] Impressum angelegt + Footer-Link auf allen Sites -- [x] Favicons (SVG mit Emojis) pro Subdomain — `shared/favicon/*.svg`, per Passthrough Copy -- [x] Meta descriptions auf allen 33 Seiten -- [x] CSS @import-Kette bereinigt (kein Render-Blocking mehr) -- [x] .gitignore erweitert (.env*, Zertifikate, Swap-Files) -- [x] Placeholder-Cards `"#"` bereinigt — keine mehr vorhanden -- [x] README.md überarbeitet (Emojis, Architektur, Tech-Stack, CI/CD) -- [x] Lizenz hinzugefügt (CC BY-NC-SA 4.0) -- [x] Content-Review — alle Seiten geprüft, alles passt -- [x] Cloudflare Pages Projects erstellt (moonweb-hub, -infra, -smarthome, -code, -retro) -- [x] DNS & Custom Domains gebunden -- [x] Secrets konfiguriert (CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID) -- [x] Smoke-Test Cross-Linking — alles funktioniert auf live +## Phase 4: Deployment umstellen -## Workflow für neue Contexts +- [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 -Wenn du einen neuen Context öffnest, lies diese Datei und prüfe: -1. Welche P4-Items sind relevant? → Nur wenn angefordert +## Phase 5: Cloudflare Redirects -## Definition of done +- [x] 5.1 Redirect-Regeln einrichten (via GitHub Action) -Alle 5 Sites live auf Cloudflare Pages: -- ✅ hub.moonweb.org — verlinkt alles (+ stefankoelle.de extern) -- ✅ code.moonweb.org — GitHub-Katalog via Aggregator -- ✅ smarthome.moonweb.org — Smart Home Übersicht + Detailseiten -- ✅ infra.moonweb.org — Infra-Übersicht (redigiert) -- ✅ retro.moonweb.org — Ehrliche minimale Übersicht (WIP) +| 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 | -stefankoelle.de live auf IONOS (SFTP-Deployment): -- ✅ stefankoelle.de — Onepager mit CV, Projects, Languages, Impressum -- ✅ stefankoelle.de/ledmatrix/ — LED Matrix WebServer Dokumentation +**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) + +--- + +## Abgeschlossen + +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 diff --git a/code/404.html b/code/404.html index 7b6d6dc..a836dc6 100644 --- a/code/404.html +++ b/code/404.html @@ -1,9 +1,10 @@ --- title: "Page Not Found" section: "code" +tags: "code" description: "The page you are looking for does not exist." layout: base.njk -permalink: /404.html +permalink: /code/404.html ---

404

diff --git a/code/eleventy.config.js b/code/eleventy.config.js deleted file mode 100644 index ae9fb63..0000000 --- a/code/eleventy.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function (eleventyConfig) { - eleventyConfig.addGlobalData("site", { url: "https://code.moonweb.org" }); - eleventyConfig.addFilter("date", (d) => d.toISOString()); - eleventyConfig.addPassthroughCopy({ "shared/theme-code.css": "theme.css" }); - eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); - eleventyConfig.addPassthroughCopy({ "shared/favicon/code.svg": "favicon.svg" }); - eleventyConfig.addPassthroughCopy({ "code/robots.txt": "robots.txt" }); - - return { - dir: { - input: "code", - includes: "../shared/_includes", - output: "dist/code" - }, - serverOptions: { - host: "0.0.0.0", - port: 8084 - } - }; -}; diff --git a/code/index.njk b/code/index.njk index 715717e..9ab341c 100644 --- a/code/index.njk +++ b/code/index.njk @@ -1,6 +1,7 @@ --- title: "Open Source Projects — GitHub Repos & Code | moonweb" section: "code" +tags: "code" description: "Curated catalog of my public GitHub projects — automation, dev tools, web apps, and firmware." layout: base.njk subcategories: diff --git a/code/robots.txt b/code/robots.txt deleted file mode 100644 index f0bdb62..0000000 --- a/code/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: / - -Sitemap: https://code.moonweb.org/sitemap.xml diff --git a/code/sitemap.xml.njk b/code/sitemap.xml.njk deleted file mode 100644 index 7cbc214..0000000 --- a/code/sitemap.xml.njk +++ /dev/null @@ -1,5 +0,0 @@ ---- -permalink: /sitemap.xml -eleventyExcludeFromCollections: true ---- -{% include "sitemap.njk" %} diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 0000000..d470ed4 --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,91 @@ +const SITES = { + hub: { pathPrefix: "" }, + infra: { pathPrefix: "/infra" }, + smarthome: { pathPrefix: "/smarthome" }, + code: { pathPrefix: "/code" }, + retro: { pathPrefix: "/retro" }, +}; + +module.exports = function (eleventyConfig) { + eleventyConfig.addGlobalData("site", { url: "https://www.moonweb.org" }); + eleventyConfig.addFilter("date", (d) => d.toISOString()); + + // Computed pathPrefix based on page's section front matter + eleventyConfig.addGlobalData("eleventyComputed", { + pathPrefix: (data) => SITES[data.section]?.pathPrefix ?? "", + }); + + // Per-section collections (for sitemaps) + for (const section of Object.keys(SITES)) { + eleventyConfig.addCollection(section, (collectionsApi) => + collectionsApi.getFilteredByTag(section) + ); + } + + // --- Passthrough copies --- + + // Root-level shared assets + eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); + eleventyConfig.addPassthroughCopy({ "shared/favicon/hub.svg": "favicon.svg" }); + eleventyConfig.addPassthroughCopy({ "hub/robots.txt": "robots.txt" }); + + // Per-section assets: favicon + for (const [section, cfg] of Object.entries(SITES)) { + const prefix = cfg.pathPrefix || "."; + eleventyConfig.addPassthroughCopy({ + [`shared/favicon/${section}.svg`]: `${prefix}/favicon.svg`, + }); + } + + // Hub: profile photo + eleventyConfig.addPassthroughCopy({ + "hub/stefan-koelle-foto.jpg": "stefan-koelle-foto.jpg", + }); + + // Hub: old www.moonweb.org redirects (.htm → .html) + const htmRedirects = [ + "start", + "index2", + "index3", + "new", + "links", + "infos", + "hardware", + "users", + ]; + for (const name of htmRedirects) { + eleventyConfig.addPassthroughCopy({ + [`hub/${name}.htm`]: `${name}.html`, + }); + } + const htmSubdirs = [ + "beginning", + "projects", + "products", + "acoustics", + "location", + "background", + "partners", + "contact", + "network", + "stefan", + "legal-notice", + ]; + for (const dir of htmSubdirs) { + eleventyConfig.addPassthroughCopy({ + [`hub/${dir}/index.htm`]: `${dir}/index.html`, + }); + } + + return { + dir: { + input: ".", + includes: "shared/_includes", + output: "dist", + }, + serverOptions: { + host: "0.0.0.0", + port: 8081, + }, + }; +}; diff --git a/hub/404.html b/hub/404.html index 66bde92..65a7ba4 100644 --- a/hub/404.html +++ b/hub/404.html @@ -1,6 +1,7 @@ --- title: "Page Not Found" section: "hub" +tags: "hub" description: "The page you are looking for does not exist." layout: base.njk permalink: /404.html diff --git a/hub/acoustics/index.htm b/hub/acoustics/index.htm new file mode 100644 index 0000000..26810e2 --- /dev/null +++ b/hub/acoustics/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/acoustics/...

+ + diff --git a/hub/background/index.htm b/hub/background/index.htm new file mode 100644 index 0000000..e05ed8c --- /dev/null +++ b/hub/background/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/background/...

+ + diff --git a/hub/beginning/index.htm b/hub/beginning/index.htm new file mode 100644 index 0000000..0e33d8f --- /dev/null +++ b/hub/beginning/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/beginning/...

+ + diff --git a/hub/contact/index.htm b/hub/contact/index.htm new file mode 100644 index 0000000..1bd3b53 --- /dev/null +++ b/hub/contact/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/contact/...

+ + diff --git a/hub/eleventy.config.js b/hub/eleventy.config.js deleted file mode 100644 index 73d8732..0000000 --- a/hub/eleventy.config.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = function (eleventyConfig) { - eleventyConfig.addGlobalData("site", { url: "https://hub.moonweb.org" }); - eleventyConfig.addFilter("date", (d) => d.toISOString()); - eleventyConfig.addPassthroughCopy({ "shared/theme-hub.css": "theme.css" }); - eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); - eleventyConfig.addPassthroughCopy({ "shared/favicon/hub.svg": "favicon.svg" }); - eleventyConfig.addPassthroughCopy({ "hub/robots.txt": "robots.txt" }); - eleventyConfig.addPassthroughCopy({ "hub/stefan-koelle-foto.jpg": "stefan-koelle-foto.jpg" }); - - return { - dir: { - input: "hub", - includes: "../shared/_includes", - output: "dist/hub" - }, - serverOptions: { - host: "0.0.0.0", - port: 8081 - } - }; -}; diff --git a/hub/hardware.htm b/hub/hardware.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/hardware.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/impressum.njk b/hub/impressum.njk index 11a95c2..a8e7191 100644 --- a/hub/impressum.njk +++ b/hub/impressum.njk @@ -1,6 +1,8 @@ --- title: "Legal Notice & Privacy Policy" section: "hub" +tags: "hub" +permalink: /impressum/index.html description: "Legal notice (Impressum) and privacy policy for moonweb.org." layout: base.njk --- @@ -19,7 +21,7 @@ layout: base.njk

- Scope of this legal notice: This legal notice and the privacy policy below apply to the following websites, all operated by Stefan Kölle: hub.moonweb.org, smarthome.moonweb.org, infra.moonweb.org, code.moonweb.org, retro.moonweb.org, buildbroken.moonweb.org, 28k8.moonweb.org, www.moonweb.org, and stefankoelle.de. All of these sites are part of the same personal project network and are covered jointly by this single document. + Scope of this legal notice: This legal notice and the privacy policy below apply to the following websites, all operated by Stefan Kölle: www.moonweb.org (including /infra/, /smarthome/, /code/, /retro/, /timecapsule/), buildbroken.moonweb.org, 28k8.moonweb.org, and stefankoelle.de. All of these sites are part of the same personal project network and are covered jointly by this single document.

@@ -41,7 +43,7 @@ layout: base.njk

2. Purpose of these Websites

- The moonweb.org subdomains (hub, smarthome, infra, code, retro) document my private home-lab, home-automation and retro-computing hobby projects. buildbroken.moonweb.org is an archive of a blog I created with friends in our spare time. 28k8.moonweb.org is a homage to the 90s era. www.moonweb.org is an archived version of my original website from 2001. stefankoelle.de presents my professional CV and background as the same person. All are part of one personal project network and share this legal notice and privacy policy. + The moonweb.org websites (hub, smarthome, infra, code, retro, timecapsule) document my private home-lab, home-automation and retro-computing hobby projects. buildbroken.moonweb.org is an archive of a blog I created with friends in our spare time. 28k8.moonweb.org is a homage to the 90s era. stefankoelle.de presents my professional CV and background as the same person. All are part of one personal project network and share this legal notice and privacy policy.

3. Hosting

@@ -49,18 +51,23 @@ layout: base.njk Two different hosting providers are used within this network:

-

a) moonweb.org subdomains (hub, smarthome, infra, code, retro, buildbroken) — Cloudflare Pages

-

- Hosted via Cloudflare Pages, operated by Cloudflare, Inc., 101 Townsend St, San Francisco, CA 94107, USA. Cloudflare processes connection-level data (e.g. your IP address, request headers) as part of its content delivery and DDoS/security systems. This is governed by Cloudflare's Data Processing Addendum, which incorporates the EU Standard Contractual Clauses (2021) as a safeguard for the transfer of data to the USA. See cloudflare.com/privacypolicy. -

- -

b) www.moonweb.org and stefankoelle.de — IONOS SE

+

a) www.moonweb.org (hub, infra, smarthome, code, retro, timecapsule) — IONOS SE

Hosted on web space provided by IONOS SE, Elgendorfer Str. 57, 56410 Montabaur, Germany, acting as a processor under Art. 28 GDPR (Data Processing Agreement in place).

+

b) stefankoelle.de — IONOS SE

- Legal basis for both: Art. 6(1)(f) GDPR (legitimate interest in reliable, secure delivery of the websites). + Hosted on web space provided by IONOS SE, Elgendorfer Str. 57, 56410 Montabaur, Germany, acting as a processor under Art. 28 GDPR (Data Processing Agreement in place). +

+ +

c) buildbroken.moonweb.org, 28k8.moonweb.org — Cloudflare Pages

+

+ Hosted via Cloudflare Pages, operated by Cloudflare, Inc., 101 Townsend St, San Francisco, CA 94107, USA. Cloudflare processes connection-level data (e.g. your IP address, request headers) as part of its content delivery and DDoS/security systems. This is governed by Cloudflare’s Data Processing Addendum, which incorporates the EU Standard Contractual Clauses (2021) as a safeguard for the transfer of data to the USA. See cloudflare.com/privacypolicy. +

+ +

+ Legal basis: Art. 6(1)(f) GDPR (legitimate interest in reliable, secure delivery of the websites).

4. No Tracking, No Cookies, No Analytics (current state)

diff --git a/hub/index.njk b/hub/index.njk index 75291b4..e584043 100644 --- a/hub/index.njk +++ b/hub/index.njk @@ -1,6 +1,8 @@ --- title: "Stefan Koelle — Homelab, Smart Home, Code & Retro Hardware | moonweb" section: "hub" +tags: "hub" +permalink: /index.html description: "Stefan Koelle — Senior Software Developer & Architect based in Munich. Homelab projects, smart home automation, open-source code, and retro hardware." layout: base.njk ogImage: "/stefan-koelle-foto.jpg" @@ -9,19 +11,19 @@ sections: cards: - title: "infra" summary: "Stack overview: Proxmox, Synology, network, backups, and how I work." - href: "https://infra.moonweb.org" + href: "/infra/" emoji: "🏗️" - title: "smarthome" summary: "What's actually running on the homelab, and why." - href: "https://smarthome.moonweb.org" + href: "/smarthome/" emoji: "🏠" - title: "code" summary: "Curated catalog of my GitHub projects." - href: "https://code.moonweb.org" + href: "/code/" emoji: "💻" - title: "retro" summary: "Physical retro hardware collection." - href: "https://retro.moonweb.org" + href: "/retro/" emoji: "🕹️" - heading: "About me" cards: @@ -37,7 +39,7 @@ sections: emoji: "💾" - title: "www.moonweb.org" summary: "The 2000s internet projects, networking and engineering." - href: "https://www.moonweb.org" + href: "/timecapsule/" emoji: "🌐" - title: "inseco.de" summary: "Internet services & consulting for gastronomy and clubs, Peak 2003–2008. Custom PHP/CMS." @@ -63,7 +65,7 @@ sections:

What this site is about

moonweb is a collection of personal projects that have grown over the past 25 years. What started as a single 486 running a BBS in the mid-90s has turned into a full homelab with Proxmox, Docker, smart home automation, and a growing collection of retro hardware. The name "moonweb" comes from the original domain moonweb.org, which has been online since 2000.

-

Each section of this site documents a different part of the setup. The infrastructure section covers the Proxmox cluster, Synology NAS, Docker containers, networking, and backup strategies. The smart home section shows what automation projects are running, from Tasmota energy monitoring to MQTT sensors and AirPlay audio. The code section lists the public GitHub projects that power these setups, and the retro section documents the hardware collection.

+

Each section of this site documents a different part of the setup. The infrastructure section covers the Proxmox cluster, Synology NAS, Docker containers, networking, and backup strategies. The smart home section shows what automation projects are running, from Tasmota energy monitoring to MQTT sensors and AirPlay audio. The code section lists the public GitHub projects that power these setups, and the retro section documents the hardware collection.

What I do professionally

I work as a Senior Software Developer & Architect at TENHIL GmbH (formerly stellenanzeigen.de), where I build and maintain microservices on .NET Core and Kubernetes. My day job involves designing cloud-native architectures, building APIs, and migrating legacy applications to modern stacks. I've been working with .NET since the early 2000s and have used everything from ASP Classic to the latest .NET 8 features.

diff --git a/hub/index2.htm b/hub/index2.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/index2.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/index3.htm b/hub/index3.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/index3.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/infos.htm b/hub/infos.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/infos.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/legal-notice/index.htm b/hub/legal-notice/index.htm new file mode 100644 index 0000000..b254778 --- /dev/null +++ b/hub/legal-notice/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/legal-notice/...

+ + diff --git a/hub/links.htm b/hub/links.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/links.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/location/index.htm b/hub/location/index.htm new file mode 100644 index 0000000..7673a98 --- /dev/null +++ b/hub/location/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/location/...

+ + diff --git a/hub/network/index.htm b/hub/network/index.htm new file mode 100644 index 0000000..134f6d6 --- /dev/null +++ b/hub/network/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/network/...

+ + diff --git a/hub/new.htm b/hub/new.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/new.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/partners/index.htm b/hub/partners/index.htm new file mode 100644 index 0000000..a6cb6da --- /dev/null +++ b/hub/partners/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/partners/...

+ + diff --git a/hub/products/index.htm b/hub/products/index.htm new file mode 100644 index 0000000..84638aa --- /dev/null +++ b/hub/products/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/products/...

+ + diff --git a/hub/projects/index.htm b/hub/projects/index.htm new file mode 100644 index 0000000..3675d1e --- /dev/null +++ b/hub/projects/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/projects/...

+ + diff --git a/hub/robots.txt b/hub/robots.txt index 778be63..dde49ff 100644 --- a/hub/robots.txt +++ b/hub/robots.txt @@ -1,4 +1,5 @@ User-agent: * Allow: / -Sitemap: https://hub.moonweb.org/sitemap.xml +Sitemap: https://www.moonweb.org/sitemap.xml +Sitemap: https://www.moonweb.org/timecapsule/sitemap.xml diff --git a/hub/start.htm b/hub/start.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/start.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/hub/stefan/index.htm b/hub/stefan/index.htm new file mode 100644 index 0000000..0150fa4 --- /dev/null +++ b/hub/stefan/index.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/stefan/...

+ + diff --git a/hub/users.htm b/hub/users.htm new file mode 100644 index 0000000..14657c4 --- /dev/null +++ b/hub/users.htm @@ -0,0 +1,11 @@ + + + + + +Redirecting... + + +

Redirecting to /timecapsule/...

+ + diff --git a/infra/404.html b/infra/404.html index 0597e48..a914d70 100644 --- a/infra/404.html +++ b/infra/404.html @@ -1,9 +1,10 @@ --- title: "Page Not Found" section: "infra" +tags: "infra" description: "The page you are looking for does not exist." layout: base.njk -permalink: /404.html +permalink: /infra/404.html ---

404

diff --git a/infra/backup-strategy/index.njk b/infra/backup-strategy/index.njk index e1bb576..66affd2 100644 --- a/infra/backup-strategy/index.njk +++ b/infra/backup-strategy/index.njk @@ -1,7 +1,8 @@ --- title: "Backup Strategy" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "Layered 3-2-1 backup strategy covering NAS snapshots, offsite copies, and cloud storage." layout: base.njk --- diff --git a/infra/dev-environment/index.njk b/infra/dev-environment/index.njk index b40343c..78acbc3 100644 --- a/infra/dev-environment/index.njk +++ b/infra/dev-environment/index.njk @@ -1,7 +1,8 @@ --- title: "Xubuntu Dev VM" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "A disposable, daily-backed-up Xubuntu VM for AI-assisted, remote development via SSH and Chrome Remote Desktop." layout: base.njk --- diff --git a/infra/docker/index.njk b/infra/docker/index.njk index d095e4c..f1e53f2 100644 --- a/infra/docker/index.njk +++ b/infra/docker/index.njk @@ -1,7 +1,8 @@ --- title: "Docker Container Strategy" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "How self-hosted services are organized across three Docker hosts on Proxmox and Synology, using Docker Compose as the single source of truth." layout: base.njk --- diff --git a/infra/eleventy.config.js b/infra/eleventy.config.js deleted file mode 100644 index 3338af4..0000000 --- a/infra/eleventy.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function (eleventyConfig) { - eleventyConfig.addGlobalData("site", { url: "https://infra.moonweb.org" }); - eleventyConfig.addFilter("date", (d) => d.toISOString()); - eleventyConfig.addPassthroughCopy({ "shared/theme-infra.css": "theme.css" }); - eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); - eleventyConfig.addPassthroughCopy({ "shared/favicon/infra.svg": "favicon.svg" }); - eleventyConfig.addPassthroughCopy({ "infra/robots.txt": "robots.txt" }); - - return { - dir: { - input: "infra", - includes: "../shared/_includes", - output: "dist/infra" - }, - serverOptions: { - host: "0.0.0.0", - port: 8082 - } - }; -}; diff --git a/infra/index.njk b/infra/index.njk index f743915..173211b 100644 --- a/infra/index.njk +++ b/infra/index.njk @@ -1,6 +1,7 @@ --- title: "Homelab Infrastructure — Proxmox, Docker & Networking | moonweb" section: "infra" +tags: "infra" description: "Homelab infrastructure overview: Proxmox hosts, Synology NAS, Docker VMs and Setup-Guides." layout: base.njk sections: diff --git a/infra/lxc/index.njk b/infra/lxc/index.njk index 76853cf..8bebac4 100644 --- a/infra/lxc/index.njk +++ b/infra/lxc/index.njk @@ -1,7 +1,8 @@ --- title: "LXC Container Strategy" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "Overview of the lightweight LXC containers running on the main Proxmox host, and why they are LXC instead of Docker." layout: base.njk --- diff --git a/infra/monitoring/index.njk b/infra/monitoring/index.njk index 7f29ed7..1657d75 100644 --- a/infra/monitoring/index.njk +++ b/infra/monitoring/index.njk @@ -1,7 +1,8 @@ --- title: "Monitoring" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "Prometheus and Grafana monitoring stack for hosts, containers, and hardware metrics." layout: base.njk --- diff --git a/infra/openwrt/index.njk b/infra/openwrt/index.njk index 3990d01..dddbb8a 100644 --- a/infra/openwrt/index.njk +++ b/infra/openwrt/index.njk @@ -1,7 +1,8 @@ --- title: "OpenWrt Multi-WAN Router" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "Multi-WAN OpenWrt router in the study with WiFi and Powerline failover, plus VLAN 189 for IoT isolation." layout: base.njk --- diff --git a/infra/proxmox/index.njk b/infra/proxmox/index.njk index 0548872..3853fbb 100644 --- a/infra/proxmox/index.njk +++ b/infra/proxmox/index.njk @@ -1,7 +1,8 @@ --- title: "Proxmox Virtualization" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "What Proxmox VE is, the hardware it runs on in my homelab, its key advantages, and a short setup walkthrough." layout: base.njk --- diff --git a/infra/robots.txt b/infra/robots.txt deleted file mode 100644 index b9acb72..0000000 --- a/infra/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: / - -Sitemap: https://infra.moonweb.org/sitemap.xml diff --git a/infra/sitemap.xml.njk b/infra/sitemap.xml.njk deleted file mode 100644 index 7cbc214..0000000 --- a/infra/sitemap.xml.njk +++ /dev/null @@ -1,5 +0,0 @@ ---- -permalink: /sitemap.xml -eleventyExcludeFromCollections: true ---- -{% include "sitemap.njk" %} diff --git a/infra/synology/index.njk b/infra/synology/index.njk index 2bad928..41601f2 100644 --- a/infra/synology/index.njk +++ b/infra/synology/index.njk @@ -1,7 +1,8 @@ --- title: "Synology NAS" section: "infra" -parent: "/" +tags: "infra" +parent: "/infra/" description: "Model, storage setup and current role of the Synology NAS in the homelab after the late-2025 cleanup." layout: base.njk --- diff --git a/package.json b/package.json index d23157d..88ad30d 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,16 @@ { "name": "moonweb-site", - "version": "0.2.0", + "version": "0.3.0", "private": true, - "description": "Monorepo for hub/infra/smarthome/code/retro (Eleventy, static, deployed to Cloudflare Pages)", + "description": "Monorepo for hub/infra/smarthome/code/retro/timecapsule (Eleventy, static, deployed to IONOS SFTP)", "scripts": { - "dev:hub": "npx @11ty/eleventy --config=hub/eleventy.config.js --serve --port=8081", - "dev:infra": "npx @11ty/eleventy --config=infra/eleventy.config.js --serve --port=8082", - "dev:smarthome": "npx @11ty/eleventy --config=smarthome/eleventy.config.js --serve --port=8083", - "dev:code": "npx @11ty/eleventy --config=code/eleventy.config.js --serve --port=8084", - "dev:retro": "npx @11ty/eleventy --config=retro/eleventy.config.js --serve --port=8085", + "dev": "npx @11ty/eleventy --serve --port=8081", "dev:stefankoelle": "npx @11ty/eleventy --config=stefankoelle/eleventy.config.js --serve --port=8086", - "dev": "npm run dev:hub & npm run dev:infra & npm run dev:smarthome & npm run dev:code & npm run dev:retro & npm run dev:stefankoelle", - "build:hub": "npx @11ty/eleventy --config=hub/eleventy.config.js", - "build:infra": "npx @11ty/eleventy --config=infra/eleventy.config.js", - "build:smarthome": "npx @11ty/eleventy --config=smarthome/eleventy.config.js", - "build:code": "npx @11ty/eleventy --config=code/eleventy.config.js", - "build:retro": "npx @11ty/eleventy --config=retro/eleventy.config.js", + "dev:timecapsule": "cd timecapsule && npx @11ty/eleventy --serve --port=8087", + "build": "npx @11ty/eleventy", "build:stefankoelle": "npx @11ty/eleventy --config=stefankoelle/eleventy.config.js", - "build": "npm run build:hub && npm run build:infra && npm run build:smarthome && npm run build:code && npm run build:retro && npm run build:stefankoelle", + "build:timecapsule": "cd timecapsule && npx @11ty/eleventy && mkdir -p ../dist/timecapsule && cp -r _site/timecapsule/* ../dist/timecapsule/", + "build:moonweb": "npm run build && npm run build:timecapsule", "pdf:cv": "bash stefankoelle/pdf/build-pdf.sh", "prebuild": "bash prebuild.sh" }, diff --git a/retro/404.html b/retro/404.html index 30ca8ac..8a321b7 100644 --- a/retro/404.html +++ b/retro/404.html @@ -1,9 +1,10 @@ --- title: "Page Not Found" section: "retro" +tags: "retro" description: "The page you are looking for does not exist." layout: base.njk -permalink: /404.html +permalink: /retro/404.html ---

404

diff --git a/retro/amiga-hardware-landscape/index.njk b/retro/amiga-hardware-landscape/index.njk index 39790da..98fdb4b 100644 --- a/retro/amiga-hardware-landscape/index.njk +++ b/retro/amiga-hardware-landscape/index.njk @@ -1,9 +1,10 @@ --- title: "Running AmigaOS in 2026: MiSTer FPGA vs Amiberry on Pi" section: "retro" +tags: "retro" description: "Two very different ways to get a fully working AmigaOS 3.2.3 desktop running today." layout: base.njk -parent: "/" +parent: "/retro/" ---

Running AmigaOS in 2026: MiSTer FPGA vs Amiberry on Pi

diff --git a/retro/amiga-modern-platforms/index.njk b/retro/amiga-modern-platforms/index.njk index 0fa568f..577e0a0 100644 --- a/retro/amiga-modern-platforms/index.njk +++ b/retro/amiga-modern-platforms/index.njk @@ -1,9 +1,10 @@ --- title: "Vampire V4, A600GS or MiSTer: Amiga Hardware Isn't a Simple Speed Race" section: "retro" +tags: "retro" description: "Why raw benchmark numbers are actively misleading when comparing modern Amiga hardware options." layout: base.njk -parent: "/" +parent: "/retro/" ---

Vampire V4, A600GS or MiSTer: Amiga Hardware Isn't a Simple Speed Race

diff --git a/retro/atari-mega-st-fleet/index.njk b/retro/atari-mega-st-fleet/index.njk index acb3c81..bf242e1 100644 --- a/retro/atari-mega-st-fleet/index.njk +++ b/retro/atari-mega-st-fleet/index.njk @@ -1,9 +1,10 @@ --- title: "The Atari Mega ST Fleet: Three Machines, Three Jobs" section: "retro" +tags: "retro" description: "How three Atari Mega ST computers ended up with completely different roles in a modern retro setup." layout: base.njk -parent: "/" +parent: "/retro/" ---

The Atari Mega ST Fleet: Three Machines, Three Jobs

diff --git a/retro/atari-monitor-compatibility/index.njk b/retro/atari-monitor-compatibility/index.njk index 21911b0..8e73d0a 100644 --- a/retro/atari-monitor-compatibility/index.njk +++ b/retro/atari-monitor-compatibility/index.njk @@ -1,9 +1,10 @@ --- title: "The 15kHz Problem: Finding a Monitor That Speaks Atari" section: "retro" +tags: "retro" description: "Why most modern monitors refuse to display Atari ST colour modes, and which ones actually work." layout: base.njk -parent: "/" +parent: "/retro/" ---

The 15kHz Problem: Finding a Monitor That Speaks Atari

diff --git a/retro/atari-networking-bbs/index.njk b/retro/atari-networking-bbs/index.njk index 4ba1025..3f89807 100644 --- a/retro/atari-networking-bbs/index.njk +++ b/retro/atari-networking-bbs/index.njk @@ -1,9 +1,10 @@ --- title: "Getting a 40-Year-Old Computer Online: Atari ST Networking and BBS Access" section: "retro" +tags: "retro" description: "Connecting an Atari ST to the modern internet and to dial-up-era bulletin board systems, warts and all." layout: base.njk -parent: "/" +parent: "/retro/" ---

Getting a 40-Year-Old Computer Online: Atari ST Networking and BBS Access

diff --git a/retro/batocera-living-room/index.njk b/retro/batocera-living-room/index.njk index b8ca972..36b6cf9 100644 --- a/retro/batocera-living-room/index.njk +++ b/retro/batocera-living-room/index.njk @@ -1,9 +1,10 @@ --- title: "Batocera in the Living Room: One Box, Every Retro System" section: "retro" +tags: "retro" description: "Why the living room emulation station takes a completely different approach than the FPGA rigs upstairs." layout: base.njk -parent: "/" +parent: "/retro/" ---

Batocera in the Living Room: One Box, Every Retro System

diff --git a/retro/dos-486-tower/index.njk b/retro/dos-486-tower/index.njk index 156f3f2..858a834 100644 --- a/retro/dos-486-tower/index.njk +++ b/retro/dos-486-tower/index.njk @@ -1,9 +1,10 @@ --- title: "The 486 DX2-66: Rebuilding a DOS Era on MiSTer FPGA" section: "retro" +tags: "retro" description: "Recreating a Vobis-Highscreen 486 DX2-66 setup on MiSTer FPGA, down to the original DOS configuration." layout: base.njk -parent: "/" +parent: "/retro/" ---

The 486 DX2-66: Rebuilding a DOS Era on MiSTer FPGA

diff --git a/retro/eleventy.config.js b/retro/eleventy.config.js deleted file mode 100644 index 729f1d4..0000000 --- a/retro/eleventy.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function (eleventyConfig) { - eleventyConfig.addGlobalData("site", { url: "https://retro.moonweb.org" }); - eleventyConfig.addFilter("date", (d) => d.toISOString()); - eleventyConfig.addPassthroughCopy({ "shared/theme-retro.css": "theme.css" }); - eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); - eleventyConfig.addPassthroughCopy({ "shared/favicon/retro.svg": "favicon.svg" }); - eleventyConfig.addPassthroughCopy({ "retro/robots.txt": "robots.txt" }); - - return { - dir: { - input: "retro", - includes: "../shared/_includes", - output: "dist/retro" - }, - serverOptions: { - host: "0.0.0.0", - port: 8085 - } - }; -}; diff --git a/retro/et4000-experiment/index.njk b/retro/et4000-experiment/index.njk index 3ec5ce3..5ed0dde 100644 --- a/retro/et4000-experiment/index.njk +++ b/retro/et4000-experiment/index.njk @@ -1,9 +1,10 @@ --- title: "Why an ET4000 Graphics Card and a Mega ST Don't Mix (Yet)" section: "retro" +tags: "retro" description: "A cautionary tale about pushing 1980s power supplies past their limits with a modern-ish graphics card." layout: base.njk -parent: "/" +parent: "/retro/" ---

Why an ET4000 Graphics Card and a Mega ST Don't Mix (Yet)

diff --git a/retro/index.njk b/retro/index.njk index be06473..b241dd6 100644 --- a/retro/index.njk +++ b/retro/index.njk @@ -1,6 +1,7 @@ --- title: "Retro Computing — Vintage Hardware & FPGA | moonweb" section: "retro" +tags: "retro" description: "Physical retro hardware collection — Raspberry Pi units, Pi 400, and vintage computing setups." layout: base.njk sections: diff --git a/retro/mini-arcade-handheld-roundup/index.njk b/retro/mini-arcade-handheld-roundup/index.njk index ab3d8ce..82457c9 100644 --- a/retro/mini-arcade-handheld-roundup/index.njk +++ b/retro/mini-arcade-handheld-roundup/index.njk @@ -1,9 +1,10 @@ --- title: "Mini Arcades and Handhelds: Sorting the Real Deal from the Bootlegs" section: "retro" +tags: "retro" description: "A buyer's guide to compact retro gaming devices, and why the cheapest option is almost never the right one." layout: base.njk -parent: "/" +parent: "/retro/" ---

Mini Arcades and Handhelds: Sorting the Real Deal from the Bootlegs

diff --git a/retro/mist-mister-fpga/index.njk b/retro/mist-mister-fpga/index.njk index ba5b5c3..58a425c 100644 --- a/retro/mist-mister-fpga/index.njk +++ b/retro/mist-mister-fpga/index.njk @@ -1,9 +1,10 @@ --- title: "MiST and MiSTer: Two FPGA Boxes, Two Very Different Personalities" section: "retro" +tags: "retro" description: "Why the newer, more powerful MiSTer isn't automatically the better choice for every retro system." layout: base.njk -parent: "/" +parent: "/retro/" ---

MiST and MiSTer: Two FPGA Boxes, Two Very Different Personalities

diff --git a/retro/pimiga-journey/index.njk b/retro/pimiga-journey/index.njk index 38000a7..4e21dba 100644 --- a/retro/pimiga-journey/index.njk +++ b/retro/pimiga-journey/index.njk @@ -1,9 +1,10 @@ --- title: "PiMiga 3 to 5: Chasing the Perfect Amiga-on-a-Pi Distro" section: "retro" +tags: "retro" description: "Three generations of PiMiga later, here's what actually changed — and why newer isn't always better." layout: base.njk -parent: "/" +parent: "/retro/" ---

PiMiga 3 to 5: Chasing the Perfect Amiga-on-a-Pi Distro

diff --git a/retro/retro-corner-snapshot/index.njk b/retro/retro-corner-snapshot/index.njk index 82ea0f7..fee3a18 100644 --- a/retro/retro-corner-snapshot/index.njk +++ b/retro/retro-corner-snapshot/index.njk @@ -1,9 +1,10 @@ --- title: "The Retro Corner Today: A Snapshot of the Whole Setup" section: "retro" +tags: "retro" description: "A tour through every retro system currently active across the home, room by room." layout: base.njk -parent: "/" +parent: "/retro/" ---

The Retro Corner Today: A Snapshot of the Whole Setup

diff --git a/retro/robots.txt b/retro/robots.txt deleted file mode 100644 index b42cb4e..0000000 --- a/retro/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: / - -Sitemap: https://retro.moonweb.org/sitemap.xml diff --git a/retro/sitemap.xml.njk b/retro/sitemap.xml.njk deleted file mode 100644 index 7cbc214..0000000 --- a/retro/sitemap.xml.njk +++ /dev/null @@ -1,5 +0,0 @@ ---- -permalink: /sitemap.xml -eleventyExcludeFromCollections: true ---- -{% include "sitemap.njk" %} diff --git a/retro/the-a1200/index.njk b/retro/the-a1200/index.njk index 601cd3c..0c100a7 100644 --- a/retro/the-a1200/index.njk +++ b/retro/the-a1200/index.njk @@ -1,9 +1,10 @@ --- title: "The A1200: What We Know Before It Ships" section: "retro" +tags: "retro" description: "A close look at Retro Games Ltd.'s upcoming Amiga 1200 console, based on everything public so far." layout: base.njk -parent: "/" +parent: "/retro/" ---

The A1200: What We Know Before It Ships

diff --git a/scripts/cloudflare/redirect-rules.json b/scripts/cloudflare/redirect-rules.json new file mode 100644 index 0000000..1a6f4ac --- /dev/null +++ b/scripts/cloudflare/redirect-rules.json @@ -0,0 +1,72 @@ +[ + { + "expression": "http.host eq \"hub.moonweb.org\"", + "description": "hub.moonweb.org -> www.moonweb.org", + "action": "redirect", + "action_parameters": { + "from_value": { + "target_url": { + "expression": "concat(\"https://www.moonweb.org\", http.request.uri.path)" + }, + "status_code": 301, + "preserve_query_string": true + } + } + }, + { + "expression": "http.host eq \"infra.moonweb.org\"", + "description": "infra.moonweb.org -> www.moonweb.org/infra/", + "action": "redirect", + "action_parameters": { + "from_value": { + "target_url": { + "expression": "concat(\"https://www.moonweb.org/infra\", http.request.uri.path)" + }, + "status_code": 301, + "preserve_query_string": true + } + } + }, + { + "expression": "http.host eq \"smarthome.moonweb.org\"", + "description": "smarthome.moonweb.org -> www.moonweb.org/smarthome/", + "action": "redirect", + "action_parameters": { + "from_value": { + "target_url": { + "expression": "concat(\"https://www.moonweb.org/smarthome\", http.request.uri.path)" + }, + "status_code": 301, + "preserve_query_string": true + } + } + }, + { + "expression": "http.host eq \"code.moonweb.org\"", + "description": "code.moonweb.org -> www.moonweb.org/code/", + "action": "redirect", + "action_parameters": { + "from_value": { + "target_url": { + "expression": "concat(\"https://www.moonweb.org/code\", http.request.uri.path)" + }, + "status_code": 301, + "preserve_query_string": true + } + } + }, + { + "expression": "http.host eq \"retro.moonweb.org\"", + "description": "retro.moonweb.org -> www.moonweb.org/retro/", + "action": "redirect", + "action_parameters": { + "from_value": { + "target_url": { + "expression": "concat(\"https://www.moonweb.org/retro\", http.request.uri.path)" + }, + "status_code": 301, + "preserve_query_string": true + } + } + } +] diff --git a/scripts/cloudflare/setup-redirects.sh b/scripts/cloudflare/setup-redirects.sh new file mode 100755 index 0000000..f7fa5ee --- /dev/null +++ b/scripts/cloudflare/setup-redirects.sh @@ -0,0 +1,172 @@ +#!/bin/bash +# Setup Cloudflare redirect rules for moonweb.org +# Redirects old subdomains to www.moonweb.org subdirectories +# +# Required env vars: +# CLOUDFLARE_API_TOKEN - API token with Dynamic Redirects Write permission +# CLOUDFLARE_ZONE_ID - Zone ID for moonweb.org +# +# Usage: +# ./setup-redirects.sh # Apply redirects +# ./setup-redirects.sh --dry-run # Show what would be created +# ./setup-redirects.sh --status # Show current redirect rules +# ./setup-redirects.sh --delete # Delete all redirect rules + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +RULES_FILE="$SCRIPT_DIR/redirect-rules.json" +API="https://api.cloudflare.com/client/v4" +PHASE="http_request_dynamic_redirect" +RULESET_NAME="moonweb-subdomain-redirects" + +DRY_RUN=false +STATUS=false +DELETE=false + +for arg in "$@"; do + case $arg in + --dry-run) DRY_RUN=true ;; + --status) STATUS=true ;; + --delete) DELETE=true ;; + esac +done + +if [ -z "${CLOUDFLARE_API_TOKEN:-}" ] || [ -z "${CLOUDFLARE_ZONE_ID:-}" ]; then + echo "Error: CLOUDFLARE_API_TOKEN and CLOUDFLARE_ZONE_ID must be set" + exit 1 +fi + +cf_api() { + local method=$1 + local url=$2 + shift 2 + curl -s -X "$method" "$url" \ + -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ + -H "Content-Type: application/json" \ + "$@" +} + +# Get existing ruleset ID for this phase +get_ruleset_id() { + cf_api GET "$API/zones/$CLOUDFLARE_ZONE_ID/rulesets" | \ + python3 -c " +import sys, json +data = json.load(sys.stdin) +for r in data.get('result', []): + if r.get('phase') == '$PHASE': + print(r['id']) + sys.exit(0) +print('') +" 2>/dev/null +} + +# Get rules in a ruleset +get_rules() { + local ruleset_id=$1 + cf_api GET "$API/zones/$CLOUDFLARE_ZONE_ID/rulesets/$ruleset_id" | \ + python3 -c " +import sys, json +data = json.load(sys.stdin) +for r in data.get('result', {}).get('rules', []): + desc = r.get('description', 'unnamed') + expr = r.get('expression', '') + print(f' {desc}') + print(f' expression: {expr}') +" 2>/dev/null +} + +# Show current status +if [ "$STATUS" = true ]; then + echo "=== Current redirect rules ===" + ruleset_id=$(get_ruleset_id) + if [ -z "$ruleset_id" ]; then + echo "No redirect ruleset found for phase $PHASE" + exit 0 + fi + echo "Ruleset ID: $ruleset_id" + get_rules "$ruleset_id" + exit 0 +fi + +# Delete all redirect rules +if [ "$DELETE" = true ]; then + echo "=== Deleting redirect rules ===" + ruleset_id=$(get_ruleset_id) + if [ -z "$ruleset_id" ]; then + echo "No redirect ruleset found, nothing to delete" + exit 0 + fi + echo "Deleting ruleset $ruleset_id..." + RESULT=$(cf_api DELETE "$API/zones/$CLOUDFLARE_ZONE_ID/rulesets/$ruleset_id") + echo "$RESULT" | python3 -c " +import sys, json +data = json.load(sys.stdin) +if data.get('success'): + print('Deleted successfully') +else: + for e in data.get('errors', []): + print(f\"Error: {e.get('message', '')}\") +" 2>/dev/null + exit 0 +fi + +# Build payload from JSON file +PAYLOAD=$(python3 -c " +import json +with open('$RULES_FILE') as f: + rules = json.load(f) +payload = { + 'name': '$RULESET_NAME', + 'kind': 'zone', + 'phase': '$PHASE', + 'rules': rules +} +print(json.dumps(payload)) +") + +RULE_COUNT=$(echo "$PAYLOAD" | python3 -c "import sys, json; print(len(json.load(sys.stdin)['rules']))" 2>/dev/null) + +if [ "$DRY_RUN" = true ]; then + echo "=== DRY RUN ===" + echo "Would create/update ruleset '$RULESET_NAME' with $RULE_COUNT rules:" + python3 -c " +import json +with open('$RULES_FILE') as f: + rules = json.load(f) +for r in rules: + print(f\" - {r['description']}\") +" 2>/dev/null + exit 0 +fi + +# Check if ruleset already exists +echo "=== Checking existing ruleset ===" +EXISTING_ID=$(get_ruleset_id) + +if [ -n "$EXISTING_ID" ]; then + echo "Updating existing ruleset $EXISTING_ID..." + RESULT=$(cf_api PUT "$API/zones/$CLOUDFLARE_ZONE_ID/rulesets/$EXISTING_ID" \ + -d "$PAYLOAD") +else + echo "Creating new ruleset..." + RESULT=$(cf_api POST "$API/zones/$CLOUDFLARE_ZONE_ID/rulesets" \ + -d "$PAYLOAD") +fi + +# Check result +echo "$RESULT" | python3 -c " +import sys, json +data = json.load(sys.stdin) +if data.get('success'): + ruleset = data['result'] + print(f\"Success! Ruleset: {ruleset['name']} (ID: {ruleset['id']})\") + print(f\"Rules: {len(ruleset.get('rules', []))}\") + for r in ruleset.get('rules', []): + print(f\" - {r.get('description', 'unnamed')}\") +else: + print('Error:') + for e in data.get('errors', []): + print(f\" {e.get('code', '')}: {e.get('message', '')}\") + sys.exit(1) +" 2>/dev/null diff --git a/shared/_includes/base.njk b/shared/_includes/base.njk index 6227245..70fe200 100644 --- a/shared/_includes/base.njk +++ b/shared/_includes/base.njk @@ -17,12 +17,11 @@ {% if ogImage %}{% endif %} - - + + + + +
+ +
+{{ section }} +{% include "nav.njk" %} +
+
+ + + +
+
+ +

{{ pageTitle | default("The " + section) }}

+ +{{ content | safe }} + +
+
+{% if quicknav %} + +{% endif %} +
+
+ +
+
+ + diff --git a/timecapsule/src/_includes/nav.njk b/timecapsule/src/_includes/nav.njk new file mode 100644 index 0000000..5c55eea --- /dev/null +++ b/timecapsule/src/_includes/nav.njk @@ -0,0 +1,17 @@ + diff --git a/timecapsule/src/_includes/quicknav.njk b/timecapsule/src/_includes/quicknav.njk new file mode 100644 index 0000000..24e5034 --- /dev/null +++ b/timecapsule/src/_includes/quicknav.njk @@ -0,0 +1,2 @@ + +
quicknav
{% for entry in quicknav %}{{ entry.label }}{% if not loop.last %}
{% endif %}{% endfor %}
quicknav
diff --git a/timecapsule/src/_includes/redirect.njk b/timecapsule/src/_includes/redirect.njk new file mode 100644 index 0000000..e0e5151 --- /dev/null +++ b/timecapsule/src/_includes/redirect.njk @@ -0,0 +1,12 @@ + + + + + + +Redirecting to {{ redirectTo }} + + +

Redirecting to {{ redirectTo }}

+ + diff --git a/timecapsule/src/acoustics/index.md b/timecapsule/src/acoustics/index.md new file mode 100644 index 0000000..3076f3e --- /dev/null +++ b/timecapsule/src/acoustics/index.md @@ -0,0 +1,52 @@ +--- +title: "The acoustics" +description: "Explore my journey in music, from mixing on turntables since 1995 to creating computer music with MOD-Trackers. Discover live synthesizer sessions, DJ mixes, and more. Stay tuned for updates." +section: acoustics +permalink: "/timecapsule/acoustics/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +Music has always been a significant part of my life. Since 1995, I have been mixing on turntables. I also tried composing my own songs, but they never turned out very well. + +## Music on Computers + +My first attempt at making music was on the computer. I never enjoyed live playing, so I sought a better way to create music. That's when I discovered MOD-Trackers. There are some nice MOD files, but they are very computer-based and don't sound like real music. + +{% pseudonymBox "MOD-file examples (can be played on Winamp)" %} + +Computer music examples from 1993: +[... wizard.mod (46kB)](https://www.moonweb.org/files/amiga/mods/wizard.mod) +[... run_away.mod (43kB)](https://www.moonweb.org/files/amiga/mods/run_away.mod) + +Electronic techno-steps from 1994: +[... lit_rave.mod (57kB)](https://www.moonweb.org/files/amiga/mods/LIT_RAVE.MOD) +[... nxt_rave.mod (33kB)](https://www.moonweb.org/files/amiga/mods/NXT_RAVE.MOD) + +{% endpseudonymBox %} + +## Live Synthesizer Music + +Later on, we tried to perform some live music. There are two tapes with live music that I will digitize very soon. One tape is a live recording from the S.O.N.A.X meets Genital Angriff session in our party room (screenshot follows), and the other is a solo tape from Genital Angriff. + +{% pseudonymBox "Live Sessions" %} + +vapeur live session (1992) +... album on soundcloud + +{% endpseudonymBox %} + +## Live Turntable Mixing + +I started mixing later in life and never aspired to be a star DJ. I really enjoyed mixing at private parties and smaller events. In the 'DJ examples' box, you can find the latest afro-cosmic-double-mix with my DJ friend Marc le Nain, a live recording at the Private Lounge Party V. + +{% pseudonymBox "DJ Examples" %} + +Biggest events: +... All Areas Party Prince Garden +... 2nd place in DJ competition + +Live mix: +... afro cosmic double mix on mix-cloud + +{% endpseudonymBox %} diff --git a/timecapsule/src/assets/archive/banner/moonback_finish.gif b/timecapsule/src/assets/archive/banner/moonback_finish.gif new file mode 100755 index 0000000..87e8917 Binary files /dev/null and b/timecapsule/src/assets/archive/banner/moonback_finish.gif differ diff --git a/timecapsule/src/assets/archive/banner/moonweb_banner_ani.gif b/timecapsule/src/assets/archive/banner/moonweb_banner_ani.gif new file mode 100755 index 0000000..6621284 Binary files /dev/null and b/timecapsule/src/assets/archive/banner/moonweb_banner_ani.gif differ diff --git a/timecapsule/src/assets/archive/banner/moonweb_banner_static.gif b/timecapsule/src/assets/archive/banner/moonweb_banner_static.gif new file mode 100755 index 0000000..69ec33e Binary files /dev/null and b/timecapsule/src/assets/archive/banner/moonweb_banner_static.gif differ diff --git a/timecapsule/src/assets/archive/banner/moonweb_newdesign5.gif b/timecapsule/src/assets/archive/banner/moonweb_newdesign5.gif new file mode 100755 index 0000000..2629260 Binary files /dev/null and b/timecapsule/src/assets/archive/banner/moonweb_newdesign5.gif differ diff --git a/timecapsule/src/assets/archive/fuckoff.jpg b/timecapsule/src/assets/archive/fuckoff.jpg new file mode 100755 index 0000000..0e13208 Binary files /dev/null and b/timecapsule/src/assets/archive/fuckoff.jpg differ diff --git a/timecapsule/src/assets/archive/splash-pre.gif b/timecapsule/src/assets/archive/splash-pre.gif new file mode 100755 index 0000000..c2596a1 Binary files /dev/null and b/timecapsule/src/assets/archive/splash-pre.gif differ diff --git a/timecapsule/src/assets/archive/splash.gif b/timecapsule/src/assets/archive/splash.gif new file mode 100755 index 0000000..9b0087c Binary files /dev/null and b/timecapsule/src/assets/archive/splash.gif differ diff --git a/timecapsule/src/assets/content/network.jpg b/timecapsule/src/assets/content/network.jpg new file mode 100755 index 0000000..ed0dd49 Binary files /dev/null and b/timecapsule/src/assets/content/network.jpg differ diff --git a/timecapsule/src/assets/content/stefan-koelle.jpg b/timecapsule/src/assets/content/stefan-koelle.jpg new file mode 100755 index 0000000..33b174d Binary files /dev/null and b/timecapsule/src/assets/content/stefan-koelle.jpg differ diff --git a/timecapsule/src/assets/css/moonweb.css b/timecapsule/src/assets/css/moonweb.css new file mode 100644 index 0000000..4e28894 --- /dev/null +++ b/timecapsule/src/assets/css/moonweb.css @@ -0,0 +1,315 @@ +body { + font-family: Verdana, Arial, sans-serif; + font-size:9pt; + background-color:#FFFFFF; + color:#000000; + margin: 0px; + } +input { + font-family: Verdana, Arial, sans-serif; + font-size:9pt; + width:300px; + BORDER-WIDTH: 1px; + BORDER-STYLE: solid; + BORDER-COLOR: #666666; + BACKGROUND-COLOR: #EEEEEE; + COLOR: #000000; + } +.inputbutton { + font-family: Verdana, Arial, sans-serif; + font-size:9pt; + width:120px; + BORDER-WIDTH: 1px; + BORDER-STYLE: solid; + BORDER-COLOR: #666666; + BACKGROUND-COLOR: #DDDDDD; + COLOR: #000000; + } +textarea { + font-family: Verdana, Arial, sans-serif; + font-size:9pt; + width:450px; + height:150px; + BORDER-WIDTH: 1px; + BORDER-STYLE: solid; + BORDER-COLOR: #666666; + BACKGROUND-COLOR: #EEEEEE; + COLOR: #000000; + } +hr { color:#AA2233; height:1; } +h1 { font-family:Impact,sans-serif,Arial; font-size:14pt; font-weight:normal; background-color:#DDDDDD; color:#555544; } +h2 { font-family: Verdana, Arial, sans-serif; font-weight:bold; font-size:9pt; background-color:#EEEEEE; color:#990033;} +h3 { font-family:Impact,Verdana,Arial; font-size:12pt; font-weight:bold; padding-left:50px; color:#990033; } +p { font-family: Verdana, Arial, sans-serif; font-size:9pt;} +br { font-family: Verdana, Arial, sans-serif; font-size:9pt;} +p.red { font-family: Verdana, Arial, sans-serif; font-size:9pt; color:#990033;} +p.footer { font-family: Verdana, Arial, sans-serif; font-size:8pt; text-align:center; alignment:center; } +br.footer { font-family: Verdana, Arial, sans-serif; font-size:9pt; text-align:center; alignment:center; } +p.pt8 { font-family:Verdana, Arial, sans-serif; font-size:9pt;} +th { font-family: Verdana, Arial, sans-serif; font-size:9pt;} +td { font-family: Verdana, Arial, sans-serif; font-size:9pt;} +ul { font-family: Verdana, Arial, sans-serif; list-style-image:url(/assets/images/item.gif); font-size:9pt;} +a:link { font-weight:bold; background-color:#FFFFFF; color:#334444; } +a:visited { font-weight:bold; background-color:#FFFFFF; color:#334444; } +a:active { font-weight:bold; background-color:#DDDDDD; color:#334444; } +a:hover { font-weight:bold; background-color:#BBCCEE; color:#334444; } +a.quicknav { font-weight:normal; text-decoration:none; background-color:#DDDDDD; width:85px; padding-right:5px; font-family: sans-serif, Arial, sans-serif; font-size:8pt; color:#AA2233; } +a.quicknav:visited { font-weight:normal; text-decoration:none; background-color:#DDDDDD; width:85px; padding-right:5px; font-family: sans-serif, Arial, sans-serif; font-size:8pt; color:#AA2233; } +a.quicknav:active { font-weight:normal; text-decoration:none; background-color:#DDDDDD; width:85px; padding-right:5px; font-family: sans-serif, Arial, sans-serif; font-size:8pt; color:#AA2233; } +a.quicknav:hover { font-weight:normal; text-decoration:none; background-color:#CCCCCC; width:85px; padding-right:5px; font-family: sans-serif, Arial, sans-serif; font-size:8pt; color:#AA2233; } +strong { color:#BBCCEE; background-color:#334444; font-weight:normal;} + +/* Mobile Header: nur auf Mobile sichtbar */ +.mobile-header { + display: none; +} + +.mobile-footer-quicknav { + display: none; +} + +/* ======================================== + MOBILE LAYOUT (Responsive) + ======================================== */ + +/* Navigation Toggle (nur im Mobile sichtbar) */ +.nav-toggle-button { + display: none; + background-color: #555544; + color: #CCAA66; + padding: 8px 12px; + cursor: pointer; + font-weight: bold; + border: none; + width: 100%; + text-align: left; +} +.nav-toggle-button:hover { + background-color: #444433; +} + +/* Mobile Breakpoint: 768px */ +@media (max-width: 768px) { + /* Mobile Header: Logo oben skaliert, darunter Seite + Navigation */ + .mobile-header { + display: block !important; + padding: 0 0 8px 0; + } + .mobile-logo { + display: block; + width: calc(100% - 40px); + max-width: 400px; + height: auto; + margin: 20px auto 0 auto; + border: 1px solid #000; + } + .mobile-nav-row { + display: flex !important; + align-items: flex-start; + padding: 20px; + } + .mobile-nav-row .mobile-pageimage { + flex-shrink: 0 !important; + width: 108px !important; + height: 120px !important; + object-fit: cover !important; + object-position: top !important; + border: 1px solid #000; + } + .mobile-header .nav-toggle { + flex: 1; + padding: 0 0 0 8px; + margin: 0; + } + .mobile-header .nav-toggle-button { + display: none !important; + } + .mobile-header .nav-table { + width: auto !important; + display: inline !important; + } + .mobile-header .nav-table > tbody, + .mobile-header .nav-table > tbody > tr { + display: inline !important; + } + .mobile-header .nav-table > tbody > tr > td { + display: inline !important; + width: auto !important; + text-align: left; + } + .mobile-header .nav-spacer { + display: inline !important; + width: 8px !important; + height: auto !important; + } + .mobile-header a.menu-item { + display: inline !important; + width: auto !important; + height: auto !important; + padding: 0 4px !important; + text-indent: 0 !important; + overflow: visible !important; + text-align: left; + background-image: none !important; + background-color: transparent; + color: #334444; + margin: 0; + font-weight: bold; + font-size: 14px; + } + .mobile-header a.menu-item:hover, + .mobile-header a.menu-item.active { + background-color: #BBCCEE; + } + + /* Layout-Tabellen auf Block umschalten */ + table.layout-main { + display: block !important; + width: 100% !important; + height: auto !important; + } + table.layout-main > tbody, + table.layout-main > tbody > tr { + display: block !important; + } + table.layout-main > tbody > tr > td { + display: block !important; + width: 100% !important; + padding: 0 !important; + } + + /* Linke Sidebar ausblenden */ + td.sidebar-left, + td.sidebar-left * { + display: none !important; + } + + /* Content-Bereich: Volle Breite */ + td.content-area { + width: 100% !important; + padding: 8px !important; + } + td.content-area table { + width: 100% !important; + padding: 8px !important; + } + td.content-area table td { + padding: 2px 10px !important; + } + + /* Rechte Sidebar ausblenden */ + td.sidebar-right, + td.sidebar-right * { + display: none !important; + } + + /* Footer: Volle Breite */ + td[colspan="2"] table { + width: 100% !important; + } + + /* Quicknav ueber Footer */ + .mobile-footer-quicknav { + display: block !important; + padding: 12px 20px; + text-align: center; + } + .mobile-footer-quicknav a.quicknav { + font-size: 14px; + margin: 0 4px; + } + + /* Typografie anpassen */ + body { + font-size: 14px !important; + line-height: 1.4; + } + h1 { + font-size: 18pt !important; + padding: 8px; + margin: 0; + } + h2 { + font-size: 11pt !important; + } + h3 { + font-size: 14pt !important; + padding-left: 10px !important; + } + p { + font-size: 14px !important; + } + + /* Formulare: Volle Breite */ + input[type="text"], + input[type="email"], + input[type="submit"], + textarea { + width: 100% !important; + max-width: 100% !important; + box-sizing: border-box; + } + + /* Tabellen in Inhalten: Volle Breite */ + td.content-area table { + display: table !important; + width: 100% !important; + } + + /* Quicknav: Kompakte horizontale Leiste */ + .quicknav-table { + width: 100% !important; + } + .quicknav-table td { + display: inline-block !important; + width: auto !important; + height: auto !important; + padding: 2px 4px !important; + } + .quicknav-table img { + display: none !important; + } + + /* Pseudonym-Box: Volle Breite */ + .pseudonym-box { + width: 100% !important; + max-width: 350px; + } + p[align="right"] { + text-align: center !important; + } + + /* Bilder: Responsiv */ + img { + max-width: 100% !important; + height: auto !important; + } + img.mobile-pageimage { + height: 120px !important; + max-height: 120px !important; + } + + /* Background: komplett aus */ + body { + background-image: none !important; + } + body::before { + display: none !important; + } +} + +/* Kleinere Breakpoint: 480px */ +@media (max-width: 480px) { + body { + font-size: 13px !important; + } + h1 { + font-size: 16pt !important; + } + td.content-area { + padding: 4px !important; + } + td.content-area table { + padding: 4px !important; + } +} diff --git a/timecapsule/src/assets/images/background.gif b/timecapsule/src/assets/images/background.gif new file mode 100755 index 0000000..921e003 Binary files /dev/null and b/timecapsule/src/assets/images/background.gif differ diff --git a/timecapsule/src/assets/images/favicon.ico b/timecapsule/src/assets/images/favicon.ico new file mode 100755 index 0000000..4cf9dbd Binary files /dev/null and b/timecapsule/src/assets/images/favicon.ico differ diff --git a/timecapsule/src/assets/images/item.gif b/timecapsule/src/assets/images/item.gif new file mode 100755 index 0000000..b225a46 Binary files /dev/null and b/timecapsule/src/assets/images/item.gif differ diff --git a/timecapsule/src/assets/images/logo.gif b/timecapsule/src/assets/images/logo.gif new file mode 100755 index 0000000..10a635c Binary files /dev/null and b/timecapsule/src/assets/images/logo.gif differ diff --git a/timecapsule/src/assets/images/logomobile.gif b/timecapsule/src/assets/images/logomobile.gif new file mode 100755 index 0000000..69ec33e Binary files /dev/null and b/timecapsule/src/assets/images/logomobile.gif differ diff --git a/timecapsule/src/assets/images/pixel-white.gif b/timecapsule/src/assets/images/pixel-white.gif new file mode 100755 index 0000000..350d4a3 Binary files /dev/null and b/timecapsule/src/assets/images/pixel-white.gif differ diff --git a/timecapsule/src/assets/images/quicknav-back.gif b/timecapsule/src/assets/images/quicknav-back.gif new file mode 100755 index 0000000..cffd8b8 Binary files /dev/null and b/timecapsule/src/assets/images/quicknav-back.gif differ diff --git a/timecapsule/src/assets/images/quicknav-end.gif b/timecapsule/src/assets/images/quicknav-end.gif new file mode 100755 index 0000000..43a9e14 Binary files /dev/null and b/timecapsule/src/assets/images/quicknav-end.gif differ diff --git a/timecapsule/src/assets/images/quicknav-top.gif b/timecapsule/src/assets/images/quicknav-top.gif new file mode 100755 index 0000000..f102218 Binary files /dev/null and b/timecapsule/src/assets/images/quicknav-top.gif differ diff --git a/timecapsule/src/assets/images/redbottom.gif b/timecapsule/src/assets/images/redbottom.gif new file mode 100755 index 0000000..7d0575b Binary files /dev/null and b/timecapsule/src/assets/images/redbottom.gif differ diff --git a/timecapsule/src/assets/images/redline.gif b/timecapsule/src/assets/images/redline.gif new file mode 100755 index 0000000..2cd2eb9 Binary files /dev/null and b/timecapsule/src/assets/images/redline.gif differ diff --git a/timecapsule/src/assets/menu/acoustics.gif b/timecapsule/src/assets/menu/acoustics.gif new file mode 100755 index 0000000..4890ea9 Binary files /dev/null and b/timecapsule/src/assets/menu/acoustics.gif differ diff --git a/timecapsule/src/assets/menu/acoustics_a.gif b/timecapsule/src/assets/menu/acoustics_a.gif new file mode 100755 index 0000000..4491eca Binary files /dev/null and b/timecapsule/src/assets/menu/acoustics_a.gif differ diff --git a/timecapsule/src/assets/menu/acoustics_h.gif b/timecapsule/src/assets/menu/acoustics_h.gif new file mode 100755 index 0000000..993046d Binary files /dev/null and b/timecapsule/src/assets/menu/acoustics_h.gif differ diff --git a/timecapsule/src/assets/menu/background.gif b/timecapsule/src/assets/menu/background.gif new file mode 100755 index 0000000..9f52a88 Binary files /dev/null and b/timecapsule/src/assets/menu/background.gif differ diff --git a/timecapsule/src/assets/menu/background_a.gif b/timecapsule/src/assets/menu/background_a.gif new file mode 100755 index 0000000..53edd78 Binary files /dev/null and b/timecapsule/src/assets/menu/background_a.gif differ diff --git a/timecapsule/src/assets/menu/background_h.gif b/timecapsule/src/assets/menu/background_h.gif new file mode 100755 index 0000000..a72249f Binary files /dev/null and b/timecapsule/src/assets/menu/background_h.gif differ diff --git a/timecapsule/src/assets/menu/beginning.gif b/timecapsule/src/assets/menu/beginning.gif new file mode 100755 index 0000000..21982d2 Binary files /dev/null and b/timecapsule/src/assets/menu/beginning.gif differ diff --git a/timecapsule/src/assets/menu/beginning_a.gif b/timecapsule/src/assets/menu/beginning_a.gif new file mode 100755 index 0000000..44302de Binary files /dev/null and b/timecapsule/src/assets/menu/beginning_a.gif differ diff --git a/timecapsule/src/assets/menu/beginning_h.gif b/timecapsule/src/assets/menu/beginning_h.gif new file mode 100755 index 0000000..fa07979 Binary files /dev/null and b/timecapsule/src/assets/menu/beginning_h.gif differ diff --git a/timecapsule/src/assets/menu/contact.gif b/timecapsule/src/assets/menu/contact.gif new file mode 100755 index 0000000..0e155b2 Binary files /dev/null and b/timecapsule/src/assets/menu/contact.gif differ diff --git a/timecapsule/src/assets/menu/contact_a.gif b/timecapsule/src/assets/menu/contact_a.gif new file mode 100755 index 0000000..011030e Binary files /dev/null and b/timecapsule/src/assets/menu/contact_a.gif differ diff --git a/timecapsule/src/assets/menu/contact_h.gif b/timecapsule/src/assets/menu/contact_h.gif new file mode 100755 index 0000000..b82a73a Binary files /dev/null and b/timecapsule/src/assets/menu/contact_h.gif differ diff --git a/timecapsule/src/assets/menu/location.gif b/timecapsule/src/assets/menu/location.gif new file mode 100755 index 0000000..608c4b1 Binary files /dev/null and b/timecapsule/src/assets/menu/location.gif differ diff --git a/timecapsule/src/assets/menu/location_a.gif b/timecapsule/src/assets/menu/location_a.gif new file mode 100755 index 0000000..90cd5d9 Binary files /dev/null and b/timecapsule/src/assets/menu/location_a.gif differ diff --git a/timecapsule/src/assets/menu/location_h.gif b/timecapsule/src/assets/menu/location_h.gif new file mode 100755 index 0000000..4233516 Binary files /dev/null and b/timecapsule/src/assets/menu/location_h.gif differ diff --git a/timecapsule/src/assets/menu/partners.gif b/timecapsule/src/assets/menu/partners.gif new file mode 100755 index 0000000..c3671ae Binary files /dev/null and b/timecapsule/src/assets/menu/partners.gif differ diff --git a/timecapsule/src/assets/menu/partners_a.gif b/timecapsule/src/assets/menu/partners_a.gif new file mode 100755 index 0000000..22896de Binary files /dev/null and b/timecapsule/src/assets/menu/partners_a.gif differ diff --git a/timecapsule/src/assets/menu/partners_h.gif b/timecapsule/src/assets/menu/partners_h.gif new file mode 100755 index 0000000..82d787e Binary files /dev/null and b/timecapsule/src/assets/menu/partners_h.gif differ diff --git a/timecapsule/src/assets/menu/products.gif b/timecapsule/src/assets/menu/products.gif new file mode 100755 index 0000000..84f30f0 Binary files /dev/null and b/timecapsule/src/assets/menu/products.gif differ diff --git a/timecapsule/src/assets/menu/products_a.gif b/timecapsule/src/assets/menu/products_a.gif new file mode 100755 index 0000000..10e4473 Binary files /dev/null and b/timecapsule/src/assets/menu/products_a.gif differ diff --git a/timecapsule/src/assets/menu/products_h.gif b/timecapsule/src/assets/menu/products_h.gif new file mode 100755 index 0000000..0ca497b Binary files /dev/null and b/timecapsule/src/assets/menu/products_h.gif differ diff --git a/timecapsule/src/assets/menu/projects.gif b/timecapsule/src/assets/menu/projects.gif new file mode 100755 index 0000000..39cadda Binary files /dev/null and b/timecapsule/src/assets/menu/projects.gif differ diff --git a/timecapsule/src/assets/menu/projects_a.gif b/timecapsule/src/assets/menu/projects_a.gif new file mode 100755 index 0000000..c7312cf Binary files /dev/null and b/timecapsule/src/assets/menu/projects_a.gif differ diff --git a/timecapsule/src/assets/menu/projects_h.gif b/timecapsule/src/assets/menu/projects_h.gif new file mode 100755 index 0000000..9ce7882 Binary files /dev/null and b/timecapsule/src/assets/menu/projects_h.gif differ diff --git a/timecapsule/src/assets/pageImage/acoustics.jpg b/timecapsule/src/assets/pageImage/acoustics.jpg new file mode 100755 index 0000000..a0338a4 Binary files /dev/null and b/timecapsule/src/assets/pageImage/acoustics.jpg differ diff --git a/timecapsule/src/assets/pageImage/background.jpg b/timecapsule/src/assets/pageImage/background.jpg new file mode 100755 index 0000000..5ff26d2 Binary files /dev/null and b/timecapsule/src/assets/pageImage/background.jpg differ diff --git a/timecapsule/src/assets/pageImage/beginning.jpg b/timecapsule/src/assets/pageImage/beginning.jpg new file mode 100755 index 0000000..9450002 Binary files /dev/null and b/timecapsule/src/assets/pageImage/beginning.jpg differ diff --git a/timecapsule/src/assets/pageImage/contact.jpg b/timecapsule/src/assets/pageImage/contact.jpg new file mode 100755 index 0000000..fe66e8d Binary files /dev/null and b/timecapsule/src/assets/pageImage/contact.jpg differ diff --git a/timecapsule/src/assets/pageImage/location.jpg b/timecapsule/src/assets/pageImage/location.jpg new file mode 100755 index 0000000..e7a73c4 Binary files /dev/null and b/timecapsule/src/assets/pageImage/location.jpg differ diff --git a/timecapsule/src/assets/pageImage/network.jpg b/timecapsule/src/assets/pageImage/network.jpg new file mode 100755 index 0000000..c57a2b8 Binary files /dev/null and b/timecapsule/src/assets/pageImage/network.jpg differ diff --git a/timecapsule/src/assets/pageImage/partners.jpg b/timecapsule/src/assets/pageImage/partners.jpg new file mode 100755 index 0000000..53b34f7 Binary files /dev/null and b/timecapsule/src/assets/pageImage/partners.jpg differ diff --git a/timecapsule/src/assets/pageImage/products.jpg b/timecapsule/src/assets/pageImage/products.jpg new file mode 100755 index 0000000..a0b1ae7 Binary files /dev/null and b/timecapsule/src/assets/pageImage/products.jpg differ diff --git a/timecapsule/src/assets/pageImage/projects.jpg b/timecapsule/src/assets/pageImage/projects.jpg new file mode 100755 index 0000000..c57a2b8 Binary files /dev/null and b/timecapsule/src/assets/pageImage/projects.jpg differ diff --git a/timecapsule/src/assets/pageImage/stefan.jpg b/timecapsule/src/assets/pageImage/stefan.jpg new file mode 100755 index 0000000..fe66e8d Binary files /dev/null and b/timecapsule/src/assets/pageImage/stefan.jpg differ diff --git a/timecapsule/src/background/index.md b/timecapsule/src/background/index.md new file mode 100644 index 0000000..fe7aa31 --- /dev/null +++ b/timecapsule/src/background/index.md @@ -0,0 +1,67 @@ +--- +title: "The background" +description: "Discover the key milestones in my IT learning journey, from my first computer in 1988 to my work at IXOS SOFTWARE AG. Learn about my projects, certifications, and contributions to the IT field." +section: background +permalink: "/timecapsule/background/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +Here is a list of key milestones in my IT learning journey. + +## The Key Dates + +{% pseudonymBox "Key Dates" %} + +1988 +First computer (Atari ST) + +1990 +First computer program (Bowling) + +1991 +First complete computer game (Atom Oh No!) + +1992 +First Intel computer (80486) + +1994 +First computer modem + +1996 +Own computer mailbox and Fidonet access + +1997 +First computer network (10Mbit thin-ethernet) + +1997-99 +Trainee at IXOS SOFTWARE AG + +1998 +First internet webpage (www.moonweb.org) + +1999-00 +Web Engineer at IXOS SOFTWARE AG + +2000 +Microsoft certified for: +- Windows NT 4.0 Workstation, Server +- Internet Information Server 4.0 + +{% endpseudonymBox %} + +## The Work at IXOS SOFTWARE AG + +I started to work at IXOS SOFTWARE AG as an intern during my studies and worked on different projects. + +- Jetform integration into IXOS ARCHIVE on an R/3 environment + +- Mobile internet computing test for IXOS Mobile/3 + +- IXtrain sysadmin while studying + +- Digital timestamp client/server application in Java + +- Porting the Perl/CGI version of the IXOS Jukeman website to ASP/SQL on the IIS + +After I stopped my studies, I started to work at IXOS SOFTWARE AG as a Web Engineer. My job was to build up a logical environment for all scripts and to enable persons with no HTML experience to publish content on the www.ixos.com webpage. This was done for press releases, event database, and later for job offers. I also integrated the index server search engine on the webpage, including PDF indexing. If you have further questions about this, just [email me](mailto:stefans-work-at-ixos@moonweb.org). diff --git a/timecapsule/src/beginning/index.md b/timecapsule/src/beginning/index.md new file mode 100644 index 0000000..143da19 --- /dev/null +++ b/timecapsule/src/beginning/index.md @@ -0,0 +1,8 @@ +--- +title: "The beginning" +description: "Welcome to moonweb.org, a site dedicated to building IT knowledge through self-study." +section: beginning +permalink: "/timecapsule/beginning/index.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/beginning/news.md b/timecapsule/src/beginning/news.md new file mode 100644 index 0000000..4e4f04b --- /dev/null +++ b/timecapsule/src/beginning/news.md @@ -0,0 +1,43 @@ +--- +title: "The news" +description: "Stay updated with the latest news on moonweb.org. Learn about the design relaunch, upcoming section updates, and the reasons behind the changes. Discover more about our projects and products." +section: beginning +pageTitle: "The news" +permalink: "/timecapsule/beginning/news.html" +layout: layout.njk +lastChanged: "5/1/2001" +quicknav: + - { label: "news", url: "/beginning/news.html" } + - { label: "monthly report", url: "/beginning/report.html" } + - { label: "sitemap", url: "/beginning/sitemap.html" } +--- + +This relaunch of moonweb.org is mostly a design update. In the following months, I will update one section per month. +Keep an eye on the following dates: + +{% pseudonymBox "The dates of section updates" %} + +06/2001 - The projects +07/2001 - The products +08/2001 - The acoustics + +{% endpseudonymBox %} +
+ +## The design relaunch (1.5.2001) + +Many people ask me about the reason for moonweb.org. During my studies, I started to think more globally. I already had +some contacts through Fidonet, but serious networking and communication started with the internet. The first step was to build up +an internet brand, and I started with the first planets.org webpages. I quickly realized an internet brand has to have +its own domain. As everyone can expect, planets.org was already taken, and after sleepless nights, moonweb.org +became the domain of the moment. + +So why have I relaunched the design of this domain? +Sure, there has not been much activity in the last two years on moonweb.org, but the main reason to update this page was +to collect all the projects and products we created over the past 10 years and document them on this webpage. + +Are there still some active projects or new products? +Yes, and I hope there are still more to come. Stay tuned. +More about the upcoming projects and products in the next months. + +Stefan diff --git a/timecapsule/src/beginning/report.md b/timecapsule/src/beginning/report.md new file mode 100644 index 0000000..55ffa1a --- /dev/null +++ b/timecapsule/src/beginning/report.md @@ -0,0 +1,39 @@ +--- +title: "The monthly report" +description: "This month marks the relaunch of moonweb.org with a new design. Learn about the design process, timeline, and upcoming content releases. Stay updated with the latest news." +section: beginning +pageTitle: "The monthly report" +permalink: "/timecapsule/beginning/report.html" +layout: layout.njk +lastChanged: "5/1/2001" +quicknav: + - { label: "news", url: "/beginning/news.html" } + - { label: "monthly report", url: "/beginning/report.html" } + - { label: "sitemap", url: "/beginning/sitemap.html" } +--- + +This month marks the relaunch. For more information about the relaunch, please visit the [news page](news.html). + +## The Design Relaunch (1.5.2001) + +Soon after the first release of the old moonweb.org design, I started thinking about a new design—a simple, clean, and smooth version. After a year of brainstorming, I developed the first version of the new design and aimed to publish it by the new millennium in 2000. However, I discovered numerous small issues I didn't like. Nearly another year later, I finished the design. Here is a timeline with the key relaunch steps: + +{% pseudonymBox "Timeline" %} + +05/1998 - Release of old moonweb.org design +12/1998 - Idea of new moonweb.org design +12/1999 - First design prototype +05/2000 - Last content change on old design +01/2001 - Content prototype +03/2001 - Completed new design of moonweb.org +05/2001 - Design relaunch of moonweb.org + +{% endpseudonymBox %} + +Meanwhile, I also tried to develop the INSECO Webpages, but they are still in early development. More information about this will be announced in the coming months with a detailed plan of the steps to publish the INSECO Webpages. + +The content on moonweb.org will be released in three steps as described on the [news page](news.html). This is due to the large amount of information that needs to be added to these sections. This time, I will describe everything that has been developed over the last 13 years. + +For any comments, please write me an email. Thanks. + +Stefan diff --git a/timecapsule/src/beginning/sitemap.md b/timecapsule/src/beginning/sitemap.md new file mode 100644 index 0000000..f161de7 --- /dev/null +++ b/timecapsule/src/beginning/sitemap.md @@ -0,0 +1,160 @@ +--- +title: "The sitemap" +description: "Explore the sitemap of moonweb.org, including sections on projects, products, acoustics, location, background, partners, and contact information. Discover our journey and how to connect with us." +section: beginning +pageTitle: "The sitemap" +permalink: "/timecapsule/beginning/sitemap.html" +layout: layout.njk +lastChanged: "5/1/2001" +quicknav: + - { label: "news", url: "/beginning/news.html" } + - { label: "monthly report", url: "/beginning/report.html" } + - { label: "sitemap", url: "/beginning/sitemap.html" } +--- + +Listed below is the sitemap of moonweb.org. + +## The Projects + +The main purpose of moonweb.org is to build up knowledge through continuous learning by doing. You can find all finished, ongoing, and upcoming projects below. + +- Atari development +- Amiga development +- PC/Intel development +- Fidonet/BBS +- Network/Internet +- Web development + +
+ + + + + + +
+The Projects +
+
+ +## The Products + +After 13 years of development, we have released several products during different projects. + +- SkyLINE Shareware Development +- PHOBIA +- ESPRIT (Tr@nceMission, P.C.C) +- ASC (The Force, HCC) +- Olympic Arts / TropicDREAMS + +
+ + + + + + +
+The Products +
+
+ +## The Acoustics + +Live music and DJ mixes recorded over the past 10 years. Also, some rare tracks from studioMARS. + +- Live music +- Live mixing +- studioMARS + +
+ + + + + + +
+The Acoustics +
+
+ +## The Location + +General information about our current operations and our locations. + +- Branch offices +- Environments +- Teams + +
+ + + + + + +
+The Location +
+
+ +## The Background + +Information about myself, the creator of moonweb.org, and the beginnings of the moonweb.org network. + +- Personal +- Knowledge +- Timeline + +
+ + + + + + +
+The Background +
+
+ +## The Partners + +All our partners, supporters, and guests. + +- Partners +- Supporters +- Guests + +
+ + + + + + +
+The Partners +
+
+ +## The Contact + +Different ways to get in contact with us. + +- Phone +- Fax +- Email + +
+ + + + + + +
+The Contact +
+
diff --git a/timecapsule/src/contact/index.md b/timecapsule/src/contact/index.md new file mode 100644 index 0000000..21d593c --- /dev/null +++ b/timecapsule/src/contact/index.md @@ -0,0 +1,25 @@ +--- +title: "The contact" +description: "Get in touch for general information or report technical issues with moonweb.org. Contact us via phone or email for assistance." +section: contact +permalink: "/timecapsule/contact/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +For general information, please use this contact information. + +{% pseudonymBox "Contact" %} + +phone: +49.89.20006547 +email: info@moonweb.org + +{% endpseudonymBox %} + +Please report technical problems with this webserver to the webmaster. + +{% pseudonymBox "Webmaster" %} + +email: webmaster@moonweb.org + +{% endpseudonymBox %} diff --git a/timecapsule/src/css/nav-replacement.njk b/timecapsule/src/css/nav-replacement.njk new file mode 100644 index 0000000..1516c71 --- /dev/null +++ b/timecapsule/src/css/nav-replacement.njk @@ -0,0 +1,38 @@ +--- +permalink: "/timecapsule/assets/css/nav-replacement.css" +eleventyExcludeFromCollections: true +--- +/* Ersetzt den Bild-Hover-Tausch aus menu.js OHNE Javascript. */ + +/* Fix: inline in table cells with explicit height creates 2px baseline gap */ +table.quicknav-table img { display: block; } + +a.menu-item { + display: inline-block; + width: 76px; + height: 15px; + background-repeat: no-repeat; + text-indent: -9999px; + overflow: hidden; +} + +{% for group in nav %}{% for item in group %} +a.menu-{{ item }} { + background-image: url("/timecapsule/assets/menu/{{ item }}.gif"); +} +a.menu-{{ item }}:hover { + background-image: url("/timecapsule/assets/menu/{{ item }}_h.gif"); +} +a.menu-{{ item }}.active { + background-image: url("/timecapsule/assets/menu/{{ item }}_a.gif"); +} +{% endfor %}{% endfor %} + +/* Mobile: Navigation als Text statt Bilder */ +@media (max-width: 768px) { + a.menu-item { + background-image: none !important; + text-indent: 0 !important; + overflow: visible !important; + } +} diff --git a/timecapsule/src/hardware.md b/timecapsule/src/hardware.md new file mode 100644 index 0000000..aa0d507 --- /dev/null +++ b/timecapsule/src/hardware.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/hardware.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/index.md b/timecapsule/src/index.md new file mode 100644 index 0000000..289faa5 --- /dev/null +++ b/timecapsule/src/index.md @@ -0,0 +1,35 @@ +--- +title: "The beginning" +description: "Welcome to moonweb.org, a site dedicated to building IT knowledge through self-study. Explore my life, projects, and the journey of learning IT with Matthias since 1988. Stay tuned for more updates." +section: beginning +permalink: "/timecapsule/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +quicknav: + - { label: "news", url: "/beginning/news.html" } + - { label: "monthly report", url: "/beginning/report.html" } + - { label: "sitemap", url: "/beginning/sitemap.html" } +--- + +Welcome to the new moonweb.org website. After 2 years of part-time development, it is finally here. + +## The Idea + +Thank you for visiting our page. The idea behind moonweb.org is to build IT knowledge and to learn from each other. +Since computer education in schools or colleges here in Germany isn't very comprehensive and often misses out on interesting aspects relevant to business life, we built up our IT knowledge through self-study. + +## The Website + +This page mostly describes my life, the products I have developed, and the projects I have been part of. +You can also find some general information about the person who played a major role in my IT learning process, Matthias. Together, we took our first steps in computer programming in 1988 on an Atari STFM 1040, a great machine. + +## The Person + +Since there is no advertising on my homepage, you probably know who I am, so I will skip the standard description of myself. If you want to know more about [me](/timecapsule/stefan/), write me an [email](mailto:who-are-you@moonweb.org). +I dislike personal websites and often wonder if anyone would actually use this page. I stopped worrying about it :) and remember the main reason I started this website: to document all the information about my projects so I would never forget anything. That's all. + +## The Future + +... stay tuned + +Stefan diff --git a/timecapsule/src/index2.md b/timecapsule/src/index2.md new file mode 100644 index 0000000..436da2d --- /dev/null +++ b/timecapsule/src/index2.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/index2.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/index3.md b/timecapsule/src/index3.md new file mode 100644 index 0000000..a93b4df --- /dev/null +++ b/timecapsule/src/index3.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/index3.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/infos.md b/timecapsule/src/infos.md new file mode 100644 index 0000000..623cf78 --- /dev/null +++ b/timecapsule/src/infos.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/infos.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/legal-notice/index.md b/timecapsule/src/legal-notice/index.md new file mode 100644 index 0000000..71bf700 --- /dev/null +++ b/timecapsule/src/legal-notice/index.md @@ -0,0 +1,20 @@ +--- +layout: layout.njk +section: contact +permalink: /timecapsule/legal-notice/index.html +pageTitle: "Legal Notice" +lastChanged: "8/16/2026" +--- + +**Legal Notice (Impressum, § 5 DDG)** + +Stefan Kölle +Neumarkter Str. 86c +81673 München + +Phone/Fax: +49-(89)-20006547 +E-Mail: webmaster@moonweb.org + +Responsible for content according to § 18 (2) MStV: Stefan Kölle, address as above. + +Full legal notice & privacy policy for this website and the moonweb.org network: [/impressum](https://www.moonweb.org/impressum) diff --git a/timecapsule/src/links.md b/timecapsule/src/links.md new file mode 100644 index 0000000..ecb927a --- /dev/null +++ b/timecapsule/src/links.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/links.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/location/index.md b/timecapsule/src/location/index.md new file mode 100644 index 0000000..8bd94d0 --- /dev/null +++ b/timecapsule/src/location/index.md @@ -0,0 +1,43 @@ +--- +title: "The location" +description: "Learn about the location and network setup of moonweb.org in Augsburg, Germany. Explore the hardware and network environment, including servers, workstations, and network connections." +section: location +permalink: "/timecapsule/location/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +moonweb.org was located in Augsburg, Germany. The location was connected to two additional locations: one in the same house via a 10 Mbit thin-Ethernet cable, and another to the Springfield.net network via a demand dial RAS connection. The next step was to build a much wider network with the new network project 'VPN demand dial connection'. + +## The Main Environment + +There were some old servers which did not run very fast, so don't expect too much. The main server, the internet access, and the two client hubs (10 Mbit and 100 Mbit) were connected with a SOHO switch. + +{% pseudonymBox "Hardware" %} + +XS +smoothwall firewall + +IO +The main server for all internal services + +KALLISTO +Red Hat Linux Server + +PANDORA +The multimedia workstation with 3 monitors and high-quality speakers + +GANYMED +The guest computer + +PHOBOS +Linux Server with Postfix/Apache + +DIONE +The classic 486 with DOS + +{% endpseudonymBox %} + +## The Network + +A network plan can be found here: [network plan](/timecapsule/network) diff --git a/timecapsule/src/network/index.md b/timecapsule/src/network/index.md new file mode 100644 index 0000000..2cdee67 --- /dev/null +++ b/timecapsule/src/network/index.md @@ -0,0 +1,15 @@ +--- +title: "The network" +description: "Explore the moonweb.org network setup, including hardware, servers, workstations, and network connections. Learn about the infrastructure that supports our IT environment." +section: network +pageTitle: "The network" +permalink: "/timecapsule/network/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +Here is the moonweb.org network plan: + +![Detailed network plan of the moonweb.org network](/timecapsule/assets/content/network.jpg) + +The moonweb.org network in Augsburg, Germany, connected to two other locations via a 10 Mbit thin-Ethernet cable and a demand dial RAS connection. Plans included expanding with a VPN demand dial connection. The network had older servers, modest performance, and used a SOHO switch to connect the main server, internet access, and client hubs. The setup featured various servers and workstations, including a Smoothwall firewall and a classic 486 with DOS. diff --git a/timecapsule/src/new.md b/timecapsule/src/new.md new file mode 100644 index 0000000..c0adc66 --- /dev/null +++ b/timecapsule/src/new.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/new.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/partners/index.md b/timecapsule/src/partners/index.md new file mode 100644 index 0000000..8a0dff9 --- /dev/null +++ b/timecapsule/src/partners/index.md @@ -0,0 +1,46 @@ +--- +title: "The partners" +description: "A heartfelt thank you to the individuals who supported me from 1988 to 2001. Acknowledging contributions in game development, demo coding, network projects, and more." +section: partners +permalink: "/timecapsule/partners/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +I want to thank some people who helped me during the last 13 years (1988-2001). + +Matthias +For the best time ever while brainstorming about games, demos, and enhancements of all the tools we developed. And of course, I have to thank you for leading me to the Atari ST and not to the Amiga :) and for the help on all the projects. + +The Elite, M.C.A., and of course the equinox website +For the inspiration in demo coding. + +Milkrun +For the help with graphical coding. + +Helmut Kalb +For the interesting projects at IXOS SOFTWARE AG. + +Miltos +For the great help while learning ASP :) + +Christian Beckmann +For the help with the network projects and for the hardware supply :) + +Thomas Hoeger +For the nice time at IXtrain as a sysadmin. + +Hary and Thomas +For the help with electronics. + +Ulrich, Sirius-BBS Sysop, and Mash +For the great Fidonet time and for some help with the Fidonet projects. + +Raphael +For some help with programming and network stuff. + +Marco +For the nice cosmic sounds. + +Juergen and Brainstorm-Radio +For the help with the Fidonet and internet projects. diff --git a/timecapsule/src/products/index.md b/timecapsule/src/products/index.md new file mode 100644 index 0000000..d8f73b4 --- /dev/null +++ b/timecapsule/src/products/index.md @@ -0,0 +1,84 @@ +--- +title: "The products" +description: "Discover the products developed over the years at moonweb.org, from Atari ST games and tools to PC games, intros, demos, and utilities. Learn about the projects and software group pseudonyms." +section: products +permalink: "/timecapsule/products/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +Over the years of development projects, some products have been released. This section is grouped by project and also listed separately by product title. The projects started in 1988 on our first computers, which were Atari STFM 1040s. You can find more detailed information in the projects section. + +## The Atari ST Products + +On our first project, we quickly learned to code some simple programs. Matthias mainly focused on medium resolution programming and Stefan on high resolution. As 12-year-olds, the type of software we wanted to code was games, although we also coded some nice tools. + +- International Kegeln and Bowling (1990) + Our first release ever. Idea from Matthias (Olympic Arts) and first graphical coding project. The result was a complete Bowling game as a second version of "International Kegeln" simply called Bowling. It was complete, but never playable. + +- Runner (1991) + An all-round helper tool including a database, memo, system overview, and a game. Main idea from CPK and some help from Stefan on the built-in Hangman game. + +- Atom Oh No! (1991) + The second game release on the Atari ST completely coded by Stefan under the pseudonym "Tropic DREAMs". The idea came from the game Atomix on the Amiga, ported to the Atari ST high resolution 640x400 including a level maker and 10 demo levels. + +- TOP Tools (1992) + Some small tools and a game coded by Stefan under the pseudonym "Tropic DREAMs". All-round tool like Runner, a simple strategic game, and an archive tool for the Atari ST magazine TOS. + +{% pseudonymBox "The software group pseudonyms" %} + +Olympic Arts +mainly Matthias, his brother, and sometimes Stefan + +Tropic DREAMs +mainly Stefan + +{% endpseudonymBox %} + +## The PC Games + +In about 1992, Matthias and I bought a 486 Intel personal computer and quickly learned to develop on this processor. Our main language was Turbo Pascal with more and more inline assembler from Stefan. The first type of software we wanted to develop was games. + +- Glücksrad (1993) + The first PC software release in 1993. Code by Stefan, graphics from Matthias, and PC-Speaker sound sampled from the 'Wheel of Fortune' show on Sat1. The idea, of course, comes from 'Wheel of Fortune'. Recommended computer: 486 with DOS. [... download (400kB)](https://www.moonweb.org/files/pc/esprit/grad1993.zip) + +- Tetris (1994) + Fully playable two-player Tetris competition preview. Complete coding and graphics by Stefan. Never finished a release version, but this version is very playable. Released under 'SkyLINE Production'. Recommended computer: 486 with DOS. Now available as DOSBox version for Windows and modern systems. + [... download DOSBOX Version](https://www.moonweb.org/files/pc/skyline/tet_comp_dosbox.zip) + +{% pseudonymBox "The software group pseudonyms" %} + +Tr@nceMISSION +mainly Stefan, the goal was to build games and demos on the PC, but there was only one game release and some small demos and intros +Tr@nceMission Website with Sourcecode + +SkyLINE Productions +mainly Stefan, the goal was to build serious applications on the PC. SkyLINE existed from 1993 until 1995 and released about 15 tools and demos +SkyLINE Production Releases + +PHOB!A +was a short-lived PC demo group in 1994. It released the Phobia Welcome Intro, coded in Turbo Pascal with inline assembler, using palette tricks for animation and a custom font. +PHOB!A Website with Sourcecode + +{% endpseudonymBox %} + +## The PC Intros and Demos + +Matthias and I always looked at the famous PC demos and thought about the way to code them. Several small demo releases deserve mention. + +- phobia-intro (1994) + The best intro ever coded by me (Stefan). Some parts are faked, but it looks really good. I will try to make a screenshot soon and put the source and the executable into an archive for download. Meanwhile, you can read about the PHOBIA and the demo group story. Sorry, the links on this page do not work. ... read more + +- Copperintro (1995) + A really interesting demo with more than 100 colors in text mode done with Amiga copper-like effects. Only works on an old 486 PC. Perhaps it will run under Pentium, too. Just test it. [... download (10kB)](https://www.moonweb.org/files/pc/skyline/copperint.zip) + +## The PC Tools + +- DOSMENU II (1994) + The only boot selector that could change config.sys and autoexec.bat parameters while booting. There has never been a tool like this. It might be useful for you. A must for a DOS machine. + [... download (170kB)](https://www.moonweb.org/files/pc/skyline/dosmenu.zip) + [... free reg-key by email](mailto:dosmenu-reg-key@moonweb.org) + +- misc Tools (1995) + SkyLINE released even more tools, especially the XLIBUNIT for Turbo Pascal for direct VGA functions. I will release the source code as public freeware, not sure if anyone would need it. Mostly assembler code, maybe just for fun to read through :) + ... X Lib Unit on Github diff --git a/timecapsule/src/projects.md b/timecapsule/src/projects.md new file mode 100644 index 0000000..66a3071 --- /dev/null +++ b/timecapsule/src/projects.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/projects.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/projects/index.md b/timecapsule/src/projects/index.md new file mode 100644 index 0000000..c01f475 --- /dev/null +++ b/timecapsule/src/projects/index.md @@ -0,0 +1,103 @@ +--- +title: "The projects" +description: "Explore the diverse projects at moonweb.org, from computer programming and game development to networking and music projects. Learn about our journey in IT knowledge building since 1988." +section: projects +permalink: "/timecapsule/projects/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +The main goal of moonweb.org projects is to build up IT knowledge. Over the past 13 years, through a continuous learning process, I have gained extensive experience in various areas of IT. + +## Computer Programming Projects + +Over the years, several products have been released through various development projects. These projects began in 1988 on our first computers, the Atari STFM 1040. More detailed information can be found in the projects section. + +The Atari ST Products +Our first project involved coding simple programs. Matthias focused on medium resolution programming, while Stefan worked on high resolution. As 12-year-olds, we primarily coded games but also developed some useful tools. + +- International Kegeln and Bowling (1990): Our first release, a complete but barely playable bowling game. + +- Runner (1991): An all-round helper tool with a database, memo, system overview, and a game. + +- Atom Oh No! (1991): A game inspired by Atomix on the Amiga, including a level maker and 10 demo levels. + +- TOP Tools (1992): Small tools and a game, including a strategic game and an archive tool for the Atari ST magazine TOS. + +The PC Games +In 1992, we started developing on a 486 Intel personal computer using Turbo Pascal and inline assembler. Our initial focus was on game development. + +- Glücksrad (1993): A 'Wheel of Fortune' inspired game with graphics and PC-Speaker sound. + +- Tetris (1994): A two-player Tetris competition preview, very playable but never finished. + +The PC Intros and Demos +We were inspired by famous PC demos and released some small demo projects. + +- phobia-intro (1994): A visually impressive intro. + +- Copperintro (1995): A demo with more than 100 colors in text mode, using Amiga copper-like effects. + +The PC Tools +We also developed several tools for DOS. + +- DOSMENU II (1994): A boot selector that could change config.sys and autoexec.bat parameters while booting. + +- misc Tools (1995): Various tools, including XLIBUNIT for Turbo Pascal with direct VGA functions. + +## Mailbox/BBS/Fidonet Projects + +- BBS and Fidonet node (dates approximately 1994 - 2000) + +- Node in Augsburg with uplink directly to the NC in Munich + +- Operated on an OS/2 machine + +- 2x ISDN, 1x MODEM + +- Approximately 20 subnodes and points + +- Bavaria HUB/HOST for various Alt-Nets + +## Networking Projects + +- Home network with various Linux servers and Windows NT 4.0 + +- pfSense firewall predecessor + +- FreeBSD server with Apache/Sendmail/Perl scripts + +- NT 4.0 file server + +- Windows 98 and Windows 2000 hosts + +- Better information at [/timecapsule/network/](/timecapsule/network/) + +## Practical Projects at IXOS SOFTWARE AG + +- Redesigned the Jukeman website (in ASP classic and MSSQL) + +- Prepared rooms for R/3 training sessions + +- Worked in the innovation department + +- Developed blockchain technology for contract signing in Java + +- Created an R/3 module for Jetforms form editor in ABAP and C++ + +## Music Projects + +Music has always been a significant part of my life. Since 1995, I have been mixing on turntables and composing my own songs, although they were never quite professional. + +The Music on Computers +I started by composing music on the computer using MOD-Trackers. While these tracks were very computer-based, they didn't sound like real music. + +- Examples from 1993: wizard.mod (46kB), run_away.mod (43kB) + +- Electronic techno-steps from 1994: lit_rave.mod (55kB), nxt_rave.mod (32kB) + +The Live Synthesizer Music +We later experimented with live music, resulting in two tapes of live recordings, including a session from S.O.N.A.X meets Genital Angriff and a solo tape from Genital Angriff. + +The Live Turntable Mixing +I started mixing live at private and smaller parties. Some notable events include the 'all areas party prince garden' and winning 2nd place in a DJ competition. You can find a live recording of the afro-cosmic-double-mix with my DJ friend Marc Le Nain from Private Lounge Party V. diff --git a/timecapsule/src/robots.njk b/timecapsule/src/robots.njk new file mode 100644 index 0000000..a6862c2 --- /dev/null +++ b/timecapsule/src/robots.njk @@ -0,0 +1,8 @@ +--- +permalink: "/timecapsule/robots.txt" +eleventyExcludeFromCollections: true +--- +User-agent: * +Allow: / + +Sitemap: {{ site.domain }}/sitemap.xml diff --git a/timecapsule/src/sitemap.xml.njk b/timecapsule/src/sitemap.xml.njk new file mode 100644 index 0000000..b8666ae --- /dev/null +++ b/timecapsule/src/sitemap.xml.njk @@ -0,0 +1,12 @@ +--- +permalink: "/timecapsule/sitemap.xml" +eleventyExcludeFromCollections: true +--- + + +{%- for page in collections.all %}{% if page.data.layout != "redirect.njk" and page.data.permalink != "/sitemap.xml" and page.url != "/404/" %} + + {{ site.domain }}{{ page.url }}{% if page.data.lastChanged %} + {{ page.data.lastChanged | toIsoDate }}{% endif %} + {% endif %}{% endfor %} + diff --git a/timecapsule/src/start.md b/timecapsule/src/start.md new file mode 100644 index 0000000..97c9129 --- /dev/null +++ b/timecapsule/src/start.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/start.html" +redirectTo: "/" +layout: redirect.njk +--- diff --git a/timecapsule/src/stefan/index.md b/timecapsule/src/stefan/index.md new file mode 100644 index 0000000..547c1f6 --- /dev/null +++ b/timecapsule/src/stefan/index.md @@ -0,0 +1,26 @@ +--- +title: "The person" +description: "Learn more about Stefan Kölle, including contact details, favorite radio stations, and electronic music preferences. Discover additional background information." +section: stefan +pageTitle: "The person" +permalink: "/timecapsule/stefan/index.html" +layout: layout.njk +lastChanged: "5/1/2001" +--- + +![Stefan Koelle Munich](/timecapsule/assets/content/stefan-koelle.jpg) +Stefan Kölle +Neumarkter Str. 86c +81673 München +Germany + +phone: +49-89-20006547 +email: stefan.koelle@moonweb.org + +Favourite radio station: FM4 +Favourite internet radio: Soma FM +Favourite electronic band: Autechre + +## Links + +[More background information about myself](/timecapsule/background/) diff --git a/timecapsule/src/users.md b/timecapsule/src/users.md new file mode 100644 index 0000000..cee5efa --- /dev/null +++ b/timecapsule/src/users.md @@ -0,0 +1,5 @@ +--- +permalink: "/timecapsule/users.html" +redirectTo: "/" +layout: redirect.njk +---