CVFunSignupLogin

Portfolio

Rasmus Haversen

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.

Research — Interactive Matter Lab

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.

TypeScriptCustom CompilerLLM AgentsOpenSCADNext.js

ManufacturerAI

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.

PythonSwagger/OpenAPITeam CoordinationManufacturing

Quickjet

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.

CUARTG-code StreamingBuffer ManagementTerminal UI

Projects

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.

SumUp APISocket.ioRedisMongoDB AggregationPassport.js

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.

isolated-vmesbuildesprimaMonaco EditorThree.js

SeedGPT

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.

Anthropic ClaudeMulti-Agent PipelineOctokitGitHub Actions CIsimple-git

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.

Next.jsMongoDBCost TrackingPer-Phase Drill-Down

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.

ExpressMongoDBChart.jsPassport.jsToken Auth

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.

Socket.ioRedisExpressMongoDBPassport.js

Dupontdoku

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.

Next.jsExpressMongoDBPassport.js

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.

C++std::threadFloyd's Cycle DetectionBit-Packed GridCanonical Hashing

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.

Javajava.util.concurrentGenetic AlgorithmCommon Random NumbersMulti-Objective Fitness

How all of this runs

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.