Search projects, hackathons, sponsors and tech

    ← All projects

    Rivalry

    Race friends or human verified strangers across the world, same distance, same difficulty!

    Demo

    About

    This project is a blockchain enhanced irl version of zwift, initially designed for running but will expand to other sport disciplines. Say you're travelling in Sydney for a couple days, your friend is in London and you're both training for a marathon. With Rivalry you can continue training together by racing an equally distanced equally difficult running route (adjusted for elevation gain) at the same time. Perhaps none of your friends are awake and you cant be bothered to search for running groups, you can select the stranger mode and be matched with someone who wants to run the same distance, to prevent running against a clanker you prove your humanhood, for races with greater time commitment, there are additional verifications so that you have greater reassurance.

    How it's made

    Rivalry is an Expo (React Native, TypeScript) app for iPhone and Android. Users sign in by email with Privy. The backend runs on Supabase: Postgres plus Deno Edge Functions. Each function checks the user's Privy login token itself, and the database tables are closed to direct access from the app. Matching, readiness, the countdown, scoring and results are all handled in SQL functions, so both phones always see the same race state. A scheduled background job cleans up abandoned races and deletes precise GPS points once results are saved. Routes come from openrouteservice. I trim each loop to the exact race distance along its own path, so both runners race identical lengths anywhere in the world. During the race, the server matches each GPS fix to the runner's own private route, and friends see each other's position while strangers see only progress. World ID is the trust layer: a fresh Selfie Check is required before two strangers share a start time. The server signs each request, ties it to the specific race, verifies the proof with World, and stores only the pass/fail result. Hacky bits: IDKit's WebAssembly runtime runs in a hidden WebView that hands the World ID link back to the app. I patched Expo's native iOS code to build with an older Xcode. And the 10 km race is a 5 km loop run twice.