Portfolio

Rasmus Haversen

rhaversen@gmail.com

Software engineering student at Aarhus University. I build full-stack web applications, write tests, set up CI/CD pipelines, and deploy everything to a self-managed Kubernetes cluster on a Raspberry Pi. Most of these projects are live and used by real people.

I work mostly with TypeScript, Express, Next.js, and MongoDB, but I also write C++ and Java when the problem calls for it. I'm interested in infrastructure, AI agents, and algorithm design.

Infrastructure

All web projects share a common deployment setup. This isn't a separate project, it's just how everything below gets built and run.

Kubernetes

Every service has staging and production deployments with Kustomize overlays. Production runs 2+ replicas with horizontal pod autoscaling (up to 10). Liveness and readiness probes on all pods.

CI/CD

Reusable GitHub Actions workflows run tests, lint, spellcheck, and build Docker images on every PR. On merge, images are built for ARM64 + AMD64 and pushed to DockerHub. ArgoCD syncs the cluster.

Docker

All containers run as non-root users on Debian slim. Production dependencies only. Multi-platform builds (ARM64 for the Raspberry Pi, AMD64 for CI).

Monitoring

Sentry with performance tracing and profiling on all backends. Structured JSON logging via Winston with separate error/info/combined files, forwarded to BetterStack for centralized aggregation.

Security

Helmet, CORS restricted per domain, httpOnly/secure/SameSite session cookies, tiered rate limiting, environment secrets verified at startup, K8s secrets via secretRef.

TLS

All public endpoints served over HTTPS via cert-manager with Let's Encrypt certificates, auto-renewed on the cluster.

Projects

Ordering system for a Danish cantina. Touchscreen kiosks, kitchen display, and card payment.

TypeScriptExpress 5Next.js 16React 19MongoDBMongoose 8RedisSocket.ioPassport.jsSumUp APISentryWinstonBetterStackMochaChainycDockerKubernetes

Gaslight

Competitive programming platform where submitted JavaScript strategies play automated tournaments against each other.

TypeScriptExpress 5Next.js 16React 19MongoDBRedisSocket.ioisolated-vmesbuildesprimaMonaco EditorShikiThree.jsMochaChainycDockerKubernetes

SeedGPT

AI agent that modifies its own source code, opens PRs, waits for CI, and merges — changing itself each cycle.

TypeScriptNode.jsAnthropic ClaudeMongoDBMongoose 8simple-gitOctokitJestDockerKubernetesArgoCD

SeedWatch

Observability dashboard for SeedGPT. Inspect every LLM call with token counts, costs, and cache statistics.

TypeScriptNext.js 16React 19MongoDBMongoose 9Tailwind CSS

Event tracking service. Log events with a single HTTP request from any device, see patterns on a dashboard.

TypeScriptExpress 5Next.js 16React 19MongoDBMongoose 8Passport.jsNodemailerChart.jsdate-fnsSentryWinstonBetterStackMochaDockerKubernetes

Group scheduling app. Invite people, mark availability, and find the best time in real-time.

TypeScriptExpress 5Next.js 16React 19MongoDBMongoose 8RedisSocket.ioPassport.jsNodemailerdayjsSentryWinstonBetterStackMochaDockerKubernetes

C++ tool that generates and classifies Conway's Game of Life patterns as still lifes, oscillators, or spaceships.

C++MSVCPythonNumPyMatplotlibMultithreadingFloyd's AlgorithmBit Manipulation

Diecup-2

Genetic algorithm that evolves strategies for a Danish dice game across a population of 1000 variations.

JavaGenetic AlgorithmCommon Random NumbersMultithreadingPythonStatisticsMulti-Objective Optimization