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. Consultnode_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 vianode: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.