About this site
We used to run this site the way we run a client's. A service page for every service, titles built to be found, the words arranged so a search engine would know exactly which aisle we were standing in. That is real work and we still do it, because plenty of clients need to be found and being found is the job.
It has been through a few versions since 2011. They are all still on the Wayback Machine.
We have been lucky enough to stay busy through clients and friends who send people our way. Which means this site does not have to go out and get the work. It only has to be true.
So it turned into the place we get to build properly. Tooling we wanted an excuse to try, design decisions argued down to the last pixel, and a way of writing the work up that sounds like people talking rather than a brochure. We closed the social accounts. We have never advertised. Nobody here has to write "Welcome to our Laguna Beach SEO Agency in Laguna Beach" ever again.
One honest exception. The Yelp material is not marketing for the work. It is the work, written down, with the parts we are still unsure about marked as unsure.
Built with
- Eleventy
- Static site generator. Every page is HTML on disk before a reader asks for it.
- Vite
- Asset pipeline. Hashes and bundles the one stylesheet and the one script.
- Tailwind
- Utility layer under hand-written component CSS, not instead of it.
- Cloudflare Pages
- Hosting. A push to the main branch is the deploy.
- Bunny CDN
- Images, at cdn.circulationstudio.com. Our own subdomain, so the scoreboard counts it as first party and its bytes are inside the page weight below.
- Git
- The source of truth. Every word and every rule on this site has a commit behind it.
- Dual and Lora
- Display and body. Dual is self-hosted from this origin. Lora is served by Google Fonts, which is the third-party request counted below. We use Dual's alternate glyphs, the O-target and the crossbar-less A, because they are fun.
Laid out in Claude Design. Constructed in Claude Code.
- No CMS
- No database
- No plugins
- No cookies
- No tracking pixels
- No third-party scripts
Structured data on every page, matching what is visible on it. Sources dated on every article. Pages corrected when the facts move, rather than left standing because they already ranked.
Scoreboard
Nothing below is typed by hand. Rows marked derived
are recomputed on every build. Rows marked
measured 2026-08-19 come from
npm run measure:stats, which builds the site, serves it, and
loads every page in headless Chromium. Built with npx eleventy, served from _measure by a static server with no compression, and loaded in headless Chromium at 1440 by 900 with no throttling. Bytes are what the browser received. The figures describe the build they were taken from, which is the one before the build you are reading, because writing them is what changed it.
19
Pages built
measured 2026-08-19
2
Articles, Yelp Hub tier
derived
2
Articles, library tier
derived
697ms
Full build, cold
measured 2026-08-19
9433bytes
JavaScript shipped, every page. 4089 bytes gzipped.
measured 2026-08-19
241.7KB
Median page, gzipped as production serves it. 382.5 KB uncompressed.
measured 2026-08-19
8
Requests to hosts we control, median page. This origin plus the CDN.
measured 2026-08-19
2
Third-party requests, median page, costing 50.6 KB. 3 at the worst, and 0 pages at zero. Every host contacted anywhere on the site: fonts.gstatic.com, fonts.googleapis.com. A host on a registrable domain other than circulationstudio.com. Our own CDN subdomain is not one.
measured 2026-08-19
148ms
Largest contentful paint, median page. 472 ms at the worst.
measured 2026-08-19, lab
0.0143
Worst cumulative layout shift of any page. 0 pages at zero.
measured 2026-08-19, lab
Lab figures from headless Chromium on localhost, not field data. INP is not listed because it requires a real interaction to exist. The page weight is dominated by six self-hosted weights of the display face, which is a choice we made with our eyes open and which the number above will keep reminding us about.