Inspiration
Whenever I go to eat lunch or dinner, I often go to one of the dining centers available on the OSU campus. However, when I arrive, typically the restaurant I feel like eating at turns out to be closed or isn't serving the food I like. There is a website available, but it requires users to remember the site to go to, open a browser, and check if the restaurant they want is available. Also, the original website (https://food.oregonstate.edu) for looking at dining center options at the OSU campus isn't the best interface for knowing which restaurants are still open.
What it does
Our app is an all-in-one place for easily seeing which restaurant options are open on the OSU campus. You can select filters based on open/close times. It also shows you the menu options in a more intuitive interface for easier browsing. Searing through dining options has never been easier!
How we built it
There are three main components:
Web Scraper
- Node.js - Jest for unit testing - using Puppeteer (later switched to JSDOM to reduce memory and code size), we can gather all the information we needed from the original site at https://food.oregonstate.edu such as locations, restaurant names, whether dining dollars are accepted, open/close times, menu itemsAPI
- Node.js - Express - SQL database for caching web scraping data - backend that serves all web scraped data via a RESTful API service - polls web scraped data every 30 minutes since each operation takes ~20s - API interface documentation: https://github.com/tobyloki/BeaverEats/blob/backend-server/docs/index.md - deployed as a Docker image onto Fly.io cloud hosting serviceAndroid App
- Android Studio - Kotlin - Retrofit - Frontend app to display data obtained via HTTP requests to backend API
Challenges we ran into
- Puppeteer requires too much memory and takes too much code size. This is resolved by using JSDOM (a lightweight web scraping tool without the chrome browser installation)
- During Android development, we worked simultaneously over Discord
- For some members, Android development in Kotlin was a new experience, and it was challenging to build an app from scratch
Accomplishments that we're proud of
We got the whole application finished, starting from scratch. For some, this was a new experience in web scraping and Android development. For some, it was also a chance to practice our skills on a real project that would be useful in our lives.
What we learned
- learned how to use Puppeteer (later switched to JSDOM to reduce memory and code size) for web scraping
- learned how to develop Android apps (RecyclerView, HTTP requests, navigation, etc.)
What's next for Beaver Eats
- possibly add caching to the mobile app to reduce API invocations
- rate limit API
- When restaurants are closed, their start/end times become NULL. We can update the API to record the last valid start/stop time for reference rather than simply returning null to the front end.
Built With
- android
- docker
- express.js
- fly.io
- javascript
- kotlin
- node.js
- puppeteer
- sqlite
- typescript

Log in or sign up for Devpost to join the conversation.