Riders post a trip, drivers bid, and the two sides talk in the app
Most ride apps assign: an algorithm picks the driver and sets the fare, and neither side negotiates. This one bids. A rider posts where they are going, drivers who want it make offers, and the rider chooses.
That inversion is what makes it interesting to build. An assignment model has one decision at one moment. A bidding model has a live auction — a trip that must reach the right drivers immediately, several bids arriving at once and staying ordered and current on both screens, and an offer that has to close cleanly the moment the rider accepts, without a second driver believing they still have a chance.
On top of that sits calling, because a rider and driver almost always need to say one thing to each other before the trip starts.
I built both the app and the backend.
Full-stack: React Native frontend for both rider and driver, the Node.js backend and data model, the Socket.IO layer carrying live trip and bid state, and the Agora integration for in-app voice.
Socket.IO on Node carries the live marketplace — trip posted, bids arriving, bid withdrawn, trip accepted, trip closed — to both sides. Voice runs on Agora rather than over the socket layer, with signalling still handled as messages: invite, accept, end. Firebase covers push so a driver hears about a trip while the app is backgrounded, which is most of the time.
A ride marketplace where the price is negotiated rather than assigned — built on a socket layer that keeps a live auction honest on two screens at once, with calling handled by a media stack rather than improvised on top of messaging.
If this sounds familiar
Building something similar?
Most of these problems show up again in different clothes. Describe yours and I will tell you what I would look at first.