Inspiration
AccessRide was inspired by real world transit challenges we saw every day, especially this winter, when delays, crowded buses, and accessibility barriers became impossible to ignore. Apps like Transit App showed us what good real time data can do, but we also saw the gaps: no accessibility context, no community reporting, no support for riders who need more than just schedules. Those observations, combined with lived experiences on Durham Region Transit, motivated us to build a tool that makes public transit more predictable, inclusive, and empowering for everyone.
What it does
AccessRide is a premium, accessibility first mobile app built in React Native for both iOS and Android. It makes public transit more inclusive and rewarding by integrating real time DRT transit data, community driven reporting, GPS proximity alerts, adaptive route planning, and a local business rewards system all designed around the needs of riders with disabilities, seniors, and transit‑dependent communities.
How we built it
Frontend: React Native with Expo & Expo Router.
Backend: Python with FastAPI, leveraging asynchronous operations for real-time tracking.
Database: SQLite3 for lightweight, efficient data persistence.
Challenges we ran into
We ran into a ton of issues with Git since it was our first time using git in a team setting.
We built our first version as one big HTML file using React CDN and Tailwind. It looked fine in a browser, but it could never become a real mobile app . Since there is no SafeAreaView, no native gestures, no GPS, no haptics. It was just a web page pretending to be an app, and we didn’t even know the right terms to search for why it felt wrong.
When We switched to React Native, everything broke. My HTML JSX used <div>, <button>, <input>,and tons of Tailwind classes, none of which exist in React Native. we tried converting it by hand, but every fix revealed three new problems:<p> had to become <Text>, hover states don’t exist, checkboxes aren’t a thing, and layout rules work differently. After two hours, I’d converted maybe 15% and created a pile of new bugs.
The gamification logic sounded simple , points up for accessible choices, points down for rewards, no double redeeming, reset after submitting a report , but it relied on patterns we hadn’t fully learned yet. our first version had bugs like points going negative during fast taps, rewards redeeming twice, and modals reopening with old state. I knew the behavior was wrong, but I didn’t yet understand React’s state batching or how closures affected our logic.
The whole point of AccessRide is accessibility, yet we was designing an accessibility app without any background in accessibility or universal design. we made early choices that actually violated core principles like using only color to show crowding levels, setting touch targets too small, and picking low contrast text that looked clean but failed readability standards.
Accomplishments that we're proud of
We're proud of actually having finished and having a working application.
As a first-year student, we don't have five years of React Native experience. But we do have the ability to identify a problem clearly, ask precise questions, evaluate the answers critically, and integrate the knowledge into something real. That workflow -> problem -> question -> understand -> apply -- is arguably the most important engineering skill to develop early, and this hackathon forced us to practice it under pressure.
What we learned
We learned a bit on how to use Git in a team setting and how to actually bring a full stack project from a concept into a piece of software.
We learn the difference between React, React Native, and Expo , and why native components, native rendering, and device APIs actually matter. It wasn’t just “use React Native,” it was the reasoning behind it. That one conversation with Max completely reframed the project. and he was a wonderful mentor. Without it, We would’ve submitted a browser demo and called it a mobile app.
By offloading the full HTML file to Gemini showed me the power of systematic conversion over manual guesswork. It didn’t just rewrite my code , it demonstrated the exact mapping from web elements to native components, replaced Tailwind with proper StyleSheet objects, and removed browser only features cleanly. More importantly, it explained why each change mattered. Instead of blindly copy and pasting, we walked away with a real understanding of React Native patterns, native components, and proper state handling. It turned a days long trial and error grind into a clear learning moment.
Gemini caught a subtle but important mistake: using setPoints(points + 15) instead of the functional form setPoints(p => p + 15). That one change prevents stale state bugs during rapid or batched updates. More importantly, it explained why this matters , React batches state updates, so relying on the old variable can produce outdated values. The functional updater always uses the latest state. It was a perfect example of the kind of nuance you don’t usually learn in first year courses but becomes essential the moment you build something interactive and timing sensitive.
Gemini also flagged that my crowding indicator relied on color alone and suggested the fix I ended up using pairing each color with an emoji so the meaning is never conveyed by color alone. It also pointed us to the exact guideline, WCAG 2.1 Success Criterion 1.4.1, which gave me the vocabulary to explain the decision to judges. On top of that, it highlighted the 44×44pt minimum touch‑target rule from Apple’s HIG (and the 48×48dp Android equivalent), which helped me redesign the UI with proper accessibility standards in mind.
What's next for AccessRide
The next stage is connecting AccessRide to real transit APIs, enabling true GPS proximity alerts, persisting points and rewards, and expanding accessibility features so the app can move from a polished demo into a fully deployable, real world transit accessibility platform.
Built With
- expo.io
- fastapi
- gtfs
- opendata
- python
- react-native
- sqlite
Log in or sign up for Devpost to join the conversation.