little tools to convert lists of events https://eventdb.mayer.rocks/
  • HTML 98.7%
  • Python 1.2%
Find a file
Ralph Mayer eecdaac8af drop forgejo ci workflow, build locally with podman
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 20:43:00 +02:00
eventdb P3: translations to JSON, logging, pre-commit, build verification 2026-03-15 19:08:51 +01:00
output standardize repo: baseline rollout (8 mandatory files) 2026-03-29 19:39:55 +02:00
tests add test suite, config file, security fixes, robustness improvements 2026-03-15 18:24:58 +01:00
.env.example add docker deployment with forgejo ci and sftp upload 2026-03-30 22:14:03 +02:00
.gitignore standardize repo: baseline rollout (8 mandatory files) 2026-03-29 19:31:53 +02:00
.pre-commit-config.yaml P3: translations to JSON, logging, pre-commit, build verification 2026-03-15 19:08:51 +01:00
CHANGELOG.md add test suite, config file, security fixes, robustness improvements 2026-03-15 18:24:58 +01:00
CLAUDE.md migrate todos to central issue tracker, update CLAUDE.md 2026-03-15 23:40:46 +01:00
compose.yaml drop forgejo ci workflow, build locally with podman 2026-03-31 20:43:00 +02:00
deploy.sh add docker deployment with forgejo ci and sftp upload 2026-03-30 22:14:03 +02:00
Dockerfile Update Dockerfile 2026-03-31 20:39:41 +02:00
entrypoint.sh add docker deployment with forgejo ci and sftp upload 2026-03-30 22:14:03 +02:00
eventdb.toml add test suite, config file, security fixes, robustness improvements 2026-03-15 18:24:58 +01:00
inbox.md Update inbox.md 2026-03-31 19:42:38 +02:00
LICENCE LICENCE 2026-03-05 20:35:50 +01:00
LICENSE Initial commit 2014-08-23 20:24:51 +02:00
Makefile update Makefile to baseline revision 4 (check-baseline + update targets) 2026-03-30 09:44:25 +02:00
myproject.toml add myproject-toml revision to baseline tracking 2026-03-29 19:41:58 +02:00
pyproject.toml add feed importer, json export, update docs 2026-03-13 20:35:00 +01:00
README.md drop forgejo ci workflow, build locally with podman 2026-03-31 20:43:00 +02:00
tickets.org standardize repo: baseline rollout (8 mandatory files) 2026-03-29 19:31:53 +02:00
uv.lock add category filters, month pages, search+filter combo 2026-03-05 23:16:23 +01:00

mr-eventdb

Generates an ICS calendar, RSS feed, JSON export and a static HTML page from mr-eventdb-data data.

Live at eventdb.mayer.rocks

Features

  • Multilingual — 12 languages (de, en, nl, fr, it, es, pl, da, el, et, lv, lt) with automatic browser language detection
  • Interactive map — Leaflet/OpenStreetMap with MarkerCluster, tag filters, and past event toggle
  • Search & filter — full-text search and tag-based filtering across all event tables
  • Countdown — "in X days" / "today" / "tomorrow" for upcoming events
  • Month pages — separate page per month for the next 12 months
  • Venue links — venue names linked to their websites from locationdb
  • ICS calendar — subscribable calendar with all-day multi-day events
  • RSS feeds — per-language feeds with upcoming events
  • JSON export — machine-readable export of all events
  • Duplicate detection — skips imported events that match manual entries (by URL, domain+date, or name+date)
  • Dark mode — respects system preference

Prerequisites

  • Python >= 3.11
  • uv

Usage

Build

uv run eventdb-build

Reads .rec files from ../mr-eventdb-data/data/ and generates:

Output Description
output/index.html Root page with browser language detection redirect
output/{lang}/index.html Main event listing with search, filters, countdown
output/{lang}/map.html Interactive map with tag filters and past event toggle
output/{lang}/YYYY-MM.html Month pages for the next 12 months
output/{lang}/feed.xml RSS feed with upcoming events
output/events.ics ICS calendar (shared across languages)
output/events.json JSON export of all events
output/favicon.svg Favicon

Import ICS feeds

uv run eventdb-import

Fetches ICS feeds configured in ../mr-eventdb-data/data/feeds.rec, extracts upcoming events, writes them to imported.rec, and adds new cities/venues to the locationdb.

Export JSON

uv run eventdb-export

Exports all events as JSON to output/events.json.

URL-Checker

uv run eventdb-urlcheck

Checks all URLs in event data for reachability.

Adding a new language

Add entries to the three dicts in eventdb/translations.py (LANGUAGES, MONTH_SHORT/MONTH_FULL, STRINGS). The build will automatically generate a new subdirectory and include it in the language switcher and browser detection.

Architecture

eventdb/
├── build.py          # main build orchestrator
├── models.py         # Event dataclass
├── rec_parser.py     # recutils parser for events, locations, tags
├── html_gen.py       # HTML generation (main page, month pages, map)
├── ics_gen.py        # ICS calendar generation
├── rss_gen.py        # RSS feed generation
├── export.py         # JSON export
├── translations.py   # i18n strings, month names, language config
├── feed_import.py    # ICS feed importer
├── url_check.py      # URL reachability checker
└── favicon.svg       # calendar emoji favicon

Data sources

File Description
events.rec Main event database
camp.rec CCC Camp series (projected dates)
congress.rec Chaos Communication Congress series
zeitumstellung.rec DST changes (MEZ/MESZ)
schnitzels.rec SchnitzelS monthly meetup series + Auswärtsschnitzel
imported.rec Auto-generated from ICS feeds (do not edit manually)
feeds.rec ICS feed URLs for automatic import

External databases (submodules in mr-eventdb-data)

Deployment

A Docker container clones both repos, builds the site, and uploads the result via SFTP. It runs once at startup and then daily via cron. The image is built locally on the NAS via podman compose build.

podman compose up -d

Configuration via environment variables:

Variable Description Default
SFTP_HOST Upload target host
SFTP_USER SFTP username
SFTP_PATH Remote path for the site
SFTP_PORT SFTP port 22
SFTP_SSH_KEY Private SSH key for SFTP (content)
FORGEJO_SSH_KEY Private SSH key for git clone (content)
CRON_SCHEDULE Cron expression for rebuild 0 4 * * *

See .env.example for a template.

Make targets

Target Description
make build Build the site
make test Run pytest test suite
make clean Remove output directory