The Clubworks Data Platform's services on Railway: the crawler (FlareSolverr, Flower, Celery workers and beat), Redis, the frontend, and the processing services.

Clubworks Data Platform.

A distributed scraping platform that ingests 30GB/month across 12 locations, 2 providers, and 6 timeslots — in under 3 minutes per cycle, down from 45.

Role
Founding Engineer @ Clubworks (Contract)
Timeline
2025 — 2026
Category
Data Pipeline

Working is not the same as scalable.

Clubworks needed a way to systematically scrape and index location-based pricing data from multiple providers. I built the entire system solo — from scrapers to task orchestration to the frontend dashboard. Two major iterations: the first worked, the second is production-grade.

V1 worked, but it hit a ceiling

Jobs ran sequentially through BullMQ, Selenium-based scrapers couldn't scale, and a full scrape took 45 minutes. Individual scraper concurrency and multi-scraper parallelism became bottlenecks at production volume.

V2 decoupled everything.

Celery + Celery Beat for scheduling, Playwright for browser automation, FlareSolverr for complex cookie management. Added circuit breakers, dynamic rate limiting, cookie jar to reduce proxy costs. Backend consumes Redis Streams with parallel batch processing. The architecture now scales.

V1

one at a time

45 min

V2

20 concurrent Celery workers

under 3 min

Scrapes 12 locations × 2 providers × 6 timeslots in under 3 minutes, down from 45 (15×)

Celery Beat schedules daily/weekly/monthly/yearly scrapes.

In under 3 minutes per cycle, down from 45.

Coverage
12 x 2 x 6
Cycle
< 3 min
Throughput
~30 GB / mo
Speedup
15×
  • Scrapes 12 locations × 2 providers × 6 timeslots in under 3 minutes, down from 45 (15×)
  • Extracts ~30GB/month of pricing data, stored in NeonDB with snowflake-style aggregation
  • 20 concurrent Celery workers with tuned threading for Playwright + FlareSolverr sessions
  • Redis TTL caching (3 min) for hot data, eliminating frontend latency spikes
V1 taught me that 'working' isn't the same as 'scalable.' It worked, but when we needed more concurrency, the architecture couldn't support it. V2 was about building room to grow. Celery made all the difference.
  • Python
  • Celery
  • Redis Streams
  • Playwright
  • Express.js
  • Next.js
  • NeonDB
  • Prisma
  • Docker