Teknologistakken bag Uniteapps — og filosofien bag valgene

Bo Sundgaard

En ærlig gennemgang af de teknologiske valg bag Uniteapps — fra React og Next.js til Supabase og Vercel — og filosofien bag AI-assisteret systemudvikling.

Teknologistakken bag Uniteapps — og filosofien bag valgene

Fra rod til arkitektur: Uniteapps version 2

Den første version af Uniteapps opstod hurtigt. For hurtigt. AI-assisteret udvikling er forførerisk: man kan bare skyde løs og se resultater vokse frem på skærmen næsten i realtid. Men hvad der ser imponerende ud i de første timer, ender med at koste dyrt i de næste dage. Koden hænger ikke sammen. Biblioteker overlapper. Strukturen er bygget til gårsdagens forståelse af problemet.

UniteApps V2 startede anderledes. Jeg brugte adskillige timer på at skrive en detaljeret arkitekturplan, inden jeg rørte en linje kode. Det viste sig at være den bedste investering i hele projektet. God AI-assisteret udvikling handler ikke om at slippe kontrol — det handler om at udøve mere kontrol, tidligere i processen. Pseudo-koden, beregningslogikken og de overordnede strukturbeslutninger er mine. AI'en implementerer indenfor de rammer, jeg har sat.

For selvom en moderne AI-agent er imponerende genial, kan den i samme åndedrag træffe beslutninger der er irrationelle og kontraproduktive — medmindre den er holdt i kort snor. Hellere bruge fem timer på en god plan end at spilde tyve timer og millioner af tokens på noget der skal rives ned alligevel.

React og Next.js — valgt med omtanke

Valget af React og Next.js var både teknisk og pragmatisk. React er et af de mest modne, veldokumenterede og udbredte JavaScript-frameworks til webapplikationer. Next.js bygger oven på det med serverside-rendering, intelligent caching, filbaseret routing og et produktionsklar deploymentsflow.

Det tekniske argument er solidt: komponentarkitekturen er skalerbar, applikationen er hurtig, og TypeScript giver den type-sikkerhed der er nødvendig, når beregningslogik skal være korrekt til juridiske formål.

Men det pragmatiske argument er mindst ligeså vigtigt: AI-agenter er ekstremt gode til React. Ikke tilfældigt — React har verdens største community og dokumentationsbase. Når man arbejder AI-assisteret, er valget af framework ikke bare et teknisk spørgsmål, men et spørgsmål om, hvor meget kontekst og præcedens agenten har at trække på. React vinder den konkurrence.

Sidst, men ikke mindst: continuous deployment fungerer fejlfrit. Et commit til GitHub udløser automatisk et build og en deployment. En ny funktion er live inden for et minut.

Infrastruktur — tre servere, én DNS

Uniteapps kører ikke ét sted. Den kører tre steder.

Den primære instans kører på Vercel. Det var ikke mit første valg — jeg startede med Docker på en selvejede server — men så opdagede jeg Vercel. Platformen er lavet til Next.js (de er fra samme selskab), og integrationen er gnidningsfri: preview-deployments, edge-caching, automatiske rollbacks og et dashboard der faktisk giver mening.

Faktrisk brugte jeg Koyeb inden Vercel kom ind i billedet. Koyeb er en elegant managed platform med en æstetik og brugeroplevelse der er tæt på Vercels niveau. Den kørte fint, men jeg ville gerne have mere kontrol over infrastrukturen.

Den tredje instans kører på en Linux-VPS hos Hetzner, administreret via Coolify — en open source-platform til selvhostet deployment. En rigtig Linux-server er fundamentalt anderledes end en managed tjeneste: man kan konfigurere præcis hvad man vil, afvikle sideprocesser, sætte cronjobs op og generelt gøre ting, som managed platforme ikke tillader.

Alle tre instanser kan aktiveres som primær platform med én DNS-ændring. Det er ikke et system bygget til daglig failover — det er et system bygget til sindsro og fleksibilitet.

MCP-servere — AI'ens forlængede arm

MCP — Model Context Protocol — er en åben standard der gør det muligt for AI-agenter at kommunikere direkte med eksterne systemer. Tænk på det som specialiserede stik, der giver agenten adgang til at hente information og udføre handlinger i en bestemt tjeneste — uden at man som udvikler skal fungere som mellemmand.

Både Vercel og Supabase har MCP-servere. Det betyder i praksis, at Claude, Antigravity og VScode + Copilot (ja jeg bruger faktisk alle 3) kan:

  • Hente produktionslogfiler fra Vercel og debugge direkte i deploymentsmiljøet
  • Køre SQL-forespørgsler mod Supabase, oprette tabeller og inspicere data
  • Analysere fejl og foreslå løsninger baseret på det faktiske produktionsmiljø — ikke et rekonstrueret testmiljø

Det lyder som en detalje. Det er det ikke. Det er forskellen på at debugge med og uden kontekst. En agent der kan se den rigtige fejl i det rigtige miljø, løser problemer markant hurtigere end en agent der arbejder på antagelser. På den måde slipper jeg for endeløs kopiering fra serverlog og DOM i browseren.

Supabase — database og auth i ét

Databasen kører i Supabase, som er et open source-alternativ til Firebase bygget oven på PostgreSQL.

Valget af Supabase handler om tre ting. For det første håndterer de brugerautentificering komplet og korrekt — email, magic links, OAuth — med Row Level Security direkte i databasen. Man behøver ikke bygge et separat adgangskontrollag.

For det andet er PostgreSQL en robust relationsdatabase, der håndterer de komplekse aggregeringsforespørgsler og statistik-queries som admin-dashboardet kræver. Det er ikke en nice-to-have — det er en forudsætning for, at platformen kan skalere til at betjene mange organisationer med isolerede data.

For det tredje: MCP-serveren, som allerede nævnt.

Dependencies — en undervurderet vedligeholdelsesopgave

AI-agenter er gavmilde med dependencies. Til enhver opgave henter de instinktivt et nyt bibliotek ind, fordi det er den hurtigste vej til en løsning. Resultatet er hurtigt et projekt med overlappende funktionalitet og ingen konsistens.

Jeg har brugt tid på at holde dette i skak. Uniteapps har ét sæt valgte biblioteker til PDF-håndtering, én datoformateringspakke, én chart-løsning. Det sker ikke af sig selv — det kræver, at man jævnligt siger nej til agentens forslag, selvom forslaget teknisk set virker.

En anden dimension er licenserede biblioteker. Open source er ikke altid frit for kommerciel brug, og det kræver en aktiv indsats at holde styr på licensbetingelserne i en voksende dependency-liste. Til blogfunktionen og flere af de avancerede PDF funktioner bruger Uniteapps Syncfusion — en professionel komponent-suite med en rich text editor, som jeg har erhvervet startup-licens til. Syncfusion er anderledes fra de gængse open source-alternativer, og AI-agenterne er ikke nær så hjælpsomme her som med React eller Supabase. Det kræver, at man selv sætter sig grundigt ind i dokumentationen — eksempelvis via Context7, der kan hente opdateret biblioteksdokumentation direkte ind i agentens kontekst. Det er egentlig et godt eksempel på, at man som AI-assisteret udvikler ikke kan slippe for at forstå de værktøjer man bruger.

Cloudflare — DNS som kontrolpanel

Alle tre serverinstanser styres via Cloudflare som DNS-udbyder. Det er præcis det, der gør den ene DNS-ændring mulig: Cloudflare er det centrale kontrolpunkt, der bestemmer, hvilken instans der er aktiv. En ændring i Cloudflares dashboard propagerer globalt på få sekunder.

Men Cloudflare er mere end DNS. Det fungerer også som CDN og sikkerhedslag foran applikationen — med DDoS-beskyttelse, bot-filtrering og caching af statiske assets tæt på brugerne. Det er infrastruktur, der normalt kræver et dedikeret ops-team at opsætte, men som med Cloudflare er konfigureret på under en time.

Fremtiden — portaler til fagforeninger og advokatkontorer

Uniteapps er i dag et offentligt tilgængeligt værktøj. Det næste skridt er at tilbyde dedikerede portaler til organisationer — fagforeninger og advokatkontorer der ønsker en skræddersyet version med egne værktøjer, eget brand og egne brugere.

Infrastrukturen er allerede på plads og er testet i tæt samarbejde med udvalgte kolleger. Modellen er klar: en organisation får sin egen instans med de beregnere og funktioner, der er relevante for netop dem. Supabase-arkitekturen med Row Level Security gør det muligt at holde data fuldstændig isoleret på organisationsniveau.

Det er et stykke vej fra én mands sideprojekt til et B2B-produkt — men arkitekturen er bygget til det fra start.

Synes du artiklen var nyttig?

Del den med dit netværk

Del artikel: