Skip to main content

05 — Writing

Blog

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

Oct 06, 2026Deploy to Vercel from a git pre-push hook: org repo, Hobby plan, no CI secretsVercel's Git integration refuses a private repo owned by a GitHub organization on the Hobby plan, and the CI route needs repo secrets you may not be allowed to add. Here's the lighter option: a local pre-push hook that deploys the exact pushed commit with the Vercel CLI, while everyone keeps pushing under their own name.Vercel · Git Hooks · CI/CD
7 min read
Oct 06, 2026UpdatedDeploy to Vercel from CI when the committer isn't a team memberMove a repo into a GitHub org and Vercel quietly starts blocking your deploys: the commit “could not be matched to a team member.” Here's how I deploy from GitHub Actions with the Vercel CLI instead — my commits still count toward my own GitHub graph, the dashboard still shows who pushed, and I don't buy a seat for every contributor.Vercel · GitHub Actions · CI/CD
8 min read
Sep 05, 2026Four bugs killed text selection on iOS — and each one hid the nextA Lexical editor inside a vaul drawer worked everywhere except on a real iPhone: selection handles wouldn't drag, scrolling locked at the edges, the toolbar dove under the keyboard. Guessing fixed nothing, because there was no single culprit — there were four independent ones, each masking the next. What worked was a bisection stand: the same skeleton with one toggle per suspect, tested on a physical device. This is the full hunt — href poisoning selection, vaul's drag handlers, our own tap-focus, a container moving under the finger — plus the scroll-lock autopsy and the three one-shot scrollTop writes that made rubber-band scrolling feel native, including catching a swipe mid-bounce.iOS · Safari · WebKit
15 min read
Aug 29, 2026A cascade of agents: the terminal picks whichever one is aliveWhen Claude partly went down and some models stopped working, I tried to switch to Gemini — and found my fallback had been broken for months. Here is how to build one that actually holds.Claude Code · AI · CLI
9 min read
Aug 17, 2026system-droid: a watchdog that checks and heals my systems on its ownMy local services kept dying silently — the morning brief just wouldn't arrive, tokens expired, backups froze. So I built a launchd droid that checks everything every two hours, repairs what it safely can with a Claude agent, and messages me only when it truly needs a human.Claude Code · AI · Automation
10 min read
Aug 14, 2026A static page that's secretly an A/B testA/B testing a page is usually built so it falls off the CDN onto a per-request render. It doesn't have to be. Keep every variant fully static and let a proxy (Next.js's renamed middleware) resolve the assignment through an experimentation platform, keyed on a stable device id — then rewrite only when the visitor isn't in the control. The URL never changes, the CDN still caches, and the common path pays nothing.Next.js · A/B Testing · Proxy
8 min read
Aug 10, 2026UpdatedNext.js Memory Leak: Fetch + Standalone Mode — 2 Years Without a FixNext.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.Next.js · Memory Leak · Docker
10 min read
Aug 09, 2026UpdatedRunning Multiple Claude Code Accounts on One DeviceHow to use two (or more) Claude Code accounts side by side — personal and corporate — with full isolation using a single environment variable.claude-code · productivity · cli
4 min read
Aug 05, 2026Lazy-load blog content in SolidStart without losing SSGYour blog probably ships every post's body in a single bundle — mine had grown to 2.88 MB, downloaded even on the index page where you only need titles. Here's how I split each post's prose into a lazy chunk that loads on demand, while every page stays fully server-rendered for SEO.SolidJS · SolidStart · Performance
8 min read
Aug 05, 2026UpdatedCRAFT: a method for using AI without losing your edgeNaming a problem without offering a solution only sows 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.ai · learning · career
6 min read
Jul 28, 2026One listener instead of a client component per buttonThe 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.JavaScript · Analytics · Event Delegation
10 min read
Jul 28, 2026A smooth accordion with zero JavaScriptEveryone 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.CSS · HTML · Accordion
9 min read
Jul 27, 2026Catch a third-party value the instant it lands on windowA 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.JavaScript · Web · Third-Party Scripts
9 min read
Jul 24, 2026Fit text to its container with pure CSS — no JavaScriptEveryone 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.CSS · Container Queries · Typography
11 min read
Jul 18, 2026next/dynamic Won't Save You: Why CMS-Driven Next.js Pages Ship Every ChunkOur 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%.Next.js · Performance · Code Splitting
14 min read
Jun 30, 2026Pulling my boards out of Miro and into ObsidianMiro'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.obsidian · miro · automation
6 min read
Jun 23, 2026UpdatedClaude Code Multi-Profile, v2: a clean XDG architectureAfter 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.claude-code · productivity · cli
9 min read
Jun 22, 2026The silence AI turned offIs 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.ai · learning · career
8 min read
May 29, 2026How to Write Claude Code Agents That Don't Lie to YouTwo rules for building reliable Claude Code agent pipelines: one agent per specialization, and shell commands instead of prompts wherever quantitative answers are involved.claude-code · agents · ai
6 min read
May 03, 2026How to Connect Claude Desktop to Obsidian — A Journey Through 4 MCP ServersA 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.Obsidian · Claude · MCP
9 min read
Apr 17, 2026Black Holes as Recursive Universes: From Physics to the Purpose of ExistenceWhat 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.physics · philosophy · consciousness
10 min read
Apr 17, 2026AI Killed the CMS — For Simple Websites, At LeastWhy 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.ai · cms · web-development
8 min read
Apr 12, 2026How to Connect Perplexity AI to Obsidian via MCP — Direct Note-Taking from ChatSet 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.Obsidian · Perplexity · MCP
5 min read
Apr 12, 2026Daily AI News Digest with Claude Code CLI and Obsidian — Zero DependenciesHow 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.Claude Code · AI · Obsidian
7 min read
Apr 11, 2026Next.js Dark Mode Without Flash or React 19 WarningsHow to replace next-themes with Zustand + useServerInsertedHTML for flicker-free dark mode in Next.js 15+ without triggering React 19 script warnings.next.js · react-19 · dark-mode
8 min read
Apr 08, 2026How I Eliminated 94 Render-Blocking CSS Files in Next.js 16 with a Poorly Documented Turbopack FeatureAfter 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 · CSS · Performance
12 min read

27 entries