design(docs): architecture for docs.cl8y.com static host #1
Labels
No labels
agent:implement
agent:research
docs
feature
ready
research
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-docs#1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Write the architecture for
code/cl8y-docs— the first-party static host for https://docs.cl8y.com. This issue is design only. Do not scaffold Vite, Docker, nginx, or page copy here.Parent / source intent: PlasticDigits/cl8y-marketing#3. Repo create is done (marketing#6, closed). Governance stays in
PlasticDigits/cl8y-marketing.Sequence for this empty repo (do not skip):
main.ready/agent:implementto #3 until then.Current codebase
This repository is README-only (
main@ initial commit). There is nopackage.json, Vite config,Dockerfile,nginx.conf,public/robots.txt,public/sitemap.xml, Woodpecker pipeline, prerender, or route modules.docs.cl8y.comis not a shipped first-party static site (TLS is not a valid product cert).This repo (
code/cl8y-docs)README.md— one paragraph: TypeScript static site for docs.cl8y.com (Vite + React + TS → nginx), Coolify-deployable; governance inPlasticDigits/cl8y-marketing.Governance (
PlasticDigits/cl8y-marketing)URLSearchParams, no unverified claims.strategy/technical-architecture.md— TypeScript + React static sites, Vite → nginx, one repo per deployable, publicVITE_*only.strategy/operating-system.md— crawlable layer separate from the transaction SPA (robots.txt/sitemap.xmlwith correct types; prerendered unique titles).strategy/90-day-plan.mdPhase 1 — unique canonicals on indexable routes; do not use the DEX SPA as the content host.strategy/static-content-architecture.mdis not present yet (marketing#3 AC12). That file belongs in the marketing repo, not this one.Sibling product hosts (do not become this app)
code/cl8y-dex-terraclassic(dex.cl8y.com) — transaction SPA.docker/frontend/nginx.confusestry_files $uri $uri/ /index.htmlfor/. Exact-location 404 exists only for/og-image.png.frontend-dapp/public/has norobots.txt/sitemap.xml. That is marketing#2 (DEX repo), not this host. Swap first-party query keys:frontend-dapp/src/utils/swapQueryParams.ts(from,to, optionalexactAmount/exactField; unknown keys dropped on rewrite).code/CL8Y-web(cl8y.com) — Vite + React marketing/blog withvite-plugin-prerender,src/blog/SEO.tsx,src/lib/siteOrigin.ts,VITE_SITE_ORIGIN. Product CTAs:src/content/invariants.ts(https://dex.cl8y.com). Wallet stack (wagmi/viem) and three.js live here — not a template to copy.CL8Y-web#6is cl8y.com deep-links, not this hostname.Duplicates / already implemented
Do not add
docs.cl8y.comroutes toCL8Y-webor the DEX SPA. Do not grow an app folder incl8y-marketing.Why the new implementation is needed
Phase 1 exit needs unique canonicals and honest crawl files. The DEX SPA cannot provide that without pretending every client route is a document.
cl8y.comis homepage + blog, not methodology / markets / contracts / guides.This repo was created empty so implement agents would scaffold immediately ([ops-worker] implement card). Architecture first is required: the nginx vs SPA-fallback choice, prerender vs client-only titles, env contract, and route list are the same class of mistakes marketing#2 is already paying for on dex.cl8y.com. Writing those decisions into this tree lets program review (#2) happen before a Coolify image exists.
v0 copy may be stubs. The platform decisions (stack, crawl rules, headers, CTA builder, env, 404 policy) must be explicit and reviewable.
Constraints and guardrails
Dockerfile, nonginx.conf, no Vite app, nopublic/robots.txtas shipped artifacts except as specified in the architecture doc. Follow-on implement is #3 after #2.code/cl8y-docs. NotPlasticDigits/cl8y-marketing. Not a new tree insideCL8Y-weborcl8y-dex-terraclassic.docker/frontend/Dockerfilecurrently runs nginx as root — do not copy that./robots.txtor/sitemap.xml. Exactlocation =+try_files $uri =404. Missing file → 404, notindex.html. Unknown HTML paths prefer 404, not a wrong home canonical.text/plain; sitemapapplication/xml(setdefault_typeon that location; do not rely on nginx.xml→text/xmlalone).VITE_SITE_ORIGIN=https://docs.cl8y.com,VITE_DEX_ORIGIN=https://dex.cl8y.com, optionalVITE_INDEXER_ORIGIN=https://indexer.dex.cl8y.com(HTTPS). No WalletConnect ids, LCD keys, forge tokens. Build must fail if required origins are missing or nothttps://.index.htmltitle/canonical for every path (DEX OG-5). Prerender or equivalent SSG.https://dex.cl8y.com(optional/?from=&to=first-party ids, never tickers as execute ids). Campaign keys viaURLSearchParamsonly. Never concatenate visitor query,javascript:,data:, protocol-relative, or?url=redirectors. Do not readwindow.locationto build product origins.content/guides/from the marketing repo. Stubs with honest placeholder methodology are OK in #3.docs.cl8y.comfrom the DEX robots file. DEXSitemap:pointer at this host is gated on a live docs sitemap (marketing#2 item 8) — not this issue, not #3 until production curl succeeds.X-Frame-Options: DENYandframe-ancestors 'none'.X-Content-Type-Options: nosniffon crawl files and HTML.https://docs.cl8y.com(no trailing slash on origin). www or other aliases 301 to that origin or are not published.ready/agent:implementto this issue. Labels:research+agent:researchonly.Relevant files
README.mddocs/ARCHITECTURE.mdAGENTS.mdcl8y-marketing/strategy/technical-architecture.mdcl8y-marketing/strategy/operating-system.md,strategy/90-day-plan.mdcl8y-dex-terraclassic/docker/frontend/nginx.conftry_filesmust not apply to robots/sitemapcl8y-dex-terraclassic/docker/frontend/Dockerfilecl8y-dex-terraclassic/frontend-dapp/src/utils/swapQueryParams.tsfrom/toids; unknown keys droppedCL8Y-web/vite.config.ts,src/blog/SEO.tsx,src/lib/siteOrigin.tsCL8Y-web/src/content/invariants.tsCL8Y-web/src/data/tokenDirectory.ts/contractsdocuments themcl8y-pm/.woodpecker.yamlRecommended direction
docs/ARCHITECTURE.mdthat records, as decisions (not code):https://docs.cl8y.com; Coolify static image; one repo.vite-plugin-prerenderor lighter SSG). Every shipped path writes HTML whose<title>andrel=canonicalmatch that path.VITE_SITE_ORIGINbaked into absolute canonicals.public/robots.txt/public/sitemap.xmlrules (allow/; sitemap loc allowlisthttps://docs.cl8y.comonly).node:24-*-slimbuilder →npm ci+ build with publicARG/ENVonly → copydistinto nginx html. HealthcheckGET /without root./,/methodology+ one child,/markets,/contracts,/guides+ one child.dexHref({ from, to, campaign })→URL+URLSearchParams. Default pair may match CL8Y-web LUNC→CL8Y (uluna+ checksummed Terra Classic CL8Y CW20 already in token directory / DEXVITE_CL8Y_TOKEN_ADDRESS). Campaign:utm_source=docs&utm_medium=web&utm_campaign=<page-or-stub-id>.AGENTS.mdpointing atdocs/ARCHITECTURE.mdand the gate: #2 then #3.README.mdhonest (empty app until #3). Do not invent fee/TVL numbers in the architecture examples.strategy/static-content-architecture.mdhere (marketing repo). Do not land DEXrobots.txtSitemap:here.Acceptance criteria
docs/ARCHITECTURE.mdexists on a PR/mainand covers stack, routes, nginx crawl rules, env contract, headers, CTA builder, 404 policy, CI, and non-goals.AGENTS.mdstates this repo is the docs.cl8y.com static host, forbids wallet/DEX SPA copy, and names the #1 → #2 → #3 gate.VITE_*only, no unverified claims.Dockerfile, Vite app, nginx conf,public/robots.txtas shipped site) in the architecture PR. Those are #3.readyoragent:implement.Test plan (functional paths)
docs/ARCHITECTURE.md/, methodology (+child),/markets,/contracts,/guides(+child) namedURLSearchParams; compile-time DEX origin; nowindow.locationproduct originpackage.json/Dockerfile/ nginx / page TSXAGENTS.mdTest plan (attack, hack, and abuse)
try_filesSPA fallback for/including robotsVITE_WC_*content/guides/Sitemap:to docs before live sitemapreadyso CAC scaffolds before #2http://or internal hostnameVerification criteria
docs/ARCHITECTURE.mdwithout reading a Vite tree.git ls-fileson the architecture PR is docs + README (+.gitignoreif needed) only.readyon #3.Out of scope
strategy/static-content-architecture.mdin the marketing repo.First-pass model recommendation
Recommendation: grok-high. New-repo architecture, nginx/crawl security decisions, and cross-repo boundaries (DEX anti-pattern, CL8Y-web prerender without wagmi). Not a three-file local edit.
Gate
Do not start #2 until AC1–AC4 are on a reviewable PR or
main. Do not start #3 until #2 records RECOMMEND: ACCEPT (or FIX items are landed and re-reviewed).cl8y-agent-control: queued
implementjob47a20fe6-63ec-4dd0-8ad4-07ec54625829(not executed; no Hetzner VM).feat(docs): Coolify TS static scaffold for docs.cl8y.comto design(docs): architecture for docs.cl8y.com static hostIssue repair: this was an
agent:implement+readyscaffold card on an empty repo. That skipped architecture and program review.Now:
docs/ARCHITECTURE.md+AGENTS.md). Labelsresearch+agent:research.ready/agent:implementremoved.RECOMMEND: ACCEPT|FIX|BLOCK.featureonly. Do not applyreadyuntil #2 ACCEPT.Duplicates checked: marketing#3 is the parent spec; marketing#6 (repo create) is closed; marketing#2 is DEX crawl files; nothing in this tree is implemented yet. Related features are bundled into #3, not split into per-route tickets.
Architecture for #1 is on reviewable PR #4 (
issue/1-docs-architecture). Design only — no Vite/Docker/nginx/crawl scaffold.Duplicates (unchanged): marketing#3 parent spec; marketing#6 repo create (done); marketing#2 DEX crawl (other repo); this tree was README-only.
Decisions recorded in
docs/ARCHITECTURE.md:https://docs.cl8y.com; Node 24 → Vite/React/TS static files →nginxinc/nginx-unprivileged:1.27-alpineon 8080 (DEX frontend image is root on 80 — not copied)./,/methodology+/methodology/sources,/markets,/contracts,/guides+/guides/open-the-dex. Unknown paths 404 (no SPA/index.htmlfallback).location =+try_files $uri =404; robotstext/plain; sitemapapplication/xmlviadefault_type.dexHref:from=uluna,to=Terra Classic CL8Y CW20terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3. DEX rewrite dropsutm_*(first-touch).VITE_SITE_ORIGIN/VITE_DEX_ORIGINHTTPS; optional indexer origin if set must equalhttps://indexer.dex.cl8y.com. NoVITE_WC_*.strategy/static-content-architecture.md; marketing AC11 DEXSitemap:pointer (gated on live docs sitemap).Gate: #2 reviews this PR/document (
RECOMMEND: ACCEPT|FIX|BLOCK). Do not applyready/agent:implementto #3 until ACCEPT.Evidence: sibling nginx/Dockerfile/swap params in
cl8y-dex-terraclassic; prerender/SEO/origins/token directory inCL8Y-web; Woodpecker+Postgres incl8y-pm/.woodpecker.yaml; unprivileged image listens 8080 (nginxinc/docker-nginx-unprivileged).Merge check for #4 (
issue/1-docs-architecture@8fa5503) vs this issue's AC.Conflicts: none.
mainis still the initial commit; README merges cleanly.Woodpecker:
code/cl8y-docsis enabled on ci.cl8y.com (repo id 19) but has zero pipelines. Forgejo commit status is empty (fj pr statuscannot parse an empty CI variant). This is expected: AC4 /docs/ARCHITECTURE.md§13 and §17 forbid.woodpecker.yamlon the architecture PR. Not a red check. Pipeline lands in #3 after #2 ACCEPT.AC (this issue):
docs/ARCHITECTURE.mdcovers stack (§3), routes (§4), nginx crawl/404 (§6–7), env (§9), headers (§11), CTA (§10), CI (§13), non-goals (§14).AGENTS.mdnames docs.cl8y.com, forbids wallet/DEX SPA copy, and states #1 → #2 → #3 (do not start #3 until ACCEPT).nginxinc/nginx-unprivilegedon 8080, no SPA fallback, unique prerender, publicVITE_*only, no unverified claims.git ls-filesis markdown +.gitignoreonly (nopackage.json/Dockerfile/nginx.conf/ crawl files / Vite / Woodpecker).VITE_WC_*only as forbidden; no secrets; fee/TVL/volume only as bans.research+agent:research(notready/agent:implement).T1–T9 / A1–A12: covered in ARCHITECTURE §§4–18. Explicit reject table for A1–A12 is §18.
Gate: merging this closes architecture AC. #2 stays open for
RECOMMEND: ACCEPT|FIX|BLOCK. Do not start #3 and do not applyready/agent:implementuntil #2 ACCEPT.Correction: the #1 architecture (and merge comment on #4) was wrong to treat
.woodpecker.yamlas forbidden scaffold. Issue #1 AC4 lists Dockerfile/Vite/nginx/robots, not CI. Missing Woodpecker isNO_CI_MISSING_WOODPECKER(CAC #154).Fix: #5 / #6. Gitleaks + nonempty-tree now; Node/Playwright still #3.