LMU App Screenshot 1
LMU App Screenshot 2
LMU App Screenshot 3
LMU App Screenshot 4
LMU App Screenshot 5
LMU App Screenshot 6
LMU App Screenshot 7
LMU App Screenshot 8
LMU App Screenshot 9
LMU App Screenshot 10
LMU App Screenshot 11
LMU App Screenshot 12
LMU App Screenshot 13
LMU App Screenshot 14
LMU App Screenshot 15
An open source mobile app for students of the Ludwig Maximilian University of Munich.
From students, for students. Available on iOS and Android.
12.000Downloads
4,9Stars
122Reviews
14GitHub Stars
Figma
Dart
Flutter
Git
GitHub
Docker
Python
FastAPI
GraphQL
Nginx
PostgreSQL
Star
Star
Star
Star
Star
Download from App Store

We're writing the year 2024 and the biggest university in Germany, the LMU, still has no app for students. No easy way to check the canteen menu, available libraries, grades, lectures and services cluttered around 20 different websites.

I wasn't alone with this thought. One night at Café Cosmos we forged plans to solve this ourselves. Suffering together created a strong connection. So Paul Walter, Lukas Plenk, me and some other LMU students started the vision and began the work.

University Course

At one point we thought, why limit the capacity to us? There should be more students taking part in creating their own solution. From students, for students. So we talked to professors and PhDs and were able to host our own official class called „Full Stack App Development" for the winter and summer semester 2025.

We received over 30 applications from students to take the class and chose 8 to join the team. We had weekly meetings discussing progress, teaching concepts of modern frontend architecture, color theory and more.

Class Team

Full Stack App Development Class Summer Semester 2025

The whole project had several obstacles, to name some:

Legacy Infrastructure

The outdated system doesn't only make it hard for students to look up information but also for our system to access it. There were no clean APIs and interfaces to access the information. So it was evident we had to build that ourselves, store the data on our side to not overwhelm the old system and bring the information into a new structure that can be used to populate a UI with information. This way we would have the whole data pipeline in control.

Learning Backend Development

Nobody on our team had ever written a backend. So the whole hosting, server, database, scraping, API thing was new to us. Even though my background is more on the UX side, I jumped head first into the topic and took responsibility of it since then.

User Communication

It was clear that the first release was missing some essential student features like checking available courses, calendar and news, due to lack of APIs and infrastructure from LMU. So we needed a way to show what the app can do, what is missing and actually give users a way to communicate their needs.

For this we added a wishlist, where they were able to see and vote on current ideas. This addressed the high expectations students have for an app, and also gave us a way to prioritize what we would implement next.

We definitely wanted to make the app look, feel and appear official. So we needed a legal way to call it the „LMU Students" App, which we decided to be the name after a long brainstorming session.

This and other reasons led us to first found the university group LMU Developers and afterwards the student organization „Technik Referat" of the Student Council. I was officially elected to be the leader of those organizations, but we shared that role equally in our team. Everyone leads so everyone takes responsibility and has the ability to decide.

Over the course of 2 years we met a lot of people. Something they had in common was they really loved what we were doing so far. Students (of course), but also professors, the head of IT, and the new vice presidents Julia Dittrich and Philip Baaske.

Special thanks goes to Prof. Florian Alt and Dr. Florian Behmann who supported our journey enabling us offer a class for students to learn about app development. Other honorable mentions go to the Student Council, the IT department at LMU and all the students who supported us.

In every step of our journey we compared ourselves to other companies or student organizations. To name some: UniNow, Studo, TUM Campus, Ingolstadt Neuland, ETH Zurich, TU Berlin, Stanford and more. The goal was clear: extracting what works & building it better.

After half a year, on 03.02.2025, we released our first internal beta version to the App Store and Play Store. We invited many friends and students who visited our official university exhibition of the Media Informatics Group.

Beta Release

Beta Release Exhibition

Fresh to the start of the Summer Semester 25 we painted the final strokes and released the app officially.

Language

The style I aimed for was modern, simple and mobile friendly. I took inspiration from other apps I very much enjoy using, like Revolut.

Design System

The fundament of all designs: our design system. It was handcrafted by myself in Figma Figma, with auto layout, variables, components and variants. Supporting light and dark mode and over 100 custom components.

Design System Cover

Design System Cover

The system was built in a way that can also be reproduced in code in our Flutter Flutter frontend. So when Paul and Lukas started with the frontend, the first step was to translate all the elements like colors, components etc. into a mirrored Flutter design system. This made designing and building UIs very fast.

Colors

All color palettes were custom created with a perceptually uniform colorspace called OkLCH on oklch-palette.vercel.app. This ensured accessibility and contrast over all colors for the same value. E.g. a yellow-10 has the same contrast asred-10.

OkLCH Color Space

Color Space Comparison (from Wikipedia)

Since our brand color is green, we chose it as our accent color which isn't ideal because it can get confusing with success states. The gray palette was also derived from that and inherited a greenish tint.

We added those palettes in a variable collection in Figma Figma as primary color tokens and built a second semantic layer on top that was exposed to our design files.

Design System Color Variables

Design System Color Variables

Animations

Animations are a great way to enhance the user experience. We used the design system to create a set of animations that are used throughout the app. Since simple easing functions don't reflect natural motions i decided to use spring animations. Those are based on the physics of a spring and feel more natural and organic.

Spring Animation

Spring Animation

After talking to the head of IT at LMU, we knew they were using Python Python, FastAPI FastAPI, Docker Docker and Postgres Postgres. This answered the question which tech stack to use, since it also seemed pretty modern and easy to use.

We started by connecting our domain api.lmu-dev.org to a Linux server hosted on Digital Ocean. Same for the staging environment. Our backend currently sits in a mono repo which spins up different Docker Docker containers for the data_fetcher and the API, as well as the database and Nginx nginx as a proxy which we use for SSL management and port forwarding.

Backend Structure

Backend Structure

Data Fetcher

For each topic like food, cinema etc. we added a time-scheduled scraper to the container which then collected the data and saved it in our database.

For some content like the libraries we had to deal with unstructured data, so we used LLMs to interpret what the website gave us and put it into a format we could save. Some websites were so cluttered it wasn't possible to solve with regex.

For the canteen menus we did a similar thing, they were automatically translated with DeepL. Generally our approach was to improve the data quality we got with other APIs. We also did that for the movies: we added information like IMDb ratings, movie posters, trailers etc.

Database

This was probably the hardest part, getting the relations right. Especially when you deal with translations, it isn't enough to just put a „title" column. We needed to create a new translation table with all fields that needed localization.

API

To implement the API fast I went with FastAPI FastAPI. Each endpoint had its own Pydantic model which was also used as a response model, as well as a service layer to get the information from the DB and the router.

Some endpoints were protected and only accessible with API keys of different scopes. Some endpoints have a soft protection. For example, getting canteen dishes will return a result authenticated or not, but when a user is recognized it also returns the dish likes for that user.

Available endpoints can be found in the API documentation.

To make the API more responsive we would like to add a Redis cache database.

GitHub

We used GitHub GitHub not only as a version control tool but also for project planning. Issues were always connected to branches.

We also used GitHub Actions to automatically deploy the Docker Docker containers and spin them up on staging/prod. This significantly improved our workflow since once something was merged with staging it would get deployed. To push to prod, another action took the staging Docker container, renamed it and published it over SSL on the prod server.

Content Management

There is some data you can't crawl... so you have to manage. We started content management with writing hardcoded values in the backend, then switched to API endpoints and finally settled on a CMS system. After some research we chose Directus Directus (over Strapi) because it could be integrated into our current database.

Since Lukas and Paul are very familiar with Flutter Dart Flutter/Dart, this was an obvious choice also to support multi-platform development for iOS and Android.

Working tightly in a cross-functional team was fantastic. This ensured the UI was set up exactly how it was intended. It really helped knowing how to code.

The frontend was set up with each feature encapsulated as its own package. The design system was the core package used everywhere. This provided a very clean architecture — some would even call it over-engineering.

Frontend MVVM

Frontend MVVM

  • UX and backend are a powerful combination, because when you know how a UI should look like you also know exactly which data needs to be provided to the frontend.
  • Onboarding new people in a long-running project takes a lot of time and is sometimes not worth it.
  • Working with skilled people is really a blessing. Especially if they have an eye for the details. Thanks to the best 2 frontend devs I know, Paul and Lukas
  • Building an effective channel for user feedback is really important.