Utvalgt arbeid

Case-studier

Hver case under er forankret i et ekte repositorium. Private prosjekter beskrives uten kundedetaljer; koden kan vises på forespørsel.

2026Arkitekt og eneste utviklerPrivat repositorium

AI-kursgenerator for en e-læringsplattform

En læringsplattform som genererer komplette, sammenhengende kurs fra kildedokumenter med Gemini, rettet mot norske kommuner og bedrifter. Privat repositorium, detaljer på forespørsel.

Kursgenerering er en lang kjede av LLM-kall som må overleve omstarter, holde budsjettet og leses som én fortelling, ikke som sammenlimte moduler. Kommunale anbud legger til SSO, universell utforming og verifiserbare kursbevis.

Python 3.12FastAPITemporalPostgreSQL 16 + pgvectorGemini (google-genai)Next.js 16 + React 19MinIODocker Compose

Tilnærming

  • Genereringen kjører som en Temporal-arbeidsflyt (innhenting, blåkopi, komponering, kvalitetsport, lokalisering, media, publisering) med varige sjekkpunkter i PostgreSQL.
  • 16 orkestreringsagenter (Architect, Composer, Critic, NarrativeKeeper, Localizer) og 13 blokktype-generatorer, hver med en dokumentert kontrakt.
  • Alle Gemini-modellstrenger ligger i én nivå-enum; tre avviklinger i samme syklus betydde å redigere én fil.
  • Store nyttelaster flyttet til MinIO etter å ha truffet Temporals 2 MB blob-grense.
  • Flerleietaker via radnivåsikkerhet i PostgreSQL; Entra ID SSO per skole.

Det som finnes i dag

  • 70 arkitekturbeslutninger (ADR) og et levende prosjektmanifest som eneste sannhetskilde.
  • 62 Alembic-migrasjoner, 195 testmoduler; CI kjører gitleaks, ruff, mypy og pytest mot ekte PostgreSQL.
  • Utviklingsmiljø utrullet av GitHub Actions ved hver sammenslått pull request.
  • PDF-kursbevis med QR-verifisering.
2026Arkitekt og eneste utviklerPrivat repositorium

Personlig nettsted med AI-tvilling, RAG og GDPR-kontroller

Dette nettstedet: en portefølje med en chatassistent som svarer på spørsmål om bakgrunnen min fra en kuratert kunnskapsbase, bygget etter produksjonsstandard. Privat repositorium, detaljer på forespørsel.

En offentlig chatbot om en virkelig person må holde seg til temaet, motstå prompt-injeksjon, bare sitere godkjent materiale og behandle besøksdata i tråd med GDPR.

Astro 5 + React 19FastAPISQLAlchemy 2 (async) + AlembicPostgreSQL 16 + pgvectorGemini (google-genai)Celery + RedisOpenTelemetryDocker Compose

Tilnærming

  • Hver melding går gjennom et injeksjonsvern (regex pluss en Flash-klassifiserer som feiler lukket), en intensjonsklassifiserer og hybrid gjenfinning (pgvector HNSW pluss BM25) før hovedmodellen strømmer et svar.
  • Kunnskapsbasen mates fra opplastede dokumenter og utvalgte GitHub-repositorier: skannet for hemmeligheter, oppdelt, embeddet og synkronisert nattlig.
  • CV lagret som språkvise seksjoner i PostgreSQL, importerbar fra en LinkedIn-eksport, og brukt av CV-siden, PDF-eksporten og tvillingens fakta.
  • Daglig oppbevaringsjobb (30 dager for chat); endepunkter for eksport, sletting og retting knyttet til en hashet besøkstoken; ingen sporingsinformasjonskapsler.
  • Kun Gemini, via google-genai, modell-ID-er i én konfigurasjonsfil.

Det som finnes i dag

  • Kjører på én server med Docker Compose; utrulles kun via GitHub Actions.
  • Fire grensesnittspråk: engelsk, norsk bokmål, russisk, ukrainsk.
  • OpenTelemetry-spor, Prometheus-metrikker og Grafana-dashbord.
2026Arkitekt og eneste utviklerPrivat repositorium

Dashbord for drift av Telegram-kanal og fellesskap

Et flerleietaker-dashbord for å drive en Telegram-kanal og diskusjonsgruppen dens: meldingssynkronisering, publisering, antispam, nyhetskuratering og Gemini-drevet analyse. Privat repositorium, detaljer på forespørsel.

Manuell moderering av et aktivt fellesskap skalerer ikke: spam kommer tilslørt, relevante nyheter må finnes daglig, og ingen kan lese tusenvis av meldinger for å se hva folk diskuterer.

Python 3.12FastAPIpython-telegram-bot + TelethonPostgreSQL 16 + pgvector (asyncpg)Gemini (google-genai)React + TypeScriptDocker Compose

Tilnærming

  • To Telegram-veier: en webhook-bot for sanntidshendelser og svar, og Telethon (MTProto) for inkrementell historikksynkronisering med deteksjon av slettinger.
  • Antispam-motoren normaliserer Unicode og leetspeak, matcher fraser, beregner tillitsnivå og utfører handlinger gjennom et strategiregister.
  • Meldinger embeddes med gemini-embedding-2 i pgvector; temaanalyse og nyhetsrelevans bruker strukturerte utdata typet med Pydantic.
  • RSS-kilder hentes etter tidsplan, vurderes for relevans av Gemini og klargjøres for publisering.
  • Leietakerkontekst injiseres per forespørsel, slik at flere kanaler deler én utrulling.

Det som finnes i dag

  • 17 rutemoduler, 16 React-sider pluss servergenererte maler.
  • Utrullet med Docker Compose; alle porter bundet til loopback bak nginx.
  • Skjemaet vedlikeholdes for hånd i koden uten migrasjonsverktøy, en avveining jeg ikke gjentok senere.
2026Arkitekt og eneste utviklerPrivat repositorium

Selvdriftet plattform for webskraping og AI-analyse

En plattform som oppdager URL-er, skraper og renser sider, analyserer dem med Gemini og eksporterer strukturerte data, med et React-dashbord på toppen. Privat repositorium, detaljer på forespørsel.

Skraping i stor skala krever høflig hastighetsbegrensning, proxy-rotasjon, captcha-deteksjon og nye forsøk, og rå HTML er ubrukelig før den er renset, strukturert og oppsummert. Hvert trinn feiler på sin måte.

Python 3.12FastAPICelery + RedisPostgreSQL 16MinIOGemini (google-genai)React 18 + Vite + Tailwind 4Traefik

Tilnærming

  • Trinnene (oppdag, skrap, parse, analyser, eksporter) kjører som Celery-oppgaver på dedikerte køer med Redis som megler og MinIO for lagring.
  • Oppdagelse via sitemaps med robots.txt-støtte, crawling eller URL-lister; URL-gruppering merket av Gemini.
  • httpx-henter med autothrottle, backoff og helsesjekkede proxy-pooler; Playwright for JavaScript-rendrede sider.
  • Strukturerte Gemini-utdata gir sammendrag, entiteter, sentiment og kvalitetsscore, og utleder uttrekksmaler fra sidestrukturen.
  • Hvert LLM-kall logges med token- og kostnadsstatistikk; kjøretidsinnstillinger kan redigeres fra grensesnittet.

Det som finnes i dag

  • 12 Alembic-migrasjoner; enhets- og integrasjonstester med en mock-server for captcha- og hastighetsbegrensningsatferd.
  • Eksport til JSON, CSV, Markdown og PDF (WeasyPrint).
  • Kjører på én server med Docker Compose bak Traefik, med Flower for køovervåking.
2026HovedutviklerPrivat repositorium

Selvdriftet CRM for en norsk konsulentvirksomhet

Et CRM som kombinerer kundehåndtering, booking, meldinger, videosamtaler, kurssalg og dokumentsamarbeid, fullt selvdriftet på én server. Privat repositorium, detaljer på forespørsel.

Kunden ville ha kundedata på norskkontrollert infrastruktur, ingen obligatoriske leverandørkontoer, tre grensesnittspråk og ett sted der eier, ledere og kunder jobber, uten fem separate produkter og fem innlogginger.

Next.js 15 + TypeScriptPrismaPostgreSQL 16 + pgvectorRocket.Chat (hodeløs)Jitsi MeetMinIOGeminiDocker Compose + nginx

Tilnærming

  • Etter en første iterasjon med ferdige verktøy, samlet alt i én Next.js-applikasjon der roller skilles med ruter og middleware.
  • PostgreSQL er den eneste sannhetskilden; Rocket.Chat, MediaCMS og MinIO kjører hodeløst og refereres gjennom en externalRefs JSONB-kolonne.
  • Easy!Appointments, Jitsi Meet og ONLYOFFICE eksponert på egne subdomener bak nginx.
  • Myk sletting på alle entiteter, optimistisk låsing via et versjonsfelt, tillatelser som tupler av rolle, ressurs og handling.
  • Bakgrunnsarbeidere for pgvector-embeddinger (Gemini) og videotranskoding.

Det som finnes i dag

  • GitHub Actions ruller ut ved push til main etter Prisma-generering og TypeScript-sjekk, med helsesjekk og en produksjons-samtidighetsgruppe.
  • Driftshåndbok, tillatelsesmatrise, go-live-sjekkliste, sikkerhetskopiskript og seks ADR-er i repositoriet.
2025UtviklerPrivat repositorium

Nettsted for VPS-leverandør med planlagt AI-innholdsgenerering

Det offentlige nettstedet til en VPS-leverandør: et eldre PHP-nettsted omstrukturert til et MVC-lag, med en daglig cron som publiserer blogginnlegg gjennom Gemini-API-et. Privat repositorium, detaljer på forespørsel.

Nettstedet hadde vokst som PHP-includes uten rutingslag, og bloggen trengte en jevn strøm av tekniske artikler uten et innholdsteam.

PHP 8MySQL (PDO)Gemini REST APICloudflareNginxCron

Tilnærming

  • Innførte en PSR-4-autolastet kjerne (Router, Request, Config) med kontrollere, modeller og tjenester, og lot de eldre includes virke for cron-jobber.
  • Emner legges i kø i en databasetabell med datoer; en daglig cron plukker ventende emner, kaller Gemini over REST med et JSON-responsskjema og Google Search-forankring, og prøver på nytt ved feil.
  • Etter publisering tømmes Cloudflare-cachen og søkemotorer varsles via IndexNow.
  • Cloudflare Turnstile på skjemaer, samtykke for informasjonskapsler og et bloggsøk-API.
  • Main- og dev-grener svarer til live- og dev-servere; en dev-modus slår på profiler og debug-verktøylinje.

Det som finnes i dag

  • Sitemap med omtrent 2 900 URL-er, inkludert over 2 500 innlegg, som dokumentert i repositoriet.
  • Produktsider for GPU-skiver, microVM-er, AI-inferens, spillservere og CI/CD.
2025ForfatterGitHub ↗

Verktøykasse for klargjøring av Ubuntu-servere

Tre Bash-skript som tar en fersk Ubuntu 22.04-server til en herdet, tunet webvert og legger til Laravel- eller PHP-domener med TLS i én kommando.

Å sette opp en PHP-vert for hånd er repetitivt og feilutsatt: pakker, en admin-bruker uten root, brannmur, tuning av PHP-FPM og MySQL, vhosts og sertifikater må gjøres likt hver gang.

BashUbuntu 22.04 LTSNginxPHP-FPMMySQLCertbotFail2ban

Tilnærming

  • postinstall.sh installerer Nginx, MySQL, PHP (versjon oppdages automatisk), Memcached, Composer, ionCube, Fail2ban og Certbot, og oppretter en sudo-adminbruker med en standard katalogstruktur.
  • Antall PHP-FPM-arbeidere og MySQL-minneinnstillinger utledes fra oppdaget RAM, CPU og disk.
  • addDomain.sh oppretter vhost, loggkatalog og Let's Encrypt-sertifikat for et domene, med en Laravel-variant.
  • install_project.sh setter opp et Laravel-prosjekt på den klargjorte verten.
  • Streng modus (set -euo pipefail), ikke-interaktiv APT og egne loggfiler.

Det som finnes i dag

  • Omtrent 1 000 linjer Bash fordelt på tre skript, kjørbare direkte fra repositoriet.
  • Offentlig repositorium.
2025ForfatterGitHub ↗

Flerspråklig skattekalkulator for enkeltpersonforetak

En avhengighetsfri nettleserkalkulator som anslår skatt for 2025 for et ENK i Norge, på fire språk, med brutto-til-netto- og netto-til-brutto-modus.

Folk som starter virksomhet i Norge, mange av dem uten norsk som morsmål, trenger en rask og gjennomsiktig oversikt over hvordan trygdeavgift, skatt på alminnelig inntekt og trinnskatt summeres, og hvilket overskudd et ønsket nettobeløp krever.

JavaScriptHTMLCSSlocalStorage

Tilnærming

  • Skattereglene er kodet som data: 10,7 % trygdeavgift på næringsinntekt, 22 % skatt på alminnelig inntekt og de fem trinnskattstegene for 2025, hvert med lenke til den offisielle kilden hos Skatteetaten.
  • Omvendt beregning (ønsket netto til nødvendig overskudd) implementert med binærsøk over den fremadrettede modellen.
  • Oversettelser i én fil per språk med nestede nøkler og en reserve; valget lagres i localStorage.
  • Månedlig eller årlig inndata, resultater i begge, og en valgfri annen valuta med manuell kurs.

Det som finnes i dag

  • Fire språk: norsk, engelsk, ukrainsk og russisk.
  • Ren HTML, CSS og JavaScript uten byggetrinn eller eksterne avhengigheter.

Vil du diskutere et prosjekt?