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:

terminal
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.

lib/constants.ts
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.

app/about/page.tsx
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.

people

Person[]

Team members and article authors. Suppressed when deploymentModel is owned-asset.

services

Service[]

Used in serviceList and serviceDetail archetypes.

products

Product[]

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.

ArchetypeSchemas generated
home
OrganizationWebSiteWebPage
about
OrganizationWebPagePerson*
serviceList
OrganizationWebPageService
serviceDetail
OrganizationWebPageServiceFAQPage*
location
LocalBusinessWebPage
article
ArticleWebPagePerson*
faq
FAQPageWebPage
contact
OrganizationWebPage
policy
WebPage
landing
OrganizationWebPageProduct*
team
OrganizationWebPagePerson
product
ProductWebPage
category
WebPage
listingDetail
LocalBusinessWebPage
portfolio
WebPage
listingList
WebPageItemList

Schemas

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 / LocalBusiness

Root business identity. Includes name, url, logo, sameAs, address, and contact details.

WebSite

Site-level schema with SearchAction potential. Generated once on the home archetype.

WebPage

Per-page schema with breadcrumbList, url, name, and description.

BreadcrumbList

Nested inside WebPage. Built from the breadcrumbs array you pass in pageData.

Article

For blog posts and content pages. Includes author, datePublished, dateModified.

FAQPage

Structured FAQ with Question/Answer pairs. Used in faq and serviceDetail archetypes.

Service

For service-based businesses. Includes provider, areaServed, description.

Product

For product pages and landings. Includes offers, price, availability, sku.

Person

For 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-owned

Full 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-asset

Reduced 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.

Open /debug →