AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Marketing site for deCDN — the delivery layer anyone can serve.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A decentralized delivery layer for bytes at scale. Anyone can serve bytes; clients pay per megabyte in USDC.
This is the source for the deCDN marketing site and blog.
Next.js 16 (App Router) · React 19 · Tailwind CSS v4 · TypeScript · pnpm. Static export, deployed to Cloudflare Pages.檢視完整 README ↗A decentralized delivery layer for bytes at scale. Anyone can serve bytes; clients pay per megabyte in USDC.
This is the source for the deCDN marketing site and blog.
Next.js 16 (App Router) · React 19 · Tailwind CSS v4 · TypeScript · pnpm · Node ≥24 (.nvmrc). Static export, deployed to Cloudflare Pages.
pnpm install # required (not npm/yarn) — husky hooks shell out to `pnpm exec`
pnpm dev # dev server on :3000
pnpm build # static export → ./out, then the check:out + check:og-image guards
pnpm test # vitest run
pnpm typecheck # tsc --noEmit
pnpm lint # eslint (flat config)
pnpm format # prettier --write .
pnpm format:check # prettier --check . (CI)
app/ — App Router entry (layout.tsx, page.tsx, globals.css) plus the blog routes (blog/, blog/[slug]/), the legal/[doc] route, the sitemap/robots handlers, the llms.txt / llms-full.txt handlers, and file-convention metadata assets.components/layout/ — the site chrome mounted in app/layout.tsx on every route (Chrome → MobileMenu, Footer, ScrollReveal) plus chrome-active, the nav's section and tone tables.components/home/ — the homepage sections composed by app/page.tsx, one folder per section (hero/, compare/, method/, faq/, try/, contact/) with its sub-parts, plus brand.tsx, which they share.components/blog/, components/legal/ — components used only by those routes (PostRow, LegalDoc).components/ui/ — generic primitives with no site content (Frame, SectionHeader, Prose, Figure, PanelFigure, Pill, CodeBlock). A component that takes site data or domain types goes in its feature's folder; a primitive with no site content stays in ui/ even if only one feature uses it today.lib/ — shared helpers (links.ts, copy.ts, stats.ts, blog.ts, faq.ts, legal.ts, jsonld.tsx, schema.ts, …). The site's prose and its displayed values live in lib/copy.ts as plain data — the comparison table maps over it and the llms-full.txt mirror serialises it, so anything inlined in a component drifts from the mirror. Prose that names the product renders through highlightBrand (components/home/brand.tsx).test-utils/ — test-only helpers for walking the element tree a server component returns.scripts/ — postbuild guards run against ./out by pnpm build: check-out.mjs (advertised URLs, dotted routes, panel captions, the prerendered mobile menu toggle) and check-og-image.mjs (social cards).content/blog/ — MDX posts loaded by lib/blog.ts and rendered by app/blog/[slug]/page.tsx.content/legal/ — MDX for the legal pages (privacy, terms, disclaimer), loaded by lib/legal.ts and rendered by app/legal/[doc]/page.tsx.docs/ — Mintlify source for docs.decdn.org. Built and deployed independently of pnpm build; not part of the static export and not imported from the website code.@/* maps to the project root (e.g. @/lib/links, not @/src/...).next.config.ts sets output: "export"; the build emits ./out. No SSR, ISR, middleware, or Image Optimization API. Route handlers (app/robots.txt/route.ts, app/sitemap.xml/route.ts, app/sitemap-pages.xml/route.ts, app/llms.txt/route.ts, app/llms-full.txt/route.ts) must be dynamic = "force-static" and GET-only; the dotted segment is what makes them emit real files rather than <path>/index.html. robots.txt is a hand-written route handler rather than the Next app/robots.ts metadata file, so it can emit the non-standard Content-Signal: directive (per contentsignals.org).trailingSlash: true. Every route emits <path>/index.html. Internal links and hand-built URLs (sitemap entries, JSON-LD @ids) should expect a trailing slash — see SITE_URL and BLOG_URL in lib/links.ts.app/globals.css under @theme inline { … } — there is no tailwind.config.*.commitlint runs in the commit-msg husky hook; non-conforming messages are rejected.metadataBase is live. lib/links.ts site is the real origin and INDEXABLE is true. Anything anchored on this origin — OG and canonical (via metadataBase); JSON-LD and the sitemap/robots emitters (via SITE_URL) — ships to production. Adding a non-blog page means appending an entry to app/sitemap-pages.xml/route.ts; blog posts are auto-derived from content/blog/, while legal pages are driven by the closed LEGAL_SLUGS list in lib/legal.ts (add both the MDX file under content/legal/ and a slug there). Flipping INDEXABLE flips <meta name="robots"> only; robots.txt and the sitemap stay unconditional by design (rationale in lib/links.ts)./llms.txt is a curated index of this origin and /llms-full.txt is every page as one plain-text document; both derive their page entries from listPosts(), , and , are listed in , and are advertised through in and a header in . resolves every advertised same-origin URL against after a build. The protocol documentation has its own pair on , served by Mintlify.This project is tested with BrowserStack. Unit tests run under vitest (pnpm test); cross-browser checks use BrowserStack through its Open Source Sponsorship Program.
Cloudflare Pages serves the out/ directory produced by pnpm build.
See AGENTS.md for the full ruleset (CLAUDE.md is a one-line include of it).
LEGAL_SLUGSlib/faq.tslib/copy.tsapp/sitemap-pages.xml/route.tsalternates.typesapp/layout.tsxLink:public/_headersscripts/check-out.mjsout/docs.decdn.orghttps://data.decdn.org/stats-421614.json (rewritten every five minutes by the decdn/stats indexer). The fetch lives in lib/stats.ts / lib/use-stats.ts; the CSP in public/_headers allowlists the origin under connect-src, so change STATS_ORIGIN and the CSP together.