Reference
Grndwerk Docs
Grndwerk adds Schema.org JSON-LD, llms.txt, and correct metadata to any Next.js project. Everything is derived from a single lib/constants.ts file — configure once, never think about it again.
Getting started
Quick Start
After purchase you get access to a private GitHub repo. Fork or clone it, then copy the relevant directories into your project.
1. Copy the kit files
Drop these into the root of your Next.js project:
cp -r grndwerk/lib ./lib
cp -r grndwerk/components/seo ./components/seo
cp -r grndwerk/app/debug ./app/debug # debug dashboard
cp -r grndwerk/app/llms.txt ./app/
cp -r grndwerk/app/llms-full.txt ./app/No npm install required. The only runtime dependency is Next.js itself.
2. Edit lib/constants.ts
Replace the Acme Corp demo with your real data. This is the only file you need to edit for most sites.
export const SITE: SiteConstants = {
deploymentModel: "client-owned", // or "owned-asset"
businessModel: "saas",
identity: {
name: "Your Company",
description: "What your site does.",
slogan: "Short tagline.",
foundingDate: "2024",
},
urls: { canonical: "https://yourdomain.com" },
org: { type: "Organization" }, // or "LocalBusiness"
contact: { email: "hello@yourdomain.com" },
capabilities: {
hasFAQ: true,
hasProducts: true,
// ... see capabilities reference below
},
}3. Add JsonLd to each page
One component per page. Pass the archetype and a pageData object.
import { JsonLd } from "@/components/seo/json-ld"
import { generateMetadata } from "@/components/seo/metadata"
const pageData = {
url: "https://yourdomain.com/about",
path: "/about",
title: "About Us",
description: "...",
breadcrumbs: [
{ name: "Home", url: "/" },
{ name: "About", url: "/about" },
],
}
export const metadata = generateMetadata({ page: pageData, archetype: "about" })
export default function AboutPage() {
return (
<>
<JsonLd archetype="about" page={pageData} />
{/* your content */}
</>
)
}4. Verify at /debug
Open localhost:3000/debug to see schema health, validation warnings, and a live preview of your generated llms.txt. Fix any warnings before deploying.
Configuration
constants.ts reference
All top-level fields on SiteConstants. Most are optional — fill in what applies to your site.
deploymentModelrequired"client-owned" | "owned-asset"
Controls identity signal density. client-owned emits full Person schemas and legalName. owned-asset suppresses them for rank-and-rent or agency handoffs.
businessModelrequired"saas" | "local" | "ecommerce" | "content" | "portfolio"
Informs which schema types are relevant. Drives conditional schema generation across archetypes.
identityrequired{ name, legalName?, description, slogan?, foundingDate? }
Core business identity. Used in Organization schema, page metadata, and llms.txt.
brand{ logo?, logoSquare?, ogImage?, primaryColor? }
Paths relative to /public. ogImage is used for Open Graph and Twitter card metadata.
orgrequired{ type: "Organization" | "LocalBusiness" | "Person", id? }
Sets the @type for the root schema. Use LocalBusiness if you have a physical location.
urlsrequired{ canonical, privacy?, terms?, contact? }
canonical is your base URL without a trailing slash. All absolute URLs are derived from it.
contact{ email?, phone?, address? }
Added to Organization schema and llms.txt. Phone should be E.164 format (+1...).
geo{ latitude?, longitude?, radius? }
Used in LocalBusiness schema for areaServed geo coverage.
social{ twitter?, github?, linkedin?, ... }
Populates sameAs on the Organization schema and the social block in llms.txt.
capabilities{ hasBlog, hasEcommerce, hasFAQ, hasProducts, hasServices, ... }
Feature flags that control which schema builders are active. All default to false.
peoplePerson[]
Team members and article authors. Suppressed when deploymentModel is owned-asset.
servicesService[]
Used in serviceList and serviceDetail archetypes.
productsProduct[]
Used in product and landing archetypes. Each product gets a full Product schema.
Archetypes
16 page archetypes
Pass an archetype string to JsonLd and the correct schemas are selected automatically. Schemas marked * are only generated when the relevant data exists in constants.ts.
homeaboutserviceListserviceDetaillocationarticlefaqcontactpolicylandingteamproductcategorylistingDetailportfoliolistingListSchemas
9 schema types
All schemas are Schema.org-compliant JSON-LD, injected into the page head via Next.js script tags with type application/ld+json.
Organization / LocalBusinessRoot business identity. Includes name, url, logo, sameAs, address, and contact details.
WebSiteSite-level schema with SearchAction potential. Generated once on the home archetype.
WebPagePer-page schema with breadcrumbList, url, name, and description.
BreadcrumbListNested inside WebPage. Built from the breadcrumbs array you pass in pageData.
ArticleFor blog posts and content pages. Includes author, datePublished, dateModified.
FAQPageStructured FAQ with Question/Answer pairs. Used in faq and serviceDetail archetypes.
ServiceFor service-based businesses. Includes provider, areaServed, description.
ProductFor product pages and landings. Includes offers, price, availability, sku.
PersonFor team members and article authors. Suppressed in owned-asset deployment mode.
Configuration
Deployment modes
Set deploymentModel in constants.ts. This single flag controls how much identity information is exposed in schemas and llms.txt.
client-ownedFull identity signals. Use for real business sites where you want maximum AI and search visibility.
- ✓ Organization with legalName
- ✓ Person schemas for team/authors
- ✓ Full contact and address data
- ✓ sameAs social profile links
owned-assetReduced footprint. Use for rank-and-rent sites, agency handoffs, or any site where you want minimal identity exposure.
- - Person schemas suppressed
- - legalName omitted
- - Reduced contact exposure
- ✓ Core WebPage + WebSite schemas
Tooling
Debug dashboard
The /debug route ships with the kit. It's a first-class tool for verifying your setup before deploying.
Health overview
Checks for missing required fields, placeholder values, bad phone formats, and 24hr business hour conflicts.
Schema inspector
Preview the exact JSON-LD output for each archetype without deploying.
Constants viewer
See how your constants.ts values are parsed and mapped to schema fields.
llms.txt preview
See the generated llms.txt and llms-full.txt content before going live.
See it live on this site
grndwerk.com/debug - running on the Grndwerk Kit itself.