44 documents
System Architecture⏱️5 min read

Architecture — JSGlobtech marketing site

Derived from direct inspection of this repository on 2026-07-30. Factual only; update when the code changes.

Architecture — JSGlobtech marketing site

Derived from direct inspection of this repository on 2026-07-30. Factual only; update when the code changes.

In this section

File Purpose
This file Stack, versions, folder layout, request/data flow, lead domain model
system-overview.md Start here for client demos — product mental model, multi-tenant story, live URLs
geo-stack.md The AI-discovery layer: llms.txt (both paths) and the JSON-LD graph
geo-mcp-gap-analysis.md GEO & MCP requirements vs implemented code — gap analysis

Integration-level detail — the MCP endpoint and lead delivery — lives in ../integrations/.

Product

Marketing site for JSGlobtech (Dubai / UAE): multi-platform development positioning, agentic AI / MCP integrations, and Generative Engine Optimization (GEO).

Repository

Item Value
Remote git@github.com:juned77/jsglobtech.com.git
Default branch main (origin/HEAD → origin/main)
Package jsglobtech 0.1.0, private: true
CI No .github/workflows present at inspection time

Runtime stack (from package.json)

Layer Version / package
Framework next 16.2.12 (App Router)
UI runtime react 19.2.4, react-dom 19.2.4
Language typescript ^5
Styling tailwindcss ^4 + @tailwindcss/postcss
Theming next-themes ^0.4.6
Validation zod ^3.25.76
Agent protocol @modelcontextprotocol/sdk ^1.29.0
Lint eslint ^9, eslint-config-next 16.2.12
Node >=20.9.0 (engines); .nvmrc pins major 20

next.config.ts currently exports an empty config (Next.js defaults).

Note for agents: per AGENTS.md, this Next.js version has breaking changes versus older training data. Consult node_modules/next/dist/docs/ before writing framework code.

Top-level layout

jsglobtech/
├── app/          # App Router: page, layout, globals.css, API routes, icons/OG images
├── components/   # UI components + GeoSchema / JSON-LD
├── lib/          # content.ts, leads.ts, mcp-server.ts
├── public/       # static assets, llms.txt, OpenAPI spec, .well-known/
├── scripts/      # google-apps-script/, kb-sync.sh, git-hooks/, install-git-hooks.sh
├── knowledge/    # this knowledge base
├── AGENTS.md     # agent rules (CLAUDE.md re-exports it)
└── next.config.ts, tsconfig.json, eslint.config.mjs, postcss.config.mjs, .nvmrc

Request / data flow

Browser contact form ──POST──▶ /api/contact
                                 (field validation; optional future email delivery)

Agents / GPT Actions ──POST──▶ /api/leads/submit ──┐
MCP clients (Streamable HTTP) ▶ /api/mcp/{sse|mcp} ─┼──▶ lib/leads.ts submitConsultationLead()
                                                    │              │
                                                    │              ├─ client_id (tenant)
                                                    │              ▼
                                                    │      resolveClientWebhookUrl(client_id)
                                                    │        CLIENT_WEBHOOK_MAP /
                                                    │        CLIENT_WEBHOOK_<ID> /
                                                    │        CRM_WEBHOOK_URL
                                                    │      (Apps Script → Google Sheet)
                                                    │      or server-side log if unset
LLM / SEO crawlers ◀── components/GeoSchema.tsx, public/llms.txt, public/.well-known/llms.txt

Dogfood tenant: JSGlobtech uses client_id jsglobtech (or omitted → default). See ./system-overview.md.

Key modules

Path Role
app/page.tsx Homepage composition
app/layout.tsx Root layout (theme provider, metadata)
app/globals.css Tailwind v4 global styles
app/api/mcp/[transport]/route.ts Remote MCP endpoint (stateless Streamable HTTP)
app/api/leads/submit/route.ts OpenAPI / ChatGPT Actions lead capture (runtime = "nodejs", CORS enabled)
app/api/contact/route.ts On-site consult form endpoint
lib/leads.ts Zod schema, LeadValidationError / LeadWebhookError, CRM webhook submission
lib/mcp-server.ts MCP server definition; registers request_dev_consultation
lib/content.ts Marketing copy and structured content source of truth
components/GeoSchema.tsx Schema.org JSON-LD (ProfessionalService and related)
components/contact-form.tsx Client contact form
components/site-header.tsx / site-footer.tsx Page shell
components/hero.tsx, capability-matrix.tsx, service-pillars.tsx, tech-stack.tsx, geo-readout.tsx Homepage sections
components/theme-provider.tsx, theme-toggle.tsx next-themes wiring
app/docs/openapi.json/route.ts CORS-enabled OpenAPI 3.0 for ChatGPT Actions (/docs/openapi.json)
app/api/openapi.json/route.ts Alias of the same OpenAPI document (/api/openapi.json)
lib/openapi-spec.ts OpenAPI 3.0 document mirroring request_dev_consultation
lib/openapi-route.ts Shared CORS + JSON response helpers for OpenAPI routes
public/llms.txt, public/.well-known/llms.txt GEO facts for LLM crawlers (byte-identical; see geo-stack.md)
scripts/google-apps-script/ Code.gs + SETUP.md for the Sheets lead webhook

Lead domain model (lib/leads.ts)

  • Project types: flutter_mobile_app, web_application, geo_ai_integration.
  • Required fields: client_name (≥2 chars), client_email_or_phone (email or phone pattern), project_type, budget_range_usd (positive number or non-empty string).
  • Optional: client_id (tenant key, defaults to "default"), requirements_notes (≤5000 chars).
  • Result shape: lead_id (jsg- prefix + UUID via node:crypto), client_id, message, project_type, received_at.

Full contract, delivery payload, and known gaps: ../integrations/lead-capture.md.

Not present (verified absent at inspection)

  • No auth provider (no Clerk / Auth0 / NextAuth dependency).
  • No database or ORM (no Prisma / Drizzle / Postgres client).
  • No payment SDK.
  • No analytics SDK in package.json.
  • No Redis or session store — MCP runs stateless by design.
  • No CI workflows.

Unverified

  • Production hosting / deployment target was not confirmed from the local tree; check the deployment dashboard.
  • Host-level analytics (if any) would not appear in package.json.