feat: CAPTCHA (Cloudflare Turnstile) for anonymous deploys
Anonymous deploy endpoint (POST /api/agent/deploy) now verifies a Turnstile token when TURNSTILE_SECRET_KEY is set
Frontend renders an invisible Turnstile widget in the Agentize button section; button is disabled until token is issued
Env-var guarded: both keys optional — CAPTCHA is skipped entirely in dev when vars are unset
New env vars: NEXT_PUBLIC_TURNSTILE_SITE_KEY (public), TURNSTILE_SECRET_KEY (server-only)
feat: /about page
Static About page at /about covering what w2agent builds, the problem it solves, capabilities (audit/deploy/discover/integrate), open standards (MCP, A2A), and contact info
feat: /privacy page
Static Privacy Policy page at /privacy covering data collection, sub-processors (Clerk, Vercel, Neon, Sentry, Spider.cloud), retention, cookies, and user rights
feat: /contact page
Static Contact page at /contact with general email (hello@w2agent.dev), GitHub issues link for bug reports, and privacy contact (privacy@w2agent.dev)
fix: custom 404 page
app/[locale]/not-found.tsx: renders within locale layout (SiteHeader + SiteFooter), shows "Page not found" with "Go home" link
app/[locale]/[...rest]/page.tsx: catch-all route that calls notFound() so all unmatched locale paths use the branded 404
feat: /terms page
Static Terms of Service page at /terms covering acceptance, acceptable use, API usage limits, data ownership, service availability, limitation of liability, and changes to terms
perf: audit scoring uses spider.cloud JS-rendered HTML (no double-crawl)
Audit scoring now uses JS-rendered HTML already fetched during deploy when CRAWL_BACKEND=spider-cloud — no second crawl
Pre-fetched pages (rawPages: FetchedPage[]) and site metadata passed from deploy after() → runSiteAudit() → runAudit(), eliminating redundant HTTP requests
Graceful fallback: when prefetched is absent (submit, register, re-audit callers), runAudit() falls through to normal crawlSite() path unchanged
feat: per-page hreflang tags
Middleware now forwards x-pathname request header on every response
Root layout generateMetadata reads x-pathname to compute page-specific canonical and hreflang URLs
All pages now emit <link rel="alternate" hreflang="en|zh|x-default"> pointing to the correct path (not hardcoded homepage)
Added canonical tag; x-default points to English locale
2026-04-02
Breadcrumb navigation + BreadcrumbList schema: Added visible breadcrumbs to all 30 inner pages. Pages with 3+ hierarchy levels (18 pages: learn articles, platform guides, directory/categories, sites/[slug], audit/[id], leaderboard/[domain]) also include BreadcrumbList JSON-LD for Google rich snippets.
Added resolveAgent(slug) helper in lib/agent-adapter.ts: DB → YAML → null cascade used by all agent route handlers
GET /api/agent/[slug]/agent-card and GET /api/agent/[slug]/server-json now resolve adapter agents directly from YAML (no DB row required)
Fixed Vercel function bundling: outputFileTracingIncludes in next.config.ts ensures data/adapters/*.yaml files are included in function output
New scripts/sync-adapters.ts: scans data/adapters/*.yaml, validates, upserts into DB. --dry-run flag validates without DB writes. Package scripts: sync:adapters, sync:adapters:prod, sync:adapters:dry
Removed hardcoded adapter entries from data/seed/third-party.ts; sync script replaces them
Added data/adapters/README.md — contributor guide with YAML schema, field reference, and submission instructions
fix: Verified production directory shows agents (no code change needed)
Diagnosed "0 verified agents" report from SEO audit: production /directory renders 207 agent links and /api/v0/servers returns 1,171 total agents
Root cause of original report: ISR cache (revalidate = 300) had cached a stale empty result during a transient DB outage — subsequent revalidation resolved it automatically
No code change required; docs/TODO.md item marked done
SEO: internal link anchor text + cross-linking
Updated nav/footer/homepage anchor text to keyword-rich phrases (AI Readiness Audit, AI Agent Directory, AI Adoption Trends, AI Readiness Leaderboard, etc.)
Added Related Articles sections to all 8 learn article pages for topic clustering