Skip to main content

Blogg

Om webbutveckling, prestanda, verktyg — och då och då något större.

iOSSafariWebKitLexicalcontenteditableDebugging

Fyra buggar dödade textmarkeringen på iOS — och varje bugg gömde nästa

En Lexical-editor i en vaul-drawer fungerade överallt utom på en riktig iPhone: markeringshandtagen gick inte att dra, skrollningen låste sig vid kanterna, verktygsfältet dök under tangentbordet. Att gissa hjälpte inte, för det fanns ingen ensam skyldig — det var fyra oberoende, och var och en maskerade nästa. Det som fungerade var en bisektionsrigg: samma skelett med en strömbrytare per misstänkt, testad på en fysisk enhet. Här är hela jakten — href som förgiftar markeringen, vauls drag-hanterare, vår egen tap-focus, en container som rör sig under fingret — plus obduktionen av skroll-låset och de tre engångsskrivningarna av scrollTop som fick rubber-band att kännas nativt, inklusive att fånga ett svep mitt i studsen.

5 september 202615 min läsning
Läs artikeln
Claude CodeAICLIBashAutomationResilience

En kaskad av agenter: terminalen väljer den som faktiskt lever

När Claude delvis låg nere och vissa modeller slutade svara försökte jag byta till Gemini — och upptäckte att min reserv varit trasig i månader. Så här bygger man en som faktiskt håller.

29 augusti 20269 min läsning
Läs artikeln
Claude CodeAIAutomationMonitoringlaunchdResilience

system-droid: en vakthund som själv kontrollerar och lagar mina system

Mina lokala tjänster dog alltid ljudlöst — morgonrapporten kom inte, tokens gick ut, backupen frös. Så jag byggde en launchd-droid som kontrollerar allt varannan timme, lagar det som riskfritt kan lagas via en Claude-agent och skriver till mig bara när en människa verkligen behövs.

17 augusti 202610 min läsning
Läs artikeln
Next.jsA/B TestingProxyPerformanceSSG

En statisk sida som i hemlighet är ett A/B-test

Ett A/B-test byggs oftast så att sidan faller bort från CDN:en till en rendering per request. Så behöver det inte vara. Håll varje variant helt statisk och låt en proxy (Next.js omdöpta middleware) lösa tilldelningen via en experimentplattform, utifrån ett stabilt device-id — och skriv om bara när besökaren inte är i kontrollgruppen. URL:en ändras aldrig, CDN:en cachar fortfarande, och den vanliga vägen kostar ingenting.

14 augusti 20268 min läsning
Läs artikeln
VercelGitHub ActionsCI/CDDeploymentMonorepo

Deploya till Vercel från CI när den som committar inte är teammedlem

Flytta ett repo till en GitHub-organisation och Vercel börjar tyst blockera dina deployer: committen ”kunde inte matchas mot en teammedlem”. Så här deployar jag i stället från GitHub Actions med Vercels CLI — mina committar räknas fortfarande i min egen GitHub-graf, dashboarden visar fortfarande vem som pushade, och jag köper inte en plats per bidragsgivare.

10 augusti 20268 min läsning
Läs artikeln
Next.jsMemory LeakDockerAWS LambdaNode.js

Next.js Memory Leak: Fetch + Standalone-läge — 2 år utan fix

Next.js patchar den globala fetch och lägger till ett cache-lager som läcker minne vid varje förfrågan. I Docker/K8s leder detta till OOM-krascher var några timmar. Buggen har funnits sedan Next.js 14 och är fortfarande olöst i 16.2.x.

Uppdaterad 10 augusti 202610 min läsning
Läs artikeln
claude-codeproductivityclidevtools

Flera Claude Code-konton på en enhet

Hur du använder två (eller fler) Claude Code-konton parallellt — personligt och företag — med fullständig isolation med en enda miljövariabel.

Uppdaterad 9 augusti 20264 min läsning
Läs artikeln
SolidJSSolidStartPerformanceSSGCode Splitting

Ladda blogginnehåll lazy i SolidStart utan att förlora SSG

Din blogg levererar förmodligen varje inläggs brödtext i ett enda bundle — mitt hade vuxit till 2,88 MB och laddades även på indexsidan, där du bara behöver titlarna. Så här delade jag upp varje inläggs text i en lazy-chunk som laddas vid behov, medan varje sida förblir helt serverrenderad för SEO.

5 augusti 20268 min läsning
Läs artikeln
ailearningcareermethodology

CRAFT: en metod för att använda AI utan att tappa skärpan

Att peka ut ett problem utan att ge en lösning sår bara oro. Efter inlägget om AI-driven kompetensurhålkning kommer nu receptet: CRAFT — fem principer (Challenge First, Review Adversarially, Ask Why Not What, Friction on Purpose, Test Your Understanding) under ett enda axiom: AI gör det du redan behärskar, du gör det du fortfarande håller på att lära dig. En praktisk och lättminnbar metod för att använda AI varje dag utan att tyst förlora kompetens.

Uppdaterad 5 augusti 20266 min läsning
Läs artikeln
JavaScriptAnalyticsEvent DelegationServer ComponentsPerformance

En lyssnare i stället för en klientkomponent per knapp

I samma ögonblick som du lägger till klick-analys på en komponent blir den en klientkomponent som skickar med JavaScript. Gör det över en hel webbplats och enbart spårningen sväller upp din bundle. Här är alternativet som funnits i plattformen sedan urminnes tider: en delegerad lyssnare, deklarativa data-attribut och komponenter som förblir ren serverrenderad HTML.

28 juli 202610 min läsning
Läs artikeln
CSSHTMLAccordionFrontendPerformance

En mjuk dragspelsmeny helt utan JavaScript

Alla griper efter React-state och en höjdmätande hook för att bygga en dragspelsmeny. Webbläsaren har levererat en inbyggd variant i åratal — och sedan 2024 animeras den öppen och stängd med ren CSS. Här är hela tekniken: details[name], ::details-content, interpolate-size, och den enda egenskap som gör att även stängningen animeras.

28 juli 20269 min läsning
Läs artikeln
JavaScriptWebThird-Party ScriptsFrontendPatterns

Fånga ett tredjepartsvärde i samma sekund det landar på window

Ett skript du inte kontrollerar skriver sitt resultat till en global variabel på window vid en tidpunkt du inte kan förutsäga. Det mesta av koden tävlar mot det med en timeout eller belastar main thread med onödig polling. Här är accessor-property-tricket som förvandlar skrivningen till en händelse — plus gettern du aldrig får glömma, och hur du helt kan ersätta värdet.

27 juli 20269 min läsning
Läs artikeln
CSSContainer QueriesTypographyFrontendPerformance

Anpassa text till sin container med ren CSS — utan JavaScript

Alla skriver en JavaScript-hook som krymper font-size tills texten får plats i en container. Här är ett fullt fungerande alternativ helt utan JS — med container query-enheter, clamp() och språkmedveten avstavning, inklusive kaskadfällan som får folk att ge upp.

24 juli 202611 min läsning
Läs artikeln
Next.jsPerformanceCode SplittingTurbopackReact Server Components

next/dynamic räddar dig inte: därför levererar CMS-drivna Next.js-sidor varje chunk

Våra CMS-drivna Next.js-sidor levererade alla ~100 sektionskomponenter på varje route — trots läroboksmässig användning av next/dynamic. Vi uttömde varenda fix på bundler-nivå (direkt import(), filuppdelning, Turbopack-konfiguration, webpack splitChunks) innan vi hittade den verkliga orsaken: nåbarhet, inte chunkning. Kodgenerering vid byggtid + rewrites skar bort 53 % av first-load JS.

18 juli 202614 min läsning
Läs artikeln
obsidianmiroautomationtoolsopen-source

Jag drar ut mina boards ur Miro och in i Obsidian

Export-knappen i Miro ger dig en PNG eller en PDF — ett foto av datan, inte datan. Om dina boards är load-bearing maps of thinking byggda över år hör de hemma i Obsidian: editable, searchable, i ett lokalt vault. Så här drog jag ut boards ur Miro via REST API och konverterade till Excalidraw / Obsidian Canvas — med positioner, färger, fonts, curved connectors, mindmap nodes — och lärdomen sträcker sig längre än Miro: varje SaaS bör mötas med en exit plan INNAN du öppnar den första gången.

30 juni 20266 min läsning
Läs artikeln
claude-codeproductivityclidevtools

Claude Code Multi-Profile, v2: en ren XDG-arkitektur

Efter en månad med det gamla alias-baserade upplägget byggde jag om mitt multi-profile-setup för Claude Code till en XDG-kompatibel struktur under ~/.config/claude-profiles/. Den verkliga orsaken var inte snyggheten — det var att jag upptäckte att ~/.claude.json är en separat fil i home-roten där MCP-servrarna som lagts till via --scope user tyst levde sitt eget liv.

Uppdaterad 23 juni 20269 min läsning
Läs artikeln
ailearningcareerengineering

Tystnaden som AI:n stängde av

Är det fortfarande värt att lära sig programmera när det finns AI? Det högljudda svaret är fel från båda håll. Med evidensunderlaget från 2025–2026 (Nature, Anthropic, AI & Society) är frågan inte "AI eller inte", utan vilka färdigheter du överlåter till AI och vilka du behåller själv — och en sak har faktiskt förändrats: tidigare tvingade verkligheten dig att lära dig genom motstånd, AI stängde tyst av det trycket.

22 juni 20268 min läsning
Läs artikeln
claude-codeagentsaiprompt-engineeringautomation

Hur man skriver Claude Code-agenter som inte ljuger för dig

Två regler för att bygga tillförlitliga Claude Code-agentpipelines: en agent per specialisering och shell-kommandon istället för prompts överallt där kvantitativa svar är inblandade.

29 maj 20266 min läsning
Läs artikeln
ObsidianClaudeMCPAutomationAI

Hur man ansluter Claude Desktop till Obsidian — En resa genom 4 MCP-servrar

En verklig historia om att hitta ett stabilt sätt att automatisera refaktorering av Obsidian-vault via Claude. Vad som gick sönder, vad som fungerade, och varför VaultForge visade sig vara det enda fungerande alternativet.

3 maj 20269 min läsning
Läs artikeln
physicsphilosophyconsciousnessblack-holescosmology

Svarta hål som rekursiva universum: från fysik till existensens syfte

Tänk om varje svart hål är en Big Bang för ett nytt universum? En utforskning av rekursiv kosmologi och kognitiv stängning.

17 april 202610 min läsning
Läs artikeln
aicmsweb-developmentopinionworkflow

AI dödade CMS — åtminstone för enkla webbplatser

Varför traditionella innehållshanteringssystem blir onödiga för portfolios, bloggar och landningssidor.

17 april 20268 min läsning
Läs artikeln
ObsidianPerplexityMCPAIProductivity

Hur man ansluter Perplexity AI till Obsidian via MCP — Anteckningar direkt från chatten

Konfigurera Perplexity Desktop för att läsa och skriva ditt Obsidian-vault med MCP filesystem-server. Sök på webben och spara i dina anteckningar i en konversation.

12 april 20265 min läsning
Läs artikeln
Claude CodeAIObsidianAutomationProductivity

Daglig AI-nyhetsdigest med Claude Code CLI och Obsidian — Noll beroenden

Hur jag byggde en daglig nyhetsforskningsagent med ett 6-radigt bash-skript, Claude Code headless-läge och macOS launchd.

12 april 20267 min läsning
Läs artikeln
next.jsreact-19dark-modezustandperformance

Next.js Dark Mode utan blinkning eller React 19-varningar

Hur man ersätter next-themes med Zustand + useServerInsertedHTML för flimmerfritt mörkt läge i Next.js 15+.

11 april 20268 min läsning
Läs artikeln
Next.jsCSSPerformanceTurbopackSCSS

Hur jag eliminerade 94 renderingsblockerande CSS-filer i Next.js 16 med en dåligt dokumenterad Turbopack-funktion

Efter dagar av att prova varje tillvägagångssätt — från experimental.inlineCss till MutationObserver-hack — upptäckte jag Turbopack Import Attributes som löser problemet med renderingsblockerande CSS i Next.js App Router.

8 april 202612 min läsning
Läs artikeln