Projects

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

  • SparsomScreen capture of the front page of Sparsomsparsom.aiCLIENT WORKPRE-LAUNCH

    Sparsom

    THE PROBLEM

    Getting 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 DID

    I 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 TODAY

    The app itself is not built yet. What is out there is the landing page and the waiting list.

    STACK

    NEXT.JS · REACT 19 · TAILWIND V4 · MOTION · PLAYWRIGHT · VERCEL

    sparsom.ai
  • Toms ArenaScreen capture of the front page of Toms ArenaCLIENT WORKIN PROGRESS

    Toms Arena

    THE CLIENT

    The 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 DID

    I 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.

    STACK

    VANILLA JS · SETMORE · VERCEL

  • Ice DreamScreen capture of the front page of Ice Dreamicedreamstrommen.noCLIENT WORKRUNNING

    Ice Dream

    WHAT I DID

    I 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.

    STACK

    NEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL

    icedreamstrommen.no
  • Varingskollen BorettslagScreen capture of the front page of Varingskollen BorettslagCLIENT WORKIN PROGRESS

    Varingskollen Borettslag

    THE PROBLEM

    The 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 DID

    I 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 TODAY

    The database layer is built, but waiting for the board to switch it on.

    STACK

    NEXT.JS · TYPESCRIPT · TAILWIND · VERCEL

  • Håvard WeiderScreen capture of the front page of Håvard Weiderhweider.noCLIENT WORKRUNNING

    Håvard Weider

    THE PROBLEM

    Hå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 DID

    I 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.

    STACK

    NEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL

    hweider.no
  • Pawsome PlushiesScreen capture of the front page of Pawsome Plushiespawsomeplushies.comONLINE STORERUNNING

    Pawsome Plushies

    WHAT I DID

    I 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.

    STACK

    ONLINE STORE · META PIXEL/CAPI · KLAVIYO · JUDGE.ME

    pawsomeplushies.com
  • KMG StansefabrikkScreen capture of the front page of KMG StansefabrikkCLIENT WORKIN PROGRESS

    KMG Stansefabrikk

    THE CLIENT

    Karl 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 DID

    I 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 TODAY

    The site sits on a preview domain while the content is reviewed with the customer.

    STACK

    NEXT.JS · REACT 19 · TYPESCRIPT · TAILWIND V4 · VERCEL

    kmg-beta.vercel.app
  • Booking systemScreen capture of the front page of Booking systemWORK SAMPLEOPEN DEMO

    Booking system

    THE PROBLEM

    A 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 DID

    Booking 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 TODAY

    The 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.

    STACK

    SUPABASE · POSTGRES · EDGE FUNCTIONS · CLOUDFLARE TURNSTILE · VERCEL

    booking-demo-rosy.vercel.app