> maagero.dev
[email protected] Tønsberg, Norge English

Mathias Maagerø Lekven

Fullstackutvikler, med mål om gode brukeropplevelser

Jeg er fullstackutvikler med en kjærlighet for frontend. De siste årene har jeg bygget løsninger i både Vue og React med .NET eller Supabase bak — fra elektronisk stemmegivning i en folkeavstemning til styreportal og datarom der tilgangsstyring og sporbarhet er selve produktet. Det siste året har jeg jobbet AI-assistert i den typen kode — høy fart på selve skrivingen, men med verifikasjonen forankret hos meg og ikke hos maskinen. Jeg jobber tett med design og forretning, og er mest fornøyd når det jeg leverer faktisk kan brukes av alle som skal bruke det.

Tilgjengelig for oppdrag

Send meg en e-post

Utvalgte prosjekter

Samvar — Hemvar og Fagvar

Fagpersonen skriver tilstandsanalysen i Fagvar; rapporten deles gjennom det felles .NET-API-et inn i styrets Hemvar.FagvarAnalyseRapportDelt API.NETHemvarStyret

Samvar er to produkter på én plattform. Hemvar er driftsappen for boligselskap — borettslag og sameier — der styret følger opp eiendommen sin: avvik med bilder, driftsoppgaver, vedlikeholdsplan og dokumenter, per bygg. Fagvar er verktøyet fagfolkene bruker til tilstandsanalyser. Poenget er koblingen mellom dem: rapporten en fagperson skriver i Fagvar havner rett inn i styrets Hemvar, i stedet for å bli en PDF på e-post.

Jeg startet på Samvar høsten 2025, på kveldstid og i helger ved siden av oppdraget hos Admincontrol — med Sopra Sterias viten, og mot eierandel i selskapet heller enn lønn. Siden september 2026 er det hovedbeskjeftigelsen min. Jeg er eneste utvikler, i tett samarbeid med en designer, og har tatt de tekniske valgene. Tre React 19-apper — Hemvar, Fagvar og et internt adminverktøy — i et pnpm- og Turborepo-monorepo med Vite og TanStack Router, mot ett felles .NET-API på PostgreSQL. Ett API holder driftskostnadene nede for et lite selskap, og Next.js var mer rammeverk enn vi trengte. Clerk håndterer innlogging, tenants er typet per app, og roller sjekkes på hvert endepunkt, ikke bare i grensesnittet. Det vanskeligste var rapportsynken: en Fagvar-rapport blir til snapshots knyttet til kilderapporten, slik at styret ser riktig tilstand per bygningsdel og historikken aldri overskrives. Faktureringsmodellen har endret seg flere ganger, så jeg bygget en migreringsvei i API-et for å bytte leverandør per tenant fra adminappen. Bygningsdeler er kodet etter NS 3451, eiendommer slås opp mot matrikkelen hos Kartverket, og fakturering går per bygg via Tripletex. Grønne tester er et krav for deploy: API-et går til Azure med azd ved merge til main, frontendene via Vercel. Jeg la arkitekturen og bygget de første delene for hånd, og har siden jobbet AI-assistert med prosjektspesifikke instruksjoner og min egen kode som mønster.

I produksjon med betalende kunder.

  • React 19
  • TypeScript
  • Vite
  • TanStack Router
  • .NET
  • PostgreSQL
  • Clerk
  • Turborepo
  • Azure
  • Vercel
  • Tripletex

Kvepp — én utfordring om dagen, bare med vennene dine

Kvepp (kvepp.app) er en app der du og vennene dine får én felles utfordring hver morgen klokka 08. Du har én dag på deg og ett bilde å ta, og du ser hva vennene dine har lagt ut først når du har lagt ut ditt eget. Grupper med QR-invitasjon og egne utfordringer gjør den til et verktøy for vennegjengen på tur. Ingen offentlig feed, ingen følgere du ikke kjenner, ingen annonsesporing.

Kvepp er mitt eget produkt, fra idé til App Store, og jeg har gjort alt selv. Mobilappen er React Native med Expo, nettsiden React, og bak ligger et .NET-API på PostgreSQL med S3-kompatibel objektlagring for bildene. Det viktigste valget var hvor dataene bor. Backend, database og lagring kjører i containere på en Hetzner-server i Finland, e-post går via Brevo, og posisjon og annen metadata fjernes fra bildene før de lagres. Jeg valgte europeiske leverandører overalt der det fantes et alternativ, slik at så lite som mulig av brukernes data går til USA. Lærdommen fra Samvar var å bruke mer tid på drift og deploy tidlig, så her ble det planlagt før første linje kode. Teknisk var ingenting av dette vanskelig. Det var et prosjekt for moro skyld, og for å kjøre hele løpet alene: app, nettside, backend, drift og innsending til App Store.

Godkjent i App Store, lansering kommer.

  • React Native
  • Expo
  • React
  • TypeScript
  • .NET
  • PostgreSQL
  • S3
  • Docker
  • Hetzner
  • Brevo

Admincontrol — styreportal og virtuelt datarom

Styrer og rådgivere når fortrolige dokumenter gjennom en React-portal og tilgangsstyring i .NET, mot datarommet i SQL Server.StyrerådgiverPortalReactTilgang.NET-APIDataromSQL Server

Admincontrol leverer styreportal og virtuelt datarom til styrer, ledergrupper og rådgivere i Norden. Alt som ligger der er fortrolig — styrepapirer, transaksjonsdokumenter, sensitive personopplysninger — og tilgangsstyring og sporbarhet er ikke en detalj rundt produktet, det er produktet.

Jeg var én av tre fullstackutviklere fra Sopra Steria, sammen med en QA-ingeniør fra oss og produkteier, arkitekt og designer hos Admincontrol. Vi jobbet kanban-aktig mot faste releasesykluser, ikke i sprinter. Kodebasen er fra 2010 og har blitt modernisert underveis: React og TypeScript i frontend, .NET mot SQL Server bak. Stor, moden og med mye historikk å ta hensyn til. Kravene til presisjon gikk gjennom alle lag: en feil i tilgangsstyring eller datamodell er ikke en kosmetisk bug her, den er et sikkerhetsbrudd. GDPR lå i bunnen av alt, i praksis som etablerte regler og mønstre fra eksisterende kode som nye løsninger måtte følge. Hver endring gikk gjennom en streng pull request-prosess med automatiserte tester, sikkerhetssjekker i CI og godkjenning fra kolleger før den kunne gå videre. Jeg skrev enhetstestene for min egen kode; integrasjons- og ende-til-ende-tester lå hos QA og arkitekt. Jeg brukte AI aktivt for å holde høy fart, men med min egen verifikasjon som et eget lag i prosessen. Det laget fanget noe hver eneste uke: navngiving som brøt med kodebasens konvensjoner, logiske feil i kantene, og ikke minst altfor mye kode til enkle problemer. Fart fra maskinen, kontroll fra mennesket.

  • React.js
  • TypeScript
  • .NET
  • C#
  • SQL Server

Elektronisk stemmegivning til folkeavstemning

Velger logger inn via ID-porten og en Backend-for-Frontend i .NET, til stemmeportalen i Vue.VelgerID-portenOIDCBFF.NET 7StemmeportalVue

Valgdirektoratet har det operative ansvaret for valggjennomføring i Norge. Til folkeavstemningen i Søgne, Songdalen og Kristiansand skulle det for første gang leveres en løsning der stemmeberettigede kunne avgi stemme elektronisk.

Vi var tre utviklere, en designer, en produkteier og QA. Jeg hadde frontend-ansvaret og bygget stemmeportalen i Vue med TypeScript, på et nytt designsystem basert på Valgdirektoratets eget. I tillegg hadde jeg ansvaret for autorisasjon: jeg satte opp Duende Identity Server og innloggingen via ID-porten, og bygget Backend-for-Frontend-laget i .NET 7 sammen med mentoren min. BFF-en var et bevisst valg framfor å la Vue-appen snakke rett mot backend. Den ga oss ett sted å oppfylle ID-portens strenge OIDC-krav, et sikkerhetslag foran backend, og et sted å vaske data på vei ut og validere data på vei inn. Om lag 30 000 stemmeberettigede, og over 80 prosent av dem stemte elektronisk. Mye av arbeidet gikk til å sikre at hver stemme ble registrert nøyaktig én gang, og at et avbrutt forsøk ikke krysset velgeren ut av manntallet. Backend-systemene var skilt fra hverandre og dataene kryptert, slik at en stemme ikke kan spores tilbake til en person. Innleide penetrasjonstestere fant blant annet at avstemningen kunne blokkeres med forfalskede forespørsler i volum. Det ble rettet i koden og i tillegg håndtert med rate limiting hos drift, før stemmeperioden åpnet. Tilgjengelighet var et strengt krav, med WCAG 2.1 som mål. Jeg kjørte brukertester med Blindeforbundet, og de førte til konkrete endringer: funksjoner de etterspurte, bedre kontrast, og hover-tilstander som endrer form og ikke bare farge.

Over 80 prosent av stemmene kom inn elektronisk — enklere og rimeligere enn en rent fysisk gjennomføring.

  • Vue.js
  • TypeScript
  • .NET 7
  • OIDC / ID-porten
  • WCAG 2.1
  • C#
  • Duende Identity Server
  • Scrum
  • GitLab

SyntPop — syntetiske testpersoner for helsesektoren

Syntetisk folkeregister mates gjennom en modell og et .NET-API til SyntPop-grensesnittet i React.SyntetiskfolkeregisterModellAPI.NETSyntPopReact

Norsk Helsenett trengte realistiske, men syntetiske testpersoner for å kvalitetssikre digitale helsetjenester uten å røre ekte persondata. SyntPop er selvbetjeningsløsningen for å finne, opprette og redigere slike testpersoner.

Vi var to utviklere, en arkitekt og en produkteier. Jeg hadde frontend-en alene: React og TypeScript mot et .NET-API dokumentert med OpenAPI. SyntPop var pilot for Norsk Helsenetts nye designsystem, så komponentene kom fra et annet team mens de fortsatt var under utvikling. Jeg var første reelle bruker: testet dem, meldte tilbake, og tilpasset iblant en komponent lokalt og viste dem hva jeg hadde måttet gjøre, slik at endringen gikk tilbake inn i systemet. WCAG 2.1 kom inn fra starten på samme måte. Utenfor frontend jobbet jeg med generatoren for resepter: testpersonene fantes allerede, men trengte realistiske legemiddelhistorikker. Reglene for hva som kan knytte en person til en diagnose er strenge, så jeg skrev Python-regler som vasket et datasett med resept- og legemiddeldata ned til det som kunne brukes som treningsdata, og var med på å trene og teste modellen.

  • React.js
  • TypeScript
  • .NET
  • WCAG 2.1
  • Python
  • OpenAPI / Swagger
  • Scrum

Drift og modernisering av kassesystemer

Kassene sender hendelser over RabbitMQ til .NET-tjenester og videre til butikkdatasystemet.KasseRabbitMQTjenester.NETButikkdata

Extenda Retail leverer kasse- og butikkdatasystemer til ledende dagligvarekjeder i Norge og Norden. Systemene er forretningskritiske: står de, stanser butikkdriften.

Systemene sto hos NorgesGruppen og Reitan, i et stort antall butikker og kasser, med back office på kjedenes egne servere. Jobben min var feilsøking og retting i store .NET-systemer i daglig produksjon, ut fra kundenes egne beskrivelser: finne fram til riktig sted i et system jeg ikke hadde skrevet, forstå hva som faktisk skjedde, og rette uten å ødelegge noe annet. Deler var hendelsesdrevet over RabbitMQ. Moderniseringen fra .NET Framework 4.5 mot .NET 5 skjedde komponent for komponent, utløst av feilrapporter heller enn som eget prosjekt. Teamet jobbet testdrevet, så jobben var ofte å skrive tester rundt eksisterende kode før den kunne endres trygt.

  • C#
  • .NET Framework
  • RabbitMQ
  • TDD
  • MySQL
  • .NET Core
  • GitHub

Tastaturbo og modernisering av læringsspill

Gamle Flash-spill portet til JavaScript, testet med skjermleser og leselist.Flash-spillPort tilJavaScriptSkjermleserleselist

Statped lager digitale læremidler for barn og unge med særskilte behov. Tastaturbo er et skriveverktøy som brukes i skolen, ved siden av en portefølje eldre læringsspill bygget i Flash.

Jeg var eneste utvikler. Jeg skrev om minst åtte Flash-spill til JavaScript fra bunnen av: uten tilgang til kildefilene spilte jeg spillene, dokumenterte reglene og den pedagogiske hensikten, og bygget dem på nytt i HTML5 og CSS. Tastaturbo bygget jeg fra første linje, mitt første store prosjekt, i samarbeid med en blind testbruker, to lærere og en designer og illustratør. Jeg brukertestet jevnlig med blinde og døve elever. Det viktigste jeg lærte der var hvordan en blind bruker faktisk opplever en side: at semantisk HTML, riktige elementer og riktig rekkefølge i dokumentet ikke er pynt, men selve grensesnittet.

Læremidlene kunne fortsatt brukes i skolen etter at Flash ble faset ut.

  • JavaScript
  • Universell utforming
  • Brukertesting
  • HTML5
  • CSS
  • Scrum

Erfaring

  1. Kvepp Gründer, utvikler og alt det andre

    Egen app for daglige bildeutfordringer blant venner — bygget, driftet og sendt til App Store på egen hånd, på europeisk infrastruktur.

  2. Sopra Steria Senior systemutvikler

    Senior systemutvikler ved kontoret i Drammen, hele perioden ute hos Admincontrol — sikkerhetskritisk programvare for styrer og transaksjoner.

  3. ContentCloud Fullstackutvikler Selvstendig oppdrag

    Selvstendig oppdrag på en UGC-plattform og markedsplass, fra planlegging til lansering — arkitektur og teknologivalg, design og siste finpuss.

  4. Valgdirektoratet Rådgiver og fullstackutvikler

    Del av et mindre team som forvaltet deler av valgsystemet EVA, i tillegg til folkeavstemningsløsningen. Under valg støttet jeg valgkontorene med feilsøking og retting, noe som krevde at jeg kjente hele systemet fra back office-siden.

  5. Capgemini Konsulent, frontendutvikler

    Utleid som frontendkonsulent, hovedsakelig til Norsk Helsenett.

  6. Extenda Retail Software engineer

    Feilsøking og feilretting i forretningskritiske legacy-systemer, ut fra kundenes egne beskrivelser.

  7. Statped Rådgiver og utvikler

    Modernisering av læringsspill for blinde og døve elever, blant annet porting fra Flash til JavaScript.

Kompetanse

Til daglig

  • TypeScript
  • React
  • Tailwind CSS
  • HTML
  • CSS
  • .NET (C#)
  • PostgreSQL
  • REST-API
  • Git

Komfortabel med

  • Next.js
  • Vue.js
  • Nuxt
  • OIDC og autentisering
  • WCAG 2.1
  • Semantisk HTML og ARIA
  • Supabase
  • Brukertesting
  • GitHub Actions
  • Scrum
  • OpenAPI / Swagger
  • TDD
  • i18n

Kjent med

  • Python
  • Kotlin
  • RabbitMQ
  • Azure
  • Docker

Universell utforming er ikke en avkrysningsboks for meg. Jeg har jobbet med WCAG 2.1 på tvers av offentlig sektor, helse og utdanning, brukertestet med blinde og døve brukere, og vært med på å bygge designsystemer der kravene er lagt inn fra starten i stedet for etterpå.

Utdannelse

  • 2015–2018
    Bachelor i informatikk, NTNU
    Valgfag innen frontendutvikling og design. Bacheloroppgave om personvern og sikkerhet på nett.
  • 2018–2019
    Årsenhet, lektor, NTNU
    Pedagogikk, matematikk og kjemi.

Sertifiseringer

  • Microsoft Certified: Azure Developer Associate
    11.2021
  • Kotlin for Java Developers
    11.2025

Språk

  • Norsk
    Morsmål
  • Engelsk
    Meget god muntlig og skriftlig
  • Norsk tegnspråk
    Grunnleggende

Kontakt

[email protected] Tønsberg, Norge