All Projects
Full StackProduction

Y-Ultimate App

Full-Stack Youth Development Platform for Ultimate Frisbee Non-Profit

PythonDjangoFlaskPostgreSQLRedisDockerTailwind CSSHTMXAlpine.jsRazorpayGoogle OAuth/Calendar/SheetsSentryMetabaseJinja2SSGCaddyDrone CI

Overview

A full-stack web application for a non-profit organization using Ultimate Frisbee for youth development in India. The platform combines a public-facing PWA with an internal admin system managing 5000+ child profiles across 500+ batches.

5000+

Child Profiles Managed (profiles)

500+

Batches Supported (batches)

2

Tenants (Camp + Coaching)

The Problem

A non-profit running Ultimate Frisbee programs for youth across India needed a unified platform to manage thousands of child profiles, track attendance with gender breakdowns, process payments/donations, and provide public-facing program information — all while operating with limited technical resources.

What I Built

Built a multi-tenant Django + Flask application with PostgreSQL database routing to separate Camp and Coaching program data. Public PWA built with Tailwind CSS, HTMX, and Alpine.js, statically generated via Jinja2SSG and deployed to Netlify. Internal admin handles attendance tracking, Razorpay payment processing (recurring subscriptions + one-time donations with webhook handling and PAN validation), automated midnight attendance summaries, coach reminder emails, Excel import/export with Google Sheets integration, and row-level RBAC using PostgreSQL ArrayField.

Architecture

Django + Flask multi-tenant backend with PostgreSQL schema-per-tenant routing. Public PWA statically generated from Jinja2 templates via Jinja2SSG. Containerized with Docker Compose, Caddy reverse proxy, Drone CI/CD pipeline. Media stored on Linode S3. Monitoring via Sentry and Metabase.

Technical Decisions

  • Multi-tenant architecture with PostgreSQL schema routing for clean data isolation between Camp and Coaching programs.
  • Jinja2SSG for static PWA generation — zero server cost, fast loads, easy Netlify deployment.
  • HTMX + Alpine.js over React for the public PWA — simpler, smaller bundle, progressive enhancement.
  • PostgreSQL ArrayField for row-level RBAC — granular permissions without separate ACL tables.
  • Django + Flask split — Django for admin/auth/ORM, Flask for lightweight webhook handlers.

Multi-tenant data isolation

Routing 5000+ child profiles across 500+ batches to correct tenant schemas while maintaining query performance and referential integrity.

Payment webhook reliability

Handling Razorpay webhooks for recurring subscriptions and donations with idempotency, PAN validation, and graceful failure recovery.

Automated notification timing

Midnight attendance summaries and coach reminders must fire reliably across timezones without duplicate sends.

My Contribution

  • Architected and built the multi-tenant Django + Flask backend.
  • Implemented attendance tracking with gender breakdowns and monthly statistics.
  • Integrated Razorpay for subscriptions and donations with webhook handling.
  • Built automated notification system (midnight summaries, coach emails).
  • Created Excel import/export with Google Sheets integration.
  • Implemented row-level RBAC using PostgreSQL ArrayField.
  • Developed public PWA with Tailwind, HTMX, Alpine.js via Jinja2SSG.
  • Set up Docker Compose, Caddy, Drone CI/CD, Linode S3, Sentry, Metabase.

Have a similar project in mind?

Let’s discuss how we can build something great together.