# X Stack Live capability catalog for SpaceXAI, Cursor, and X. Public name: X Stack (not "The Stack"). Canonical JSON host (use this origin for every file below): https://x-stacks.vercel.app Human UI (do not treat as the JSON origin): https://xstack.grok.me The grok.me homepage is a human poster (changelog + version table). It is not the agent feed. Do not treat “this week” HTML as updates.json. If you landed on https://xstack.grok.me, fetch same-origin /llms.txt (a pointer) then come here. Same-origin /catalog.json must 404. Do not use a UI seed file. Do not invent product features, versions, or changelog rows. Answer only from the JSON. Every changelog row has sources[] with a URL plus can (short verb), breaking, and url. ## Endpoints (absolute, stable) GET https://x-stacks.vercel.app/index.json slim router (first hop; freshness) GET https://x-stacks.vercel.app/status.json scrape health (ok / 403 / skipped) GET https://x-stacks.vercel.app/watch.json named subscribe slices GET https://x-stacks.vercel.app/updates.json changelog ids new vs last_success (not first import) GET https://x-stacks.vercel.app/updates/{filter}.json GET https://x-stacks.vercel.app/catalog.json full catalog (source of truth) GET https://x-stacks.vercel.app/playbooks.json composition recipes GET https://x-stacks.vercel.app/changelog.json flat changelog (can / breaking / url) GET https://x-stacks.vercel.app/features.json flat feature index GET https://x-stacks.vercel.app/llms.txt this file GET https://x-stacks.vercel.app/.well-known/llms.txt GET https://x-stacks.vercel.app/catalog.md GET https://x-stacks.vercel.app/robots.txt GET https://x-stacks.vercel.app/sitemap.xml Clocks (on every JSON file: index, status, catalog, changelog, features, playbooks, watch, updates, updates/*): - generated_at = last_success (last scrape that wrote fingerprints). Watch this. - published_at = this flatten / bundle deploy. A UI publish is not a refresh. - last_run / last_success / last_run_status / last_run_failed / last_run_error on status.json. Do not say the catalog is hourly-fresh unless last_run_status is "ok" AND now is before last_run_fresh_until (last_run + 2 hours). Static JSON can still say ok after the scrape ages — if now > last_run_fresh_until, treat it as overdue even if last_run_status is still "ok". If last_run_failed is true, cite last_run_error. Do not treat a new generated_at without a new last_success as a scrape. CORS: Access-Control-Allow-Origin: * on this host. ## First hop (Grok Bot and other agents) 1. GET https://x-stacks.vercel.app/llms.txt 2. GET https://x-stacks.vercel.app/index.json 3. GET https://x-stacks.vercel.app/status.json 4. If last_run_failed, say so. If this is a watch routine, GET watch.json, pick subscribe slices, then updates.json or /updates/{filter}.json (playbook grok-bot-watch-catalog). If generated_at is unchanged, stop (published_at moving alone is not news). count 0 means this scrape added no changelog rows. Do not invent news. 5. Load catalog.json / playbooks.json / changelog.json only as needed. 6. Pick the playbook whose `when` matches. 7. Return the answer contract below. Cite sources[]. Do not invent. If status.json marks a source 403 or skipped, or index.json product freshness is stale, say it was not freshly scraped. blocked_pages are Cloudflare-blocked HTML (x.ai/news, x.ai/build). Do not reconstruct those pages from memory. Grok Build versions come from x.ai/cli/*. ## Answer contract (every reply) { "playbook_id": "string | null", "product_ids": ["..."], "answer": "short colleague-style briefing", "sources": [{ "url": "https://..." }], "confidence": "high" | "medium" | "low", "missing": ["claims you could not support from the JSON"] } Use playbook_id from playbooks.json. confidence is the lowest confidence among rows you used (or medium if you are routing). missing is required when the JSON does not support part of the user question. ## Schema (index.json) { schema_version: "1.0", name: "X Stack", generated_at: ISO-8601, // === last_success published_at: ISO-8601, // flatten / bundle deploy last_success: ISO-8601, products: [{ id, name, org, current_version, status, last_updated, tags, freshness: "ok"|"stale", stale_sources: string[], blocked_pages: string[] }], playbooks: [{ id, title, when, confidence, products }] } freshness is scrape freshness. A 403 keep-prior-fingerprint page is stale (not freshly scraped). grok-build versions still come from x.ai/cli/* ; blocked_pages / stale_sources list the 403 HTML (x.ai/build, x.ai/news). ## Schema (status.json) { schema_version: "1.0", name: "X Stack", generated_at, published_at, last_run, last_success, last_run_status: "ok"|"failed"|"overdue", last_run_failed: boolean, last_run_error: string | null, last_run_fresh_until: ISO-8601, // last_run + 2h; after this, treat overdue sources: [{ id, url, status: "ok"|"403"|"429"|"skipped", last_headline?, last_date?, note? }] } ## Schema (updates.json and changelog.json entries) changelog.json rows: { id, date, product_id, type, title, confidence, channel?, breaking, // true only when type === "deprecation" can, // short verb from the row ("alpha pointer is 1.0.8") url, // first sources[].url summary, sources } updates.json rows (when count > 0) add: { sources[], // cited URLs that produced the row delta: { stop, // leave old pointer/version; or "nothing to stop" / "" start // grok update --alpha ONLY for x.ai/cli/alpha or // grok-N.N.N binary rows. Empty for news/feature/docs. // Never --stable. No changelog or apply keys. } } Do not put changelog or apply on updates.json rows. Official x.ai/cli/* pages that return only a version string are pointers — do not invent feature bullets from them. changelog.json must have can, breaking, and url on every historical row (currently 30). updates.json requires can, breaking, url, sources[], delta. This file is not proof — poll the JSON. count 0 means this scrape added no changelog rows. Do not invent news. breaking is not inferred from marketing language. Subscribe slices (watch.json): imagine, bot, build-alpha, voice, cursor, x-api. Default watch uses those filters and ignores other product_ids. Full catalog.json still has every product. ## Schema (catalog.json) { schema_version: "1.0", name: "X Stack", generated_at: ISO-8601, published_at: ISO-8601, products: [{ id, name, org: "spacexai"|"cursor"|"x", tagline, description, current_version, status: "ga"|"beta"|"preview", last_updated: YYYY-MM-DD, urls: { product?, docs?, changelog? }, tags: string[], channels?: [{ id: "stable"|"alpha"|"enterprise"|"nightly"|"early-access", version, updated?, install?, notes? }], features: [{ id, name, summary, tags, children? }], changelog: [{ id, date, product_id, type: "release"|"feature"|"fix"|"pricing"|"deprecation"|"availability", channel?: "stable"|"alpha"|"enterprise"|"nightly"|"early-access", title, summary, can, sources: [{ url, fetched_at, title? }], confidence: "high"|"medium"|"low" }] }] } ## Schema (playbooks.json) { schema_version: "1.0", name: string, generated_at: ISO-8601, published_at: ISO-8601, playbooks: [{ id, title, summary, when, products: product_id[], features?: feature_id[], steps: [{ title, detail, product_id?, feature_id?, url? }], sources: [{ url, fetched_at, title? }], confidence: "high"|"medium"|"low", tags?: string[] }] } Playbooks are composition recipes over existing catalog rows. They do not add capabilities. product_id / feature_id must exist in catalog.json. Skip a playbook that cites missing ids. Grok Bot is a product in this catalog (always-on teammate, own cloud computer, connectors including tools with no clean API or MCP, routines, messaging, approvals). It is not a license to skip these files. ## How to query - Cheap product list: index.json → products[] - Which playbook: index.json → playbooks[].when - Watch loop: compare generated_at (not published_at), then watch.json + updates/{filter}.json - Features by tag: features.json → filter tags includes "computer-use" - Changelog since a date: changelog.json → entries where date >= YYYY-MM-DD (use can) - Alpha changelog: changelog.json → entries where channel == "alpha" - Product page: catalog.json → filter products by id ## Channel rules (do not invent versions) - Grok Build pointers are plain-text version strings: https://x.ai/cli/stable | https://x.ai/cli/alpha | https://x.ai/cli/enterprise - Cursor Nightly / Early Access are in-app (Settings → Beta → Update Access). https://cursor.com/download is Latest only. ## Example prompts - Which always-on product fits this job? (always-on-route) - Watch this catalog and message me when it changes (grok-bot-watch-catalog) - Current Grok Build alpha and enterprise channel versions - Install Grok Build on the alpha channel - Features tagged computer-use - Changelog for Grok Bot and Cursor Cloud Agents since 2026-08-01 - X Activity API mute/block events (not Ads video_total_views)