Skip to Content
EngineeringFrontend deployment

Front-end deployment (Vercel) + SEO

How the two front-ends deploy and the SEO/crawler setup. Backend deploy is in ../server/DEPLOYMENT.md.

Two Vercel projects, two domains

Marketing and the product app are separate Next.js apps so they deploy and evolve independently. Each is its own Vercel project pointed at its own directory and domain.

SurfaceDirDomainVercel root directory
Marketingweb/obsrv.in (+ www)web
Product platformapp/app.obsrv.inapp
Backend APIserver/api.obsrv.inn/a (AWS)

Env vars

  • web (marketing): NEXT_PUBLIC_ANALYZER_API=https://api.obsrv.in (waitlist POST), NEXT_PUBLIC_APP_URL=https://app.obsrv.in (cross-links to the app).
  • app (console): NEXT_PUBLIC_ANALYZER_API=https://api.obsrv.in.

One-time setup for the split (Salil)

  1. In the existing Vercel project (obsrv.in), confirm Root Directory = web; add NEXT_PUBLIC_APP_URL.
  2. Create a second Vercel project from the same repo, Root Directory = app, add domain app.obsrv.in, set NEXT_PUBLIC_ANALYZER_API.
  3. Cloudflare: add a CNAME app → the new Vercel project (DNS-only is fine; Vercel handles TLS).
  4. obsrv.in/analyze and obsrv.in/report already 308-redirect to the app (next.config.mjs).

SEO / crawlers

  • Stale Google results are cache lag, not a site bug. The live site serves the correct title/description and no legacy content. To clear old SERP entries: register obsrv.in (and later app.obsrv.in) in Google Search Console, submit the sitemap, and use URL Inspection → “Request Indexing” on the homepage. Old results clear in days–weeks after recrawl.
  • Cloudflare managed robots.txt blocks AI crawlers. The zone prepends a managed block that Disallows GPTBot, ClaudeBot, Google-Extended, CCBot, etc. — which defeats the AEO work (llms.txt, structured data). If you want answer engines to cite Obsrv, disable Cloudflare’s AI-bot blocking / managed-robots feature for the zone (Cloudflare dashboard → the AI Audit / robots setting).
  • Each app ships its own robots.ts + sitemap.ts. Marketing indexes its pages; the app exposes only /report to crawlers (the console root needs a session).