Build1 distinct publisher3 min readUpdated
Richard Lemon published the structured data he ships by default, with one rule that does most of the work: nothing goes in the markup unless a visitor can see it on the page.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Richard Lemon has published on dev.to a walkthrough of the default JSON-LD bundle he ships on almost every marketing or SaaS site, plus variants for blogs and local businesses [1][4]. The markup itself is ordinary; the operating decision behind it is the part worth copying, because he says he stopped treating Schema.org as a research project after noticing where the research led [2].
The failure mode he describes is familiar: new client, new niche, too many candidate schema types, and then you add nothing at all because the job feels endless [3]. A fixed default closes the scope. His bundle is governed by four constraints [5][6][7][8][25]. Two are about vocabulary: JSON-LD only, inside `script type="application/ld+json"`, with no microdata and no RDFa [5], and one primary entity per page, on the grounds that Google can handle more but simplicity wins unless a composite is genuinely needed [6]. The other two are about provenance, and they are the ones that change outcomes. The markup is generated from a build step or CMS fields rather than hand-written per page [7], and the data must exist visually: if the user cannot see it, it does not go in the schema, which he frames as staying out of spam territory [8].
Those two rules together mean the page is the source of truth, not a separate document that drifts. The contactPoint block shows the discipline working: he includes a phone number in the Organization markup only if the site displays one, and deletes the block otherwise [21]. Same logic on the site-wide WebSite entity, which he puts only on the root URL, not every page [13], and only with a `potentialAction` if a real search endpoint exists, with no fake endpoints [14]. He matches the `url` value to the canonical link tag every time [15]. According to Lemon, Google uses this block for sitelinks search boxes [12]. The implementation is a `buildWebsiteSchema(config)` helper fed a site name, a URL and an optional search URL, which the page component calls and stringifies [16].
The main entity is a generic Organization for SaaS, agencies without public shops and online-only services, carrying name, url, logo, sameAs and contactPoint [17][18]. Logo is the same file as the header, absolute and crawlable [19]; sameAs holds only real social profiles, not directory listings [20]. It sits on the homepage next to the WebSite block as a second, separate script [22]. Brick-and-mortar clients get a LocalBusiness subtype instead, such as Restaurant, Physiotherapy or HealthClub [23], and the gym example adds an `@id` anchored to a `#business` fragment, a PostalAddress, GeoCoordinates and openingHoursSpecification [24]. Injection is in the head wherever possible, via a Head component in Next.js or written directly in Astro, Svelte and plain HTML [9], with dynamic data rendered on the server and dropped in as stringified content [10]. No CDNs, no external scripts [11].
Two things to watch if you adopt this. First, the visibility rule creates a coupling that has to be enforced somewhere: remove the phone number from the footer and the contactPoint block has to go with it [21][8], which is a template problem, not an editorial one. Second, the walkthrough as supplied breaks off inside the local-business section, so the blog and local-business variants he references are not fully in evidence [26][4].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Rule: data must exist visually; if the user cannot see it, he does not put it in schema, which he says keeps him out of spam territory.
He uses a small buildWebsiteSchema(config) helper fed siteName, url and an optional searchUrl; the page component calls it and stringifies the JSON.
Richard Lemon published a technical walkthrough on dev.to of his default Schema.org markup bundle, described as the markup he actually uses and where it lives.
The author writes that he got tired of treating Schema.org like a research project and stopped doing that, building a small default bundle instead.
The author describes the drill as: new client, new niche, too many schema types, then you add nothing because it feels endless.
The bundle is a set of JSON-LD blocks he ships on almost every marketing or SaaS site, plus a couple of variants for blogs and local businesses.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One self-reported practitioner walkthrough
The cluster rests on a single dev.to post. Its strength is specificity -- complete, inspectable JSON-LD blocks, named framework injection points and named helper functions -- which makes the practice claims easy to verify as described. Its weakness is that every efficacy assertion is unsupported: no rich-results validation output, no search-console or ranking data, and no citation to Google or Schema.org documentation for the sitelinks or knowledge-panel claims. The supplied text is also truncated mid-sentence, leaving part of the bundle undocumented.
One practitioner's own client sites
The only adoption signal is the author's own disclosure that he ships these blocks on almost every client site, with one named domain. There is no third-party usage, no repository, package or template release, no download or star count, and no other publisher observing the pattern. That is enough to register real-world use by one shop and no more.
Prescription outruns the proof
Mildly overstated. The practice content is modest and honest -- ship a small default bundle, keep it generated, keep it visible-only -- and the cluster framing tracks the source. The gap comes from scope and outcome language: a headline asserting what every client site should ship, plus unmeasured SEO benefit claims (sitelinks search boxes, local rankings and knowledge panel consistency improving 'a lot'), resting on one practitioner's habit with no validation output or comparison. Nothing here is fabricated, so the overstatement is small rather than severe.
Practitioner credibility building, mild self-interest
The post is a personal-brand and expertise artifact by a freelance or agency practitioner on a developer publishing platform, and the local-business worked example is built on the author's own lemonperformance.nl domain -- undisclosed self-reference that also functions as a shopfront. There is no vendor sponsorship, product to sell, license or funding interest visible in the cluster, so the incentive to overstate is real but limited to reputational and lead-generation upside.
Practice claims solid, outcome claims thin
Confidence is moderate-low. What the author does is described precisely enough to be reproduced and internally consistent across sections, so the practice claims hold. But there is one source and one publisher, no independent corroboration, no measurement of results, a truncated body, and one ledger claim about where the text ends that the supplied source contradicts -- all of which cap how far this assessment can be trusted beyond 'one practitioner's documented method'.
build
Five frameworks, one store, and a benchmark that measures when the button works1 distinct publisher
build
Pin `formats` before you take the next/image v4 bump1 distinct publisher
build
The third answer: a dead-code tool allowed to say "not traced yet"1 distinct publisher
build
Next.js 15 warns instead of failing, so the async params fix keeps getting deferred1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 16, 2026