Blog
Notes on engineering, AI-augmented workflows, and what survives contact with production.
- 9 min read

What a website learns before you click anything
I followed one link to a test site and touched nothing. The site got 15 lines about me with the request and read 33 more things in under half a second.
privacybrowsersfingerprintingchrome - 7 min read

What 'clear browsing data' leaves behind
I filled a Chrome profile with two test sites, then pressed Delete browsing data exactly as the dialog opened. One site was wiped. The other was not touched.
privacybrowserscookieschrome - 8 min read

What incognito mode actually hides, and from whom
I opened one site in a normal Chrome window and an incognito one and compared what it saw. 26 of 29 things matched. Here is what incognito changes.
privacybrowsersincognitocookiesfingerprinting - 8 min read

What an AI coding assistant actually reads from your code
I counted every file my AI sessions opened on one repo over a year. The median task read 5 files of 533. The surprise was the 482 it opened outside the repo.
ai-toolsclaude-codeprivacydeveloper-workflowsecurity - 6 min read

Why I stopped letting AI agents share a working tree
One AI coding session's commit swept another's unfinished file into it. I reproduced the exact mechanism - the fix is isolation, not a better commit habit.
gitai-toolsclaude-codedeveloper-workflowworktrees - 7 min read

What a CAPTCHA checks before it decides you're a robot
I loaded a real CAPTCHA widget and watched what it actually checked. It cleared me in under a second, without a click, and told me exactly what it read.
captchabot-detectionprivacybrowserssecurity - 6 min read

Why I moved my site off Cloudflare
Cloudflare has been throttled across Russia since 2025, and some of my readers are there. Moving my site to a single server fixed that, and cost something.
hostingcloudflareself-hostingdnsstatic-sites - 3 min read

Why running more AI agents at once made my laptop slower
I run several Claude Code agents in parallel on one MacBook. Past a point, adding more slowed the whole machine down. Here is the actual mechanism.
ai-toolsclaude-codedeveloper-workflowmacos - 10 min read

What 'Reject all' on a cookie banner actually does
I clicked reject all on a real news site and measured what changed. On a good banner it does stop the trackers. Here is the part it does not touch.
privacycookiesbrowsersgdprconsenttracking - 8 min read

What I actually use AI for, after a year of it
A year of Claude Code as my daily driver, honestly: what got faster, what got worse, and the tasks I took back. No productivity-multiplier claim.
ai-toolsclaude-codeworkflowdeveloper-experience - 13 min read

What a browser extension can actually see
Chrome's one permission sentence hides six separate capabilities. I read the manifests of all 20 extensions in my browser to see what Add really grants.
browser-extensionsprivacychromepermissionsmanifest-v3 - 11 min read

Why websites feel slow, measured on four real sites
I timed four sites and counted what each page fetches. The fix every performance guide leads with was already done on all four, and they are still slow.
web-performancebrowserspage-speedcore-web-vitalshttp - 4 min read

PDF operations, ranked by what they can silently corrupt
Compress, merge, split and OCR each have a failure mode that leaves a file that opens fine and is wrong. Which to fear, and what to check after each.
pdftoolsbackend - 5 min read

QR codes: the four decisions that decide whether yours scans
Version, error-correction level, static or dynamic, quiet zone: the QR choices that decide whether a code scans in the field, with numbers from the spec.
qrencodingtoolsfrontend - 8 min read

Adding a Russian locale to an Astro blog, no CMS
How I added bilingual EN/RU posts to a static Astro blog with no headless CMS: route duplication, shared-slug pairing, hreflang, and a language switcher.
astroi18nlocalizationcontent-collectionsfrontend - 8 min read

Three things MV3 taught me about the service-worker lifecycle
Chrome Manifest V3 swapped the persistent background page for an ephemeral service worker. Three lifecycle lessons that cost me real debugging time.
browser-extensionsmanifest-v3service-workerchromejavascript - 13 min read

Typed content with Zod: schema as a build-time contract
An Astro content-collection Zod schema is not just validation. It is a build-time contract that turns a folder of MDX into a typed CMS with no backend.
astrotypescriptzodcontent-collectionsfrontend - 15 min read

The 6 MCP servers I keep in every Claude Code project
After six months of Claude Code across roughly twenty repos, six MCP servers survived the cull. The kept set, what I dropped, and the rule behind it.
claude-codemcpai-engineeringworkflowtooling - 13 min read

The 30-second test: what senior clients check on your portfolio
The 30-second checklist that a senior client actually runs on your freelance portfolio before they decide to message you, listed in real scan order here.
portfoliofreelanceconversiondesignsenior - 17 min read

A senior developer's Lighthouse 100/100 checklist, after 30 sites
A checklist for hitting Lighthouse 100/100/100/100 - the architecture decisions, the boring 88-to-94 fixes, and the cargo-cult performance tactics to skip.
lighthouseperformanceweb-vitalsseoaccessibility