Link Tags
Connect your pages to their structured versions.
Reference tags tell AI systems where to find your structured files. Without them, the files exist but are invisible to crawlers.
What to add
Add <link rel="alternate"> tags inside the <head> of each page, pointing to the matching Geordy files.
Homepage (8 files)
The homepage includes llms.txt and humans.txt - root-only files. llms.txt uses rel="llms" per the llmstxt.org spec.
Homepage <head>html
<!-- Geordy AI References --> <link rel="llms" type="text/plain" href="https://ai.yourdomain.com/llms.txt" title="LLMs.txt" data-ai="true" /> <link rel="alternate" type="text/plain" href="https://ai.yourdomain.com/humans.txt" title="Humans.txt" data-ai="true" /> <link rel="alternate" type="text/markdown" href="https://ai.yourdomain.com/index.md" title="Markdown" data-ai="true" /> <link rel="alternate" type="application/ld+json" href="https://ai.yourdomain.com/index.schema.json" title="Schema" data-ai="true" /> <link rel="alternate" type="application/yaml" href="https://ai.yourdomain.com/index.yaml" title="YAML" data-ai="true" /> <link rel="alternate" type="application/json" href="https://ai.yourdomain.com/index.og.json" title="Open Graph" data-ai="true" /> <link rel="alternate" type="application/rss+xml" href="https://ai.yourdomain.com/index.xml" title="RSS" data-ai="true" /> <link rel="alternate" type="application/json" href="https://ai.yourdomain.com/index.manifest.json" title="Manifest" data-ai="true" />
Inner pages (6 files)
Inner pages use the page path as the filename, preserving directory structure. Root-only files (llms.txt, humans.txt) can still be included - they always point to the same root URL.
/about/team page <head>html
<link rel="alternate" type="text/markdown" href="https://ai.yourdomain.com/about/team.md" title="Markdown" data-ai="true" /> <link rel="alternate" type="application/ld+json" href="https://ai.yourdomain.com/about/team.schema.json" title="Schema" data-ai="true" /> <link rel="alternate" type="application/yaml" href="https://ai.yourdomain.com/about/team.yaml" title="YAML" data-ai="true" /> <link rel="alternate" type="application/json" href="https://ai.yourdomain.com/about/team.og.json" title="Open Graph" data-ai="true" /> <link rel="alternate" type="application/rss+xml" href="https://ai.yourdomain.com/about/team.xml" title="RSS" data-ai="true" /> <link rel="alternate" type="application/json" href="https://ai.yourdomain.com/about/team.manifest.json" title="Manifest" data-ai="true" />
NotePath mapping: /about → about.*, /pricing → pricing.*, /about/team → about/team.*
Dynamic implementation (recommended)
Use a reusable React component that automatically generates correct file URLs based on the current page path. Tags then auto-generate for every page, with no manual updates.
components/geordy-tags.tsxtsx
import React from "react"
interface GeordyTagsProps {
domain: string
pagePath?: string
formats?: {
yaml?: boolean; markdown?: boolean; llms?: boolean; schema?: boolean
rss?: boolean; manifest?: boolean; humans?: boolean; og?: boolean
}
}
export function GeordyTags({ domain, pagePath = "/", formats = {} }: GeordyTagsProps) {
const today = new Date().toISOString().slice(0, 10)
const isRoot = pagePath === "/"
const pathSegment = isRoot ? "index" : pagePath.replace(/^\//, "")
const base = `https://files.geordy.ai/${domain}`
const { yaml = true, markdown = true, llms = true, schema = true, rss = true, manifest = true, humans = true, og = true } = formats
return (
<>
{yaml && <link rel="alternate" type="application/yaml" href={`${base}/${pathSegment}.yaml`} title="YAML" data-ai="true" />}
{markdown && <link rel="alternate" type="text/markdown" href={`${base}/${pathSegment}.md`} title="Markdown" data-ai="true" />}
{schema && <link rel="alternate" type="application/ld+json" href={`${base}/${pathSegment}.schema.json`} title="Schema" data-ai="true" />}
{rss && <link rel="alternate" type="application/rss+xml" href={`${base}/${pathSegment}.xml`} title="RSS" data-ai="true" />}
{manifest && <link rel="alternate" type="application/json" href={`${base}/${pathSegment}.manifest.json`} title="Manifest" data-ai="true" />}
{og && <link rel="alternate" type="application/json" href={`${base}/${pathSegment}.og.json`} title="Open Graph" data-ai="true" />}
{llms && <link rel="llms" href={`${base}/llms.txt`} title="LLMs.txt" data-ai="true" data-version={today} />}
{humans && <link rel="alternate" type="text/plain" href={`${base}/humans.txt`} title="Humans.txt" data-ai="true" />}
</>
)
}Usage in Next.js
app/layout.tsxtsx
"use client"
import { usePathname } from "next/navigation"
import { GeordyTags } from "@/components/geordy-tags"
export default function Layout({ children }) {
const pathname = usePathname()
return (
<html>
<head>
<GeordyTags domain="yourdomain.com" pagePath={pathname} />
</head>
<body>{children}</body>
</html>
)
}
// To disable specific formats:
// <GeordyTags domain="yourdomain.com" pagePath={pathname} formats={{ rss: false, manifest: false }} />Verification
- View page source and search for your subdomain - tags should appear in the <head>
- Click one of the href URLs - the file should load
- Check multiple pages to confirm dynamic implementation works
Heads upThis is the activation step. Files that exist but aren't referenced are invisible to AI systems.