Lives and works in Maribor, Slovenia
Full-stack IoT, mostly in Elixir: the device at the edge, the cloud services behind it, security in the middle, and OTA updates that actually land. I came to it through cloud, microservices and SaaS — the last four years have been spent a lot closer to the hardware.
The interesting part of IoT is that it is one system pretending to be two. A gateway in a cabinet and a service in a datacentre have to agree about identity, about what is trusted, and about what is true when they have not spoken for a week. Most of the hard problems live in that gap rather than at either end of it.
So I work across the whole of it: the firmware and the Elixir on the device, the platform and the services it talks to, the security that has to hold at both ends and in between, and the update path — because a fleet you cannot safely update is a fleet you will eventually be afraid to touch.
That habit came from years of cloud, microservices and SaaS, where those questions are the entire job. For the last four years I have been following the same questions downwards, into gateways and embedded hardware — lately NXP i.MX8M and ST STM32MP1, before that other things. The architecture problems turn out to be the same ones, with far less room to be wrong about them.
Alongside all of it I teach — not as a main line of work, but consistently, for as long as I have been doing this. I live and work in Slovenia, and always have, mostly remotely for clients elsewhere.
4.5 weeks · 9 live sessions · 13.5 hours
Nine live sessions, twice a week, for people who have never written a line of code. We start with the environment and end with a working Flask application.
The whole course is built around one running example — a fictional café called Pri Pythonu — so that every new idea arrives attached to something that already exists rather than as an isolated exercise. Conditionals, loops, data structures, functions, files and errors, objects, JSON and APIs, then the web application, then a project of their own.
9 weeks · 18 live sessions · 27 hours · max 15 people
The beginners' course, then five more weeks turning it towards real data work.
The second half is the part I find most useful to teach, because it is where programming stops being an exercise: reading data out of Excel and CSV, Pandas and Polars, talking to PostgreSQL and MSSQL, writing SQL that does the work rather than looping in Python, pulling data from APIs and scraping it when there is no API, visualising the result, and finally serving it back out with FastAPI.
Certificates and mTLS are the easy part. The hard part is identity over a device's whole life: first enrolment, rotation, power loss mid-rotation, and a gateway that was offline for two years.
Parsing every post at build time removes a whole category of problem: no database, no cache, no cold render.
Writing a custom Nerves base image for a CompuLab IOT-DIN-IMX8PLUS by hand: the packaging bugs, the flashing dead end, and the DDR failure that stopped it booting.
Building a Nerves system from scratch for the STM32MP157F-DK2: the boot chain, device trees, and the first attempt at a working build.