Interfaces
React, Next.js and Svelte, but the part that matters is the component library underneath. It is what keeps a site consistent once four people are adding pages to it.
Available for work
01Work
Six years of consulting, mostly on large sites for companies whose names you know, plus a few things built for their own sake. What follows is the work I would show someone deciding whether to hire me.

A headless storefront over Storyblok and Commercetools, where every page resolves in the right language, currency, tax rule and shipping region before it renders. I made the stack decisions, built the component library it is assembled from, and led the 2023 redesign out market by market.
Role Tech leadClient BabyBjörnStack React, TypeScript, GatsbyOutcome 35 countries, 9 languages

Sjuk- och Friskanmälan is where somebody reports themselves sick, reports a child sick, or reports themselves well again, so the interesting problems are the dull ones: BankID, organisation lookup, forms that forget you once you log out, dates that behave at the edges. I built it twice, the second time as a Svelte app shipping inside a .NET codebase older than it. The accessibility audit was the other half of the job.
Role Developer, through Alster DigitalClient Falck, formerly PreviaStack Svelte, React, .NET, Optimizely, BankIDOutcome Built Sjuk- och Friskanmälan · 151,000 employees

One repository holding the web app, both mobile apps, the API and the admin dashboard. Market data is fetched the moment somebody asks for it rather than copied in overnight, which makes the product a live window on the market instead of a warehouse of stale figures.
Role Developer, infrastructure ownerClient OpenIRStack TypeScript, Google Cloud, PostgreSQL, BankIDOutcome Live on web, iOS and Android

Around fifty components moved across to React, from buttons up to calendars, payment elements and the layout system underneath them. The job was matching a design system somebody else had authored rather than relitigating it, which is most of what makes a migration land.
Role Developer, through Alster DigitalClient StanStack React, TypeScript, Vue, NuxtOutcome ~50 components migrated

A Next.js and Storyblok front over a .NET back end, with BankID for members. I came in partway through, took the relaunch through its QA, and then built the parts only a signed-in member sees: the association home page, a new API version behind it, and the checkout people buy courses through.
Role Developer, through Alster DigitalClient StyrelseakademienStack Next.js, Storyblok, .NET, BankIDOutcome Relaunched, 16 associations

The half of the work nobody sees is that a joke is a system: it needs the timing, the camera and the physics to cooperate before it is funny. I build those, and write the lines they are carrying.
Role Half of a two-person studioTeam Snug Slug GamesStack Unity, C#, Game design, WritingOutcome Demo on Steam, full game 2027
Built the component library behind Tobii's site, turning design documents into pieces that stayed consistent as the pages multiplied.
ReactTypeScriptNext.jsLive concert streaming, sold by the ticket. I worked on the event page and the player, where the difficulty was DRM: protected playback behaving the same in every browser.
SvelteKitTypeScriptShaka PlayerWidevineA video-first social app built around challenges and prizes. I built its back office alone: the tool for creating a challenge, setting its rules and deciding who won.
SvelteKitTypeScriptAzureA meeting-transcription and sales-insight tool. I built the authentication between the CMS and the chat app, then extracted the whole thing into a white-label base and forked it twice.
Next.jsPostgreSQLAzure AI SearchAn SDK making a web CMS the source of truth for native apps, so pages come from content rather than from a release. Research and a pitch, demoed toward Storyblok themselves.
FlutterDartStoryblokA Flutter SDK and code generator for Storyblok, and the open-source half of the mobile work above. Published to pub.dev and later shown in one of Storyblok's own webinars.
FlutterDartCode generationA ski resort platform on Umbraco, and the widget people book through. Maintenance and on-call, which is its own discipline: the site has to work at seven on a February morning.
Umbraco.NETTypeScriptResearch at KTH on acting in motion capture when your character is a different size than you are: a VR system that lets performers see through the eyes of a body they do not have. Published at IEEE VR and presented at the conference.
UnityC#VRMotion captureThis site. Statically rendered, with no CMS: posts are MDX files and the design system is a set of CSS custom properties, down to the syntax highlighting.
Next.jsTypeScriptMDXLorem ipsum dolor sit amet, consectetur adipiscing.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
React, Next.js and Svelte, but the part that matters is the component library underneath. It is what keeps a site consistent once four people are adding pages to it.
The API and the data behind the screen: route handlers, .NET and Razor on client work, and the schema decisions that decide how painful next year is.
Auditing against WCAG and the European Accessibility Act, then doing the unglamorous work of fixing what the audit found and keeping it fixed.
Local pipelines and scripts, including running image models on my own machine. If a thing is done more than twice it should be a command.