Open Source
site
Eleventy based rebuild of christoph fischer.de with:
open-source · codeberg · user · javascript
2026 Static Rebuild
Eleventy-based rebuild of christoph-fischer.de with:
- filesystem-backed content
- migrated sermon archive
- static search via Pagefind
- generated feeds, sitemap, OpenSearch, manifest, and icons
- optional ActivityPub backend for federation
This README is the short operator overview. The fuller runbook is here:
2026/docs/RUNBOOK.md
Requirements
- Node.js 20.x
- npm
rsyncfor deploymentsqlite3for the ActivityPub backend
Install
cd 2026
npm install
cp .env.example .env
Then edit .env for your machine and deployment.
Most Common Commands
Development server:
npm run dev
Full static build with validation:
npm run build
This clears _site/ first, then rebuilds it completely.
Import repository entries from GitHub and Codeberg:
npm run import:open-source
Manual podcast workflow:
# create src/content/podcasts/<show>/index.md
# create src/content/podcasts/<show>/<episode>/index.md + audio file
npm run build
Run the ActivityPub backend:
npm run backend
Build, deploy, and federate newly released public content:
npm run publish
Sermon Workflow
Import the newest Pfarrplaner sermon as hidden:
npm run import:latest-sermon -- --hidden
Import with local file overrides:
npm run import:latest-sermon -- --hidden --audio ~/Audio/predigt.mp3 --image ~/Bilder/titel.jpg
Release a hidden sermon by slug:
npm run release:sermon -- --slug nett
Sync subtitle and liturgical color metadata from Pfarrplaner:
npm run sync:sermon-metadata -- --dry-run
After release:
npm run publish
Open Source Workflow
Repository entries are imported as normal content pages under src/content/projects/imported/.
They are published under /open-source/.
Dry run:
npm run import:open-source -- --dry-run
Real import:
npm run import:open-source
Include organization repositories by setting OPEN_SOURCE_GITHUB_ORGS and/or OPEN_SOURCE_CODEBERG_ORGS in .env.
The full operator details are documented in 2026/docs/RUNBOOK.md.
Optional cleanup of no-longer-present imported repositories:
npm run import:open-source -- --prune
Manual Podcast Workflow
The podcast area is split into podcast series and podcast episodes:
- series page:
src/content/podcasts/<show>/index.md - episode page:
src/content/podcasts/<show>/<episode>/index.md - each episode folder contains its own audio file and optional cover
Series example:
---
title: Christoph talks
summary: Gespraeche, Beobachtungen und digitale Randnotizen.
date: 2026-06-02
cover: cover.jpg
cover_alt: Podcastcover fuer Christoph talks.
podcast_feed_title: Christoph talks
podcast_feed_description: Gespraeche, Beobachtungen und digitale Randnotizen.
podcast_categories:
- Society & Culture
- Personal Journals
---
Diese Seite beschreibt die Reihe. Die Folgen liegen in Unterordnern derselben Reihe.
Episode example:
---
title: Neue Folge
summary: Kurze Beschreibung fuer Archiv, Feed und Suchseite.
date: 2026-06-02
subtitle: Ein moeglicher Untertitel
audio: episode.mp3
audio_duration: 28:14
cover: cover.jpg
cover_alt: Covermotiv der Folge.
episode_number: 1
season_number: 1
---
Einleitungstext, Shownotes, Links und weitere Hinweise.
After the files are in place, the series appears automatically:
- in
/podcasts/ - on
/podcast/<show>/ - with its own feed on
/podcast/<show>/feed.xml - in search and sitemap
The existing sermon podcast stays separate at /podcast.xml and is represented by Christoph predigt in the overview. Full operator notes are in 2026/docs/RUNBOOK.md.
ActivityPub Notes
The backend now stores its state in SQLite by default:
- database:
2026/backend/data/activitypub.sqlite - migrated automatically from legacy JSON files in
2026/backend/data/on first start
Operational helper scripts:
npm run activitypub:block -- --actor https://example.social/users/spam
npm run activitypub:unblock -- --actor https://example.social/users/spam
npm run activitypub:remove-follower -- --actor https://example.social/users/name
npm run activitypub:retry-deliveries
The inbox requires valid HTTP signatures by default, outbound delivery retries are enabled, and followers/outbox are paginated.
Reverse Proxy
A Caddy example is included here:
2026/deploy/Caddyfile.activitypub
Use a public HTTPS ACTIVITYPUB_BASE_URL in .env, even if the backend itself listens only on 127.0.0.1.
Accessibility Standard
Target standard is WCAG 2.2 AA across the whole site, with AAA applied where feasible without harming content clarity.
Repository Layout
2026/
backend/ ActivityPub service
docs/ runbook and operator docs
scripts/ import, release, deploy, validation, migration tooling
src/ Eleventy source
_site/ generated output
Nutzung
Dieser Inhalt wird unter einer GPL 3.0+-Lizenz veröffentlicht. Was das bedeutet, steht hier.
Dieser Inhalt ist in einem Git-Repository auf verfügbar.