From aef61ea20746ed018bba3663356f9166dcecb638 Mon Sep 17 00:00:00 2001 From: jinhojang6 Date: Tue, 28 Apr 2026 02:32:15 +0900 Subject: [PATCH] feat: add new page configurations and JSON files for Builders Hub, Circles, and Technology Stack --- content/pages/en/builders-hub.json | 11 ++ content/pages/en/circles.json | 11 ++ .../pages/en/technology-stack-blockchain.json | 60 ++++++++++ content/pages/en/technology-stack.json | 111 ++++++++++++++++++ packages/content/scripts/validate.ts | 61 ++++++++++ 5 files changed, 254 insertions(+) create mode 100644 content/pages/en/builders-hub.json create mode 100644 content/pages/en/circles.json create mode 100644 content/pages/en/technology-stack-blockchain.json create mode 100644 content/pages/en/technology-stack.json diff --git a/content/pages/en/builders-hub.json b/content/pages/en/builders-hub.json new file mode 100644 index 0000000000..73bdcc2786 --- /dev/null +++ b/content/pages/en/builders-hub.json @@ -0,0 +1,11 @@ +{ + "schemaVersion": 1, + "language": "en", + "route": "/builders-hub", + "title": "Builders Hub | Logos", + "description": "Explore RFPs, submit ideas, install the Logos App, and join a growing community of builders shipping privacy-first decentralised applications.", + "heading": "Logos Builders Hub", + "seo": { + "keywords": ["logos", "builders", "rfps", "ideas", "decentralised"] + } +} diff --git a/content/pages/en/circles.json b/content/pages/en/circles.json new file mode 100644 index 0000000000..c7051210ca --- /dev/null +++ b/content/pages/en/circles.json @@ -0,0 +1,11 @@ +{ + "schemaVersion": 1, + "language": "en", + "route": "/circles", + "title": "Circles | Logos", + "description": "Local chapters are at the heart of the Logos movement. Find a Circle near you, join upcoming events, and tackle winnable local issues.", + "heading": "Logos Circles", + "seo": { + "keywords": ["logos", "circles", "community", "events", "civil organising"] + } +} diff --git a/content/pages/en/technology-stack-blockchain.json b/content/pages/en/technology-stack-blockchain.json new file mode 100644 index 0000000000..6f1842af95 --- /dev/null +++ b/content/pages/en/technology-stack-blockchain.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "language": "en", + "route": "/technology-stack/blockchain", + "title": "Blockchain | Logos", + "description": "This isn't just another L1 — it's a purpose-built blockchain using Cryptarchia, a private proof-of-stake consensus mechanism where validator identities and stake amounts remain hidden.", + "heading": "Blockchain", + "seo": { + "keywords": ["logos", "blockchain", "cryptarchia", "proof of stake", "privacy", "consensus"] + }, + "sections": [ + { + "componentType": "hero", + "key": "blockchain.hero", + "eyebrow": "Technology stack", + "headline": "Blockchain", + "body": "This isn't just another L1 — it's a purpose-built blockchain using Cryptarchia, a private proof-of-stake consensus mechanism where validator identities and stake amounts remain hidden.", + "ctas": [ + { "label": "Logos app", "href": "https://logos.co/app", "external": true, "variant": "primary" }, + { "label": "Docs", "href": "https://docs.logos.co/blockchain", "external": true, "variant": "secondary" } + ] + }, + { + "componentType": "richText", + "key": "blockchain.privacy", + "body": "Privacy as infrastructure. Logos addresses privacy concerns through a combination of private leadership elections and anonymous broadcasting, creating a system where proposers can participate in consensus without revealing their identity or stake." + }, + { + "componentType": "cardGrid", + "key": "blockchain.cryptarchia", + "heading": "Cryptarchia", + "subheading": "A private proof-of-stake consensus mechanism where validator identities and stake amounts remain hidden.", + "cards": [ + { + "title": "The Blend Network", + "description": "Providing network-level anonymity for block propagation." + }, + { + "title": "Logos Execution Zone (LEZ)", + "description": "Enabling programmable state — both public and private — where developers can deploy programs, run AMMs, transfer tokens, and build financial primitives with built-in privacy." + } + ] + }, + { + "componentType": "ctaPanel", + "key": "blockchain.builderCta", + "title": "Logos Builder Hub", + "description": "Everything you need to start building privacy-first decentralised applications. Explore RFPs, find ideas, and connect with other builders.", + "cta": { "label": "Build", "href": "/builders-hub" } + }, + { + "componentType": "relatedArticles", + "key": "blockchain.relatedArticles", + "eyebrow": "Logos in the News", + "title": "Related Articles", + "cta": { "label": "Explore all articles", "href": "/press" }, + "visibleCount": 4 + } + ] +} diff --git a/content/pages/en/technology-stack.json b/content/pages/en/technology-stack.json new file mode 100644 index 0000000000..9c91159116 --- /dev/null +++ b/content/pages/en/technology-stack.json @@ -0,0 +1,111 @@ +{ + "schemaVersion": 1, + "language": "en", + "route": "/technology-stack", + "title": "Technology Stack | Logos", + "description": "Modular by design. Storage, Messaging, Blockchain, and User Modules form the foundation for privacy-first decentralised applications.", + "heading": "The Logos Technology Stack", + "seo": { + "keywords": ["logos", "technology stack", "storage", "messaging", "blockchain", "modules"] + }, + "sections": [ + { + "componentType": "hero", + "key": "techStack.hero", + "eyebrow": "Open by design, open in spirit.", + "headline": "The Logos Technology Stack", + "body": "The Logos Technology Stack is a unified ecosystem of distinct modules. The entire stack is modular so developers can assemble their own Logos-based platform with a different selection of modules." + }, + { + "componentType": "techStackOverview", + "key": "techStack.overview", + "pillars": [ + { + "id": "storage", + "title": "Storage", + "body": "Codex-based content addressing with reproducible attestation and graceful client-side fallback.", + "href": "/technology-stack/storage" + }, + { + "id": "messaging", + "title": "Messaging", + "body": "Waku peer-to-peer messaging that survives hostile networks and adversarial intermediaries.", + "href": "/technology-stack/messaging" + }, + { + "id": "blockchain", + "title": "Blockchain", + "body": "Cryptarchia: a private proof-of-stake consensus where validator identities and stake amounts remain hidden.", + "href": "/technology-stack/blockchain" + }, + { + "id": "userModules", + "title": "User Modules", + "body": "Wallet, chat, files, and explorer modules composing into the Logos App.", + "href": "/technology-stack#logos-app" + } + ], + "networkingTitle": "The Networking Stack: Discovery, Peering, and Mix-Net", + "foundationTitle": "The Foundation: Logos Kernel" + }, + { + "componentType": "giantSwitch", + "key": "techStack.appInstall", + "accent": "grey", + "imagePosition": "right", + "title": "Install the Logos app.", + "description": "The Logos App is a complete distribution that bundles the kernel, the default modules, and UI packages into a usable product. It provides the primary user interface, hosting Simple Apps that let users interact with the various modules.", + "image": { + "src": "/cms/pages/technology-stack/app-install.webp", + "alt": "", + "width": 566, + "height": 566 + }, + "tags": [ + { "label": "Wallet", "icon": "wallet" }, + { "label": "Chat Interface", "icon": "chat" }, + { "label": "Filesharing Tool", "icon": "files" }, + { "label": "Explorer", "icon": "explorer" } + ], + "primaryCta": { + "label": "Install", + "href": "https://logos.co/app", + "external": true, + "variant": "primary" + }, + "secondaryCta": { + "label": "Learn more", + "href": "/technology-stack#logos-app", + "variant": "secondary" + } + }, + { + "componentType": "cardGrid", + "key": "techStack.useCases", + "heading": "Use Cases", + "subheading": "We know today's systems are captured and brittle. We build alternatives to give people a choice. Build on Logos and serve your community.", + "cards": [ + { + "title": "Attack-Resistant Public Registries", + "description": "Privacy-preserving blockchain for sovereign order and decentralised governance.", + "cta": { "label": "Learn more", "href": "/technology-stack/blockchain" } + }, + { + "title": "Decentralised Archives", + "description": "Permanent, censorship-proof preservation of knowledge, culture, and history.", + "cta": { "label": "Learn more", "href": "/technology-stack/storage" } + }, + { + "title": "Private Financial Networks", + "description": "Money that moves securely and freely, without surveillance or control.", + "cta": { "label": "Learn more", "href": "/technology-stack/blockchain" } + }, + { + "title": "Community Governance", + "description": "Self-organising groups establish and enforce their own rules, with members engaging voluntarily.", + "cta": { "label": "Learn more", "href": "/circles" } + } + ] + } + ] +} diff --git a/packages/content/scripts/validate.ts b/packages/content/scripts/validate.ts index 94a94ff88f..5032a45129 100644 --- a/packages/content/scripts/validate.ts +++ b/packages/content/scripts/validate.ts @@ -398,6 +398,14 @@ const buildCirclesChecks = (locale: Language): Check[] => [ }, ] +const PAGE_ROUTES: ReadonlyArray<{ route: string; minSections: number }> = [ + { route: '/', minSections: 1 }, + { route: '/builders-hub', minSections: 0 }, + { route: '/circles', minSections: 0 }, + { route: '/technology-stack', minSections: 1 }, + { route: '/technology-stack/blockchain', minSections: 1 }, +] + const buildPagesChecks = (locale: Language): Check[] => [ { name: `pages.home (${locale}) → loads + every section componentType valid`, @@ -456,6 +464,59 @@ const buildPagesChecks = (locale: Language): Check[] => [ return page }, }, + { + name: `pages — every seed route loads + route-field round-trips + minSections`, + run: async () => { + for (const { route, minSections } of PAGE_ROUTES) { + const page = await getPageCopy(route, locale) + if (page.route !== route) { + throw new Error(`route mismatch on "${route}": file declares "${page.route}"`) + } + if (page.sections.length < minSections) { + throw new Error( + `page "${route}" has ${page.sections.length} sections, expected at least ${minSections}`, + ) + } + if (!page.title || !page.description) { + throw new Error(`page "${route}" missing title or description`) + } + } + return PAGE_ROUTES + }, + }, + { + name: `pages.technology-stack (${locale}) → giantSwitch present + tags icons enum-validated`, + run: async () => { + const page = await getPageCopy('/technology-stack', locale) + const gs = page.sections.find((s) => s.componentType === 'giantSwitch') + if (!gs || gs.componentType !== 'giantSwitch') { + throw new Error('technology-stack.json missing a giantSwitch section') + } + if (!gs.tags || gs.tags.length === 0) { + throw new Error('giantSwitch tags missing — Logos App banner expects at least one tag') + } + const allowed = new Set(['wallet', 'chat', 'files', 'explorer', 'lambda']) + for (const tag of gs.tags) { + if (tag.icon !== undefined && !allowed.has(tag.icon)) { + throw new Error(`giantSwitch tag "${tag.label}" has unknown icon "${tag.icon}"`) + } + } + return gs + }, + }, + { + name: `pages.technology-stack/blockchain (${locale}) → relatedArticles section + ctaPanel present`, + run: async () => { + const page = await getPageCopy('/technology-stack/blockchain', locale) + const types = new Set(page.sections.map((s) => s.componentType)) + for (const required of ['hero', 'richText', 'cardGrid', 'ctaPanel', 'relatedArticles']) { + if (!types.has(required as never)) { + throw new Error(`blockchain page missing "${required}" section`) + } + } + return page + }, + }, ] const main = async (): Promise => {