Case study · This website

The site you’re on is the SEO case study.

We can’t name clients yet, so here’s a build we can open all the way. Every page is HTML before any script runs. Nothing loads from another origin. Each page describes itself in structured data (code that tells search engines what a page is about), and the build fails if the copy uses a hype word or an unmeasured number. The numbers on this page are measured in your browser.

Rendering
Static HTML, prerendered at build
Scripts
Same origin only, no inline script
Data
One JSON-LD graph per page
Checks
The build fails on any guard

This page’s own structure, drawn at build from its HTML.

People read the top layer, crawlers follow the middle one and machines parse the bottom one.

10 headings · 51 links · 5 schema nodes

Build
Build

Telemetry

Measured on your visit.

The sizes below were measured when this page was built. The timings come from your browser’s performance APIs (the browser’s built-in tools for timing a page), measured now, on your device. If a browser doesn’t report a metric, the field says so instead of guessing.

How each one is measured

html, css, js
gzip sizes of this page’s own files, measured at build
LCP
the largest-contentful-paint entry (the browser’s record of when the main content appeared)
CLS
layout-shift entries (the browser’s records of content jumping as the page loads) in session windows, ignoring shifts right after input
slowest input
the longest event duration per interaction
3rd-party
resources from any origin that isn’t this one
cookies
read from document.cookie
Page status and telemetry Build
html Build
14.2 kB
css Build
23.6 kB
js Build
8.4 kB
3rd-party Build
0
LCP
needs JS
CLS
needs JS
slowest input
needs JS
time to first byte
needs JS
transfer
needs JS
requests
needs JS
DOM elements
needs JS
cookies
needs JS
tier
needs JS
Build

Prerendering

Readable before any script runs.

Every page is rendered to complete HTML at build time by plain string functions. Scripts add motion and measurement, and run the two tools that call a server: the scanner and the scoping assistant. Turn JavaScript off and every word is still there. The meter below compares the words in the raw HTML with the words your browser rendered.

Parity Build

GET /work/this-site/status needs JStime to first byte needs JSbytes needs JS

Words readable without JavaScript

1,031 of needs JS

h1 count
1
headings
10
internal links
49 · 27 unique

Build

Response headers

Nothing loads from anywhere else.

No font host, no outside script host, no analytics and no embeds. The content security policy (a list of rules for what a page may load and run) says so, and your browser enforces it. When scripts run, the panel fetches this page’s real response headers as it comes into view. Without them, it shows the policy this site ships.

curl -I Build
 curl -I https://adjltechnology.com/work/this-site/
HTTP needs JS
content-security-policy:
  default-src 'self';
  script-src 'self';
  style-src 'self' 'unsafe-inline';
  img-src 'self' data:;
  font-src 'self';
  media-src 'none';
  connect-src 'self';
  frame-src 'none';
  object-src 'none';
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self';
  upgrade-insecure-requests
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
x-frame-options: DENY
permissions-policy: geolocation=(), microphone=(), camera=(), interest-cohort=()
default-src 'self'
Nothing loads from anywhere else.
script-src 'self'
No inline script and no eval.
style-src 'self' 'unsafe-inline'
Inline style attributes, used for animation offsets.
img-src 'self' data:
Images from this site and inline data images.
font-src 'self'
Fonts are self-hosted.
media-src 'none'
No video or audio at all.
connect-src 'self'
The live readouts fetch from this site and nowhere else.
frame-src 'none'
No embeds.
object-src 'none'
No plugins.
frame-ancestors 'none'
Nobody can frame this site.
base-uri 'self'
Relative links can’t be pointed elsewhere.
form-action 'self'
A form can post only back to this site.
upgrade-insecure-requests
Any plain http request is upgraded.
Build

Structured data

Every page describes itself.

Each page carries one JSON-LD graph (one block of linked facts about the page, written for machines). The company, its founder, the site, the page and what the page is about, joined by stable IDs. The same IDs appear on every page, so a machine reading two pages knows they describe one company.

structured data Build
OrganizationPersonWebSiteWebPageOrganizationTechArticleBreadcrumbListai-engineering #serviceseo #servicesoftware #serviceaudit #service

11 entities · 18 references · 1 block · ✓ parses

  • OrganizationADJL Technology#organization
  • PersonDaniel Laskowski#daniel
  • WebSiteADJL Technology#website
  • WebPageHow This Site Is Built for Search | ADJL Technology/work/this-site/#webpage
  • OrganizationADJL Capital#organization
  • BreadcrumbList/work/this-site/#breadcrumb
  • TechArticleThe site you’re on is the SEO case study./work/this-site/#article
  • /services/ai-engineering/#service/services/ai-engineering/#service · described on another page
  • /services/seo/#service/services/seo/#service · described on another page
  • /services/software/#service/services/software/#service · described on another page
  • /services/seo/audit/#service/services/seo/audit/#service · described on another page

Build

Machine-readable files

Files written for machines.

Each of these is generated from the built pages on every deploy, so none of them can describe a site that no longer exists.

  • sitemap.xml (dates from git history)
  • robots.txt (the file that tells crawlers what they may read)
  • llms.txt (a plain-text file written for AI tools to read)
  • llms-full.txt
  • A markdown copy of every page
  • build-report.json
machine-readable files Build

Build

Build guards

Checks that fail the build.

These run on every deploy. If one fails, the previous version stays live. If you’re reading this, every check passed.

GuardWhat it stops
check-cssA class with no style, or a style nothing uses
check-linksA link to a page or fragment that doesn’t exist, or a page nothing links to
check-claimsHype words, and any number attached to a performance claim
check-contactThe contact address missing, unlinked or half-changed
check-motionAn animation module with nothing on any page to animate
check-markersAn authoring marker shipped as visible text
check-usageBritish spellings, the wrong firm name, or a description that’s too long
check-voiceCopy drifting into the padded register we don’t write in
check-seoA missing canonical, a second h1, a relative share image or broken structured data
check-provenanceA demo without a label saying whether it’s live
check-budgetA page over its byte budget, or a file nothing uses
npm run build Build
✓ check-css
✓ check-links
✓ check-claims
✓ check-contact
✓ check-motion
✓ check-markers
✓ check-usage
✓ check-voice
✓ check-seo
✓ check-provenance
✓ check-budget
Build

Motion tiers

Motion that knows when to stop.

Every animation here runs at one of three levels. Full on a desktop, lighter on phones and low-memory devices, and none at all if you’ve asked your system for reduced motion. Anything that loops pauses when it’s off screen. The Pause button stops all of it.

module weights · gz Build
core
8.4 kB/ 24 kB
lattice
9.8 kB/ 10 kB
machine
2.6 kB/ 5 kB
ask
4.0 kB/ 4 kB
pipeline
1.5 kB/ 2.5 kB
replay
2.6 kB/ 4 kB
leaders
1.1 kB/ 3 kB
headers
1.1 kB/ 1 kB ▲ over budget
palette
2.8 kB/ 4 kB
view-machine
1.1 kB/ 4 kB
view-source
1.7 kB/ 4 kB
scan
4.7 kB/ 10 kB
machine-kit
4.2 kB/ 3 kB ▲ over budget
assistant
3.8 kB/ 10 kB
exclude
2.8 kB/ 3 kB
read
0.9 kB/ 10 kB
intro
0.7 kB/ 10 kB
site-pages
0.6 kB/ 10 kB
typer
0.5 kB/ 10 kB

Left out

What it doesn’t do.

No cookies. No trackers. No third-party scripts. A form can post only back to this site. Ask This Site is retrieval only, and no language model writes its answers. The one place a model runs is the scoping assistant on the start page. It’s called from a server function, so no key ever reaches your browser.

Start here

Tell us what’s slow, or what can’t be found.

One paragraph is plenty. Tell us what you want built, the step that costs the most, or the page that should rank and doesn’t. If you know why the obvious fix hasn’t worked, say that too.

Email
daniel@adjlcapital.com
Email Daniel

Daniel reads and answers these himself, usually within a day or two. No sequence, no drip, and nothing sold to anyone.