Beautiful statically generated frontend for Etho’s appearances across the web
This project turns a living spreadsheet of videos into a clean, visual timeline.
Right now it is a static web app backed by generated JSON from the data pipeline in sheet-pipeline/.
Over time, this can evolve into a fuller web application, but today the workflow is intentionally simple and dependable.
sheet-pipeline/pipeline.pyexports a public Google Sheet and preserves rich-text links.sheet-pipeline/video_enrich.pyfetches metadata (titles/thumbnails) for YouTube and Twitch links.- The pipeline writes
data/out.enriched.json. web/(Eleventy) reads enriched data and renders month-paginated static pages.
- Reusable video card component (title, creator, media/content type, notes, timestamps, thumbnail)
- Month-based pagination (
/for latest,/<YYYY-MM>/for older months) - Top and bottom previous/next month navigation
- Quick month controls (latest, oldest, month picker jump)
- Locale-aware month/date formatting in browser
VOD⏳helper note (Likely expired) shown after 2 months- Theme support: System default + Light/Dark switcher
cd sheet-pipeline
docker compose build./scripts/allcd ../web
npm install
npm run devOr with Docker Compose:
cd web
docker compose -f compose.yml up -d devThe web container reads pipeline output from:
- host:
data/out.enriched.json - container:
/app/src/_data/out.enriched.json(viaENRICHED_JSON_PATH)
sheet-pipeline/: Dockerized extraction + enrichment pipelinesheet-pipeline/scripts/: helper scripts (extract,enrich,all)data/: generated outputs used by the frontendweb/: Eleventy frontendweb/src/_includes/: reusable Nunjucks templates/componentsweb/src/_data/: normalized data loaders used by templatesweb/src/assets/: frontend CSS and JavaScript, and image assets
out.enriched.jsonis the frontend’s source of truth.- Pipeline config lives in
sheet-pipeline/.env. - This project expects a public Google Sheet (no OAuth flow required).
video_enrich.pykeepsmetadata.last_updatedunchanged when thevideosarray has no content changes.
If you find a bug, spot data issues, or want to propose a new feature, please open an issue in this repository. Contributions and suggestions are welcome.