Every site you ship needs structured data, an llms.txt, and correct metadata. Grndwerk wires all of it from a single constants.ts - configure once, never think about it again.
One-time payment • You own the code • No lock-in
export const SITE: SiteConstants = {
deploymentModel: "client-owned",
businessModel: "saas",
identity: {
name: "Acme Corp",
description: "Project management for dev teams.",
},
org: { type: "Organization" },
urls: { canonical: "https://acmecorp.com" },
// ↑ Change this. Everything updates.
}↑ The only file you edit. Schemas, metadata, llms.txt — all derived from this.
Get discovered on
The problem
lost per site setting up Schema.org from scratch. JSON-LD doesn't copy between projects — every archetype is different.
existing tools generate an llms.txt. AI crawlers like ChatGPT and Perplexity can't read most sites. They're flying blind.
from Google to AI assistants is already happening. Without structured data and llms.txt, your site doesn't exist to them.
Grndwerk handles the whole stack — JSON-LD schemas, a well-formed llms.txt, and correct metadata — derived from one constants file. Set it once. Works for every project you ever ship.
For everyone else
Google, ChatGPT, and Perplexity decide what to surface based on signals they can read, not just words on a page. Most sites send nothing. Grndwerk wires all of it automatically.
Without these signals, AI engines guess. With them, they know — and recommend you.
What's included
Organization, WebSite, WebPage, Article, FAQ, Service, Product, Person, Breadcrumb. Correct types selected per page archetype.
Auto-generated from your constants and served as static routes. AI crawlers can read and understand your site in one pass.
generateMetadata() and generateRootMetadata() with correct OG, Twitter, canonical, and verification tags. Drop in and forget.
Checks your constants before schemas are built. Catches missing addresses, bad phone formats, placeholder values, 24hr conflicts.
Health overview, constants viewer, schema inspector per archetype. Built as a first-class tool — see it live on this site at /debug.
client-owned for real businesses. owned-asset for rank-and-rent sites: Person schemas suppressed, minimal footprint.
shadcn-style installation — you own the code.
Files copy into your project. No package to update, no lock-in. Read it, modify it, ship it.
How it works
Drop lib/, components/seo/, and the app routes into your Next.js project. No npm install.
cp -r grndwerk/lib ./lib
cp -r grndwerk/components/seo ./components/seoOne file. Replace the Acme Corp demo with your real business data. Heavily commented. Takes ~10 minutes.
// lib/constants.ts
export const SITE: SiteConstants = {
identity: { name: "Your Business" },
urls: { canonical: "https://yourdomain.com" },
org: { type: "LocalBusiness" },
// ...
}One component, one prop. The factory handles which schemas to generate for that archetype.
import { JsonLd } from "@/components/seo/json-ld"
export default function Page() {
return (
<>
<JsonLd archetype="serviceDetail" page={pageData} />
{/* your content */}
</>
)
}The debug dashboard shows validation status, schema health, and a live preview of your llms.txt. Fix any warnings before deploying.
localhost:3000/debug
# → Health dashboard
# → Schema inspector per archetype
# → Constants viewer
# → llms.txt previewDrop in, not rip out
Grndwerk adds its folders alongside what you already have. Nothing moves, nothing breaks. Your codebase stays yours.
Before
After
16 page archetypes
Pass an archetype to JsonLd and the right schemas are generated automatically. Every page type covered.
All 16 archetypes
Pricing
One-time. No subscription. No license keys.
30-day support guarantee
Set it up and it doesn't work for your project? Email us within 30 days and we'll make it right. No hassle.
Delivery via private GitHub repo • Instant access
Running client sites or rank-and-rent? The owned-asset mode suppresses Person schemas and reduces footprint. One purchase covers all your projects.
Why this exists

I rebuilt the same stack four times this year... for four different paying clients.
Every project: same setup, same integrations, same two to five days gone before a single business feature was written. Then I started looking at what was happening with AEO, GEO, and AI search - and realised every site I'd shipped was invisible to ChatGPT, Perplexity, and Claude by default.
The structured data layer didn't exist in any starter I could find, so I built it myself. Then I wired it to a single config file so I'd never have to rebuild it again. That's Grndwerk.
One purchase. Every project from here on ships AI-visible from line one.
Frequently Asked Questions
If you don't find what you're looking for, feel free to reach out at hello@grndwerk.com.