From 25829d6e8c626bacc5a5779edbd179fc192bbd0d Mon Sep 17 00:00:00 2001 From: Gaurav agarwal Date: Sat, 25 Jul 2026 11:14:29 +0530 Subject: [PATCH 1/2] Install git in the Docker builder so page dates are generated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit node:20-alpine ships without git, and Docusaurus derives several things by shelling out to `git log`: - sitemap (added in #224 — currently emits nothing live) - "Last updated on … by …" (showLastUpdateTime/Author — silently missing in production on ALL pages, pre-existing) - TechArticle datePublished/dateModified (tech-article-jsonld plugin) Verified on the deployed site: 0 in sitemap.xml, no "Last updated" footer, and no date fields in the TechArticle JSON-LD — while the same commit built locally (where git exists) produces 532 entries and full dates. Adding `apk add --no-cache git` to the builder stage fixes all three. Requires the build context to include .git (there is no .dockerignore, so it does today) and a non-shallow checkout. Co-Authored-By: Claude Fable 5 --- Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Dockerfile b/Dockerfile index fc9e1b3b..b6998b23 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,14 @@ ENV NODE_OPTIONS=--max_old_space_size=16000 WORKDIR /app +# Docusaurus derives per-page dates from git history: sitemap , +# the "Last updated" footer (showLastUpdateTime/Author), and the +# TechArticle JSON-LD dates. node:20-alpine ships without git, so these are +# silently dropped from production builds unless git is installed here. +# NOTE: the build context must include the .git directory (do not add .git to +# .dockerignore) and the checkout must not be shallow, or dates will be partial. +RUN apk add --no-cache git + COPY . . RUN yarn install && yarn build From 3901e78fab4c80c40b3fc99c1de2a491b8bbd659 Mon Sep 17 00:00:00 2001 From: Gaurav agarwal Date: Sat, 25 Jul 2026 11:19:25 +0530 Subject: [PATCH 2/2] Serve raw .md twins as text/markdown, not octet-stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The raw markdown twins emitted at /docs/**/index.md (for LLM/agent consumption) were served as application/octet-stream because nginx has no mime type for .md — browsers download them instead of displaying, and some crawlers skip non-text content types, which defeats the purpose of the file. Add a regex location setting default_type text/markdown + charset utf-8. Verified live before the fix: curl -sI .../docs/graphql/data-coverage-retention/index.md -> content-type: application/octet-stream Co-Authored-By: Claude Fable 5 --- nginx/default.conf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nginx/default.conf b/nginx/default.conf index 71a7c7ed..f046d404 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -52,6 +52,16 @@ server { add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; } + # Raw markdown twins (/docs/**/index.md) emitted by plugins/llms-txt.js for + # LLM/agent consumption. nginx has no mime type for .md, so they were served + # as application/octet-stream — browsers download them instead of displaying, + # and some crawlers skip non-text types. + location ~ \.md$ { + default_type text/markdown; + charset utf-8; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; + } + # Doc images/videos are updated in place — cache hard but allow revalidation location /img/ { try_files $uri =404;