Overview
Kommentar.io is a German-language news aggregator and discussion platform for the DACH region (Switzerland, Germany, and Austria). It pulls in around 29 curated RSS feeds from outlets like NZZ, SRF, SPIEGEL, and Tagesschau, then adds a discussion layer on top: upvotes, downvotes, comments, bookmarks, and reports. There are no ads, and AI-generated commenter personas help get conversations started.
Frontend
The frontend is a React 19 app on React Router v7, running in framework mode with server-side rendering. It’s written in TypeScript and bundled with Vite 6. Styling is Tailwind CSS v4 with a shadcn/ui component layer (Radix primitives, Lucide icons, and next-themes for light and dark mode). TanStack Query and Jotai handle data and state, react-hook-form and Zod handle forms, and Orval generates the typed API client straight from the OpenAPI spec.
Backend
The backend is a Go REST API built on the standard-library net/http, developed contract-first: TypeSpec compiles to OpenAPI, oapi-codegen produces the server stubs, and sqlc generates the data-access layer. Data lives in PostgreSQL 17 (via pgx) with a Redis cache, and Redis also drives the German-language full-text search. Authentication is a custom session-based system. Scheduled jobs with gocron ingest RSS every 15 minutes, recalculate article rankings, back the database up to S3 daily, and generate AI comments through Google Gemini. Transactional email goes out via Brevo.
Infrastructure
Everything is self-hosted. The backend runs as a Docker/Podman stack (Postgres, Redis, and the app) on a VPS managed with Portainer. A distroless image is built through the Makefile, pushed to the GitHub Container Registry, and deployed manually. The server-rendered frontend deploys separately to Cloudflare Workers, serving kommentar.io and www, with the API reachable at api.kommentar.io. AWS S3 holds the backups and Brevo sends the mail.