RideCircle
Students at Waterloo’s Stratford campus have no bus to the main campus, so they find rides in group chats. RideCircle turns that into something they can plan around, for riders and drivers both.
Tuesday, 7:55 am
Stratford to Waterloo
About an hour by car, and no bus between the two campuses. Roughly 600 GBDA students make this trip.
Tuesday, March 10
8:03
Chanice is 4 min away
Tuesday, 7:55 am
Stratford to Waterloo
About an hour by car. No bus between the two campuses.
- 7:55StratfordChanice leaves
- 8:07New HamburgKhalid gets on
- 8:18BadenLina · +6 min
- 8:47WaterlooEveryone at UW
Tuesday, March 10
8:03
Chanice is 4 min away
01 · Problem and research
Rides depend on a group chat, and safety matters most
Fun fact: UW’s Interaction Design and Digital Arts program is actually based in Stratford, Ontario, about an hour from the main campus. It’s a small theatre town of around 33,000 people, so getting around without a car is harder than you’d think. Most of us still end up in Waterloo a few times a week, for electives or just to see friends.
There’s no public transit between the two campuses, so nearly 600 GBDA students rely on carpools arranged in class chats. I was one of them, and I surveyed 200+ students across North America to see how common this is.
So ratings go both ways and feed into who gets matched.
So drivers also rate punctuality and tidiness.
Enough cars already exist. They just aren’t coordinated.
More on the research, the people and the alternatives
How they carpool
Trips to campus a week

Khalid Steele
Rider. Takes the bus when he has to.
The bus is unreliable for Khalid, so he’d rather ride with other students than risk a late arrival or a missed class.
Wants
- A regular ride he can count on, booked ahead
- Getting there on time without the bus
Gets in the way
- His requests get buried in group chats
- He can’t tell if a driver is safe, or what it’ll cost
Chanice Sullivan
Driver. Grad student with a car.
Chanice drives in most days anyway. Giving rides helps with gas on a student budget, and she likes knowing people in her program.
Wants
- Fill empty seats without organizing it herself
- Set the pickup, time and price once
Gets in the way
- Endless back-and-forth before every trip
- Passengers who cancel late or don’t show up
| Option | Cost | Daily commute | Who drives | Can you count on it? |
|---|---|---|---|---|
| RideCircle | Riders chip in for gas | Built around class schedules | Students on your route | Matched the night before |
| Riders share the cost | Made for one-off trips | Anyone | Hit or miss | |
| Too expensive for most students | Bad fit for a daily commute | Paid drivers | Almost always |
02 · The service
How a week of carpooling works
RideCircle is really a weekly routine with two kinds of people in it. The blueprint follows a single Tuesday, from planning on Sunday to rating on arrival, and shows what the matcher and the safety checks do in the background.
03 · Key screens
Week of Mar 9
Your week
Pulled from your class schedule. Turn off any day you don’t need.
- Mon9:00 GBDA 302From New Hamburg
- Tue9:00 GBDA 310From New Hamburg
- Wedoff No classNothing to book
- Thu1:00 GBDA 302From New Hamburg
- Fri8:30 StudioFrom New Hamburg
Requests go out tonight. You’ll hear back by 9 pm, and your match won’t change after that unless a driver cancels.
Request 4 ridesTue, Mar 10 · class at 9:00
You’re matched
Chanice S.4.97 rating · 41 trips CKRT 214 Why Chanice
Locks at 9 pm tonight
Tuesday · leave 7:55
Today’s route
- StratfordDownie St
- Khalid, New HamburgOn your route
- Lina, BadenAdds 6 min
- Waterloo, UW8 min before your deadline
Next week · near your route
Riders still waiting
Biggest gap
4
students need a ride Friday around 7:30, and nobody’s driving yet.
- Fri7:30 4 ridersStratford, Tavistock
- Thu12:00 2 ridersStratford
- Mon7:45 1 riderShakespeare
- Wed9:15 1 riderMilverton
04 · Matching
Matching everyone at once
If everyone grabs the nearest car, the student who asked third can end up with nothing, even when a plan existed that got everyone there. So RideCircle matches everyone together (overnight!).
Technical spec for the matcher
inRide offer
start_stopStopIdWhere the driver leaves fromdepart_at, arrive_bytimeFixed departure and the latest arrival at UWseats, accessibleint, boolFree seats and room for a mobility aidratingnumberTwo-way rating average, feeds the trust cost
inRide request
pickup_stopStopIdWhere the rider gets onclass_attimeMust arrive at least 5 minutes beforeneeds_accessboolHard rule, never traded offrequested_attimestampOnly used by first come, first served
outMatch
driver_idid or nullNull means no ride yet, and the request becomes demandpickup_at, arrive_attimeShown as the big numbers on the match screendetour_minintExtra minutes this rider adds to the drivereasonsstring[]Short lines the app shows under “Why Chanice”
runWhen it runs
triggereventEvery night, and whenever an offer or request changeslock_attime9 pm the night before. After that, only cancellations re-match
More on lock-in, cancellations and short mornings
A matcher will happily reshuffle everyone each time a request comes in. For a student planning their morning, a ride that changes at 11 pm is worse than one that’s a bit less efficient. So matches lock at 9 pm, and after that only a cancellation can move them.
- Cancellations
- only touch the riders affected. The re-match uses empty seats, so nobody else’s pickup moves, and if nothing fits the rider hears right away.
- Fairness
- To keep things fair, asking first doesn’t automatically get you the best seat. If a student only has one car that can get them there on time, the matcher makes sure they get it, and anyone who needs an accessible car always gets one.
Fri, Mar 13 · class at 8:30
No ride yet
Nobody is driving from Stratford in time for your class yet.
Drivers near you see this when they plan their week.
Closest options
- Fri7:00Sarah T.Gets to UW at 7:59 · 2 seatsAsk
- Thu5:40 pmMarcus L.Night before · stay in WaterlooAsk
When there aren’t enough cars
Friday in the lab has one driver for five students, and no algorithm fixes that. The “no ride yet” screen offers an earlier ride if there is one. Either way the request stays open and shows up for drivers planning their week.
05 · Matching lab
Two ways to match the same morning
A working prototype of the matcher on a simplified road map. First come, first served gives each request the best car left when it arrives. Best plan looks at every request at once.
The best plan gets one more student to class. Drivers spend 18 more minutes on the road for it.
Best plan: 6 of 6 students matched, 0 left behind, 18 extra driving minutes.
Students. Tap one to see why.
The straight drive from Stratford to UW is 59 minutes on this map. Sample data.
More on how the matcher works
Step 1
Find the fastest road
We started with Dijkstra’s algorithm. It treats towns as dots and roads as lines with a drive time on each, then finds the quickest way between any two towns. That’s what runs in the prototype, and on a map this small it’s instant.
Real roads are messier. The drive on Highway 7/8 changes with rush hour and snow, so each night the matcher pulls fresh drive times from routing services like OSRM and Google’s Distance Matrix API. Under the hood those use faster cousins of Dijkstra, built to search a whole province of roads at once.
Step 2
Work out the detour
detour = (start → pickup) + (pickup → UW) − (start → UW) Plus a little extra for lower ratings and for showing up very early.
Step 3
Match everyone at once
The Hungarian method takes a grid of every student against every seat and finds the pairing with the lowest total cost. Leaving someone behind costs the most, so it seats people first.
Step 4
Check the shared cars
The grid prices one rider per car. Afterwards, every car with two riders gets checked again, and spare seats go to anyone who got bumped.
06 · Trust and safety
The parts that decide whether you get in the car
88.2% of students said safety came first, so these components got the most attention. Each one is a small, reusable piece with its states drawn out.
Trust/RatingChipScore, trips and tagsThe trip count always sits next to the score. A 5.0 from 2 trips shouldn’t look like a 4.9 from 60.
Trust/VerifiedEarned, never boughtUnverified people can browse but can’t be matched. The empty state says what’s missing, so it reads as a step, not a judgement.
Safety/ReportEntry point and sheetWhat happened?
Unsafe drivingDidn’t show upMade me uncomfortableSomething elseThe other person isn’t told who reported them.
It lives on the live trip and the rating screen, in the same spot each time. It never sits behind a menu.
Filter/AccessHard rule in matchingTurning it on removes every car that can’t take the aid. The matcher can’t trade it away for a shorter detour.