arrow_back Work
chevron_left ALL_WORK
Client Project / Sole Developer

Sangathan Events.

A multi-tenant, QR-based event attendance platform for multi-state organizations — bulk QR/ID card generation, real-time scanning, CSV onboarding, OTP self-registration, and automated WhatsApp distribution.

PHP (Custom MVC) FastAPI Python (Pillow) Celery Redis MySQL Twig DigitalOcean
lock Code: Private (client IP)
90%
Card generation time reduction
2s → 0.2s
Per-card generation
10,000+
Attendees across concurrent events
4 workers
Celery, batches of 50

The Problem

Large events (10,000+ attendees) needed printed QR ID cards. The original PHP implementation was synchronous and CPU-bound — one card every 2 seconds. A 10K-card event meant roughly 5.5 hours of blocking server time. Infeasible.

The Solution — Microservice Extraction

The Hard Part

bolt

Multilingual ID cards broke in production

Under a live event deadline, ID-card rendering failed for regional-language (Devanagari) text — Pillow's font rendering couldn't shape the glyphs. I debugged font loading, glyph shaping, and text encoding, and shipped the fix before the event started. A real production war story with no room to slip the date.

Key Features

Trade-offs & What v2 Adds

Why sync for single cards, async for bulk?

Balances UX responsiveness for one-offs against system load for large batches.

Why a batch size of 50?

A tuned balance between per-worker memory usage and total processing time.

What v2 would add

Redis caching for event data, WebSockets for live attendance updates, and JWT replacing session auth.

Want the full walkthrough?

Happy to walk through the bottleneck diagnosis, the microservice design, and the production fix in detail.