Projekt
Utvalt arbete
Projekt
Saker jag har byggt. Skrivbordsvyn visar dem som ett interaktivt solsystem — här är den läsbara listan.
-
HRM
liveFull-stack-system för personalhantering
Produktionsklart HR-system byggt enligt portföljstandard. Två databaser (PostgreSQL för strukturerad data, MongoDB för en oföränderlig hash-kedjad granskningslogg), 38 finkorniga behörigheter med användarspecifika undantag, TOTP-tvåfaktorsautentisering, hastighetsbegränsning på serversidan, OpenTelemetry-spårning, 18 språk och realtidsaktivitetsnotiser via SSE (med pollning som reserv).
- 2906+ tester
- 92,2 % radtäckning
- PostgreSQL + MongoDB
Integrationer
- Google OAuth
- GitHub OAuth
- Sentry
- OpenTelemetry
- Next.js
- React
- TypeScript
- PostgreSQL
- MongoDB
- Prisma
- MUI
- Jest
- Playwright
- Docker
- GitHub Actions
- Zod
- NextAuth
- next-intl
- ReactFlow
- Pino
- pg-boss
-
Platform
liveCommunityplattform byggd ovanpå HRM
Live communityplattform som tjänar ett riktigt WoW-gille på vuohiliitto.com. Turborepo-monorepo med HRM som git-undermodul. Fleranvändarstöd med WoW-temad spelifiering (XP, nivåer, prestationer, uppdrag), flikbaserad chatt med viskningar och slash-kommandon, en Mythic+-teamspårare via Raider.IO API och en guidad rundtur för nya medlemmar.
- Riktiga användare
- Fleranvändarstöd
- 1388+ tester
Integrationer
- Raider.IO API
- Google OAuth
- GitHub OAuth
- GitHub API
- Turborepo
- Next.js
- React
- TypeScript
- PostgreSQL
- Prisma
- NextAuth
- MUI
- Playwright
- Jest
- next-intl
-
Portfolio
wipDen här sajten
Sajten du tittar på just nu. Helt statisk, byggd med Astro, Three.js och GSAP. En visuell uppvisning av rörelsehantverk, medvetet skild från produktionsstacken som används i HRM och Platform.
- Astro
- Three.js
- GSAP
- TypeScript
- Tailwind CSS
-
ReadLog
liveSpåra varje bok du läst
Personlig läsdagbok. Söker i Open Library och Google Books parallellt och avduplicerar resultat, sedan kan du logga böcker med format (papper / e-bok / ljudbok), ett 0–5-stjärnbetyg och slutdatum. Publikt anonymt flöde av nyligen loggade böcker på startsidan.
- 90 tester
- Sökning från flera källor
Integrationer
- Open Library
- Google Books
- Google OAuth
- Next.js
- React
- TypeScript
- Prisma
- PostgreSQL
- NextAuth
- MUI
- Jest
-
ReadLog .NET
liveReadLog, portad till ASP.NET Core
En idiomatisk ASP.NET Core-portning av ReadLog, körandes live och gratis på Azure App Service. Samma läsdagboksapp — sök i Open Library och Google Books, logga böcker med format, slutdatum och ett 0–5-stjärnbetyg, bläddra i ditt bibliotek och ett publikt "nyligen läst"-flöde — återskapad i .NET 8 Razor Pages, EF Core + SQLite och ASP.NET Core Identity (lokal och Google-inloggning). Containeriserad och levererad av en granskarstyrd GitHub Actions-pipeline till GHCR, sedan vidare till Azure via OIDC; EF Core-migrationer tillämpas vid första körningen.
- ASP.NET Core 8-portning
- Live på Azure App Service
- EF Core · SQLite · OIDC-deploy
Integrationer
- Open Library
- Google Books
- Google OAuth
- .NET 8
- ASP.NET Core
- Razor Pages
- EF Core
- SQLite
- ASP.NET Identity
- Bootstrap 5
- xUnit
- Docker
- GitHub Actions
- Azure App Service
-
AudiobookMaker
wipPDF → ljudbok
Skrivbordsapp som omvandlar PDF-, EPUB-, Word/DOCX- och textfiler till ljudböcker; skannade PDF:er körs först genom Tesseract-OCR. Fyra TTS-motorer: Edge-TTS (moln, 30+ röster på sex språk), Piper (offline, ingen GPU krävs), Chatterbox med "Grandmom"-rösten för röstkloning från ett kort referensklipp och VoxCPM2 för zero-shot röstkloning och röstdesign från text (kräver NVIDIA-GPU, endast utvecklarinstallation). Samma Chatterbox-motor ger rösten åt berättelsen i Spacepotatis. Engelsk talsyntes fungerar redan bra; finska är svårare att syntetisera med tillgängliga resurser, så den har en dedikerad 19-stegs textnormaliseringspipeline som hanterar kontextbaserad nummerböjning, förkortningsexpansion, enhetsavtal och lånordsuttalskorrigeringar — kvaliteten förbättras med varje release. Levereras som en Windows-installerare med automatiska uppdateringar och 3000+ tester.
- Chatterbox röstkloning med Grandmom-rösten
- 19-stegs finsk textnormalisering, 3000+ tester
- Ger rösten åt berättelsen i Spacepotatis
Integrationer
- Microsoft Edge-TTS
- Python
- PyMuPDF
- ebooklib
- ocrmypdf
- Tesseract
- num2words
- edge-tts
- Piper
- Chatterbox
- VoxCPM2
- PyTorch
- CustomTkinter
- pydub
- pygame
- ffmpeg
- PyInstaller
- Inno Setup
- GitHub Actions
-
Spacepotatis
liveWebbläsarspel — din potatis mot galaxen
Live webbläsarspel där en potatis i en sköldbubbla skjuter buggar tvärs över en procedurell galax. Bootar som en vintage-terminal, öppnar sig till ett 3D-solsystem du drar och zoomar, släpper sedan dig i top-down vertikal strid i andan av Tyrian 2000. Next.js 16 + React 19-skal runt en Phaser 4-stridsscen; Three.js + GSAP driver galaxvyn och kameraövergången in i strid; PostgreSQL på Neon talas till via Kysely (typad SQL-byggare, ingen ORM). All röst genererad av AudiobookMaker; all musik skriven i strudel-patterns. Levereras med en uppsättning egna Claude Code-skills under .claude/skills/ — versionshanterade, granskade, behandlade som produktionsartefakter.
- Next.js 16 + Phaser 4 + Three.js
- ~1300 tester, CI vid varje push
- Egna Claude Code-skills som produktionsartefakter
Integrationer
- Google OAuth
- Next.js
- React
- TypeScript
- Phaser 4
- Three.js
- GSAP
- PostgreSQL
- Kysely
- NextAuth
- Tailwind CSS
-
Strudel Patterns
liveAlgoritmisk musik i Strudel
Live-kodad elektronisk musik skriven i Strudel — en JavaScript-mönstermotor, port av TidalCycles. Varje spår är ett enda komponerbart uttryck: staplade synthar, baslinjer, trumkomp och effektkedjor. Skapad genom ett strukturerat AI-arbetsflöde — instruktion på naturligt språk → generering → lyssna → iterera, med beslut loggade vid sidan av git-historiken. Utvalda spår tonsätter Spacepotatis (galaxvy, missionsteman, berättelsebakgrund) och landningssidan på mikkonumminen.dev. Återanvändbart komponentbibliotek, kuraterade synthpresets, sessionsanteckningar per iteration.
- Live-kodat i Strudel
- AI-styrd iteration, loggad i git
- Soundtrack till Spacepotatis och mikkonumminen.dev
- Strudel
- JavaScript
- Web Audio API
- Claude Code
-
claude-continue
wipHåll Claude Code-fönster rygg mot rygg
Ett plattformsoberoende Python-verktyg — en CLI plus ett enknapps Tkinter-GUI — som håller Claude Codes 5-timmarsfönster för användning igång rygg mot rygg. Det läser det aktiva fönstrets återställningstid från ccusage, väntar på övergången och återupptar sedan pausade sessioner — broadcast till iTerm2 på macOS, till tmux-paneler på macOS eller Linux, eller en headless-körning på Windows/WSL — och laddar om för nästa fönster. Körs oövervakat via launchd (macOS) eller Windows Task Scheduler. Byggt för långa autonoma agentkörningar — och ärligt om den granskningsskuld som det mönstret skapar.
- Python · Tkinter-GUI
- macOS · Windows · WSL · Linux (tmux)
- Oövervakat via launchd / Task Scheduler
- Python
- Tkinter
- ccusage
- PyInstaller
- launchd
- Task Scheduler
- tmux
- GitHub Actions
-
PasswordManager
wipNollkunskaps-lösenordshanterare i Rust
Lokalt förankrad lösenordshanterare där en enda Rust-crate är den enda platsen där kryptering existerar — Argon2id-nyckelderivering och XChaCha20-Poly1305-autentiserad kryptering, kompilerad både nativt och till WebAssembly. Fyra klienter delar den: ett offline-först CLI-valv på SQLite, en synkserver som endast lagrar krypterad text, en WASM-klient i webbläsaren och ett Chrome-tillägg med autofyllning och spara-vid-inloggning. Post-specifika nonces och AEAD bundna till post-id + tidsstämpel förhindrar att poster byts ut; nycklar nollställs efter användning; huvudlösenordet lämnar aldrig klienten. Varje säkerhetsval är dokumenterat som en ADR mot en uttrycklig hotmodell, och CI vaktar hemligheter borta från repot samtidigt som den kör format, clippy, hela arbetsytans tester och wasm-bygget.
- En krypto-crate, fyra klienter
- Argon2id + XChaCha20-Poly1305
- Servern lagrar endast krypterad text
Integrationer
- Google OAuth
- Tailscale Funnel
- Cloudflare Tunnel
- Rust
- WebAssembly
- Tokio
- SQLite
- Argon2id
- XChaCha20-Poly1305
- wasm-bindgen
- Chrome Extension (MV3)
- JavaScript
- GitHub Actions
-
claude-agents
liveKostnadsroutade subagenter för Claude Code
En liten global uppsättning Claude Code-subagenter som slutar betala Opus-priser för arbete som en billigare modell klarar lika bra. Tolv agenter, var och en fixerar både modellnivå och resonemangsansträngning i sin frontmatter: Haiku för skrivskyddad rekognosering (scout, log-miner, scribe, dep-checker, tidy), Sonnet för specifikationsstyrda redigeringar (mechanic, test-writer, locale-translator, doc-scribe, migrator, bisect), och en ofixerad architect som ärver sessionens modell för designarbete. Agenterna känner självmant av varje repos stack — testkörare, linter, i18n-struktur — så en enda uppsättning täcker JS-, C#- och Python-projekt. Installeras som ett Claude Code-plugin från en delad marknadsplats eller via script. MIT-licensierat.
- 12 modellfixerade agenter
- Frikopplar modellnivå från resonemangsansträngning
- Plugin- eller skriptinstallation
- Claude Code
- Claude Haiku
- Claude Sonnet
- Claude Opus
- Bash
- Markdown
-
Feedback Intelligence
liveUnderbyggd feedbackanalys med en lokal LLM
Feedback-intelligensmotor som omvandlar rörig fritextfeedback till situationssignal utan att låta LLM:en komma nära siffrorna: ett deterministiskt, regelkodat larmlager beräknar varje antal och trend, och LLM:en strukturerar bara indata och syntetiserar temanarrativ — varje påstående citerat tillbaka till feedback-id och nedgraderat till en reservlösning om det inte klarar validering. Domäner är kopplingsbara moduler (först ut: finsk hybriddetaljhandel med dagligvaror och järnhandel); en konfigurationsflagga byter in en annan domän utan kärnändringar. .NET 8 ovanpå en lokal Poro 2 8B på Ollama — vald i ett 30-omgångars blindtest — med en live-demo på Azure Static Web Apps som når den lokala GPU:n via en Tailscale Funnel till noll molnkostnad för inferens. GDPR-ren syntetisk korpus, flerskiktat försvar mot prompt-injektion, hermetisk xUnit-svit i CI.
- Deterministiska larm — LLM:en räknar aldrig siffrorna
- Kopplingsbara domäner, inga kärnändringar
- Live-demo på Azure, inferens på en lokal GPU
Integrationer
- Tailscale Funnel
- .NET 8
- C#
- SQLite
- Ollama
- Poro 2 8B
- Microsoft.Extensions.AI
- xUnit
- Docker
- Node.js
- Azure Static Web Apps
- Azure Functions
- GitHub Actions
- CodeQL