← Projects

FoodRoutes

Transit directions to affordable groceries, built by a team of four at BCIT

Three FoodRoutes phone screens: the map with nearby grocery stores in Burnaby and the travel-mode buttons, the saved-routes list, and the sign-up form showing validation errors

Overview

FoodRoutes helps people reach affordable food without a car. It finds grocery stores nearby, filters them by how expensive they are, and gives directions there by transit, on foot, by bike, or by car. It's a mobile web app, designed for the phone you'd have in your hand at a bus stop.

We built it as a team of four in BCIT's COMP 2800 projects course (Team DTC 09), over about four weeks in spring 2026, using React, TypeScript, Supabase, and the Google Maps JavaScript API.

My role

I built the parts of the app that move people: the navigation map and the accounts flow. That's about 38% of the final code, including three-quarters of the map page, the app's main screen.

  • The navigation map: directions in four travel modes, saved routes, "Use my location", and almost all of the map's interface
  • Accounts: the Supabase client, login and sign-up with validation, a guided first-visit tour on both, and protected routes that send signed-out visitors to log in
  • Navigation bar: the responsive navbar that collapses into a menu on phones and updates the moment someone signs in or out

My teammates built the store search and price filter, the map setup, the AI food chatbot, the landing page, and the profile page with its accessibility settings.

The app

Map page on a phone: the location search, Transit, Walking, Driving and Bicycling buttons, a Transit Layer toggle, and a map of Metrotown in Burnaby with red markers on nearby grocery stores
The map
Nearby stores around Metrotown, with the travel modes and transit layer above.
Recent Routes panel open on a phone, showing 3 of 10 saved routes, each with a travel-mode icon, origin and destination, time, distance and date, and replay and delete buttons
Saved routes
Up to 10 per user, each one replayable or deletable. Shown with example routes.
Login screen on a phone with a guided-tour tooltip pointing at the email field: If you have an account, input your email here
Login with a guided tour
First-time visitors get a step-by-step walkthrough of the form.
Sign-up screen on a phone showing inline errors: enter a valid email address, password must be at least 6 characters, please confirm your password
Sign-up validation
Each field says exactly what's wrong before anything is sent.
Phone view with the navbar menu open, listing Home, Navigation, Profile and a Log out button above the home page
Responsive navbar
On phones the links fold into a menu that knows if you're signed in.

What I built

Directions in four travel modes

Pick a store on the map and FoodRoutes draws the route there with Google's Directions service, along with the trip's time and distance. Transit is the default, because that's who the app is for, and one tap switches to walking, cycling, or driving. Each mode has its own colour, and a transit-layer toggle shows the bus and SkyTrain lines underneath.

Saved routes

Any route can be saved to the signed-in user's history in Supabase. The list keeps the 10 most recent: when it's full, the oldest is removed before the new one goes in, so it never grows without limit. Tapping a saved route restores its travel mode and redraws it; each one can also be deleted.

"Use my location"

One tap reads the phone's location, centres the map on it, turns the coordinates into a readable street address for the starting point, and runs the nearby-store search straight away.

Accounts that guide you in

Login and sign-up run on Supabase Authentication. Sign-up checks the email format, a minimum password length, and that both passwords match, and shows each problem under its own field. Both pages open with a short guided tour (intro.js) for first-time visitors. Protected routes check the session before rendering and send anyone signed out to the login page.

A navbar that follows the session

The navbar listens for Supabase's sign-in and sign-out events, so its links switch between "Log in / Sign up" and "Profile / Log out" instantly, without a page reload. On phones it collapses into a menu button.

Tech stack

React 19 TypeScript Vite React Router Supabase Auth Supabase Postgres Google Maps JavaScript API Directions & Places intro.js Vercel

Working as a team

  • Each of us worked on our own feature branch, merged into a shared dev branch before release
  • We split the app by feature, so the map, accounts, chatbot, and profile could move in parallel without stepping on each other
  • The app was deployed on Vercel. The course's Supabase project has since been retired, so the live demo no longer signs in; the code is on GitHub