2026ha-relay-panel
Turns relays into simple thermostats in Home Assistant.
Junior Developer and IT Operations Specialist at JELD-WEN Eesti AS, based in Rakvere, Estonia.
I build web applications, maintain IT infrastructure, and work on homelab and open source projects in my spare time.
Most recently I've been sending fixes upstream: three merged into projects I don't maintain.
One employer, three roles.
Building web applications and keeping the IT infrastructure behind them running.
The third internship at the same company and the first on the development side, which turned into the developer post above.
Two internships at the same company, on the IT support side.
13 things I've built, newest first. Language, stars, dates and live links come from the GitHub API when the site builds.
2026Turns relays into simple thermostats in Home Assistant.
2025 - 2026My Hyprland desktop shell, written from scratch in QML.
2026A web control panel for Podman and Docker, with users and roles.
2026Shares the Elegoo CC2 printer's single MQTT connection with every tool.
2026A GNOME-style file manager, written in Rust on GTK4.
2026One page for all my self-hosted services and their status.
2026Puts my Tailboard on every new tab, in a popup, and on right-click.
2026A compact, full-width theme for Uptime Kuma status pages.
2026A fast 3D viewer for G-code toolpaths on Linux.
2026Lets friends run their own Minecraft servers from a browser.
2026Estonian hourly electricity prices as a Home Assistant sensor.
2026Decodes an Estonian personal ID code, in the browser.
2023 - 2024A fish plugin that makes Escape type a pipe.
Work reviewed and merged by maintainers of projects I don't own.
Every request to the recordings panel returned HTTP 500. A readiness check was shelling out to ffprobe on Home Assistant's event loop, once per cached clip. On an install with 85 clips that came to 130 blocking-call errors in three minutes. I traced the call chain, moved the check onto a flag recorded where blocking work is allowed, and the panel returned to HTTP 200 with none.
A device definition for the EZVIZ CS-T10C leak sensor. The generated fallback published a raw alarm bitmap; this maps it to a water_leak sensor and drops the alarm bit the ZCL zone type never sets.
The photograph for that same sensor, cut to the documentation's 512 px transparent-PNG convention.
4,154 contributions on GitHub in the last year.
Three of nine coursework models. Tinkercad and SketchUp for the set exercises, Blender when the set tool was Windows-only. Printable designs are published on Printables.
The set exercise expected a tool that only runs on Windows, which I don't use. I taught myself Blender over two weekends and modelled the tank there instead, with the hull plating, rivets and full running gear.
Built from a drawing across three lessons. SketchUp's web version stalled once furniture came in from the model store, so I moved to the desktop application to finish it.
Gate, curtain walls, a moat and a bowman's tower, worked up from a reference.
Vocational, then applied higher education.
Professional higher education in smart systems and applied information technology. Three and a half years at the Kohtla-Järve campus, taught in Estonian. Started August 2026, alongside the job.
AI-driven development, and the programming groundwork that makes it work: object orientation and the basics you need to judge whether generated code is any good. Most of it was about directing the tools and catching their mistakes.
Networks and hardware with hands on the kit: CAT 5e through CAT 7 terminated by hand, punched down to 110 blocks and keystone panels, and a rack of Cisco switches and routers cabled properly enough to keep using after it was graded. Also where I learned to coax a configuration page out of an access point too old for a modern browser to render one.
What I've actually used in production or in my homelab.