All work

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, 7:55 am

Stratford to Waterloo

About an hour by car. No bus between the two campuses.

  1. 7:55StratfordChanice leaves
  2. 8:07New HamburgKhalid gets on
  3. 8:18BadenLina · +6 min
  4. 8:47WaterlooEveryone at UW

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.

200+students answered
88.2%said safety matters most

So ratings go both ways and feed into who gets matched.

76.9%of drivers worry about passengers

So drivers also rate punctuality and tidiness.

54.7%drive, at least some of the time

Enough cars already exist. They just aren’t coordinated.

More on the research, the people and the alternatives

How they carpool

  • Drive41.2%
  • Ride33.5%
  • Both13.5%
  • Don’t carpool11.8%

Trips to campus a week

  • 5 or more35.3%
  • 423.5%
  • 317.6%
  • 211.8%
Group chat messages from students asking for rides between Stratford and Waterloo, many with no reply.
Real requests from a class chat, names blurred

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
OptionCostDaily commuteWho drivesCan you count on it?
RideCircleRiders chip in for gasBuilt around class schedulesStudents on your routeMatched the night before
PoparideRiders share the costMade for one-off tripsAnyoneHit or miss
UberLyftToo expensive for most studentsBad fit for a daily commutePaid driversAlmost 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.

Plan the week Sun to Thu Match Every night Lock-in 9 pm Pickup 7:55 to 8:18 Ride About an hour Rate On arrival What people see Behind the scenes Rider Switches off days with no class Sees the match and why it was picked Gets a “locked” alert Live Activity counts down Shares the trip with a friend Rates the driver Driver Offers seats, sets a detour limit Sees who’s still waiting nearby Gets the final route and times Starts the trip Follows pickups in order Rates riders on punctuality Matcher Collects offers and requests Dijkstra, then the Hungarian method Freezes the plan Watches for cancellations Re-matches spare seats if needed Ratings feed next week’s trust cost Trust and safety Checks the student email Keeps unverified drivers out Sends reminders to both sides Live location on request Takes reports during the trip Reviews repeat low ratings

03 · Key screens

RiderThe week comes from the class schedule, students switch off the days they don’t need.
RiderA stranger’s car is easier to accept when you can see the reasoning.
DriverPickups and extra minutes come before anything else.
DriverDrivers see where riders are still waiting when they plan their week.

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!).

01 Collect 02 Filter 03 Score 04 Assign 05 Tell people Ride offers Route, seats and the latest time the driver can arrive Ride requests Pickup stop and class time, plus any access needs Rule out bad pairs Drive times from Dijkstra Same day and direction Arrives before class Has a free seat Room for a mobility aid Price every pairing One row per rider, one column per seat Mostly detour minutes, with small extras for ratings Seat everyone at once The Hungarian method picks the plan with the lowest total cost for the whole day. Leaving a student behind costs more than any detour, so it seats people first. Then it re-checks every car that’s carrying two riders. Tell people why Already on her route 13 min to spare Alerts go out when you’re matched and at lock-in. No match? The request shows up as driver demand. Someone cancels before 9 pm: run it again
The matcher runs every night until 9 pm, and again whenever someone cancels. The reasons riders see come from the same numbers the matcher scores.
Technical spec for the matcher

inRide offer

  • start_stopStopIdWhere the driver leaves from
  • depart_at, arrive_bytimeFixed departure and the latest arrival at UW
  • seats, accessibleint, boolFree seats and room for a mobility aid
  • ratingnumberTwo-way rating average, feeds the trust cost

inRide request

  • pickup_stopStopIdWhere the rider gets on
  • class_attimeMust arrive at least 5 minutes before
  • needs_accessboolHard rule, never traded off
  • requested_attimestampOnly used by first come, first served

outMatch

  • driver_idid or nullNull means no ride yet, and the request becomes demand
  • pickup_at, arrive_attimeShown as the big numbers on the match screen
  • detour_minintExtra minutes this rider adds to the drive
  • reasonsstring[]Short lines the app shows under “Why Chanice”

runWhen it runs

  • triggereventEvery night, and whenever an offer or request changes
  • lock_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.

Requests open Sunday to Thursday Re-match every night, and on every change Lock-in 9 pm, everyone gets told Pickup 7:55 am Driver cancels: riders affected get first pick of spare seats Flexible Locked
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.

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.

1212867142218915171615STAStratfordShakespeareTavistockNew HamburgBadenPetersburgIra NeedlesWaterloo · UWMilvertonWellesleySt. ClementsNumbers on roads are drive minutes

Students. Tap one to see why.

SSarah T. leaves Stratford at 7:55, 2 seats, TTyson B. leaves Tavistock at 7:50, 2 seatsAAmelia W. leaves Milverton at 7:45, 3 seats

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 tags
4.9741 trips
On timeSafe drivingTidyFriendly

The 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 bought
UW student Licence checked
Not verified yet

Unverified 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 sheet
Report a problem

What happened?

Unsafe drivingDidn’t show upMade me uncomfortableSomething else

The 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 matching
I need room for a mobility aid
Room for a mobility aid

Turning it on removes every car that can’t take the aid. The matcher can’t trade it away for a shorter detour.