Én listener i stedet for én klientkomponent pr. knap
I det øjeblik du tilføjer klik-analytics til en komponent, bliver den til en klientkomponent, der sender JavaScript med. Gør det på tværs af et helt website, og tracking alene puster dit bundle op. Her er alternativet, der har ligget i platformen hele tiden: én delegeret listener, deklarative data-attributter og komponenter, der forbliver ren server-renderet HTML.
En jævn accordion helt uden JavaScript
Alle griber efter React-state og en højdemålende hook for at bygge en accordion. Browseren har haft en indbygget af slagsen i årevis — og siden 2024 animerer den både åbning og lukning med ren CSS. Her er hele teknikken: details[name], ::details-content, interpolate-size og den ene egenskab, der også får lukningen til at animere.
Fang en tredjeparts-værdi i det øjeblik den lander på window
Et script du ikke kontrollerer, skriver sit resultat til en global variabel på window på et tidspunkt du ikke kan forudsige. Det meste kode kører om kap med det via en timeout eller spilder main thread på polling. Her er accessor-property-tricket, der gør skrivningen til en event — plus den getter du ikke må glemme, og hvordan du helt kan substituere værdien.
Tilpas tekst til dens container med ren CSS — uden JavaScript
Alle skriver en JavaScript-hook, der skrumper font-size, indtil teksten passer i en container. Her er et fuldt fungerende alternativ helt uden JS — med container query-enheder, clamp() og sprogbevidst orddeling, inklusive kaskadefælden, der får folk til at give op.
next/dynamic redder dig ikke: Hvorfor CMS-drevne Next.js-sider sender hver eneste chunk
Vores CMS-drevne Next.js-sider sendte alle ~100 sektionskomponenter på hver rute — på trods af lærebogsagtig brug af next/dynamic. Vi udtømte alle bundler-niveau-fixes (direkte import(), fildeling, Turbopack-konfiguration, webpack splitChunks), før vi fandt den egentlige årsag: nåbarhed, ikke chunking. Codegen på build-tidspunkt + rewrites skar first-load JS med 53%.
Jeg trækker mine boards ud af Miro og ind i Obsidian
Export-knappen i Miro giver dig en PNG eller en PDF — et foto af dataene, ikke dataene selv. Hvis dine boards er load-bearing maps of thinking bygget op gennem år, hører de hjemme i Obsidian: editable, searchable, i et lokalt vault. Sådan trak jeg boards ud af Miro via REST API og konverterede til Excalidraw / Obsidian Canvas — med positioner, farver, fonts, curved connectors, mindmap nodes — og lektien rækker længere end Miro: enhver SaaS skal mødes med en exit plan FØR du åbner den første gang.
CRAFT: en metode til at bruge AI uden at miste sit faglige fodfæste
En diagnose uden kur er bare angst. Efter indlægget om AI-drevet afkvalificering kommer her recepten: CRAFT — fem principper (Challenge First, Review Adversarially, Ask Why Not What, Friction on Purpose, Test Your Understanding) under ét aksiomet: AI gør det, du allerede mestrer; du gør det, du stadig er ved at lære. En praktisk og lettilgængelig metode til at bruge AI hver dag uden stille at miste sine kompetencer.
Stilheden, som AI'en slukkede
Er det stadig værd at lære programmering, når der findes AI? Det højlydte svar er forkert fra begge sider. Med evidensgrundlaget fra 2025–2026 (Nature, Anthropic, AI & Society) er spørgsmålet ikke "AI eller ej", men hvilke færdigheder du overlader til AI, og hvilke du beholder selv — og én ting har faktisk ændret sig: før tvang virkeligheden dig til at lære gennem modstand, AI slukkede stille det pres.
Claude Code Multi-Profile, v2: en ren XDG-arkitektur
Efter en måned med den gamle alias-baserede tilgang byggede jeg mit Claude Code multi-profile-setup om til en XDG-kompatibel struktur under ~/.config/claude-profiles/. Den egentlige grund var ikke ryddelighed — det var opdagelsen af, at ~/.claude.json er en separat fil i home-roden, hvor MCP-serverne tilføjet via --scope user stille boede.
Sådan skriver du Claude Code-agenter, der ikke lyver for dig
To regler for at bygge pålidelige Claude Code-agentpipelines: én agent pr. specialisering, og shell-kommandoer i stedet for prompts overalt, hvor kvantitative svar er involveret.
Flere Claude Code-konti på én enhed
Sådan bruger du to (eller flere) Claude Code-konti parallelt — personlig og virksomhed — med fuld isolation ved hjælp af én enkelt miljøvariabel.
Sådan forbinder du Claude Desktop med Obsidian — En rejse gennem 4 MCP-servere
En virkelig historie om at finde en stabil måde at automatisere refaktorering af Obsidian-vault via Claude. Hvad der gik i stykker, hvad der virkede, og hvorfor VaultForge viste sig at være den eneste fungerende mulighed.
Sorte huller som rekursive universer: fra fysik til eksistensens formål
Hvad hvis hvert sort hul er et Big Bang for et nyt univers? En udforskning af rekursiv kosmologi og kognitiv lukning.
AI dræbte CMS — i hvert fald for simple hjemmesider
Hvorfor traditionelle indholdsstyringssystemer bliver unødvendige for portfolioer, blogs og landingssider.
Sådan forbinder du Perplexity AI med Obsidian via MCP — Noter direkte fra chatten
Opsæt Perplexity Desktop til at læse og skrive dit Obsidian-vault ved hjælp af MCP filesystem-server. Søg på nettet og gem i dine noter i én samtale.
Daglig AI-nyhedsdigest med Claude Code CLI og Obsidian — Nul afhængigheder
Hvordan jeg byggede en daglig nyhedsforskningsagent med et 6-linjers bash-script, Claude Code headless-tilstand og macOS launchd.
Next.js Dark Mode uden blink eller React 19-advarsler
Sådan erstattes next-themes med Zustand + useServerInsertedHTML til flimmerfri mørk tilstand i Next.js 15+.
Hvordan jeg eliminerede 94 render-blokerende CSS-filer i Next.js 16 med en dårligt dokumenteret Turbopack-funktion
Efter dage med at prøve enhver tilgang — fra experimental.inlineCss til MutationObserver-hacks — opdagede jeg Turbopack Import Attributes, der løser problemet med render-blokerende CSS i Next.js App Router.
Next.js Memory Leak: Fetch + Standalone-tilstand — 2 år uden fix
Next.js patcher den globale fetch og tilføjer et cache-lag, der lækker hukommelse ved hver anmodning. I Docker/K8s fører dette til OOM-nedbrud hver par timer. Buggen har eksisteret siden Next.js 14 og er stadig uløst i 16.2.x.