← Back to projects

Gutzkowclub e.V. — Website

Public website of Dresden’s oldest student club (since 1964): program, drinks menu, history, contact.

Gutzkowclub e.V. — Website

Gutzkowclub e.V. has run Dresden’s oldest student club since 1964. The public website presents the club’s history, program, drinks menu, team, and contact details — a third system alongside the internal club administration (Gutz Intern) and the central editorial admin (Gutz Admin), with which it synchronizes instead of maintaining its own island solutions.

Gallery

Case Study

Situation

The legacy content existed as a WordPress export. The new website had to work as a third system within an existing three-app landscape, without requiring editors — club members with no developer background — to maintain content in code.

Challenge

A nightly cross-system synchronization (Google Calendar → internal calendar → duplicate cleanup → diff check → push-back of public events, 1:15–3:30 AM) had to run reliably and safely against overlap. On top of that came the automated migration of decades-old WordPress content, including filtering out private categories and cleaning up Gutenberg shortcodes. The Filament admin panel originally included in this app was later removed entirely, moving editorial work out into the separate Gutz Admin app — a deliberate decoupling of frontend and content maintenance.

Approach

Laravel (started on version 12, since updated to 13), PHP 8.4, Blade templates with no SPA framework, Tailwind CSS 4 and Vite 7. No CMS left in its own repository — content maintenance runs through Gutz Admin, while gutz-web reads data such as the drinks menu directly from the Gutz Intern database in places.

Decisions

Three-app separation instead of a monolith

Removed the Filament admin from the public frontend; editorial work now runs through the separate Gutz Admin app, which reduces coupling and attack surface in the public part.

Drinks menu read uncached, straight from the Intern DB

An editorial change should show up immediately; the cache stores of the three apps are deliberately not shared.

Calendar sync with an explicit verification step

A dedicated scheduled job compares both calendar sources and actively reports divergences instead of silently tolerating them.

Anti-spam without a third party

Honeypot, time trap, and rate limiting for the contact form instead of an external captcha service.

Self-audit as a fixed process step

Four parallel read-only audits (backend, UI/UX, frontend assets, SEO/config) were documented — with concretely named open findings instead of a black box.

My contribution

All 131 commits are by Felix Schattenberg, built solo.

Results

Operation
live at gutzkowclub.de
Commits
131 over roughly 7 months of active development, including a Laravel major-version upgrade during the project’s lifetime
Deployment
Zero-downtime via Deployer, atomic symlink swap

Search & navigation

Navigate Open Esc Close