Projects
Everything I have built, from websites to a booking system. Tap a card for the full story.
- Sparsom

Sparsom
THE PROBLEMGetting an overview of your own finances means keeping the budget yourself, and the recurring charges you have forgotten keep going out. Fifteen suggestions in a list becomes no action at all.
WHAT I DIDI built the landing page and the waiting list. The one move worth mentioning: the site refuses to publish a claim about security until a human has checked the source. If the source is missing, the whole build stops.
STATUS TODAYThe app itself is not built yet. What is out there is the landing page and the waiting list.
STACKsparsom.aiNEXT.JS · REACT 19 · TAILWIND V4 · MOTION · PLAYWRIGHT · VERCEL
- Toms Arena

Toms Arena
THE CLIENTThe clinic is Tom Skjønnhaug’s. He has treated elite athletes since 1985, and Thor Hushovd, Lars Monsen and Nusa are among the clients. That is what the clinic says on its own page.
WHAT I DIDI built the clinic’s landing page: what the treatment is, who it is for, and who stands behind it. The booking is the clinic’s own, and it is untouched.
STACKVANILLA JS · SETMORE · VERCEL
- Ice Dream

Ice Dream
WHAT I DIDI built the site for the kiosk and café. The whole menu is sorted into groups, so a guest finds ice cream, waffles and pizza without reading the lot. The opening hours are not a picture of a table: an indicator works out whether it is open right now, and says when it opens again if it is not. At the foot it says where in the centre they are.
STACKicedreamstrommen.noNEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL
- Varingskollen Borettslag

Varingskollen Borettslag
THE PROBLEMThe document links to bylaws, house rules and application forms pointed at nothing. The news items lived in the browser’s own memory, behind a password field in the frontend code. The shared trailer had no booking system.
WHAT I DIDI ported the site to Next.js and built the board’s tooling: one-time-link sign-in locked to the board’s five addresses, an admin panel for news and notices, and trailer booking against a database with row-level security, where a neighbour deletes their own booking with a key instead of having to sign in. The conditions at the top of the page are pulled from three sources: Fnugg supplies lifts, slopes and snow depth, MET supplies the forecast, and Frost supplies the station’s measurements. Fnugg’s terms require the credit to sit with the data, so it renders only on the page that shows the conditions, and disappears if a source is down.
STATUS TODAYThe database layer is built, but waiting for the board to switch it on.
STACKNEXT.JS · TYPESCRIPT · TAILWIND · VERCEL
- Håvard Weider

Håvard Weider
THE PROBLEMHåvard is a carpenter and runs the firm on his own. Jobs came in over the phone, and he had no page showing what he actually does.
WHAT I DIDI built the site. Two things are worth naming. One is a clickable house: you point at the part of the building the job concerns, and get the service that belongs to it. The other is the hero video, which is fetched only once it is a quarter in view, and never on a small screen, on data saver or on 2G, so an expensive file is not sent to anyone who did not ask for it.
STACKhweider.noNEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL
- Pawsome Plushies

Pawsome Plushies
WHAT I DIDI set up the store for the US market, with Meta Pixel and the Conversions API for tracking, Klaviyo for e-mail and Judge.me for reviews.
STACKpawsomeplushies.comONLINE STORE · META PIXEL/CAPI · KLAVIYO · JUDGE.ME
- KMG Stansefabrikk

KMG Stansefabrikk
THE CLIENTKarl M. Gulbrandsen Stansefabrikk is a stamping works in Norwegian industry, established in 1917. They do sheet metal work, machining and wire erosion with CAD/CAM, and they draw and develop products together with the customer, from a specification of what the product is for and how it works. Those are the company’s own facts, stated on the company’s own page.
WHAT I DIDI rebuilt the site: 24 routes in Norwegian and English, every one statically prerendered, with every string and every number generated from the source files rather than typed by hand. The front page follows one workpiece through five states, from coil to finished part, and under each state stands the machine that does the job, with its own measurements. Where the source lacks a fact or contradicts itself, it is marked in the page and collected into a worksheet for the customer instead of being guessed.
STATUS TODAYThe site sits on a preview domain while the content is reviewed with the customer.
STACKkmg-beta.vercel.appNEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL
- Booking system

Booking system
THE PROBLEMA booking system is not a booking button. It is availability computed against holidays, blocked hours and what is already booked, roles that each see their own data, and a log that records who opened what.
WHAT I DIDBooking in six steps (practitioner, service, date, time, details, confirmation), where every day in the month grid shows the actual number of free slots, computed against holidays, blocked hours, extra opening days and existing bookings. The admin panel is ten routes: calendar, all bookings with filtering and CSV export, customers, services, practitioners, documents, message inbox, settings, blocked hours, and an append-only audit log. Cancellation, waiting list and a contact form come with it. The copy exists in Norwegian and English.
STATUS TODAYThe clinic is invented, and the site says so on every page. All data resets every 24 hours, and the site asks the reader not to enter real personal data. Both admin logins are published openly on the front page, because half the system sits behind them.
STACKbooking-demo-rosy.vercel.appSUPABASE · POSTGRES · EDGE FUNCTIONS · CLOUDFLARE TURNSTILE · VERCEL