Skip to content

About

The weekly menu of the UoWM's restaurant, right in your pocket.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

UoWM Restaurant Menu App

The weekly menu of the University of Western Macedonia's restaurant, right in your pocket.

Why this exists

The restaurant menu used to live on a printed sheet near the entrance, or buried somewhere on the university site. This app just puts it on your phone. Open it and you immediately see what's being served today, for both lunch and dinner.

What it does

The menu cycle is variable from the university, however the app figures out on its own which week you're currently in, so you never have to think about it. It opens straight to today's menu. From there you can swipe left or right to move through the rest of the week, and if you keep swiping past the last day it just rolls into the next week for you.

Screenshots

Installation

Grab the latest APK from the releases page and install it on your Android phone.

https://github.com/michadasis/generic-restaurant-app/releases

It's Android only for now. There's no iOS build.

Features

  • Figures out the current week in the cycle on its own, based on today's date
  • Swipe through the days, with the week rolling over automatically at the edges
  • A calendar screen to jump straight to any day, not just the current week
  • Android home screen widgets (compact and full) showing today's menu, updating on their own throughout the day
  • Dark mode and light mode, switchable with one tap, remembered for next time
  • Greek and English, switchable the same way
  • Checks GitHub on launch and lets you know if a newer version is out
  • Colors pulled from the actual UoWM logo, teal and amber
  • Gives you a heads up if the restaurant's probably closed, around the summer break and right when a new academic year is about to start
  • Menu comes from a Supabase database, cached on device so it still shows the last known menu offline
  • A Suggestions tab where anyone can post an idea and upvote/downvote others', no account needed

How the code is laid out

app/
  (tabs)/
    index.tsx        the main menu screen, this is where most of the logic lives
    Calendar.tsx     jump to any day, not just the current week
    Suggestions.tsx  browse/post/vote on suggestions
    About.tsx        the about screen
    _layout.tsx      tab navigation
  _layout.tsx        root layout

components/
  MealSection.tsx    renders a single meal (lunch/dinner) block on the menu screen
  MenuSkeleton.tsx   loading placeholder that mirrors the real menu card
  UpdateModal.tsx    the popup that shows up when a new version is available

constants/
  i18n.ts            every bit of text in the app, Greek and English
  theme.ts           the color palette and the dark and light theme objects

data/
  menu.ts               types, the raw-to-display transform, and the useMenu hook screens read from
  menuService.ts        fetches/caches the menu from Supabase (network-first, AsyncStorage fallback)
  suggestions.ts        the useSuggestions hook — list/create/vote, with per-device vote state in AsyncStorage
  suggestionsService.ts fetches/posts/votes on suggestions over Supabase's REST API (separate project, see below)

hooks/
  useUpdateChecker.ts  checks the GitHub releases API for a newer version

utils/
  getToday.ts          works out today's day and its label
  getWeek.ts           works out which week of the cycle we're in
  getClosureNotice.ts  works out if the restaurant's likely closed for the summer break or not open yet for the new one

widget/
  TodayMenuCompactWidget.tsx  small home screen widget, today's current meal only
  TodayMenuFullWidget.tsx     bigger widget, both lunch and dinner at a glance
  widget-task-handler.ts      builds the widget's data and re-renders it on schedule

Running it yourself

You'll need the EAS CLI installed globally first.

npm i -g eas-cli

Then clone the repo, set up your environment, and start it up.

git clone https://github.com/michadasis/generic-restaurant-app.git
cd generic-restaurant-app
npm i
cp .env.example .env

Fill in EXPO_PUBLIC_SUPABASE_URL and EXPO_PUBLIC_SUPABASE_ANON_KEY in .env from your Supabase project's API settings. For the Suggestions tab, create a second, separate Supabase project (see Suggestions backend below), run supabase/suggestions.sql in its SQL editor, and fill in EXPO_PUBLIC_SUGGESTIONS_SUPABASE_URL / EXPO_PUBLIC_SUGGESTIONS_SUPABASE_ANON_KEY from that project's API settings. Then:

npm run start

The home screen widgets rely on native code (react-native-android-widget), so they won't render inside plain Expo Go, you'll need a dev client build (eas build --profile development) to see them.

To build an APK for testing:

eas build --platform android --profile preview

To build the production version:

eas build --platform android --profile production

Updating the menu

The menu lives in a Supabase Postgres database (menu_meta, breakfast_items, menu_items). You don't normally update it by hand. uowm-restaurant-schedule-watcher runs once a day on Vercel Cron, checks the UoWM restaurant schedule page for a new menu PDF, and if it differs from the URL recorded in menu_meta.source_pdf_url it downloads it, parses and translates it, and applies the resulting SQL to the database. The app and the widget pick the change up on their next refresh, no rebuild needed.

If you do need to do it manually, run that repo's CLI against the PDF to get a restaurantMenu.sql (it creates the three tables if they don't exist, truncates them, and inserts the parsed menu) and apply it in the Supabase SQL editor, or edit the rows directly. The watcher's /api/generate-sql endpoint returns the same SQL without writing anything, which is handy for checking what the parser produced before applying it.

The app talks to Supabase over its public REST API using only the anon key (EXPO_PUBLIC_SUPABASE_ANON_KEY in .env, which is gitignored, copy .env.example), which Row Level Security restricts to read only. The write side belongs to the watcher, which holds its own POSTGRES_URL in its Vercel environment. The service_role key, JWT secret, and raw Postgres connection string must never be added to this app's .env or committed, because they grant full write/admin access to the database.

Suggestions backend

The Suggestions tab reads/writes a separate Supabase project from the menu — deliberately, because the menu database's tables get overwritten wholesale by a daily cron job, and suggestions submitted by students shouldn't get wiped out by that.

Schema (table, RLS policies, and the vote_suggestion function the app votes through) lives in supabase/suggestions.sql — run it once in that project's SQL editor. A couple of things worth knowing as the admin:

  • Each suggestion's email column is only in the base suggestions table, never exposed through the anon key — the app only ever reads from the suggestions_public view, which leaves it out. To see who submitted what, query the suggestions table directly (Table Editor, or select * from suggestions order by created_at desc) with your own Supabase login.
  • Voting has no sign-in behind it, so it can't be tied to a person or even reliably to a device — the app only remembers a suggestion's vote locally (AsyncStorage) to stop accidental double-votes from within the app itself. Someone calling the API directly with the anon key could still inflate/deflate a score; fine for a small trusted user base, but worth knowing.

Credits

Built by Ioannis Michadasis.

Logo by Katerina Maki.

About

The weekly menu of the UoWM's restaurant, right in your pocket.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages