Compilation of some screenshots from our Android app
As a team of busy teens, we found that we would constantly be either wasting precious time finding places to eat or coming back to the same locations over and over without ever experimenting and going to new places we have not discovered. We set out to rectify both problems with an app that, given previous information about a user, will provide helpful recommendations that are similar to the user's preferred foods along with exciting recommendations that are typically the exact opposite. In doing so, we give the best of both worlds for users who are already satisfied with their go-to restaurant locations and users who want to try something new.
What it does
After creating a Table account, our users will be directed to the home page where they are given a search query to locate their favourite restaurants on a map. Each restaurant item will return a bunch of useful information including restaurant names, images, open hours, reviews, URL, address, and user rating. While using the app, the user will be able to leave ratings for the restaurants that they have visited. This data will then be fed into a machine learning algorithm we trained and a KNN (K-nearest neighbours) algorithm, to categorize which restaurant each user is very likely to enjoy (safe recommendations) while also finding restaurants that are extremely different from the user's usual preferences (experimental recommendations).
How we built it
The Android app for this project was built natively using Kotlin, and is connected to a Firebase backend that stores user information (login, food history, and map). For the web app, we used Django together with Postgres SQL for storing user information during the sign-up and login processes, and for a relational database between the user and the restaurants that they have been to.
Challenges we ran into
One major challenge we ran into was cross-platform compatibility between our Android app and our web app. Notably, we couldn't access the same database of users due to Django's rigid hashing system. On the Android side of development we ran into issues with APIs such as the Google Maps API where most of the documentation available online was for Java and not Kotlin. We also ran into issues with the Machine Learning side of things as we were constantly switching back and forth in deciding the most ideal number of batches to use. After hours of training we found that running it on a reasonably high number of instances yielded the best and most accurate results.
Accomplishments that we're proud of
We are proud that we were able to successfully train an AI model and flesh out a KNN algorithm to predict restaurant preferences for each user in our database based off of their previously visited restaurants and restaurant reviews. We are also proud of the final UI/UX given the time constraint. Finally, we are proud that we were able to implement a fully functional user registration/login system with Firebase for our mobile app and fully functional user registration/login system with Django and Postgres SQL for our web app. Similarly, we also take pride in developing functioning mobile and web apps that met our expectations, with an eclectic use of technologies and APIs (Google Cloud Storage, Firebase, Kotlin, Mapbox, and Django to name a few).
What we learned
For some of us, this was our first experience with full stack development which was definitely an important skill to learn. We are all new to machine learning as well, so training our model was a learning experience. Along the way, we all explored new APIs, frameworks, and technologies, including but not limited to Google Maps API, Mapbox, Django, Postgres SQL, Google Cloud Storage, and Firebase API.
What's next for Table
We would love to combine our web app and Android app by connecting them to the same online database. We are also looking forward to fleshing out both our web app and our Android app by refining the user experience and fully implementing all functionality to mimic any other social media platform out there. Doing so would allow us to give our users an incentive to use our platform and leave reviews, thus gamifying the process of collecting useful data that can be shared across the platform.