Skip to content

ADR-0005: Wagtail as the CMS for gamine.org

Status: Accepted
Date: 2026-05-21
Decision-maker: João Brazão

Context

gamine.org was on WordPress/SiteGround (third-party cloud). The replacement must be self-hosted, Python-native (to match the JB stack), multilingual (PT+EN), and expose a programmatic import API for the gamine-brain "factory → product" pipeline.

Alternatives evaluated: Strapi (Node.js — wrong runtime), Ghost (Node.js + no i18n), Contentful (SaaS — violates sovereignty boundary), Payload CMS (Node.js).

Decision

Wagtail 6.x (Django/Python) — self-hosted on VPS at /opt/gamine-cms, Dockerised, PostgreSQL storage in infra-postgres (gamine_cms DB), MinIO for media.

Key factors: Python runtime, wagtail-localize for PT/EN, server-side rendering (no headless double-build), django-otp for admin 2FA, RGPD-compliant by default.

Consequences

  • Single Python/Docker ecosystem across all JB services.
  • gamine-brain approve flow POSTs to /api/cms/import/post/ to create Wagtail drafts.
  • Editor Guide (PT) needed for Marta + Alice (Vikunja #646).
  • Django migrations add deployment ceremony; managed via manage.py migrate in entrypoint.
  • ADR-0001: No public cloud / no GitHub
  • ADR-0004: Paperclip skills architecture