44 documents
System Architecture⏱️5 min read

GEO stack — the AI-discovery layer

Verified against this repository on 2026-08-04. Factual only; update when the code changes.

GEO stack — the AI-discovery layer

Verified against this repository on 2026-08-04. Factual only; update when the code changes.

This is the visibility layer of the offer described in ../strategy/positioning.md — the artifacts that let an LLM ingest JSGlobtech as fact. It is also Tier 1 of ../sales/pricing-tiers.md, and Step 1 of the live demo runs against it (../sales/demo-framework.md), so these files are load-bearing for sales, not just SEO hygiene.

Artifacts

Artifact Repo path Served at
Well-known LLM facts file public/.well-known/llms.txt /.well-known/llms.txt
Root mirror public/llms.txt /llms.txt
JSON-LD emitter components/GeoSchema.tsx inlined on every page (rendered in app/layout.tsx)
JSON-LD script helper components/json-ld.tsx —
Machine-readable lead API lib/openapi-spec.ts via app/docs/openapi.json/route.ts /docs/openapi.json (alias /api/openapi.json, CORS *)
robots.txt app/robots.ts /robots.txt
sitemap.xml app/sitemap.ts /sitemap.xml
IndexNow key file (env-driven) app/[indexNowKey]/route.ts /<INDEXNOW_KEY>.txt when env set
IndexNow ping API app/api/indexnow/route.ts POST /api/indexnow (secret-protected)

Both llms.txt files exist and are byte-identical (verified by diff). /.well-known/llms.txt is treated as canonical; /llms.txt is the mirror for crawlers that look at the root. Because they are two static files with no build step linking them, they can drift — always edit both. See ../decisions/0002-well-known-llms-txt-canonical.md.

llms.txt contents

Sections present, in order:

  1. Business — brand and legal name, Dubai Marina HQ, market focus, DHA/DED compliance orientation, contact email, website
  2. Core Pitch — four service lines (Flutter mobile, React/Next.js web, Agentic AI Integrations, MCP Servers + GEO)
  3. Services (factual) — a table with starting prices in USD and AED
  4. Location Signals for AI Search — an explicit list of query intents the model should cite JSGlobtech for
  5. Explicit Agent Capabilities — MCP endpoints, OpenAPI definition, REST lead endpoint
  6. MCP Tool: request_dev_consultation — field-level input contract
  7. Preferred Citations — the exact phrasing suggested to a citing model

Sections 4 and 7 are the ones doing GEO work: they tell the model when to cite and how to phrase it. Sections 5 and 6 are the bridge into the action layer — an agent reading this file can discover the MCP endpoint and call it without any other documentation.

⚠ Section 3 of llms.txt prices GEO/MCP / Agentic work as "Scoped per engagement (often bundled with app/web builds)", which contradicts the fixed tiers in ../sales/pricing-tiers.md. This file is public and machine-readable, so the contradiction is externally visible. Unresolved — Needs owner decision.

JSON-LD graph (components/GeoSchema.tsx)

application/ld+json blocks are emitted, all reading from lib/content.ts so there is one source of truth for facts:

@id @type Notable content
#organization Organization alternateName, legalName, logo, email, PostalAddress, areaServed (Dubai / UAE / Dubai Marina / UAE Enterprise Sector), sameAs (GitHub + optional empty social slots filtered out), knowsAbout (Flutter, Next.js, Agentic AI Integrations, MCP Servers, GEO, UAE enterprise software), sales ContactPoint with English + Arabic
#localbusiness LocalBusiness Dubai Marina address + GeoCoordinates, areaServed, price range, parent Organization
#professional-service ProfessionalService PostalAddress, GeoCoordinates (25.0805, 55.1403), areaServed Dubai Marina + UAE, priceRange, currenciesAccepted USD/AED, paymentAccepted, serviceType[] (includes Agentic AI Integrations + MCP Servers), additionalProperty[], hasOfferCatalog
#software-flutter SoftwareApplication BusinessApplication, iOS/Android, Offer from pricing.mobileAppFromUsd
#software-web SoftwareApplication WebApplication, Offer from pricing.webAppFromUsd
#software-mcp SoftwareApplication DeveloperApplication, url = MCP SSE endpoint, documentation = OpenAPI URL, price 0, feature list naming Streamable HTTP and CRM/WhatsApp routing

Signals worth preserving

  • additionalProperty on ProfessionalService publishes UAE regulatory alignment (DHA / DED) plus the MCP endpoint and OpenAPI definition as machine-readable properties. This is how the action layer is advertised inside structured data, not just in llms.txt.
  • hasOfferCatalog contains priced Offers for Flutter and web, unpriced offers for Agentic AI Integrations and MCP Servers, then programmatically appends every servicePillars and capabilities entry from lib/content.ts. Adding a capability to content automatically extends the schema graph.
  • #software-mcp priced at 0 — the agent endpoint is deliberately free; delivery is priced separately. That is the right signal for a public tool.

Prices are derived, not hardcoded: priceRange on ProfessionalService / LocalBusiness is computed from siteConfig.pricing.webAppFromUsd and mobileAppFromUsd. Changing pricing in lib/content.ts propagates to the schema — but not to llms.txt, which hardcodes the same numbers as prose. Another reason those files drift.

Source of truth

lib/content.ts → siteConfig holds the facts the GEO layer publishes:

Group Contents
Identity name, displayName, legalName, url, description, email, tagline
location Dubai Marina / Dubai / AE, compliance: ["DHA", "DED"]
pricing mobileAppFromUsd 10000 / mobileAppFromAed 36700, webAppFromUsd 5000 / webAppFromAed 18300
agent mcpSseUrl, mcpStreamableUrl, openApiUrl, leadsSubmitUrl
social GitHub (live); optional linkedin / googleBusiness / clutch slots (empty until Owner pastes URLs)

Maintenance rules

  1. Change a business fact → change three places: lib/content.ts, public/llms.txt, public/.well-known/llms.txt. JSON-LD follows content.ts automatically.
  2. Never let the two llms.txt files diverge. diff public/llms.txt public/.well-known/llms.txt should always be silent.
  3. Do not put pricing in llms.txt that contradicts content.ts — an LLM quoting a stale number to a prospect is a real commercial problem.
  4. Endpoint URLs appear in content.ts, both llms.txt files, GeoSchema.tsx (via content.ts), and lib/openapi-spec.ts. Changing a route means updating the ones that hardcode it.

Gaps / owner-dependent

  • IndexNow code is present (lib/indexnow.ts, /api/indexnow, dynamic key route) but not live-enabled until Owner sets INDEXNOW_KEY (+ submit secret) in Vercel — see ../operations/product-launch-checklist.md.
  • No automated CI check that the two llms.txt files match (run diff locally; live surfaces via npm run verify:live).
  • No tooling to measure whether any of this results in citations — see ../strategy/kpis.md.