0cda40f85e853cd376e095aef5b22ba496e52eeb
Replaces the Angular 18 app with Next.js 16 / React 19 / Tailwind 4 / shadcn, the same stack and design system as nachklang-feedback, planned in docs/rewrite-plan.md. - Admin: all calendars in one mobile-friendly list (month groups, calendar chips, Kommend/Vergangen/Alle, search, sort, filters in the URL), an edit sheet for create/edit/duplicate/delete, publish confirmation, and an "Abonnieren" dialog with subscription links for every calendar. - Public landing page: subscribe links from env instead of hardcoded, plus the next public events, server-rendered and revalidated every 5 minutes. - All times handled explicitly as Europe/Berlin; whole-day events stored as 00:00-23:59. Fixes carried over from the Angular app: the move dialog leaking a cancelled calendar change, saves that looked saved when they failed, in-place Date mutation, and duplicated calendar-id mappings. - Same shared-session auth as before (proxy.ts gate, /admin/me, 401 vs 403). - 112 Vitest tests over lib/; docs in docs/ (architecture, features, gotchas, API wish list, deployment). Needs the API branch feature/calendar-ical-escaping-subscriptions deployed first (GET /calendar/events/subscriptions). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nachklang Calendar
Event calendar for Nachklang e.V.: a public landing page for subscribing to the calendar, and an
admin area (/admin) for editing events in all calendars.
Next.js (App Router) + TypeScript + Tailwind + shadcn, the same stack as nachklang-feedback.
Rewritten from Angular in September 2026 (docs/rewrite-plan.md).
Documentation: architecture · features · gotchas · deployment · API wish list
Development
cp .env.local.example .env.local # then adjust if needed
npm install
npm run dev # http://localhost:4200
Port 4200 is not arbitrary: it is the port the API's better-auth origins and the admin app's redirect allow-list trust. Another port breaks sign-out and the return redirect after sign-in.
The admin area needs the API (:3000) and the admin app (:3002) running locally.
Other scripts
npm run build # production build (output: standalone; see docs/deployment.md)
npm run lint
npm test # Vitest, pure logic in lib/
Languages
TypeScript
60.8%
CSS
19.3%
HTML
17.4%
JavaScript
2.5%