join(repoRoot, path))
const jobsHref = 'https://free.technology/jobs'
const onboardingCalendarHref = 'https://cal.com/team/logos-onboarding/intro'
+const logosDocsHref = 'https://github.com/logos-co/logos-docs'
+const docsLabels = new Set(['docs', 'documentation', 'view the docs'])
const routeUsageAllowlist = new Set([
'apps/web/app/[locale]/work-with-us/page.tsx',
'apps/web/app/sitemap.ts',
@@ -40,6 +43,31 @@ const routeUsageAllowlist = new Set([
'apps/web/lib/__tests__/link-policy.test.ts',
])
+const collectDocsLinks = (value: unknown): Array<{ label: string; href: string }> => {
+ if (Array.isArray(value)) {
+ return value.flatMap(collectDocsLinks)
+ }
+
+ if (!value || typeof value !== 'object') return []
+
+ const record = value as Record
+ const docsText =
+ typeof record.label === 'string' && docsLabels.has(record.label.toLowerCase())
+ ? record.label
+ : typeof record.title === 'string' &&
+ docsLabels.has(record.title.toLowerCase())
+ ? record.title
+ : null
+ const ownLink =
+ docsText && typeof record.href === 'string'
+ ? [{ label: docsText, href: record.href }]
+ : []
+
+ return ownLink.concat(
+ Object.values(record).flatMap((child) => collectDocsLinks(child))
+ )
+}
+
const collectTextFiles = (dir: string): string[] => {
return readdirSync(dir).flatMap((entry) => {
const path = join(dir, entry)
@@ -148,6 +176,26 @@ describe('link policy', () => {
)
})
+ it('routes Docs and Documentation links to the Logos docs repository', () => {
+ const contentDocsLinks = [
+ footer,
+ navigation,
+ buildersHubResources,
+ buildersHubSettings,
+ ...readdirSync(join(repoRoot, 'content/pages/en'))
+ .filter((entry) => entry.endsWith('.json'))
+ .map((entry) =>
+ JSON.parse(readFileSync(join(repoRoot, 'content/pages/en', entry), 'utf8'))
+ ),
+ ].flatMap(collectDocsLinks)
+
+ expect(EXTERNAL_URLS.docs).toBe(logosDocsHref)
+ expect(contentDocsLinks.length).toBeGreaterThan(0)
+ expect(contentDocsLinks).toEqual(
+ contentDocsLinks.map((link) => ({ ...link, href: logosDocsHref }))
+ )
+ })
+
it('does not use the retired Work With Us route for public CTAs', () => {
const offenders = scannedRoots.flatMap(collectTextFiles).flatMap((file) => {
const relativePath = relative(repoRoot, file)
diff --git a/apps/web/lib/__tests__/social-proof-stats.test.ts b/apps/web/lib/__tests__/social-proof-stats.test.ts
new file mode 100644
index 0000000000..b65fcc9f78
--- /dev/null
+++ b/apps/web/lib/__tests__/social-proof-stats.test.ts
@@ -0,0 +1,77 @@
+import { afterEach, describe, expect, test, vi } from 'vitest'
+
+import { getSocialProofStats } from '../social-proof-stats'
+
+const jsonResponse = (payload: unknown): Response =>
+ ({
+ ok: true,
+ status: 200,
+ json: async () => payload,
+ }) as unknown as Response
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+describe('getSocialProofStats', () => {
+ test('maps contribution and circle API totals for the home social proof cards', async () => {
+ const fetchMock = vi
+ .spyOn(globalThis, 'fetch')
+ .mockResolvedValueOnce(
+ jsonResponse({
+ stg_external_contributors_agg_total_ext_contributions: [
+ {
+ total_commits: 3441,
+ total_external_collaborators: 218,
+ total_repositories: 341,
+ },
+ ],
+ })
+ )
+ .mockResolvedValueOnce(
+ jsonResponse({
+ data: {
+ stg_external_circle_circle_event_aggregate: {
+ aggregate: {
+ count: 34,
+ },
+ },
+ },
+ })
+ )
+
+ await expect(getSocialProofStats()).resolves.toEqual({
+ contributions: '3,441',
+ contributors: '218',
+ repositories: '341',
+ circles: '34',
+ })
+
+ expect(fetchMock).toHaveBeenCalledTimes(2)
+ expect(fetchMock).toHaveBeenNthCalledWith(
+ 1,
+ 'https://hasura.bi.status.im/api/rest/contributions/count_all',
+ { cache: 'force-cache' }
+ )
+ expect(fetchMock).toHaveBeenNthCalledWith(
+ 2,
+ 'https://hasura.bi.status.im/v1/graphql',
+ expect.objectContaining({
+ method: 'POST',
+ cache: 'force-cache',
+ headers: { 'Content-Type': 'application/json' },
+ })
+ )
+ })
+
+ test('keeps the requested stats as build fallback when the APIs fail', async () => {
+ vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('network down'))
+
+ await expect(getSocialProofStats()).resolves.toEqual({
+ contributions: '3,441',
+ contributors: '218',
+ repositories: '341',
+ circles: '34',
+ })
+ })
+})
diff --git a/apps/web/lib/active-circles.ts b/apps/web/lib/active-circles.ts
index 7367717d27..2aba5d4215 100644
--- a/apps/web/lib/active-circles.ts
+++ b/apps/web/lib/active-circles.ts
@@ -1,11 +1,11 @@
import { getLatestEventsByCity } from './circle-events'
+import {
+ BI_GRAPHQL_API_URL,
+ CIRCLES_GRAPHQL_RESPONSE_KEY,
+ LOGOS_GRAPHQL_API_URL,
+} from './logos-data-api'
import { logger } from './logger'
-const LOGOS_GRAPHQL_API_URL = 'https://api.logos.co/v1/graphql'
-const BI_GRAPHQL_API_URL = 'https://hasura.bi.status.im/v1/graphql'
-const CIRCLES_GRAPHQL_RESPONSE_KEY =
- 'stg_external_circle_circle_event_aggregate'
-
export const ACTIVE_CIRCLES_DAYS = 120
type GraphqlResponse = {
diff --git a/apps/web/lib/circle-events.ts b/apps/web/lib/circle-events.ts
index d3df2f22eb..db8e41fc81 100644
--- a/apps/web/lib/circle-events.ts
+++ b/apps/web/lib/circle-events.ts
@@ -1,7 +1,6 @@
+import { LOGOS_GRAPHQL_API_URL } from './logos-data-api'
import { logger } from './logger'
-const HASURA_URL = 'https://api.logos.co/v1/graphql'
-
const CIRCLE_EVENTS_QUERY = `query CircleEvents {
stg_external_circle_circle_event {
event_id
@@ -41,7 +40,7 @@ interface HasuraResponse {
*/
export async function fetchCircleEvents(): Promise {
try {
- const response = await fetch(HASURA_URL, {
+ const response = await fetch(LOGOS_GRAPHQL_API_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query: CIRCLE_EVENTS_QUERY }),
diff --git a/apps/web/lib/logos-data-api.ts b/apps/web/lib/logos-data-api.ts
new file mode 100644
index 0000000000..db5483a166
--- /dev/null
+++ b/apps/web/lib/logos-data-api.ts
@@ -0,0 +1,12 @@
+export const LOGOS_GRAPHQL_API_URL = 'https://api.logos.co/v1/graphql'
+
+export const BI_GRAPHQL_API_URL = 'https://hasura.bi.status.im/v1/graphql'
+
+export const CONTRIBUTIONS_API_URL =
+ 'https://hasura.bi.status.im/api/rest/contributions/count_all'
+
+export const CONTRIBUTIONS_API_RESPONSE_KEY =
+ 'stg_external_contributors_agg_total_ext_contributions'
+
+export const CIRCLES_GRAPHQL_RESPONSE_KEY =
+ 'stg_external_circle_circle_event_aggregate'
diff --git a/apps/web/lib/social-proof-stats.ts b/apps/web/lib/social-proof-stats.ts
new file mode 100644
index 0000000000..33b89d4a3a
--- /dev/null
+++ b/apps/web/lib/social-proof-stats.ts
@@ -0,0 +1,131 @@
+import {
+ BI_GRAPHQL_API_URL,
+ CIRCLES_GRAPHQL_RESPONSE_KEY,
+ CONTRIBUTIONS_API_RESPONSE_KEY,
+ CONTRIBUTIONS_API_URL,
+} from './logos-data-api'
+import { logger } from './logger'
+
+const ACTIVE_CIRCLES_DAYS = 120
+
+const FALLBACK_SOCIAL_PROOF_STATS = {
+ contributions: 3441,
+ contributors: 218,
+ repositories: 341,
+ circles: 34,
+} as const
+
+type ContributionsApiData = {
+ total_commits?: number | null
+ total_external_collaborators?: number | null
+ total_repositories?: number | null
+}
+
+type ContributionsApiResponse = {
+ [CONTRIBUTIONS_API_RESPONSE_KEY]?: ContributionsApiData[]
+}
+
+type CirclesApiResponse = {
+ data?: {
+ [CIRCLES_GRAPHQL_RESPONSE_KEY]?: {
+ aggregate?: {
+ count?: number | null
+ }
+ }
+ }
+}
+
+export interface SocialProofStats {
+ contributions: string
+ contributors: string
+ repositories: string
+ circles: string
+}
+
+function formatStat(
+ value: number | null | undefined,
+ fallback: number
+): string {
+ return (value ?? fallback).toLocaleString('en-US')
+}
+
+function getTodayISODateDaysAgo(days: number): string {
+ const date = new Date()
+ date.setDate(date.getDate() - days)
+ return date.toISOString().split('T')[0] ?? ''
+}
+
+function getCirclesGraphqlQuery(dateString: string): string {
+ return `query CountDistinctCities {
+ ${CIRCLES_GRAPHQL_RESPONSE_KEY}(where: { end_at: { _gte: "${dateString}" } }) {
+ aggregate {
+ count(distinct: true, columns: location_city)
+ }
+ }
+}`
+}
+
+async function fetchContributionsData(): Promise {
+ try {
+ const response = await fetch(CONTRIBUTIONS_API_URL, {
+ cache: 'force-cache',
+ })
+
+ if (!response.ok) {
+ throw new Error(`Contributions request failed: ${response.status}`)
+ }
+
+ const data = (await response.json()) as ContributionsApiResponse
+ return data[CONTRIBUTIONS_API_RESPONSE_KEY]?.[0] ?? null
+ } catch (error) {
+ logger.error('Failed to fetch social proof contribution stats', { error })
+ return null
+ }
+}
+
+async function fetchTotalCircles(): Promise {
+ try {
+ const activeSinceDate = getTodayISODateDaysAgo(ACTIVE_CIRCLES_DAYS)
+ const response = await fetch(BI_GRAPHQL_API_URL, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ query: getCirclesGraphqlQuery(activeSinceDate),
+ }),
+ cache: 'force-cache',
+ })
+
+ if (!response.ok) {
+ throw new Error(`Circles request failed: ${response.status}`)
+ }
+
+ const data = (await response.json()) as CirclesApiResponse
+ return data.data?.[CIRCLES_GRAPHQL_RESPONSE_KEY]?.aggregate?.count ?? null
+ } catch (error) {
+ logger.error('Failed to fetch social proof circle stats', { error })
+ return null
+ }
+}
+
+export async function getSocialProofStats(): Promise {
+ const [contributionsData, totalCircles] = await Promise.all([
+ fetchContributionsData(),
+ fetchTotalCircles(),
+ ])
+
+ return {
+ contributions: formatStat(
+ contributionsData?.total_commits,
+ FALLBACK_SOCIAL_PROOF_STATS.contributions
+ ),
+ contributors: formatStat(
+ contributionsData?.total_external_collaborators,
+ FALLBACK_SOCIAL_PROOF_STATS.contributors
+ ),
+ repositories: formatStat(
+ contributionsData?.total_repositories,
+ FALLBACK_SOCIAL_PROOF_STATS.repositories
+ ),
+ circles: formatStat(totalCircles, FALLBACK_SOCIAL_PROOF_STATS.circles),
+ }
+}
diff --git a/apps/web/lib/tech-stack-overview.ts b/apps/web/lib/tech-stack-overview.ts
new file mode 100644
index 0000000000..bb268e8acf
--- /dev/null
+++ b/apps/web/lib/tech-stack-overview.ts
@@ -0,0 +1,20 @@
+import { getPageCopy } from '@repo/content/loaders'
+import type { Language, TechStackOverviewSection } from '@repo/content/schemas'
+
+import { ROUTES } from '@/constants/routes'
+
+import { createSectionFinder } from './page-sections'
+
+const findHomeSection = createSectionFinder('home')
+
+export async function getHomeTechStackOverview(
+ locale: Language
+): Promise {
+ const homePage = await getPageCopy(ROUTES.home, locale)
+
+ return findHomeSection(
+ homePage.sections,
+ 'techStackOverview',
+ 'home.techStack'
+ )
+}
diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index bd06a6e3d4..5990cc14ba 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -38,24 +38,20 @@
},
"socialProof": {
"contributions": {
- "value": "2262",
- "label": "Contributions",
+ "label": "Total contributions",
"body": "An open source community of builders, researchers, and technologists."
},
- "nodes": {
- "value": "205",
- "label": "Node Operators",
+ "contributors": {
+ "label": "Active contributors",
+ "body": "An open source community of builders, researchers, and technologists."
+ },
+ "repositories": {
+ "label": "Repositories",
"body": "Open source tools, libraries, and infrastructure to inspect, fork, and build on."
},
"circles": {
- "value": "26",
"label": "Circles",
"body": "Local chapters of activists and change seekers solving real world issues."
- },
- "issues": {
- "value": "26",
- "label": "Winnable Issues",
- "body": "Local issues that Circles identify and solve – from privacy tech to community funding."
}
},
"build": {
@@ -305,29 +301,7 @@
"stack": {
"titleLine1": "Explore the Logos",
"titleLine2": "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.",
- "storage": "Storage",
- "messaging": "Messaging",
- "blockchain": "Blockchain",
- "userModules": "User Modules",
- "basecamp": "Basecamp",
- "basecampBody": "Lorem ipsum dolor sit amet consectetur lorem ipsum dolor sit amet consectetur lorem.",
- "basecampCta": "Install",
- "networkingLine1": "The Networking Stack:",
- "networkingLine2": "Discovery, Peering, and Mix-Net",
- "foundation": "The Foundation: Logos Kernel"
- }
- },
- "storage": {
- "techStack": {
- "storageBody": "Decentralised file storage and retrieval, using content-addressed (CID-based) data",
- "messagingBody": "Private, censorship-resistant communication between parties.",
- "blockchainBody": "Decentralised compute and consensus.",
- "userModulesBody": "Anyone can build modules that plug into the same IPC infrastructure.",
- "networkingBody": "This layer handles how Logos nodes find each other, establish connections, and communicate.",
- "foundationBody": "A microkernel that handles the essential primitives every decentralised application needs.",
- "lez": "LOGOS Execution zone (LEZ)",
- "cryptarchia": "Data Availability and Consensus: Cryptarchia"
+ "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."
}
},
"ideas": {
@@ -447,49 +421,6 @@
}
}
},
- "techStack": {
- "disclaimer": "Disclaimer: This diagram oversimplifies the stack.",
- "heading": "The Logos\nTechnology Stack",
- "body": "Logos provides developers with a modular, plugin-based runtime for building decentralised applications.",
- "cta": "See the stack",
- "primaryCta": "Documentation",
- "secondaryCta": "Builder Hub",
- "basecamp": {
- "title": "Basecamp",
- "body": "Basecamp bundles the Logos stack into a practical starting point for builders.",
- "cta": "Install"
- },
- "cards": {
- "storage": {
- "title": "Storage",
- "body": "Decentralised file storage and retrieval, using content-addressed (CID-based) data"
- },
- "messaging": {
- "title": "Messaging",
- "body": "Private, censorship-resistant communication between parties."
- },
- "blockchain": {
- "title": "Blockchain",
- "body": "Decentralised compute and consensus.",
- "badges": {
- "1": "LOGOS Execution zone (LEZ)",
- "2": "Data Availability and Consensus: Cryptarchia"
- }
- },
- "userModules": {
- "title": "User Modules",
- "body": "Anyone can build modules that plug into the same IPC infrastructure."
- }
- },
- "networking": {
- "title": "The Networking Stack:\nDiscovery, Peering, and Mix-Net",
- "body": "This layer handles how Logos nodes find each other, establish connections, and communicate."
- },
- "foundation": {
- "title": "The Foundation: Logos Kernel",
- "body": "A microkernel that handles the essential primitives every decentralised application needs."
- }
- },
"support": {
"heading": "Get Support",
"body": "Find examples, tutorials, and community channels for building on Logos.",
diff --git a/content/builders-hub/resources/en.json b/content/builders-hub/resources/en.json
index 0faf852e4f..2c3ef3278a 100644
--- a/content/builders-hub/resources/en.json
+++ b/content/builders-hub/resources/en.json
@@ -15,7 +15,7 @@
"title": "Documentation",
"description": "Reference for the kernel, modules, and UI packages.",
"ctaLabel": "Browse",
- "href": "/technology-stack",
+ "href": "https://github.com/logos-co/logos-docs",
"status": "published"
},
{
diff --git a/content/builders-hub/settings/en.json b/content/builders-hub/settings/en.json
index 222e99db8e..e32ab02b6c 100644
--- a/content/builders-hub/settings/en.json
+++ b/content/builders-hub/settings/en.json
@@ -15,7 +15,11 @@
"href": "https://discord.gg/logosnetwork",
"external": true
},
- { "label": "View the Docs", "href": "/technology-stack" }
+ {
+ "label": "View the Docs",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
+ }
]
},
"journey": {
diff --git a/content/pages/en/basecamp.json b/content/pages/en/basecamp.json
index a6b3c0c98c..4cba0bef9e 100644
--- a/content/pages/en/basecamp.json
+++ b/content/pages/en/basecamp.json
@@ -54,7 +54,7 @@
"description": "Basecamp is built around a modular architecture. At its core is a lightweight runtime that manages self-contained modules, each providing a distinct capability such as private peer-to-peer messaging or distributed storage.",
"cta": {
"label": "Documentation",
- "href": "https://docs.logos.co",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true,
"variant": "primary"
},
@@ -176,7 +176,7 @@
"description": "Basecamp is an open-source application. If you want to explore the codebase, build from source, or develop your own modules, everything lives on GitHub.",
"cta": {
"label": "View the docs",
- "href": "https://docs.logos.co",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true,
"variant": "primary"
}
diff --git a/content/pages/en/home.json b/content/pages/en/home.json
index d8b959d0bb..0cd1bbb9f9 100644
--- a/content/pages/en/home.json
+++ b/content/pages/en/home.json
@@ -73,7 +73,11 @@
"key": "home.techStack",
"eyebrow": "A unified ecosystem. Private-by-default. Built for real life.",
"title": "The Logos Technology Stack",
- "cta": { "label": "See the Stack", "href": "/technology-stack" },
+ "cta": {
+ "label": "See the Stack",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
+ },
"basecamp": {
"title": "Basecamp",
"body": "Lorem ipsum dolor sit amet consectetur lorem ipsum dolor sit amet consectetur lorem.",
@@ -132,7 +136,8 @@
"subheadingExtra": "Privacy-preserving blockchain for sovereign order and decentralised governance.",
"cta": {
"label": "View the Docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
},
"cards": [
{
diff --git a/content/pages/en/technology-stack-blockchain.json b/content/pages/en/technology-stack-blockchain.json
index a6bdda07b8..41703c219f 100644
--- a/content/pages/en/technology-stack-blockchain.json
+++ b/content/pages/en/technology-stack-blockchain.json
@@ -55,7 +55,8 @@
},
{
"label": "Docs",
- "href": "/technology-stack/blockchain",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
]
@@ -68,7 +69,8 @@
"description": "Logos Blockchain is a proof-of-stake layer-1 with privacy built into the consensus mechanism itself — not bolted on at the application layer. Block proposers are anonymous. Transactions are private by default. The chain supports the deployment of application-specific execution environments called Sovereign Zones, connected through Mantle Channels for interoperability.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack/blockchain"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
@@ -79,7 +81,8 @@
"subheading": "A private proof-of-stake consensus mechanism where validator identities and stake amounts remain hidden.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack/blockchain"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
},
"cards": [
{
@@ -98,7 +101,8 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "/technology-stack/blockchain",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
},
@@ -118,7 +122,8 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "/technology-stack/blockchain",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
},
@@ -138,7 +143,8 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "/technology-stack/blockchain",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
}
@@ -153,7 +159,8 @@
"description": "Lorem ipsum dolor sit amet consectetur",
"cta": {
"label": "View the docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
diff --git a/content/pages/en/technology-stack-messaging.json b/content/pages/en/technology-stack-messaging.json
index f180a8c54a..669f446dba 100644
--- a/content/pages/en/technology-stack-messaging.json
+++ b/content/pages/en/technology-stack-messaging.json
@@ -47,7 +47,8 @@
},
{
"label": "DOCS",
- "href": "/technology-stack/messaging",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
]
@@ -60,7 +61,8 @@
"description": "Logos Messaging provides the messaging layer for the Logos stack, letting applications send messages, relay data, and coordinate without relying on centralised servers or exposing metadata to surveillance.\n\nIt uses a peer-to-peer relay network in which messages propagate across nodes with no central broker, and it supports private one-to-one messaging, group messaging, and public broadcast channels.\n\nMessages can be encrypted end-to-end, and the relay network is designed to resist traffic analysis, making it difficult for observers to determine who is communicating with whom.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack/messaging"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
@@ -125,7 +127,8 @@
"description": "Lorem ipsum dolor sit amet consectetur",
"cta": {
"label": "View the docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
diff --git a/content/pages/en/technology-stack-networking.json b/content/pages/en/technology-stack-networking.json
index 7ffc3ecfbc..e7fac9a5ba 100644
--- a/content/pages/en/technology-stack-networking.json
+++ b/content/pages/en/technology-stack-networking.json
@@ -30,7 +30,8 @@
},
{
"label": "Docs",
- "href": "/technology-stack/networking",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
]
@@ -42,7 +43,8 @@
"description": "The networking layer handles how Logos nodes find each other, establish connections, and communicate. Private-by-default, this layer doesn't care whether modules above it are storing files, sending chat messages, or processing transactions. It provides private, reliable communication as a shared foundation.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack/networking"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
@@ -90,7 +92,8 @@
"description": "Reference for the kernel, modules, and UI packages.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
diff --git a/content/pages/en/technology-stack-storage.json b/content/pages/en/technology-stack-storage.json
index 9e60f9d01b..78779978e5 100644
--- a/content/pages/en/technology-stack-storage.json
+++ b/content/pages/en/technology-stack-storage.json
@@ -50,7 +50,8 @@
},
{
"label": "DOCS",
- "href": "/technology-stack/storage",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
]
@@ -63,7 +64,8 @@
"description": "Files are addressed by content rather than by location. When you store a file, the network returns a CID — a content identifier derived from the file itself — and anyone with that CID can retrieve the file from whichever nodes hold it. There is no central server to depend on and no single host to fail. The usage is straightforward: store a file and get back a content identifier; provide a content identifier and get back the file. Storage works both inside the Logos App and from your own applications, through either the high-level module API or the lower-level libstorage library.",
"cta": {
"label": "View the docs",
- "href": "/technology-stack/storage"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
@@ -140,7 +142,8 @@
"description": "Lorem ipsum dolor sit amet consectetur",
"cta": {
"label": "View the docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
}
},
{
diff --git a/content/pages/en/technology-stack.json b/content/pages/en/technology-stack.json
index b45b89c9b1..689b858be2 100644
--- a/content/pages/en/technology-stack.json
+++ b/content/pages/en/technology-stack.json
@@ -42,7 +42,8 @@
},
{
"label": "Documentation",
- "href": "/technology-stack#open-source",
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true,
"variant": "secondary"
}
],
@@ -70,7 +71,8 @@
"eyebrow": "Disclaimer: Abstract representation of the stack.",
"cta": {
"label": "Docs",
- "href": "/technology-stack#open-source"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
},
"architecture": {
"eyebrow": "Technology",
@@ -81,7 +83,8 @@
],
"cta": {
"label": "View the docs",
- "href": "/technology-stack#stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
},
"image": {
"src": "/images/technology-stack/architecture-overview.jpg",
@@ -209,7 +212,7 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "https://docs.logos.co",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true
}
},
@@ -224,7 +227,7 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "https://docs.waku.org",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true
}
},
@@ -239,7 +242,7 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "https://docs.codex.storage",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true
}
},
@@ -254,7 +257,7 @@
},
"secondaryCta": {
"label": "Docs",
- "href": "https://vac.dev",
+ "href": "https://github.com/logos-co/logos-docs",
"external": true
}
}
@@ -268,7 +271,8 @@
"subheadingExtra": "Privacy-preserving blockchain for sovereign order and decentralised governance.",
"cta": {
"label": "View the Docs",
- "href": "/technology-stack"
+ "href": "https://github.com/logos-co/logos-docs",
+ "external": true
},
"cards": [
{