From e0c926ba1484c778a5189226b348213d2206030b Mon Sep 17 00:00:00 2001 From: Dan Fein Date: Sun, 28 Sep 2025 23:11:08 -0400 Subject: [PATCH 1/2] Makes the URLs dynamic when you deploy the app --- app/docs/[slug]/page.tsx | 9 ++++++++- app/docs/docs.ts | 8 +++++++- app/markdown/[slug]/route.ts | 7 ++++++- docs/getting-started.md | 6 +++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/app/docs/[slug]/page.tsx b/app/docs/[slug]/page.tsx index 8f5b354..6796d46 100644 --- a/app/docs/[slug]/page.tsx +++ b/app/docs/[slug]/page.tsx @@ -1,5 +1,6 @@ import ReactMarkdown from "react-markdown"; import { availableDocs, loadDoc } from "../docs"; +import { headers } from "next/headers"; interface DocsPageProps { params: Promise<{ @@ -16,7 +17,13 @@ export const generateStaticParams = async () => { export default async function DocsPage({ params }: DocsPageProps) { const { slug } = await params; - const content = loadDoc(slug); + // Get the current domain from headers + const headersList = await headers(); + const host = headersList.get('host'); + const protocol = headersList.get('x-forwarded-proto') || 'https'; + const domain = `${protocol}://${host}`; + + const content = loadDoc(slug, domain); return (
diff --git a/app/docs/docs.ts b/app/docs/docs.ts index b4ed2ad..d5b4452 100644 --- a/app/docs/docs.ts +++ b/app/docs/docs.ts @@ -10,7 +10,7 @@ export const availableDocs = [ "examples", ]; -export function loadDoc(slug: string) { +export function loadDoc(slug: string, domain?: string) { // Check if the requested doc exists if (!availableDocs.includes(slug)) { notFound(); @@ -22,5 +22,11 @@ export function loadDoc(slug: string) { } catch { notFound(); } + + // Replace domain placeholder with actual domain if provided + if (domain) { + content = content.replace(/{{DOMAIN}}/g, domain); + } + return content; } diff --git a/app/markdown/[slug]/route.ts b/app/markdown/[slug]/route.ts index ed18920..6079893 100644 --- a/app/markdown/[slug]/route.ts +++ b/app/markdown/[slug]/route.ts @@ -11,7 +11,12 @@ export async function GET( { params }: { params: Promise<{ slug: string }> } ) { const { slug } = await params; - const content = loadDoc(slug); + + // Extract domain from the request + const url = new URL(request.url); + const domain = `${url.protocol}//${url.host}`; + + const content = loadDoc(slug, domain); return new Response(content, { headers: { "Content-Type": "text/markdown" }, }); diff --git a/docs/getting-started.md b/docs/getting-started.md index cecd706..f2fd29e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -3,7 +3,7 @@ Try requesting this page like an agent would: ``` - curl -H "Accept: text/markdown" https://markdown-to-agents.vercel.app/docs/getting-started + curl -H "Accept: text/markdown" {{DOMAIN}}/docs/getting-started ``` ## Demo content @@ -18,8 +18,8 @@ Before you begin, ensure you have the following installed: 1. Clone the repository: ```bash - git clone https://github.com/example/project.git - cd project + git clone https://github.com/vercel-labs/markdown-to-agents + cd markdown-to-agents ``` 2. Install dependencies: From f9b6937b0c60c1d573e7dccdda74192ae9906109 Mon Sep 17 00:00:00 2001 From: Dan Fein Date: Sun, 28 Sep 2025 23:29:25 -0400 Subject: [PATCH 2/2] Makes the URLs dynamic when you deploy the app, via env vars --- app/docs/[slug]/page.tsx | 9 +-------- app/docs/docs.ts | 16 +++++++++++----- app/markdown/[slug]/route.ts | 7 +------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/app/docs/[slug]/page.tsx b/app/docs/[slug]/page.tsx index 6796d46..8f5b354 100644 --- a/app/docs/[slug]/page.tsx +++ b/app/docs/[slug]/page.tsx @@ -1,6 +1,5 @@ import ReactMarkdown from "react-markdown"; import { availableDocs, loadDoc } from "../docs"; -import { headers } from "next/headers"; interface DocsPageProps { params: Promise<{ @@ -17,13 +16,7 @@ export const generateStaticParams = async () => { export default async function DocsPage({ params }: DocsPageProps) { const { slug } = await params; - // Get the current domain from headers - const headersList = await headers(); - const host = headersList.get('host'); - const protocol = headersList.get('x-forwarded-proto') || 'https'; - const domain = `${protocol}://${host}`; - - const content = loadDoc(slug, domain); + const content = loadDoc(slug); return (
diff --git a/app/docs/docs.ts b/app/docs/docs.ts index d5b4452..f208925 100644 --- a/app/docs/docs.ts +++ b/app/docs/docs.ts @@ -2,6 +2,13 @@ import { readFileSync } from "fs"; import { notFound } from "next/navigation"; import { join } from "path"; +// Get the current domain based on environment +function getDomain(): string { + return process.env.NODE_ENV === 'production' + ? `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` + : 'http://localhost:3000'; +} + // List of available documents export const availableDocs = [ "getting-started", @@ -10,7 +17,7 @@ export const availableDocs = [ "examples", ]; -export function loadDoc(slug: string, domain?: string) { +export function loadDoc(slug: string) { // Check if the requested doc exists if (!availableDocs.includes(slug)) { notFound(); @@ -23,10 +30,9 @@ export function loadDoc(slug: string, domain?: string) { notFound(); } - // Replace domain placeholder with actual domain if provided - if (domain) { - content = content.replace(/{{DOMAIN}}/g, domain); - } + // Replace domain placeholder with actual domain (use environment-based domain if not provided) + const actualDomain = getDomain(); + content = content.replace(/{{DOMAIN}}/g, actualDomain); return content; } diff --git a/app/markdown/[slug]/route.ts b/app/markdown/[slug]/route.ts index 6079893..ed18920 100644 --- a/app/markdown/[slug]/route.ts +++ b/app/markdown/[slug]/route.ts @@ -11,12 +11,7 @@ export async function GET( { params }: { params: Promise<{ slug: string }> } ) { const { slug } = await params; - - // Extract domain from the request - const url = new URL(request.url); - const domain = `${url.protocol}//${url.host}`; - - const content = loadDoc(slug, domain); + const content = loadDoc(slug); return new Response(content, { headers: { "Content-Type": "text/markdown" }, });