The whole site weighs 7.9 KB gzipped on the homepage. The blog page is 5.1 KB. Projects is 3.6 KB. Zero external scripts. Zero web fonts. Zero analytics. Built in one day with GitHub Copilot.

Those numbers are the post. Everything below explains how they got that low.

The numbers, up front

PageGzip size
Homepage7.9 KB
Blog5.1 KB
Tools3.6 KB

For comparison: an empty React + Next.js page typically ships 80 to 120 KB of JS before you write a single component. A site with Google Fonts and Analytics adds another 50 to 100 KB of network weight. This site ships none of that.

The homepage has a photo, a skills carousel, a projects carousel, recent post cards, and social links, all in 7.9 KB.

What I built it with

  • Astro 6 for the framework. It outputs 0 bytes of JavaScript by default.
  • Cloudflare Workers for hosting, via @astrojs/cloudflare.
  • Plain CSS with custom properties (--accent, --text, --surface, etc.). No Tailwind, no CSS-in-JS.
  • System fonts. No Google Fonts, no font loading at all.
  • Inline SVGs for icons.

No React. No analytics. The rendered HTML is just HTML.

How I actually used Copilot

I’ve used Copilot in autocomplete mode before. Using it as a full pair programmer in agent mode is a different experience.

The thing that changed my workflow was describing what I wanted, not how to do it. Instead of “write a date formatting function”, I’d say something like: “post dates come out of frontmatter as strings like 2025-11-04, I want to display just the date part consistently, don’t bring in a date library.” It came back with this:

const formatDateOnly = (value: string) => {
  const date = new Date(value);
  if (Number.isNaN(date.getTime())) return value;
  return date.toISOString().slice(0, 10);
};

That’s exactly what I would have written. I just didn’t have to write it.

Multi-file changes saved a lot of time too. I wanted to update the footer tagline across three .astro files. One instruction, one diff to review. Done.

The parts I still did myself were the “does this look right” calls. Typography, spacing, hover colours, whether something had too much padding. Copilot doesn’t have taste. It doesn’t know when a layout feels off. That part was always mine.

For small UI fixes, the pattern was just: “the header shows a 1px border on mobile, remove just that rule from the media query.” Copilot finds the exact scoped CSS block and removes the right rule. No hunting through 200 lines of component styles.

The time it broke (15 minutes lost)

I tried to use astro-icon for component-based icons. Installed it, wired up the integration, swapped all my inline SVGs for <Icon /> components. It immediately crashed the dev server with module is not defined in some debug package deep in the dependency tree.

The problem: astro-icon depends on debug, which uses CommonJS-style module. That doesn’t exist in the Cloudflare Workers runtime. Copilot diagnosed it correctly and quickly. We reverted everything, went back to inline SVGs. 15 minutes lost. Solo, I’d have burned 45.

Lesson I already knew but confirmed again: try things fast, cut your losses fast, keep moving.

Why the numbers are that low

Four specific reasons the homepage is 7.9 KB and not 200 KB:

  • 0 external scripts. No framework runtime, no polyfills, no analytics loader.
  • 0 unused CSS. Astro inlines and scopes all CSS at build time.
  • 0 CDN dependencies of any kind.
  • The only JavaScript that ships is ~2 KB of hand-written code: theme toggle, mobile menu, scroll handler.

0 trackers. 0 font CDNs. Just HTML.

Things I didn’t get right the first time

Running the benchmark also found a few issues.

The avatar image and footer logo were missing width and height HTML attributes on some pages. Without those, the browser can’t reserve space before the images load, so the layout shifts when they do. Fixed after the fact, but it’s the kind of thing I would have caught immediately with a Lighthouse run during the build.

There are also no <meta name="description"> or Open Graph tags anywhere. The site works fine when you visit it directly. But if someone shares a link on Slack or iMessage it’ll just show the URL with no title or preview. I’m going to add those before I send this to anyone.

Would I do this again

Yes. The workflow felt sustainable: describe what you want, look at the diff, make sure it’s right, commit. The thinking time went into “is this right” rather than “how do I write this.”

The parts I had to do myself were the parts I’d want to do myself. Everything else got written faster than I would have managed alone.