A stress therapist's single page, where the site itself slows down: an orb that breathes, statements held on the scroll, a portrait that rides in under a curve.
Selected work
- AndrummetOne page, in her own voice. It opens on a field of spheres with one face among them, breathing; it turns to follow the pointer, and a press sends a ring of colour out through every sphere, and that colour is the page's for the rest of the visit. The landing hands over through a shutter of slats closing in the ground colour of what is underneath.
The methods are three statements, each held on the scroll for a screen and read in a letter at a time, over a satin ground with a breathing line carved into it: a groove, not a stroke, with a lit lip in the session's colour. A curved wipe carries the therapist's portrait up under its arc into the next section, where the reading wraps her outline line by line and the name and the call sit at her shoulder.
Booking is a form with one real choice, in person or over a screen, made with a switch that is a soft body: a ray-marched jelly on WebGPU that squashes when pressed and wobbles when it lands, with a plain switch in the same recess wherever there is no GPU. The send only appears once there is something to send. The page ends on a wordmark carved into the ground that answers the hand. The light moves round its letters, they lift and part under the pointer, they can be pressed in, and it breathes when left alone.
Nuxt 4 and Vue, GSAP with ScrollTrigger and SplitText for the choreography, Lenis for the scroll, TypeGPU for the switch. Every hold and pin is measured to the screen it is on; on a phone the same page is a column that holds where it should and lets go where it should not.
- NØROne page, no navigation to speak of. Work, services, history and clients are laid out as a single travel, and the scroll is what moves through it, so nothing is a click away and nothing is buried a level down.
Selected work is a carousel standing in three dimensions rather than a row of thumbnails. It is pinned and scrubbed: the ring turns as you scroll, the near card faces you square and the ones on either side fall away, so the pieces read as objects being turned rather than as a gallery being paged.
The services list holds its own photograph. Each of the four is a heading, a paragraph and an image that swaps behind them as the list is read, and the whole block stays pinned while it happens so the eye is never asked to travel and change subject at once.
History is a vertical timeline with the years set behind the images rather than beside them, and each frame wiped in from its own edge as it arrives. The client quotes stack one at a time instead of sitting in a row, so each is read before the next exists.
Plain HTML, CSS and JavaScript. GSAP with ScrollTrigger and SplitText for the choreography, Locomotive Scroll for the scroll itself, and the fonts and libraries vendored so the page owes nothing to a CDN.
- Franks KaffeThe menu is the whole site. Every drink carries its own price and its own photograph, so you know what you are getting before you reach the counter. Drink, eat, the craft and find us sit as four plain ways in, with no submenus to dig through.
Two of those sections are built in WebGL rather than as ordinary lists. Drinks is a carousel in glass where one wheel notch is one drink, and the card turns over to what is in it when you click. Food is a ring whose cards fuse as they meet and draw out into threads as they part. Both paint their own canvas, which means the paper colour behind them is set in three separate places and has to be kept in step.
The navigation is a pill of glass pinned to the bottom edge. Every section puts its most important thing at the top of the frame, so a bar up there would always have been standing on something.
Built on Next.js 16 and React 19, with three.js driving the two carousels, GSAP for the rest of the motion and Tailwind v4 for the type.
- Happy LambNot a website. Happy Lamb were updating theirs and needed what goes on it: film of the room and the food for the update, short clips of single dishes, and photographs of the whole menu, every cut of meat and every item on the buffet, shot in the restaurant on its own light. The raw shrimp on ice, the marbled lamb and beef rolled on the plate, the skewers held over the pot, the buffet under the mural, the taps and the mascot. Close where the food is the point, wide where the room is.
The menu concept is a single dark page that carries both languages without doubling its length: each cut named in Swedish and English, a line on why it is there, the animal drawn with the cut marked, and a swatch of the meat itself. The two buffets are set apart by a rule, and the prices are read once, at the top of each.
And with the material came the advice: what to use where, what belongs on the site and what belongs on the table and in the feed, and how to keep it consistent once it has left our hands.
- YozaelOne page for a charter desk, and it moves before it is read. The wordmark is set too large for the frame and drifts slowly out to the left edge, holds there, and fades back to its start. A drawn swallow floats over it and will not be caught: the closer the pointer comes, the harder it is pushed the other way, turning a little as it goes, and it eases back into place once you leave it alone.
The approach is a scattered cluster rather than a row: three numbered cards, each with its own coloured dot, set around a photograph of a jet on a wet apron, placed to the offsets of the design file. Below it the six aircraft classes stand in a grid from turboprop to ultra long range, each with its passengers and range under the name, and each opening to a page of its own with the cabin, the figures typical of the class and the routes it flies non-stop.
The services are four cards that stack. The block pins while you scroll and each card rises from below onto the pile, and every card already there steps back a notch and shrinks a little, so the four read as a deck being dealt rather than a list being passed. Every button is a pill with an arrow in a bubble that swaps sides on hover, so the whole site has one gesture for going somewhere.
The menu is a full screen in the darkest of the card colours, with four links the height of the viewport that arrive one after the other. The page ends on a wordmark set across the whole width, with a jet render laid over its lower half and the dark panel pulled up behind it. The enquiry form asks for the trip and nothing else: where from, where to, when, and how many.
Next.js 16 and React 19, GSAP with ScrollTrigger for the stack and the reveals, Lenis for the scroll, Tailwind v4 for the type. Exported as static files, so the whole site is served with no server behind it.
- Taxi Stockholm, EasterAn Easter commercial for Taxi Stockholm. The brief was two words long, casual and phone-held, so that is how it was shot: the whole film handheld, no gimbal, no rig, no support of any kind, and the small unsteadiness of a hand kept in on purpose. What a phone cannot do is the rest, so under that hand was a full-frame camera recording F-Log2, which is what gives the grade its range and the frames their depth while the movement still says someone just filmed this.
The Easter bunny works the city: at the door of the Taxi Stockholm office, loading bags into a cab with the driver, along the snow, into a reception and a pastry counter, and back to the taxi. Photographed alongside, so the campaign had stills that matched the film.
The commercial is shown here in excerpts only, not as the full spot.
- Taxi Stockholm, KvalitetsveckanAn information documentary on Kvalitetsveckan, Taxi Stockholm's quality week. The point of the film is the point of the week: what makes Taxi Stockholm stand out, why its focus on quality and quality assurance is worth so much to the brand, and why the people there take pride in it. So the film is built on them. The staff are interviewed on camera and the checks are filmed as they happen in the garage: the sticker going on, the car looked over at the door, the dashboard, the vest, the paperwork at the window.
The brief was that it should look filmic, so it was shot on an anamorphic lens: the wide frame, the shallow focus and the flares that come with it, graded to sit together from the interview chair to the garage floor.
We were not permitted to show the whole film, so what is here is a set of excerpts.