<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>bradbice.com</title><link>https://www.bradbice.com/tags/performance/</link><description>Recent content from bradbice.com</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>brad@bradbice.com (Brad Bice)</managingEditor><webMaster>brad@bradbice.com (Brad Bice)</webMaster><copyright>© Brad Bice</copyright><lastBuildDate>Sun, 26 Jul 2026 12:00:00 -0400</lastBuildDate><atom:link href="https://www.bradbice.com/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>A month of housekeeping</title><link>https://www.bradbice.com/blog/2026-07-26-vibe-sweep/</link><pubDate>Sun, 26 Jul 2026 12:00:00 -0400</pubDate><author>brad@bradbice.com (Brad Bice)</author><guid>https://www.bradbice.com/blog/2026-07-26-vibe-sweep/</guid><description>&lt;p&gt;Twenty-six days, 115 commits, and 70 closed issues later, this site is faster, more accessible, and depends on almost nothing.&lt;/p&gt;
&lt;p&gt;A little over a year ago I wrote about &lt;a href="https://www.bradbice.com/blog/2025-06-24-vibe-improvements/"&gt;vibe coding some improvements&lt;/a&gt; to this place after years of neglect. That was a handful of features over a few evenings. This was something else: I pointed Claude Code at the whole site and worked through it from top to bottom in some free time throughout July.&lt;/p&gt;
&lt;p&gt;Time spent on this website has been limited lately. I have children to play with and raise, a wife to enjoy the world with, time to spend with friends and family, and (very importantly) time to just do something other than look at a screen. So sitting down and figuring out how to restore a URL sanitizer in the markdown render hooks (just as an example) wasn&amp;rsquo;t really high on my list.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ve also been doing some other work on my computer lately, and sitting at a car dealership a few times, and relocating to a library on some days&amp;hellip; all times when I can run Claude in parallel to my current situation (either waiting for something or doing my day job) to do some of these more tedious tasks. So off we went, hand in (AI-simulated) hand.&lt;/p&gt;
&lt;p&gt;The short version: 115 commits, 70 issues closed, July 1 to July 26. Here&amp;rsquo;s roughly what came out of it. (Sorry, this gets a bit nerdy from here.)&lt;/p&gt;
&lt;h3 id="accessibility"&gt;Accessibility&lt;/h3&gt;
&lt;p&gt;This is the part I care most about, and the part I was most sure I&amp;rsquo;d been getting wrong.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlabeled icons, missing alt text, and a few broken ARIA relationships, all fixed&lt;/li&gt;
&lt;li&gt;The mobile menu is now fully keyboard operable&lt;/li&gt;
&lt;li&gt;Added a skip link, and an actual &lt;code&gt;h1&lt;/code&gt; to detail pages that were missing one&lt;/li&gt;
&lt;li&gt;Form labels and tab semantics on the &lt;a href="https://www.bradbice.com/contact/"&gt;contact page&lt;/a&gt; and &lt;a href="https://www.bradbice.com/library/ratings/"&gt;ratings lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Link colors now meet WCAG AA contrast&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accessibility is at a 100 &lt;a href="https://developer.chrome.com/docs/lighthouse/" rel="noopener noreferrer external"&gt;Lighthouse&lt;/a&gt; score now, which I&amp;rsquo;m happy about.&lt;/p&gt;
&lt;h3 id="performance"&gt;Performance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://www.bradbice.com/library/ratings/movies/"&gt;movies ratings page&lt;/a&gt; went from 1.13 MB to about 594 KB&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.bradbice.com/library/ratings/games/"&gt;games page&lt;/a&gt; went from about 560 KB to 373 KB, because it had been rendering every poster twice&lt;/li&gt;
&lt;li&gt;Images are now cropped at the CDN to the size they actually display, instead of shipping a full frame to be cropped away by CSS&lt;/li&gt;
&lt;li&gt;Fonts, scripts, and stylesheets got the usual treatment: subsetting, &lt;code&gt;font-display&lt;/code&gt;, deferring, bundling, fingerprinting&lt;/li&gt;
&lt;li&gt;The search filter on an 800 item list no longer re-renders on every keystroke&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lighthouse performance went from the low 80s to 94. First paint dropped from 2.6s to 1.0s.&lt;/p&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;p&gt;I barely know what &amp;ldquo;security headers&amp;rdquo; are, and didn&amp;rsquo;t know I needed them on a personal website. Turns out they don&amp;rsquo;t fix anything that&amp;rsquo;s already broken. They just limit what a bad script could do if one ever got in, which mattered more than I thought, since I was loading three scripts I didn&amp;rsquo;t control. I had none of them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a content security policy, HSTS, &lt;code&gt;nosniff&lt;/code&gt;, referrer and permissions policies&lt;/li&gt;
&lt;li&gt;Fixed a real XSS hole in the &lt;a href="https://www.bradbice.com/library/twitter/"&gt;Twitter archive&lt;/a&gt;, where tweet text went into &lt;code&gt;innerHTML&lt;/code&gt; unescaped&lt;/li&gt;
&lt;li&gt;Restored Hugo&amp;rsquo;s URL sanitizer in the markdown render hooks, which had been switched off, so a &lt;code&gt;javascript:&lt;/code&gt; link in a post can no longer produce a live href&lt;/li&gt;
&lt;li&gt;The build now verifies the checksum of the Sass binary it downloads before putting it on the path&lt;/li&gt;
&lt;li&gt;Deleted a service worker that had not been registered since 2018 and a dead publishing endpoint that was still advertised in every page&amp;rsquo;s head&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="getting-rid-of-dependencies"&gt;Getting rid of dependencies&lt;/h3&gt;
&lt;p&gt;The site was loading three third-party scripts. All three are gone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A dialog library, replaced by the browser&amp;rsquo;s native &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element&lt;/li&gt;
&lt;li&gt;A search library, replaced by about twenty lines of plain JavaScript, because 813 tweets do not need a search engine&lt;/li&gt;
&lt;li&gt;A live CodePen embed, replaced by static syntax-highlighted code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The site now loads zero third-party JavaScript apart from analytics, and has no npm dependency at all. No &lt;code&gt;node_modules&lt;/code&gt;, anywhere, ever. That is now written down as a rule. (And if you have ever created a website with Node, then you know how freeing this can be.)&lt;/p&gt;
&lt;h3 id="design-and-everything-else"&gt;Design and everything else&lt;/h3&gt;
&lt;p&gt;This is my favorite part.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New nav pills and a rebuilt mobile menu&lt;/li&gt;
&lt;li&gt;The theme toggle cycles light, dark, and system, and each one finally has its own icon&lt;/li&gt;
&lt;li&gt;Typography moved to Source Serif 4 for the blog posts and Source Sans 3 for the interface&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.bradbice.com/library/ratings/"&gt;ratings pages&lt;/a&gt; got a shared search, sort, and filter, plus a real build-time scoring engine and an Airtable database sync&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.bradbice.com/library/"&gt;library index&lt;/a&gt;, &lt;a href="https://www.bradbice.com/blog/"&gt;blog sidebar&lt;/a&gt;, &lt;a href="https://www.bradbice.com/library/ratings/"&gt;ratings cards&lt;/a&gt;, and my &lt;a href="https://www.bradbice.com/resume/"&gt;resume&lt;/a&gt; all got reworked&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="so-claude-code"&gt;So, Claude Code&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s the honest accounting. I am a designer. I am comfortable in CSS. I am not comfortable writing Go templates, reasoning about content security policies, or thinking about how Hugo&amp;rsquo;s URL sanitizer interacts with a Cloudinary transform string.&lt;/p&gt;
&lt;p&gt;Most of this list is work I&amp;rsquo;d have done slowly, if at all. It&amp;rsquo;s work I would simply never have gotten to, because between a job and a family, time is at a premium.&lt;/p&gt;
&lt;p&gt;What actually changed the game for me was that Claude Code held context from session to session and I could run that work while I worked elsewhere. Kind of like having my own software developer on staff.&lt;/p&gt;
&lt;h3 id="the-part-im-still-careful-about"&gt;The part I&amp;rsquo;m still careful about&lt;/h3&gt;
&lt;p&gt;I said something similar last year and it still holds. There&amp;rsquo;s a real risk of ending up with a site I don&amp;rsquo;t understand. Though, again, a lot of this work was scripting and security fixes and tedious behind-the-scenes stuff that I know very little about. Before last year I had written every line of this site by hand. I&amp;rsquo;m ok with giving some of that up now to make these huge leaps in efficiency and organization.&lt;/p&gt;
&lt;p&gt;A few things helped. I asked for the reasoning behind changes, not just the changes. I pushed back when something seemed off, and it was sometimes right to hold its ground and sometimes wrong. Every change went through a branch, a build, and a look in the browser before it went anywhere near production. The security and accessibility work in particular got checked by measurement rather than by eye.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Anyway. The site is in better shape than it has ever been, and most of the work was the boring, unglamorous kind I have been avoiding for a decade. There&amp;rsquo;s a logo redesign and a music ratings section still on the list. We&amp;rsquo;ll see how those go.&lt;/p&gt;</description></item></channel></rss>