# What we did to this site, and why you can check all of it

A firm selling AI citation whose own site is not readable has no argument left. Every technical decision behind martenfield.com, including the ones that cost us something.

Source: https://martenfield.com/research/what-we-did-to-this-site/
Published: 2026-07-31
Type: note

---
This site is the product demo. That single fact ruled out most of the normal
choices, and it is worth writing down which ones and why, because you can verify
every claim here against the page you are reading.

## The constraint

A firm selling AI citation whose own site is not readable by a crawler has no
argument left. So: every page is complete static HTML at its URL, with the full
content present when JavaScript is disabled.

That rules out client-side rendering, gated content, JavaScript-dependent
tables, infinite scroll, and any marketing platform that injects wrapper markup.
It also rules out the pattern where content sits behind an accordion or a tab,
which is worth stating plainly because we charge clients to fix that pattern and
could hardly ship it ourselves.

Check it: disable JavaScript and reload. Nothing should change. There is one
`<script>` tag on any page here and it contains JSON-LD, not code.

## Zero JavaScript, and what it cost

Built on Astro rather than the framework we use for everything else. On most
stacks you configure your way toward static HTML and fight the framework's
tendency to hydrate. Here that was the starting state.

The cost is real: the interactive scorecard tool we eventually want will not
share a codebase with this site. We took that trade because a hydration mistake
on this particular site is not a performance regression, it is the argument
collapsing.

## Markdown mirrors

Every research post, guide, and service page on this site is served twice. Once
as HTML for you, and once as plain markdown at the same path with a `.md`
extension, linked from the HTML head with `rel="alternate"`.

The mirrors are generated from the same source the HTML renders from, not
maintained alongside it, so the two surfaces cannot drift. Pages whose prose
lives only in a template do not advertise a mirror, because a mirror somebody
has to remember to update is a mirror that will eventually be wrong. All of it
is concatenated at `/llms-full.txt`.

This is not a trick. It is the most direct possible answer to the question "what
does a model actually receive from your page", and it makes that question
checkable by anyone rather than arguable.

It also made us honest during the build. Several drafts read fine as designed
pages and turned into mush as plain text, which is a reliable signal that the
layout was doing work the writing should have been doing.

## Crawler access, checked from outside

`robots.txt` explicitly names and allows the agents that matter: GPTBot,
OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot,
Perplexity-User, Google-Extended, CCBot, Bingbot, and Applebot-Extended.

Explicit rather than a blanket allow, because the point of this file on this
site is to be legible to a human auditing us.

The part that catches people, and caught us on the checklist: permitting a
crawler in `robots.txt` does not mean your edge is letting it through. Several
CDN bot-management products block AI crawlers by default under managed rules,
and the block is invisible from your own testing because you are not the bot.
The verification step is fetching your own pages from outside with the actual
user agent, not reading your configuration and assuming.

## Provenance next to every number

Every page carrying data also carries a measurement stamp: what was collected,
when, against which engines, at how many runs per query, under which method
version. Same position, same format, every time.

It is the one visually distinctive element on the site and it earns its place by
being the ethic of the business made visible. The competitive set publishes
numbers with no provenance attached.

The stamp has one behaviour worth calling out. Where a figure is illustrative
rather than measured, the stamp says so in red, unprompted. The home page
scorecard currently carries that flag, because the measurement pipeline has not
produced its first real run yet and we would rather ship a visible placeholder
than an invisible fabrication.

## Structured data that resolves

`Organization`, `WebSite`, and a `Person` node for the founder, plus `Service`
on each service page, `Article` on research posts, `FAQPage` on genuine question
blocks, and `BreadcrumbList` throughout.

Two details that are usually skipped. The `Person` node reuses the same `@id`
used across our other properties rather than minting a new one, so the founder
resolves to one entity across the web instead of three weak ones. And every
`@id` reference in the graph resolves to a node that actually exists, verified
in the build rather than assumed, because a graph with dangling references
describes nothing.

Entity `sameAs` links were validated against the Wikidata API one at a time
during the build. Anything we could not confirm has no `sameAs` at all, on the
principle that a wrong one is worse than a missing one.

## Light, on purpose

Nearly every site in this category is dark with a neon accent. We went light,
and not as a taste call.

The register is analyst publication and that world is paper. Long table scanning
is harder on dark. Index pages get forwarded and printed, and dark sites produce
garbage when printed to PDF, which matters because those are the pages that
travel inside a company.

Dark is used here for exactly one thing: showing what the machine sees. Raw
responses, JSON-LD, `robots.txt` samples, markdown previews. Colour carries
meaning on this site or it does not appear, and the same rule governs the only
two accent colours, which appear inside tables and nowhere else.

## What we have not built

No CMS, for one author publishing weekly. No component library, for a site that
needs six components. No tags, categories, related posts, or pagination on a
reverse-chronological list with three entries on it. No analytics beyond a
privacy-friendly counter, because the metric that matters is citation share and
we already measure that. Nothing with a login.

Every one of those is a thing we would have to maintain in exchange for solving
a problem we do not have yet.

## The measurement that matters

martenfield.com is in the tracking pipeline against its own query set. The
early results will show we do not appear for most of it. We are going to publish
them quarterly regardless, starting from the baseline where we look bad, because
that is the only case study we can run without asking anyone's permission.