From ea78a55a866536aee686cd6fb86430475a9fa4a7 Mon Sep 17 00:00:00 2001 From: molebox Date: Mon, 19 Jan 2026 16:22:26 +0100 Subject: [PATCH 1/2] Add md tracking for AI usage analytics --- .../app/[lang]/llms.md/[[...slug]]/route.ts | 14 ++++- docs/site/app/[lang]/llms.txt/route.ts | 14 ++++- docs/site/lib/md-tracking.ts | 53 +++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 docs/site/lib/md-tracking.ts diff --git a/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts b/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts index 1f955f960b5ac..37a1748432e5a 100644 --- a/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts +++ b/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts @@ -1,10 +1,11 @@ import { notFound } from "next/navigation"; import { getLLMText, source } from "@/lib/geistdocs/source"; +import { trackMdRequest } from "@/lib/md-tracking"; export const revalidate = false; export async function GET( - _req: Request, + req: Request, { params }: RouteContext<"/[lang]/llms.md/[[...slug]]"> ) { const { slug, lang } = await params; @@ -14,6 +15,17 @@ export async function GET( notFound(); } + // Track markdown request (fire-and-forget) + const userAgent = req.headers.get("user-agent"); + const referer = req.headers.get("referer"); + const acceptHeader = req.headers.get("accept"); + void trackMdRequest({ + path: `/llms.md/${slug?.join("/") ?? ""}`, + userAgent, + referer, + acceptHeader, + }); + return new Response(await getLLMText(page), { headers: { "Content-Type": "text/markdown" diff --git a/docs/site/app/[lang]/llms.txt/route.ts b/docs/site/app/[lang]/llms.txt/route.ts index 51a86b31c6037..e04784179c3fc 100644 --- a/docs/site/app/[lang]/llms.txt/route.ts +++ b/docs/site/app/[lang]/llms.txt/route.ts @@ -1,5 +1,6 @@ import type { NextRequest } from "next/server"; import { source } from "@/lib/geistdocs/source"; +import { trackMdRequest } from "@/lib/md-tracking"; export const revalidate = false; @@ -7,12 +8,23 @@ const TURBO_SLOGAN = "Turborepo is a build system optimized for JavaScript and TypeScript, written in Rust."; export const GET = async ( - _req: NextRequest, + req: NextRequest, { params }: RouteContext<"/[lang]/llms.txt"> ) => { const { lang } = await params; const pages = source.getPages(lang); + // Track markdown request (fire-and-forget) + const userAgent = req.headers.get("user-agent"); + const referer = req.headers.get("referer"); + const acceptHeader = req.headers.get("accept"); + void trackMdRequest({ + path: "/llms.txt", + userAgent, + referer, + acceptHeader, + }); + const links = pages .sort((a, b) => a.url.localeCompare(b.url)) .map((page) => { diff --git a/docs/site/lib/md-tracking.ts b/docs/site/lib/md-tracking.ts new file mode 100644 index 0000000000000..74eda15158878 --- /dev/null +++ b/docs/site/lib/md-tracking.ts @@ -0,0 +1,53 @@ +const MD_TRACKING_URL = process.env.MD_TRACKING_URL; +const MD_TRACKING_API_KEY = process.env.MD_TRACKING_API_KEY; + +interface TrackMdRequestParams { + path: string; + userAgent: string | null; + referer: string | null; + acceptHeader: string | null; +} + +/** + * Track a markdown page request to the feedback-app analytics. + * Fire-and-forget: errors are logged but don't affect the response. + */ +export async function trackMdRequest({ + path, + userAgent, + referer, + acceptHeader, +}: TrackMdRequestParams): Promise { + if (!MD_TRACKING_URL || !MD_TRACKING_API_KEY) { + // Tracking not configured, skip silently + return; + } + + try { + const response = await fetch(MD_TRACKING_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${MD_TRACKING_API_KEY}`, + }, + body: JSON.stringify({ + path, + source: 'turborepo', + userAgent, + referer, + acceptHeader, + }), + }); + + if (!response.ok) { + console.error( + 'MD tracking failed:', + response.status, + await response.text(), + ); + } + } catch (error) { + // Fire-and-forget: don't let tracking errors affect the response + console.error('MD tracking error:', error); + } +} From 3ed1bde0d710ff611ed00bf06857edd59c5f13a3 Mon Sep 17 00:00:00 2001 From: molebox Date: Mon, 19 Jan 2026 16:36:44 +0100 Subject: [PATCH 2/2] Fix formatting: double quotes, no trailing commas --- .../app/[lang]/llms.md/[[...slug]]/route.ts | 2 +- docs/site/app/[lang]/llms.txt/route.ts | 2 +- docs/site/lib/md-tracking.ts | 20 +++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts b/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts index 37a1748432e5a..532b08a6b495e 100644 --- a/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts +++ b/docs/site/app/[lang]/llms.md/[[...slug]]/route.ts @@ -23,7 +23,7 @@ export async function GET( path: `/llms.md/${slug?.join("/") ?? ""}`, userAgent, referer, - acceptHeader, + acceptHeader }); return new Response(await getLLMText(page), { diff --git a/docs/site/app/[lang]/llms.txt/route.ts b/docs/site/app/[lang]/llms.txt/route.ts index e04784179c3fc..a93c5a5bcc212 100644 --- a/docs/site/app/[lang]/llms.txt/route.ts +++ b/docs/site/app/[lang]/llms.txt/route.ts @@ -22,7 +22,7 @@ export const GET = async ( path: "/llms.txt", userAgent, referer, - acceptHeader, + acceptHeader }); const links = pages diff --git a/docs/site/lib/md-tracking.ts b/docs/site/lib/md-tracking.ts index 74eda15158878..3a59c431151b2 100644 --- a/docs/site/lib/md-tracking.ts +++ b/docs/site/lib/md-tracking.ts @@ -16,7 +16,7 @@ export async function trackMdRequest({ path, userAgent, referer, - acceptHeader, + acceptHeader }: TrackMdRequestParams): Promise { if (!MD_TRACKING_URL || !MD_TRACKING_API_KEY) { // Tracking not configured, skip silently @@ -25,29 +25,29 @@ export async function trackMdRequest({ try { const response = await fetch(MD_TRACKING_URL, { - method: 'POST', + method: "POST", headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${MD_TRACKING_API_KEY}`, + "Content-Type": "application/json", + Authorization: `Bearer ${MD_TRACKING_API_KEY}` }, body: JSON.stringify({ path, - source: 'turborepo', + source: "turborepo", userAgent, referer, - acceptHeader, - }), + acceptHeader + }) }); if (!response.ok) { console.error( - 'MD tracking failed:', + "MD tracking failed:", response.status, - await response.text(), + await response.text() ); } } catch (error) { // Fire-and-forget: don't let tracking errors affect the response - console.error('MD tracking error:', error); + console.error("MD tracking error:", error); } }