Landing Pages — Meta Portal (meta.koder.dev)
Estrutura, IA, pipeline de render, deploy e governança do portal público de documentação da Koder Stack em `meta.koder.dev`. Renderiza o conteúdo de `meta/docs/{stack,ia,cryptography,blockchain}/` como HTML estático navegável, com nav hierárquico por tipo de documento (RFC, spec, policy, registry, module, runbook, compendium), search client-side, theme light/dark, i18n EN/PT. Distinto de landings de produto, área, sector, institucional, catálogo, packages e specs — é um **portal-indexador de documentos**, não uma landing-vendedor.
1. Visão Geral
meta.koder.dev é o portal público de documentação da Koder Stack. Renderiza o conteúdo de meta/docs/ do monorepo como site estático navegável.
Não é uma landing de produto, marca, área ou spec individual — é um indexador de documentos. Tem nav hierárquico por tipo (RFC, spec, policy, registry, module, runbook, compendium), uma página por arquivo fonte, search client-side e cross-links resolvidos.
Distinto de:
specs/landing-pages/products.kmd— landings de um produtospecs/landing-pages/specs.kmd— landing de uma spec/formato (KVG, KPKG)specs/landing-pages/areas.kmd— landing de Área L2 (foundation, ai, …)specs/landing-pages/institutional.kmd— landings sobre a Koder (www, company)specs/landing-pages/catalog.kmd— Hub catalog (hub.koder.dev)specs/landing-pages/packages.kmd— página individual de pacote no Hub
Histórico canônico (2026-05-24):
- ~10 landings de Área (
meta/sites/areas),meta/sites/brand/e
meta/sites/_ecosystem_gen.pyreferenciaramdocs.koder.devdesde 2026-Q2 como "Public documentation" (sempre dead link). - Sessão de 2026-05-24 turn 3: owner pediu site pro conteúdo de
meta/. Pragmaticamente decidido construirdocs.koder.devreusando o nome já referenciado. Implementação concluída em 5 turns (spec, renderer, vhost, audit, deploy paralelo) — portal shipped com 652 docs. - Mesma sessão turn 12: owner observou que o nome
docs.estásemanticamente errado pro conteúdo (RFCsspecspolicies/registries = "meta", não "docs do usuário"). Decisão revertida: canonical é
meta.koder.dev, mirror direto do L1 domainmeta/do monorepo. - Cutover atomic agendado (Phase B) quando
infra/net/jetliberaro lock atual (jet#160 Phase 1) — ver
jet#NNN follow-up ticketno umbrella META-DOCS-131.docs.koder.dev→ 301 →meta.koder.dev, landings editorialmente atualizadas, per-product docs ficam em<product>.koder.dev/docs/quando os produtos shipam.
2. Escopo de Conteúdo
2.1 Em escopo (público, vai pro portal)
| Fonte | Tipo | Sub-path no portal |
|---|---|---|
meta/docs/stack/rfcs/ |
RFCs | /rfcs/ |
meta/docs/stack/specs/ |
Specs normativas | /specs/ |
meta/docs/stack/policies/ |
Policies comportamentais | /policies/ |
meta/docs/stack/registries/ |
Registries (fontes de verdade) | /registries/ |
meta/docs/stack/modules/ |
Module catalog | /modules/ |
meta/docs/stack/runbooks/ |
Runbooks operacionais públicos | /runbooks/ |
meta/docs/stack/releases/ |
Release notes consolidadas | /releases/ |
meta/docs/ia/compendium/ |
Compendium de IA | /compendiums/ia/ |
meta/docs/cryptography/compendium/ |
Compendium de criptografia | /compendiums/cryptography/ |
meta/docs/blockchain/compendium/ |
Compendium de blockchain | /compendiums/blockchain/ |
2.2 Fora de escopo (NUNCA publicar)
meta/context/— runbooks internos, hooks de IA, credenciais,notices, recaps. Privado por contrato.
meta/brand/— assets de marca (vivem embrand.koder.dev)meta/sites/— landings (cada uma tem seu próprio domínio)- Qualquer arquivo com frontmatter
visibility: internalouaudit: private(ver §6.3) meta/docs/stack/backlog/— tickets de trabalho interno
2.3 Avaliação per-diretório (decidir caso a caso)
meta/docs/platform/— possivelmente público; auditar conteúdometa/docs/trust/— possivelmente público; auditar conteúdometa/docs/flow-releases/— público se substituirflow.koder.dev/releases; senão, manter privadometa/docs/company/— documentação de empresa/negócio pt-BR (marca/INPI,datacenter, cloud, projetos, processos, sessões). Mantida no monorepo (decisão de owner: tudo num repo); renomeada de
meta/docs/docs/+.kd→.kmd(stack-docs#157).meta/docs/stack/diagrams/,presentation/,build/— públicoscomo assets/anexos, não páginas próprias
3. URL Canônica
Padrão: https://meta.koder.dev/<category>/<path>/
<category>∈ {rfcs,specs,policies,registries,modules,runbooks,releases,compendiums}<path>espelha 1:1 a estrutura de subdir na fonte, com.kmd/.mdremovidos e nomes preservados
- Trailing slash sempre presente (URLs com slash final →
index.htmldo diretório virtual)
- Casos especiais:
- Homepage:
https://meta.koder.dev/(não/index.html) - Search:
https://meta.koder.dev/search/?q=<query>(client-side) - Sitemap:
https://meta.koder.dev/sitemap.xml - 404:
https://meta.koder.dev/404.html
- Homepage:
Exemplos:
| Fonte | URL |
|---|---|
meta/docs/stack/rfcs/stack-RFC-001-kdb-as-unified-data-plane.kmd |
/rfcs/stack-RFC-001-kdb-as-unified-data-plane/ |
meta/docs/stack/specs/auth/oauth-flow.kmd |
/specs/auth/oauth-flow/ |
meta/docs/stack/policies/hyperscale-first.kmd |
/policies/hyperscale-first/ |
meta/docs/stack/registries/component-names.md |
/registries/component-names/ |
meta/docs/ia/compendium/01-models.md |
/compendiums/ia/01-models/ |
Regra de imutabilidade: URLs uma vez publicadas não mudam. Renomes em meta/docs/ precisam de redirect 301 em /redirects.toml consumido pelo Jet (#131.5 audit).
4. Estrutura do Arquivo de Site
meta/sites/meta/
├── _assets/
│ ├── meta.css ← Estilos do portal (tokens, nav, sidebar, TOC, footer)
│ ├── meta-search.js ← Busca da rota /search/ (padrão KDS, vanilla)
│ ├── graph.css / graph.js / graph3d.js ← Graph explorer (home, §5.5)
│ ├── kvg.wasm / wasm_exec.js ← gerados (META-DOCS-150.8, gitignored)
│ ├── fonts/ ← Inter + JetBrains Mono woff2 self-hosted
│ ├── search-index.json ← Gerado pelo renderer (gitignored)
│ ├── icon.svg
│ └── og-image-default.png
├── _data/stack-graph.json ← Gerado por koder-stack-graph
├── index.html ← Gerado: homepage
├── <category>/ ← Gerado per category
│ ├── index.html
│ └── <doc-slug>/
│ └── index.html
├── search/index.html ← Gerado
├── sitemap.xml ← Gerado
├── robots.txt ← Gerado (env-aware, §14)
└── 404.html ← GeradoTodos os HTMLs servidos são gerados pelo renderer (#131.2); os templates vivem embedded no renderer (products/dev/koder-tools/internal/docsrender/templates
index.html, meta/sites/brand/index.html, meta/sites/_ecosystem_gen.py) e marque cada uma como:
- ✅
resolves— path canônico existe - 🔁
redirects-to: <new-path>— entrada emredirects.tomlnecessária - ❌
broken— bloqueia release até #131.5 decidir destino
CI gate: build do portal falha se houver broken sem resolução.
12. i18n
- Conteúdo (doc body) NÃO é traduzido — é EN por
policies/language.kmd - Chrome (nav, footer, breadcrumbs, status badges, "Recently
updated") É traduzido EN ↔ PT-BR
- Toggle
EN/PTno nav (mesmo padrão das outras landings) - Default por geo / browser language; persiste em
localStorage - T1-T6 da spec
specs/i18n/contract.kmdaplicam
13. Acessibilidade
- WCAG 2.1 AA
- Skip-to-content link no topo
- Sidebar tree navegável por teclado (arrow keys)
- Theme toggle com
aria-label+aria-pressed - TOC com
aria-current="location"no item ativo - Code blocks com
role="region"earia-label="Code sample" - Tabela de conformance per page em audit periódico (#131 followup)
14. SEO
sitemap.xmlgerado no build, submetido ao Google Search Console- Per-page meta tags (§7)
robots.txtna raiz (/robots.txt— crawlers só leem a raiz) —Allow: /+Sitemap:em prd,Disallow: /em stg/dev (perpolicies/environments.kmd); gerado pelo renderer via--env- IndexNow ping no deploy de produção (lista de URLs alteradas)
- Schema.org
TechArticleJSON-LD em doc pages
15. Deploy
Per policies/web-server.kmd (Jet only) + policies/environments.kmd:
| Ambiente | Host | Branch source | noindex |
|---|---|---|---|
dev.meta.koder.dev |
s.forge | dev |
true |
stg.meta.koder.dev |
s.forge | staging |
true |
meta.koder.dev (prd) |
s.forge | main |
false |
DNS A record provisionado via ClouDNS (meta/context/infrastructure/dns.md). TLS via Jet autocert (LE/ACME).
Pipeline de deploy:
- CI roda
koder-docs-render --env <env>no monorepo - Output em
meta/sites/docs/(sub-paths gitignored) rsyncpro/var/www/meta.koder.dev/no s.forge- Jet reload (zero-downtime)
- Smoke:
curl -I https://meta.koder.dev/→ 200 + TTFB <500ms - Lighthouse: a11y ≥ 95, perf ≥ 90, SEO = 100
16. Performance Targets
| Métrica | Target |
|---|---|
| TTFB | <200ms (CDN/edge se necessário, futuro) |
| LCP | <1.5s |
| CLS | <0.05 |
| Page weight (homepage) | <100KB (sem search index) |
| Page weight (doc page) | <150KB (sem code samples grandes) |
| Search index | <500KB |
| Build time (full) | <60s pra ~500 docs |
| Build time (incremental) | <5s |
17. Governança
- Owner: Koder Stack (Rodrigo)
- Spec maturity gate: v1.0 normative quando #131.2.3.4.5.6/.7
do umbrella META-DOCS-131 estiverem done + lighthouse scores atingidos + dead-link audit limpa em 2 builds consecutivos
- Versioning: a spec do portal segue semver per
specs/landing-pages/specs.kmd §6 - Audit:
koder-spec-audit landing-pages --slug docs(a serimplementado pelo audit harness em
dev/koder-tools/)
18. Decisões Em Aberto
- Search backend long-term: lunr.js (v0) → kdb-search quando
rfcs/stack-RFC-001-kdb-as-unified-data-plane.kmdentregar layer de busca. Decisão revisitada no kickoff de #131.2. - Versionamento de docs: always-latest (HEAD) vs por tag
(v1.0, v1.1). Default v0: always-latest; versões anteriores acessíveis via Flow se requestado. Revisitar quando portal tiver ≥1 ano de tráfego.
- OG image generation per page: usar
kicon generate --targets ogper doc, ou template estático compartilhado por categoria? Default v0: estático por categoria (8 imagens curadas).
- Comments / feedback: deixar fora do v0. Avaliar Giscus
(GitHub-backed) vs solução self-hosted em v2.
- Versioned dark mode: usar Verge default ou expor preset
switcher como no KDS? Default v0: Verge default, sem switcher.
- Base CSS compartilhada — RESOLVIDO 2026-06-10 (c3, owner-aprovado
via k-arch→k-go): a paleta web virou o preset Verge Web (verge.kmd §R9, export
kds.koder.dev/tokens/verge-web.css) e o portal consome o export vendored com zero mudança visual (META-DOCS-171 done). Migração das demais landings: follow-up.
19. Referência Cruzada
specs/landing-pages/institutional.kmd— padrão de footer dark + navspecs/landing-pages/specs.kmd— padrão de doc-as-pagespecs/kmd/— parser canônicopolicies/hyperscale-first.kmd— gate de build incrementalpolicies/reuse-first.kmd— reuso deecosystem.cssmeta/sites/_ecosystem_gen.py— gerador atual de landings de Área(referencia o dead link
meta.koder.dev/ecosystem)- META-DOCS-131 — umbrella ticket do programa
- JET-161 — vhost ticket
20. Estado Atual (2026-05-24)
| Sub-stream | Ticket | Status |
|---|---|---|
| Landing spec | #131.1 | ✅ esta spec (v0.1.0 pre-normative) |
| Renderer pipeline | #131.2 | pending |
| Templates + nav | #131.3 | pending |
| Vhost + TLS | JET-161 | pending (blocked on #131.1+#131.2) |
| Dead-link audit + fix | #131.5 | pending |
| OG image + brand assets | #131.6 | pending |
| i18n chrome | #131.7 | pending |