Penya Blaugrana San Diego

Official Supporters Group Platform

This project serves as the digital headquarters for Penya Blaugrana San Diego (Official Penya #2309). It solves the complex logistics of managing a non-profit supporters group by automating match schedules, handling seasonal membership renewals without data duplication, and providing a fully localized experience (EN/ES/CA) for a diverse community.

The Challenge

The organization needed a way to manage recurring seasonality without creating duplicate records for returning members. Additionally, match schedules change frequently, and manually updating the homepage was prone to error.

The Solution

I engineered a 'NextMatch' component that acts as the site's heartbeat. It interfaces with an external sports API to fetch the season schedule and uses client-side time logic to automatically rotate the hero banner to the immediately upcoming fixture.

For the membership system, I moved beyond simple CRUD. I implemented a 'Smart Upsert' strategy in PostgreSQL. Using a text array column (`seasons_active`), the system tracks a member's entire history in a single row, simply appending the new season upon renewal while preserving their original join date.

  • Full localization (i18n) for English, Spanish, and Catalan users.
  • Bento Grid gallery layout for a modern, responsive visual experience.
  • Secure Admin portal for toggling 'Watch Party' status on specific matches.

Tech Stack & Architecture

CategoryTechnologies
Frontend & Framework
Next.js 15 (App Router), React, TypeScript, Tailwind CSS
Backend & Data
Supabase (PostgreSQL), SQL Functions, External Sports API
Internationalization
next-intl, Middleware routing
Integrations
Stripe Payments, Framer Motion

Key Features

  • Dynamic Match Scheduler
    1. - Automated sync fetches fixtures via external API, reducing manual entry.
    2. - Time-aware 'Smart Display' automatically promotes the next upcoming match.
    3. - Location logic distinguishes between Home (Barcelona) and Away context.
  • Membership Engine
    1. - Custom SQL upsert logic handles new vs. returning veterans to prevent duplicates.
    2. - Uses PostgreSQL text[] arrays to track historical 'seasons_active' (e.g., ['24/25', '25/26']).
    3. - Conflict resolution allows profile updates (phone/name) during renewals.
  • Admin Dashboard
    1. - Role-based access control via Supabase Auth for board members.
    2. - Global config controls to toggle membership enrollment windows.
    3. - Match control system to designate specific fixtures as 'Official Watch Parties'.
  • Venue & Community
    1. - Interactive Google Maps integration for the Otay Ranch headquarters.
    2. - Responsive Bento Grid gallery showcasing the atmosphere and tech.
    3. - Digital 'Chants' songbook replacing physical paper sheets.
    Jonathan Mendoza

    Creative work starts with curiosity and ends in clarity.

    Portfolio v2.3 © 2025 Mendoza.