Lukas Bohez/media tools, one developer/

Case study · school project

Delivery robot platform

A web app for the company that makes delivery robots, the API behind it, a simulated platform for the robots to talk to, a robot you can run on a phone, and a small ESP32 board that shows what the robot is doing.

Source on GitHub (private) See it in the museum Walk it in 3D

Course
Advanced Full Stack Development, Howest MCT
Year
2026
Parts
Web app, API, simulator, robot, ESP32
Run it with
One command, or Docker
The robot page of the seller's web app, in Dutch: the state of one robot (tilted, battery, lid, temperature, connection, error code), its cargo, the actions a seller can take and the robot's history.
The robot page: its state, its cargo, what the seller can do about it, and who did what. The interface is in Dutch because the customer is Belgian, and the app also speaks English, French and German.

The brief

The customer builds small delivery robots on wheels and wanted a web app of its own, not another screen in the ordering platform. The wishes were specific: no staff or customer data in it, defects and replacements, roles per company with a way to view the app as a role, one isolated food robot instead of a mixed cargo, and no Google login. A later round added what to do when a robot is stolen or goods are lost: a dossier with what is gone, where, when and what happened, that downloads as a PDF and a PNG for the insurer and the police.

Design first

The customer asked to work in Figma before code, so that is what I did: a design system with two layers of variables (raw colours, then what they mean in the interface, in light and dark), an 8 px grid, contrast checked against WCAG AA, seven components with variants, and ten screens for desktop and phone, with a dark mode for the busiest ones. After feedback the design split by who uses it: the administrator on a computer, the technician on a phone, out at the robot. The screens in the code follow the Figma file one to one.

The companies page of the seller's web app, in Dutch: a table of three companies with their robots, open defects and the actions Open robots, Open roles and Archive.
Companies, with robots and open defects, and no personal data.
The technician's dashboard on a phone, in Dutch: counts of open defects and tasks, the task the technician is on, and defects nearby with an action button each.
The technician's dashboard, on a phone, next to the robot.
The design system page of the Figma file: base colours, semantic colours for light and dark, contrast ratios and text styles.
The design system: variables in two layers, contrast ratios and text styles.
The flow of the design, in Dutch: from logging in to companies, new company, a company's robots, the API key, roles and rights, view as role, defects and replacements, team and reporting a defect.
The flow, from logging in to reporting a defect.

What is in it

How it is checked

Everything is checked on the computer of whoever makes the change, before every commit and pull request, with one command that runs type checks, lint, unit tests, the API's end-to-end tests, a build of the web app, the Flutter tests and the Docker config. These counts are the ones in the repository's README:

PartTests
Platform simulator56, including two whole-day runs with nine simulated robots
Seller API122 unit and 215 end-to-end, on an in-memory MongoDB
Seller web app186 unit tests, plus 10 browser tests against the running demo
Hardware bridge79
Flutter robot app314, including nine whole-day runs, also in frost

What is not tested automatically: the ESP32 firmware (it compiles and runs on a board, but nothing guards it), the real LED, buzzer, button and sensor, and finding and connecting over Bluetooth on a real device, which I tried by hand on Windows. The README says so too.

From a team to me

This started as a team project with a classmate: I had the seller side and the robot, they had the ordering platform. After the feedback moments the teachers decided on 28 October 2026 to split the group work, so everyone carries on alone in their own repository, from the base of their own flows. This repository is a copy from that moment without the other student's ordering platform, which the simulator now plays, so the seller side and the robot keep running against something real. The history before the split is shared, and it is all still in git.

The repository belongs to the Howest class organisation and is private. If you need to see the code, email me.

Back to the portfolio Read my CV

Where the download number comes from

The figure on this site, 5,251 downloads, is not an estimate. It is the sum of the sources below, and each row says what it counts and how to check it.

SourceDownloads
GitHub releases live, as of 6 November 20265,251
Windows2,106
Android1,450
Linux1,356
macOS338
Checksum files (not counted)439
Other1
The download_count GitHub keeps for every app file attached to every release, 208 releases in all, added up. GitHub's own page shows these counts one release at a time and never a total. Downloads of checksum files are listed but not counted. Check it on GitHub.
Total5,251

Only app files are counted. The 439 downloads of checksum files (people verifying a download) are shown above for completeness and are not in the total.

Installs from Google Play and the Microsoft Store are not in this number: GitHub cannot see them.

These are downloads, not people or installs: one person can download more than once.

Open this as a page, to share.