mirror of
https://github.com/waynesutton/markdown-site.git
synced 2026-01-12 04:09:14 +00:00
146 lines
3.2 KiB
TOML
146 lines
3.2 KiB
TOML
[build]
|
|
command = "npm ci --include=dev && npx convex deploy --cmd 'npm run build'"
|
|
publish = "dist"
|
|
|
|
[build.environment]
|
|
NODE_VERSION = "20"
|
|
|
|
# Raw markdown passthrough - explicit rule prevents SPA fallback from intercepting
|
|
[[redirects]]
|
|
from = "/raw/*"
|
|
to = "/raw/:splat"
|
|
status = 200
|
|
force = true
|
|
|
|
# Static files passthrough
|
|
[[redirects]]
|
|
from = "/assets/*"
|
|
to = "/assets/:splat"
|
|
status = 200
|
|
force = true
|
|
|
|
# SPA fallback for client-side routing (must be last)
|
|
[[redirects]]
|
|
from = "/*"
|
|
to = "/index.html"
|
|
status = 200
|
|
|
|
# Edge functions for dynamic Convex HTTP proxying
|
|
# RSS feeds
|
|
[[edge_functions]]
|
|
path = "/rss.xml"
|
|
function = "rss"
|
|
|
|
[[edge_functions]]
|
|
path = "/rss-full.xml"
|
|
function = "rss"
|
|
|
|
# Sitemap
|
|
[[edge_functions]]
|
|
path = "/sitemap.xml"
|
|
function = "sitemap"
|
|
|
|
# API endpoints
|
|
[[edge_functions]]
|
|
path = "/api/posts"
|
|
function = "api"
|
|
|
|
[[edge_functions]]
|
|
path = "/api/post"
|
|
function = "api"
|
|
|
|
[[edge_functions]]
|
|
path = "/api/export"
|
|
function = "api"
|
|
|
|
# Geo location API for visitor map
|
|
[[edge_functions]]
|
|
path = "/api/geo"
|
|
function = "geo"
|
|
|
|
# MCP Server endpoint for AI tool integration
|
|
# Rate limiting configured in edge function config (50 req/min per IP)
|
|
[[edge_functions]]
|
|
path = "/mcp"
|
|
function = "mcp"
|
|
|
|
# Open Graph bot detection for social preview cards only
|
|
# Excludes raw markdown, static assets, and AI-consumable files
|
|
[[edge_functions]]
|
|
path = "/*"
|
|
function = "botMeta"
|
|
excludedPath = [
|
|
"/raw/*",
|
|
"/assets/*",
|
|
"/api/*",
|
|
"/.netlify/*",
|
|
"/favicon.ico",
|
|
"/favicon.svg",
|
|
"/robots.txt",
|
|
"/sitemap.xml",
|
|
"/rss.xml",
|
|
"/rss-full.xml",
|
|
"/llms.txt",
|
|
"/openapi.yaml"
|
|
]
|
|
|
|
# Security and SEO headers (global, excludes /raw/*)
|
|
[[headers]]
|
|
for = "/*"
|
|
[headers.values]
|
|
X-Frame-Options = "DENY"
|
|
X-Content-Type-Options = "nosniff"
|
|
X-XSS-Protection = "1; mode=block"
|
|
Referrer-Policy = "strict-origin-when-cross-origin"
|
|
X-Robots-Tag = "index, follow"
|
|
# Link header removed from global scope to avoid applying to /raw/*
|
|
|
|
# Dashboard - prevent indexing of admin pages
|
|
[[headers]]
|
|
for = "/dashboard/*"
|
|
[headers.values]
|
|
X-Robots-Tag = "noindex, nofollow"
|
|
|
|
# Write page - prevent indexing of admin pages
|
|
[[headers]]
|
|
for = "/write"
|
|
[headers.values]
|
|
X-Robots-Tag = "noindex, nofollow"
|
|
|
|
# Newsletter admin - prevent indexing of admin pages
|
|
[[headers]]
|
|
for = "/newsletter-admin"
|
|
[headers.values]
|
|
X-Robots-Tag = "noindex, nofollow"
|
|
|
|
# API endpoints - prevent indexing
|
|
[[headers]]
|
|
for = "/api/*"
|
|
[headers.values]
|
|
X-Robots-Tag = "noindex"
|
|
|
|
# Link header for SPA entry point only
|
|
[[headers]]
|
|
for = "/index.html"
|
|
[headers.values]
|
|
Link = "</llms.txt>; rel=\"author\""
|
|
|
|
# Raw markdown files - AI friendly headers
|
|
# No Link header, no noindex - optimized for AI crawlers
|
|
[[headers]]
|
|
for = "/raw/*"
|
|
[headers.values]
|
|
Content-Type = "text/plain; charset=utf-8"
|
|
Access-Control-Allow-Origin = "*"
|
|
Cache-Control = "public, max-age=3600"
|
|
# Removed X-Robots-Tag = "noindex" - AI crawlers need to index raw content
|
|
|
|
[context.production.environment]
|
|
NODE_ENV = "production"
|
|
|
|
[context.deploy-preview.environment]
|
|
NODE_ENV = "development"
|
|
|
|
[context.branch-deploy.environment]
|
|
NODE_ENV = "development"
|