01 About the project

Kulturplattform Freiburg e. V. runs events, courses and community formats in Freiburg. The platform maps what the association actually does: activities with categories, search and detail pages, course offerings, partners, the statutes, donations and a form for volunteers. The board maintains all of it themselves — including the translations, which live as resources in the database and are edited in the admin area. A new text in German and Turkish therefore needs no deployment.

The backend is a .NET 10 service in Clean Architecture with CQRS via MediatR, FluentValidation for input, JWT and BCrypt for sign-in, and Entity Framework Core on SQL Server — around 22 controllers, plus tests at domain, application and integration level. The newsletter isn’t a mailto link but a proper flow: double opt-in with a confirmation link, an unsubscribe token in every message, campaigns per language and batched sending, through Azure Communication Services with SMTP as a fallback.

It all runs on a dedicated server: Docker Compose with SQL Server, the API and nginx, dedicated mailboxes for sending, and backup and restore scripts alongside. The front-end is a React single-page app talking to the same API.

02 Highlights

  • 01

    Activities with category filter, search and detail pages

  • 02

    Course offerings, partners, statutes, donations and a volunteer form

  • 03

    Bilingual (DE/TR) — translations live in the database, not in the code

  • 04

    Newsletter with double opt-in, unsubscribe token and per-language campaigns

  • 05

    Delivery via Azure Communication Services with SMTP fallback

  • 06

    Clean Architecture with CQRS (MediatR) and FluentValidation

  • 07

    Tests at domain, application and integration level

  • 08

    Self-hosted: Docker Compose with SQL Server, API and nginx, dedicated mailboxes

03 Tech stack

  • ⚛️React
  • 🔷.NET 10
  • 🗄️SQL Server
  • 🧩MediatR / CQRS
  • 📦Entity Framework
  • 🐳Docker
  • 🔀nginx
  • 🧪xUnit

Interested in
working together?

Tell us about your plan — we’ll tell you honestly what it takes and what it costs.

Get in touch