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
◆ BuildTelemetry
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
- 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
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.
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
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 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.
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.
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
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
- /robots.txtneeds JS0.5 kB
- /sitemap.xmlneeds JS3.9 kB
- /llms.txtneeds JS7.2 kB
- /llms-full.txtneeds JS176.1 kB
- /work/this-site/index.mdneeds JS6.7 kB
- /build-report.jsonneeds JSneeds JS
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.
| Guard | What it stops |
|---|---|
| check-css | A class with no style, or a style nothing uses |
| check-links | A link to a page or fragment that doesn’t exist, or a page nothing links to |
| check-claims | Hype words, and any number attached to a performance claim |
| check-contact | The contact address missing, unlinked or half-changed |
| check-motion | An animation module with nothing on any page to animate |
| check-markers | An authoring marker shipped as visible text |
| check-usage | British spellings, the wrong firm name, or a description that’s too long |
| check-voice | Copy drifting into the padded register we don’t write in |
| check-seo | A missing canonical, a second h1, a relative share image or broken structured data |
| check-provenance | A demo without a label saying whether it’s live |
| check-budget | A page over its byte budget, or a file nothing uses |
✓ check-css
✓ check-links
✓ check-claims
✓ check-contact
✓ check-motion
✓ check-markers
✓ check-usage
✓ check-voice
✓ check-seo
✓ check-provenance
✓ check-budget
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.
- 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.
Built under
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.
Daniel reads and answers these himself, usually within a day or two. No sequence, no drip, and nothing sold to anyone.