The Race Board: two columns of 30-second finish-time slots, one per runner, with taken slots marked
The public race board — every 30-second slot for each runner, filling in as supporters guess.

Purple Pacer

2026· Code review· Security· Express

About

Purple Pacer is a fundraising game for charity marathons: supporters guess a runner's finish time, claim a 30-second slot and donate through JustGiving. It began as a page for two named runners and was rebuilt, largely with Replit's AI agent, into a platform where anyone can run a campaign.

I reviewed it for security and code quality before launch. The fixes closed routes that let one campaign's owner act on another's data, stopped donor badges being claimed without a verified donation, and blocked guesses once results were public — alongside session, upload, rate-limiting and logging hardening. I also reworked parts of the multi-tenant rebuild, including a race board driven by each campaign's own runners, and removed the leftover single-tenant code.

Later I fixed the donation reporting. JustGiving returns donations as XML, which the app parsed as JSON and silently discarded; a supporter backing both runners was counted twice; and hidden amounts read as nothing. Totals are now per donation, include Gift Aid, and show as a floor when donors hide what they gave. React, Express and Postgres.

Screens

Campaign page headed "Running for Riverside Hospice" with buttons to make a guess or see the race board
A campaign page. Each fundraiser gets their own, with their runners, charity and prize.
Guess form with a card per runner showing their stats and a finish-time picker, one set to a randomised time
Supporters pick a slot per runner — or take a random one from the most-guessed window.
Donation stats: £250.00+ raised, 12 donations, 2 hidden amounts, plus Gift Aid, above a list of submissions
Donation stats after the fix: distinct donations, Gift Aid, and hidden amounts reported as a floor rather than £0.
Campaign settings with prize, a verified JustGiving URL and a guess timeframe slider
Campaign settings — JustGiving page verification and the guessing window.