All work

Prag Kartalları

In development

Prag Kartalları v2 — Association Management Platform

Full-stack Next.js platform replacing the existing site. Member portal with authentication, admin panel, financial tracking, automated match data, and trilingual content.

Next.js TypeScript PostgreSQL Prisma Auth.js Tailwind CSS shadcn/ui

The brief

Prag Kartalları is a Beşiktaş football club supporters’ association based in Prague. The existing PHP site handles match data well, but the association needs much more: member registration and authentication, payment tracking, receipt generation, an admin panel for the board, and financial reporting. The scope outgrew what the old stack could support cleanly, so a complete rewrite is underway.

What is being built

A full-stack Next.js 15 application that will replace the current site. It serves three audiences: the public, registered members, and board administrators.

The public site carries over the match centre from the current version — live scores, fixtures, standings, squad — alongside announcements and association information. All public content is trilingual in Turkish, English, and Czech.

The member portal handles the full membership lifecycle. New users register, complete their profile, submit a membership payment (bank transfer with QR code or cash), and wait for board approval. Once active, members can view their payment history, download PDF receipts, and manage their profile.

The admin panel gives the board full control: member management with status workflows, payment approval queues, receipt generation and email delivery, announcement publishing, newsletter composition via Resend, document management, and monthly financial reports with PDF export. All admin actions are tracked in an audit log.

Automated systems

The match data pipeline carries over from the current version but runs through GitHub Actions instead of cron-job.org:

  • Nightly — syncs fixtures, squad, and events from ESPN and API-Football.
  • Hourly — updates Süper Lig standings and team logos.
  • Matchday — fires every minute during a live BJK match. Fetches score and events in real time.

Additional automations: daily database backups to Google Drive, queued newsletter delivery (batched to stay within Resend limits), and retry logic for failed Drive uploads.

Technical notes

Server Components are the default — data fetching happens at the component level for SEO. All mutations go through Server Actions with shared Zod validation schemas. Authentication uses Auth.js with a credentials provider and JWT strategy. The member status flow (registration → profile completion → payment → approval → active) is enforced by middleware.

PDF receipts are generated server-side with @react-pdf/renderer — no client-side PDF burden. Financial reports support monthly and yearly breakdowns with versioned PDF export and month finalization that locks data against further edits.

Stack

Next.js · TypeScript · PostgreSQL · Prisma · Auth.js · Tailwind CSS · shadcn/ui · Resend · Zod · GitHub Actions · Hetzner · Nginx · Let’s Encrypt

Have a similar project?

I'm available for new engagements. Let's talk.