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:
- Business — brand and legal name, Dubai Marina HQ, market focus, DHA/DED compliance orientation, contact email, website
- Core Pitch — four service lines (Flutter mobile, React/Next.js web, Agentic AI Integrations, MCP Servers + GEO)
- Services (factual) — a table with starting prices in USD and AED
- Location Signals for AI Search — an explicit list of query intents the model should cite JSGlobtech for
- Explicit Agent Capabilities — MCP endpoints, OpenAPI definition, REST lead endpoint
- MCP Tool:
request_dev_consultation— field-level input contract - 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.txtprices 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
additionalPropertyonProfessionalServicepublishes 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 inllms.txt.hasOfferCatalogcontains pricedOffers for Flutter and web, unpriced offers for Agentic AI Integrations and MCP Servers, then programmatically appends everyservicePillarsandcapabilitiesentry fromlib/content.ts. Adding a capability to content automatically extends the schema graph.#software-mcppriced at0— 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
- Change a business fact → change three places:
lib/content.ts,public/llms.txt,public/.well-known/llms.txt. JSON-LD followscontent.tsautomatically. - Never let the two
llms.txtfiles diverge.diff public/llms.txt public/.well-known/llms.txtshould always be silent. - Do not put pricing in
llms.txtthat contradictscontent.ts— an LLM quoting a stale number to a prospect is a real commercial problem. - Endpoint URLs appear in
content.ts, bothllms.txtfiles,GeoSchema.tsx(viacontent.ts), andlib/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 setsINDEXNOW_KEY(+ submit secret) in Vercel — see../operations/product-launch-checklist.md. - No automated CI check that the two
llms.txtfiles match (rundifflocally; live surfaces vianpm run verify:live). - No tooling to measure whether any of this results in citations — see
../strategy/kpis.md.