Pourya Shahroudi
  1. Home
  2. Projects
  3. shahroudi.us

A fast static site, checked before every change goes live

shahroudi.us is the site you are reading. I built it in October 2026 in plain HTML and CSS, with no framework and no build step, and Cloudflare Pages serves it. It is built the way I build websites for small businesses, and every number on this page was measured on it.

  • Built October 2026
  • Plain HTML and CSS
  • Served by Cloudflare Pages
  • No cookies

Speed

93 for performance on a phone, and 100 on the other three

Lighthouse is Google's tool for grading a web page. I ran it three times on the live home page on 23 October 2026, in its phone setting, and it gave the same four scores each time. Lighthouse counts 90 or more as good.

Performance
93
Accessibility
100
Best practices
100
SEO
100
Lighthouse 13.5, phone setting, the live home page, three runs on 23 October 2026. Each score is out of 100.

What moved it

The fonts were the slow part

The site's three fonts first came from Google Fonts, and Lighthouse blamed them for about 1.4 seconds of delay before the page appeared on a phone. Serving the same fonts from the site itself took the performance score from 83 or 84 to 93.

The portrait went the same way. It is served as AVIF at 55 KB, about half the 101 KB WebP that stays behind for browsers that cannot show AVIF.

Before and after the fonts moved onto the site

  • Before, fonts from Google
  • After, fonts from the site

Performance score

Out of 100, higher is better

83 to 84
93

First paint

When the first text appears, lower is better

3.1 s
1.7 s

Largest paint

When the portrait appears, lower is better

3.4 s
2.8 s
Lighthouse 13.5, phone setting, three runs before the change and three after, on 23 October 2026. The two timings share one scale, from 0 to 3.5 seconds.

Where the home page's 225 KB goes

Fonts, three files
136 KB
Portrait
54 KB
Scripts, four files
15 KB
Stylesheet
10 KB
The page itself
6 KB
Icons and manifest
4 KB
The same Lighthouse runs, as sent over the network. Ten of the 15 KB of scripts is Cloudflare's analytics. The site's own scripts, for the light and dark switch, the contact form and the copy button on code, come to under 8 KB together, and the code in the notes is coloured when the page is written, so no highlighter runs in the browser.

Found

Written for search engines and AI assistants to read

Every page that search engines index carries structured data, a description of the page in a format they read: who I am, the services I offer, each note as an article, and where the page sits in the site. A sitemap lists the pages, and llms.txt, a plain-text summary of every page in a format some AI tools look for, describes the whole site in one file.

The domain is verified in Google Search Console with the sitemap submitted, and the site's icon comes in the square sizes Google asks for before it will show an icon beside a result.

Privacy and security

No cookies, and a short list of what each page may load

A visitor should be able to read the site without being tracked or asked to accept anything.

  • No cookies, no banner

    Visitor counts come from Cloudflare Web Analytics, which sets no cookies, so there is nothing to consent to.

  • Nothing from Google

    The fonts are served from the site, so reading a page sends nothing to Google.

  • A strict security policy

    Every response tells the browser to use HTTPS only and lists what the page may load: the site's own files, the analytics script and the form service. The one inline script, which applies the saved theme before the page paints, is allowed by its hash, so an injected script would not run.

  • A form that works without JavaScript

    The contact form sends to a form service and lands on a thank-you page, with or without JavaScript.

How a change goes live

A preview and a check before anything is published

Each change starts on its own branch, and Cloudflare Pages publishes every branch at its own preview address, marked so search engines skip it. I look at the preview at desktop and phone width, in light and dark, and only then merge it into the live site. In its first two days the site took 33 changes this way.

Before each push, a check script reads every page. It fails on a link or image that points nowhere, a page missing its title, description or canonical address, structured data that does not parse, a skipped heading level, and a script the security policy would block.

Every claim about a project is checked against that project's own code before it goes up. When one claim turned out to have nothing in the code or its history behind it, it came off the site.

What it shows

Two of the services, and the way I work

  • A fast website

    93 for performance on a phone, 225 KB for the home page, and no framework or plugins to keep patched.

  • Found on Google and in AI assistants

    Structured data on every indexed page, a sitemap, llms.txt and a verified Search Console property.

  • Seen before it is live

    Every change gets a preview and a check before it is published, so nothing reaches the live site unseen.

It is the same work I offer small businesses.

Next

Could your business use a site like this?