Skip to main content

Blog

On web development, performance, tools — and the occasional bigger idea.

JavaScriptAnalyticsEvent DelegationServer ComponentsPerformance

One listener instead of a client component per button

The moment you add click analytics to a component, it becomes a client component that ships JavaScript. Do that across a site and tracking alone bloats your bundle. Here's the alternative that has been in the platform forever: one delegated listener, declarative data attributes, and components that stay pure server-rendered HTML.

July 28, 202610 min read
Read article
CSSHTMLAccordionFrontendPerformance

A smooth accordion with zero JavaScript

Everyone reaches for React state and a height-measuring hook to build an accordion. The browser has shipped a native one for years — and as of 2024 it animates open and closed with pure CSS. Here's the full technique: details[name], ::details-content, interpolate-size, and the one property that makes closing animate too.

July 28, 20269 min read
Read article
JavaScriptWebThird-Party ScriptsFrontendPatterns

Catch a third-party value the instant it lands on window

A script you don't control writes its result to a window global at a time you can't predict. Most code races it with a timeout or wastes the main thread polling. Here's the accessor-property trick that turns the write into an event — plus the getter you must not forget, and how to substitute the value entirely.

July 27, 20269 min read
Read article
CSSContainer QueriesTypographyFrontendPerformance

Fit text to its container with pure CSS — no JavaScript

Everyone writes a JavaScript hook to shrink font-size until text fits a container. Here's a fully working, zero-JS alternative using container query units, clamp(), and language-aware hyphenation — including the cascade gotcha that makes people give up.

July 24, 202611 min read
Read article
Next.jsPerformanceCode SplittingTurbopackReact Server Components

next/dynamic Won't Save You: Why CMS-Driven Next.js Pages Ship Every Chunk

Our CMS-driven Next.js pages shipped all ~100 section components on every route — despite textbook next/dynamic usage. We exhausted every bundler-level fix (direct import(), file splitting, Turbopack config, webpack splitChunks) before finding the real cause: reachability, not chunking. Build-time codegen + rewrites cut first-load JS by 53%.

July 18, 202614 min read
Read article
obsidianmiroautomationtoolsopen-source

Pulling my boards out of Miro and into Obsidian

Miro's Export button gives you a PNG or a PDF — a photo of the data, not the data. If your boards are load-bearing maps of thought built up over years, they belong in Obsidian: editable, searchable, in a local vault. Here's how I pulled boards out of Miro via the REST API and converted them to Excalidraw and Obsidian Canvas — preserving positions, colors, fonts, curved connectors, mindmap nodes — and the lesson goes wider than Miro: every SaaS deserves an exit plan BEFORE you ever open it.

June 30, 20266 min read
Read article
ailearningcareermethodology

CRAFT: a method for using AI without losing your edge

A diagnosis without a cure is just anxiety. After the post on AI deskilling, here is the prescription: CRAFT — five principles (Challenge First, Review Adversarially, Ask Why Not What, Friction on Purpose, Test Your Understanding) under one axiom: AI does what you have mastered, you do what you are still learning. A practical, recallable method for using AI every day without quietly losing the skill.

June 23, 20266 min read
Read article
ailearningcareerengineering

The silence AI turned off

Is it still worth learning to code if AI exists? The loud answer is wrong on both sides. With a 2025–2026 evidence base (Nature, Anthropic, AI & Society) the question is not "AI or not", but which skills to hand to AI and which to keep for yourself — and one thing that genuinely changed: reality used to force you to learn through friction, AI quietly turned that pressure off.

June 22, 20268 min read
Read article
claude-codeproductivityclidevtools

Claude Code Multi-Profile, v2: a clean XDG architecture

After a month on the old alias-based approach, I rebuilt my Claude Code multi-profile setup into an XDG-compliant structure under ~/.config/claude-profiles/. The real reason wasn't tidiness — it was discovering that ~/.claude.json is a separate file in the home root where the MCP servers added via --scope user were quietly living.

June 13, 20269 min read
Read article
claude-codeagentsaiprompt-engineeringautomation

How to Write Claude Code Agents That Don't Lie to You

Two rules for building reliable Claude Code agent pipelines: one agent per specialization, and shell commands instead of prompts wherever quantitative answers are involved.

May 29, 20266 min read
Read article
claude-codeproductivityclidevtools

Running Multiple Claude Code Accounts on One Device

How to use two (or more) Claude Code accounts side by side — personal and corporate — with full isolation using a single environment variable.

May 5, 20264 min read
Read article
ObsidianClaudeMCPAutomationAI

How to Connect Claude Desktop to Obsidian — A Journey Through 4 MCP Servers

A real story of finding a stable way to automate Obsidian vault refactoring via Claude. What broke, what worked, and why VaultForge turned out to be the only working option.

May 3, 20269 min read
Read article
physicsphilosophyconsciousnessblack-holescosmology

Black Holes as Recursive Universes: From Physics to the Purpose of Existence

What if every black hole is a Big Bang of a new universe? An exploration of recursive cosmology, Hawking radiation, cognitive closure, and why the universe might be designed to force self-improvement.

April 17, 202610 min read
Read article
aicmsweb-developmentopinionworkflow

AI Killed the CMS — For Simple Websites, At Least

Why traditional content management systems are becoming unnecessary for portfolios, blogs, and landing pages — and how AI tools are replacing the entire CMS layer with natural language.

April 17, 20268 min read
Read article
ObsidianPerplexityMCPAIProductivity

How to Connect Perplexity AI to Obsidian via MCP — Direct Note-Taking from Chat

Set up Perplexity Desktop to read and write your Obsidian vault using MCP filesystem server. Research on the web and save to your notes in one conversation.

April 12, 20265 min read
Read article
Claude CodeAIObsidianAutomationProductivity

Daily AI News Digest with Claude Code CLI and Obsidian — Zero Dependencies

How I built a daily news research agent with a 6-line bash script, Claude Code headless mode, and macOS launchd. It searches 11 topics and writes digests directly to Obsidian.

April 12, 20267 min read
Read article
next.jsreact-19dark-modezustandperformance

Next.js Dark Mode Without Flash or React 19 Warnings

How to replace next-themes with Zustand + useServerInsertedHTML for flicker-free dark mode in Next.js 15+ without triggering React 19 script warnings.

April 11, 20268 min read
Read article
Next.jsCSSPerformanceTurbopackSCSS

How I Eliminated 94 Render-Blocking CSS Files in Next.js 16 with a Poorly Documented Turbopack Feature

After days of trying every approach — from experimental.inlineCss to MutationObserver hacks — I discovered Turbopack Import Attributes that solve the render-blocking CSS problem in Next.js App Router.

April 8, 202612 min read
Read article
Next.jsMemory LeakDockerAWS LambdaNode.js

Next.js Memory Leak: Fetch + Standalone Mode — 2 Years Without a Fix

Next.js patches global fetch and adds a cache layer that leaks memory on every request. In Docker/K8s this causes OOM crashes every few hours. The bug exists since Next.js 14 and is still unresolved in 16.2.x.

March 19, 202610 min read
Read article