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.
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.
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.
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.
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%.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.