← Back

Work

Three things I build and run. Every number on this page is measured, not estimated: traffic comes from my own analytics, and the booking figures come from the booking database itself.


cphsecuritywait.dk

Live security queue times at Copenhagen Airport

cphsecuritywait.dk showing the current security wait time, a six hour trend graph, passport control times and delayed departures

In July 2022 I was flying to Nice and could not find out how long the security queue was. I built this that weekend. It has been running ever since.

It reads live data from the airport, falls back through a second source and then its own database if the feed goes quiet, and it has been recording the queue every few minutes for four years. That archive is the interesting part: the airport publishes only the current number, so as far as I know this is the only public record of how it has moved over time. The site serves Danish and English, plus an arrive-by planner, passport control times, live parking occupancy, delayed departures and an embeddable widget.

Next.js on Vercel, Postgres and a Python scraper on a Hetzner box, Prisma, umami for analytics. I do all of it: the scraping, the database, the frontend, the hosting, the SEO and the content.

35,000+
visitors in July 2026
5.8x
vs July 2025
83%
arrive from Google

christiansoefarten.dk

The ferry from Bornholm to Christiansø, Denmark's easternmost point

The previous christiansoefarten.dk: a fixed-width layout with overlapping panels and highlighted text
Before
The new christiansoefarten.dk: a full-width photographic hero with clear navigation and a booking call to action
After

Christiansøfarten sails to a 340 year old island community with no cars and about 90 residents. The previous site had reached the point where the fuel surcharge notice overlapped the departures panel.

The rebuild was deliberately not a rewrite of everything. Their booking engine works, holds years of history and is what the crew uses on the quay, so I left it alone and rebuilt the public site on top of it. Lower risk, and the money kept flowing the whole way through.

A CMS built from scratch on Payload

The client edits everything themselves, so the content model mattered more than the design. I built it on Payload 3 against Postgres, with 24 content blocks in the page builder, most of them purpose-built for this site: hero, schedule, experiences, events, FAQ, tables, callouts and so on. Pages are assembled from blocks rather than typed into one big rich text field, which is what keeps a site like this from decaying after handover.

It runs in three languages, Danish, English and German, with Danish as the default and fallback so a half-translated page shows Danish rather than nothing. Translation is AI-assisted from inside the admin: the editor picks a model, and a translate-all action fills in the other two languages for them to review. Also wired in: SEO fields, site search, redirects, nested docs, a form builder and live preview.

Payload 3 on Postgres (Neon), Next.js 16, React 19, Tailwind 4, Vercel Blob for media, deployed on Vercel.

16,500+
visitors in July 2026
43,000+
pageviews in July 2026
+88%
mobile bookings, same season
3
languages

On that mobile figure, because it is the one that matters and it is easy to overstate. Comparing the same season either side of the relaunch, May to July, from the booking database: 2025 had 13,580 bookings of which 3,830 were made on a phone. 2026 had 13,750 bookings of which 7,214 were. Total bookings are flat, and they should be. The ferry has a fixed number of seats and peak summer sells out either way, so no website can sell more. What a rebuild can change is how easily people can book, and mobile went from a minority channel to the majority one.


nofipa

Gold trading and pawn, Copenhagen

My day job. I am Head of IT and own the technology end to end: the systems the business runs on, internal automation, integrations, security and IT strategy, plus the customer-facing sites pantsat.dk and nordiskguld.dk, now also launching into Sweden. I lead the IT team and am currently growing it.

Mostly TypeScript and Node, Next.js, Directus, Postgres and a lot of process automation.


Working together

I take on a small number of freelance projects through MDL Consulting, usually for businesses that need a site that actually brings customers in rather than one that just exists. If that sounds like you, reach me on LinkedIn.