Facture
Researchers describe 3D models in plain text and get printable geometry back. An in-house compiler turns LLM-written design documents into OpenSCAD and meshes, with an agent interface for interactive design and repair.
Portfolio
I study computer science at Aarhus University, and I'm technical lead at the university's Interactive Matter Lab, where I coordinate a small developer team. Co-author on three papers in progress.
Outside the lab I run my own production systems with real users: A canteen ordering app for elderly residents with card payments and a live kitchen view; Gaslight, where JavaScript written by strangers battles in daily tournaments. All of it runs on my own Kubernetes cluster, and I'm on-call for all of it.
I chose computer science because I love programming and automating anything that can be automated. Any problem can be cracked with dedication and the right decomposition; divide and conquer., My curiosity doesn't stop at a working prototype: the fun part is carrying an idea to a system real people depend on.
Mostly I write TypeScript and Python, with C++ and Java when the problem calls for it, and Blender, Premiere Pro, or DaVinci Resolve when it's about visuals instead.
Researchers describe 3D models in plain text and get printable geometry back. An in-house compiler turns LLM-written design documents into OpenSCAD and meshes, with an agent interface for interactive design and repair.
Metal 3D printing is too specialized for off-the-shelf software. I led a three-developer team building the pipeline from AI-generated design to a physical silver print — and co-authored the resulting conference paper.
Industrial printheads drop pixels if the data stream stutters. This firmware keeps G-code and Xaar printhead UART traffic in lockstep, with buffer management sized for real print jobs — rebuilt into a terminal UI the lab actually uses.
A cantina for elderly residents replaced paper order slips with touchscreen kiosks — designed for users who find most apps hostile. Card payments run on SumUp terminals; kitchen staff see orders live, grouped by room and activity. In production since 2024.
Users submit JavaScript strategies that fight in daily automated tournaments — meaning the server runs untrusted code from strangers around the clock. Sandboxed execution, tournament orchestration, and live rankings make that safe and watchable.
An AI agent that improves its own codebase: it plans changes, opens PRs against itself, waits for CI to pass, and merges. The interesting problem isn't the LLM calls — it's giving an autonomous system the same safety rails a human team would demand.
When an agent rewrites itself, 'it broke' is not a debuggable statement. SeedWatch logs every LLM call with token counts, per-model costs, and cache hits, so each autonomous cycle can be traced, priced, and explained.
Habit trackers die when logging takes effort. This one accepts any event with a single HTTP request — no app, no UI — so years of personal data accumulate quietly and patterns surface on a dashboard. In daily use since 2024, by me and others.
The scheduling-poll problem: everyone answers, nobody converges. RainDate updates availability live across all participants and highlights the best times as they emerge — so the group decides while looking at the same data.
A client project, live in production with real users. Built and deployed end-to-end on the same infrastructure as everything else on this page.
Game of Life grids grow exponentially, so brute force dies fast. This classifier uses bit-packed grids, multithreading, and Floyd's cycle detection to find and prove which patterns are still lifes, oscillators, or spaceships — and when the search has entered a loop.
Nobody fully understands the strategy space of a dice game with this many decision points. So instead of guessing: a genetic algorithm evolves 1000 strategy variations in parallel, using common random numbers to compare fitness fairly and statistical testing to keep the winners honest.
Everything above deploys itself. CI builds the Docker image, patches the deployment manifest, and ArgoCD syncs it to a Kubernetes cluster running on a Raspberry Pi. Every project gets staging and production environments, health probes, TLS, and monitoring with alerting, all from one shared set of reusable CI workflows. There's no DevOps team to call: I'm on-call, so the setup has to be boring, repeatable, and survive me sleeping.