Ficheiro de configuração
Todas as opções em blume.config.ts, desde os metadados do site e as fontes de conteúdo até às ligações que conduzem a cada guia de configuração de funcionalidade.
O Blume lê o blume.config.ts a partir da raiz do teu projeto. Envolve a tua configuração em defineConfig para obteres preenchimento automático e verificação de tipos — todos os campos são opcionais, com um valor predefinido sensato.
import { defineConfig } from "blume";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project.",
});
Um exemplo completo
Um exemplo mais abrangente que aborda as opções mais comuns (consulta o guia de cada funcionalidade para as restantes):
import sitemap from "@astrojs/sitemap";
import { defineConfig } from "blume";
export default defineConfig({
// Site
title: "My Docs",
description: "Documentation for my project.",
logo: "/logo.svg",
// Astro integrations — installed and versioned by this site
integrations: [sitemap()],
// Content
content: {
root: "docs",
},
// Theme — see the Theming guide
theme: {
accent: "teal",
radius: "md",
mode: "system",
},
// Search — see the Search guide
search: {
provider: "orama",
},
// Markdown features
markdown: {
imageZoom: true,
code: {
icons: true, // language icon in the code-block header
wrap: false, // wrap long lines instead of scrolling
},
codeBlocks: {
theme: {
light: "github-light", // bundled name or custom Shiki theme object
dark: "github-dark",
},
},
},
// AI — see the AI guide
ai: {
llmsTxt: true,
// MCP server (needs server output)
mcp: {
enabled: false,
route: "/mcp",
},
},
// SEO — OG images, feeds, sitemap, structured data; see the SEO guide
seo: {
og: { enabled: true },
rss: { enabled: true, types: ["blog", "changelog"] },
sitemap: true,
robots: true,
structuredData: true,
},
// Deployment — see the Deployment guide
deployment: {
output: "static",
site: "https://docs.example.com",
},
});
Site
| Opção | Predefinição | Descrição |
|---|---|---|
title |
"Documentation" |
Nome do site — apresentado no cabeçalho, nos títulos das páginas e nos cartões OG. |
description |
— | Meta descrição predefinida, usada para SEO e OG. |
logo |
— | Marca gráfica e/ou logótipo textual apresentado no cabeçalho. |
banner |
— | Barra de anúncios para todo o site, acima do cabeçalho. |
Logótipo
Aponta o logo para um SVG e o Blume incorpora-o em linha, para que um logótipo com currentColor acompanhe automaticamente o tema claro e escuro:
logo: "/logo.svg",
O SVG pode estar na raiz do teu projeto ou em public/. A marca é composta por um símbolo (image) mais um logótipo textual (text); a forma de objeto permite-te defini-los de forma independente:
logo: {
image: "/logo.svg", // string, or { light, dark, alt } for themed raster art
text: "Acme", // wordmark beside the mark
href: "/", // overrides the brand link (defaults to "/")
},
image aceita o mesmo valor que a forma abreviada — um único caminho, ou { light, dark, alt } para artes separadas para claro/escuro (as imagens raster têm de estar em public/).
text controla o logótipo textual independentemente do símbolo:
- Omite
texte a marca usa otitledo teu site (a predefinição). - Define
text: ""para mostrar apenas o símbolo — útil quando a imagem do logótipo já inclui o logótipo textual. - Define
textsemimagepara um logótipo apenas de texto.
Favicon
Não existe uma opção de favicon — o Blume deteta um automaticamente pelo nome do ficheiro, tal como o Next.js faz. Coloca um ficheiro icon ou favicon (.svg, .png ou .ico) na raiz do teu projeto ou no diretório public/ e ele passa a ser o ícone do separador do browser:
my-docs/
├─ blume.config.ts
├─ icon.png ← picked up automatically
└─ docs/
O SVG prevalece sobre o PNG, que prevalece sobre o ICO quando existem vários, e um ficheiro em public/ é preferido a um na raiz. Se o Blume não encontrar nenhum ícone, recorre à sua própria marca.
Ícone Apple touch
O ícone que o iOS usa quando alguém adiciona o teu site ao ecrã principal é detetado da mesma forma. Coloca um ficheiro apple-icon (.png, .jpg ou .jpeg) — ou um apple-touch-icon.png, o nome que a maioria dos geradores de favicons produz — na raiz do teu projeto ou no diretório public/ e o Blume trata de configurar <link rel="apple-touch-icon"> por ti. Não há predefinição; se não for encontrado nenhum ficheiro, não é emitida nenhuma tag.
my-docs/
├─ blume.config.ts
├─ apple-icon.png ← picked up automatically
└─ docs/
Coloca o ficheiro em public/ em vez de na raiz do projeto: o iOS ignora o URI de dados incorporado que o Blume usa para um ícone ao nível da raiz, pelo que só um ficheiro em public/ (servido em /apple-icon.png) chega de forma fiável ao ecrã principal.
Faixa
Mostra uma barra de anúncios para todo o site acima do cabeçalho. Passa uma string, ou um objeto com uma ligação e um botão para dispensar:
banner: "Docs are in beta — expect changes.",
banner: {
content: "Blume v1 is here!",
link: { text: "Read more", href: "/blog/v1" },
dismissible: true,
id: "v1",
},
Quando dismissible está ativo, a barra mostra um botão de fechar e permanece oculta para esse visitante a partir daí. A chave de dispensa assume por predefinição o texto do conteúdo, pelo que editar a mensagem faz a faixa reaparecer; define um id estável para a manter dispensada entre edições.
Conteúdo
Onde vive o teu conteúdo e como o Blume o descobre. Consulta Páginas para saberes como os ficheiros se tornam rotas.
content: {
root: "docs",
}
| Opção | Predefinição | Descrição |
|---|---|---|
root |
"docs" |
Pasta que o Blume analisa em busca de conteúdo. |
include |
["**/*.{md,mdx}"] |
Globs que correspondem a ficheiros de conteúdo. |
exclude |
["**/_*", "**/.*"] |
Globs a ignorar (ficheiros com underscore e com ponto). |
pages |
"pages" |
Pasta para páginas .astro personalizadas. |
defaultType |
"doc" |
type de página usado quando o frontmatter o omite. |
types |
{} |
Definições de conteúdo por tipo — chaves de frontmatter personalizadas limitadas às páginas de um type. Consulta Frontmatter. |
Os recursos estáticos vivem em public/ — um ficheiro em public/logo.png é servido em /logo.png, pelo que uma referência como  é resolvida a partir de public/images/create.png. As imagens referenciadas por caminho relativo () vivem antes junto ao teu conteúdo e são otimizadas no momento da compilação.
Imagens
As imagens locais referenciadas por caminho relativo são otimizadas automaticamente no momento da compilação — comprimidas, convertidas para WebP e com atributos width/height intrínsecos, para que o layout não se desloque enquanto carregam. Não há nada a configurar; consulta Ligações e imagens para orientações de escrita.
As imagens remotas são servidas sem alterações por predefinição. Para que o Blume também as descarregue e otimize no momento da compilação, autoriza os seus hosts:
image: {
domains: ["cdn.example.com"],
remotePatterns: [{ protocol: "https", hostname: "**.example.com" }],
}
| Opção | Predefinição | Descrição |
|---|---|---|
domains |
[] |
Nomes de host cujas imagens remotas podem ser otimizadas. |
remotePatterns |
[] |
Autorização baseada em padrões (protocol, hostname, port, pathname); os nomes de host aceitam os wildcards *. (um nível) e **. (qualquer profundidade). |
Frontmatter
O frontmatter das páginas é validado de forma estrita — uma chave desconhecida faz falhar a compilação, pelo que os erros de escrita são detetados cedo. Para incluíres metadados específicos do projeto (um responsável, uma data de revisão), declara as chaves adicionais em frontmatter.extend, cada uma mapeada para um schema que forneces:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
frontmatter: {
extend: {
owner: z.string(),
reviewedAt: z.coerce.date().optional(),
},
},
});
Funciona com qualquer biblioteca Standard Schema — Zod (qualquer que seja a versão que o teu projeto instale), Valibot, ArkType. As chaves fora da extensão continuam validadas de forma estrita, pelo que a deteção de erros de escrita mantém-se inalterada. Consulta Chaves personalizadas para a semântica de validação.
As chaves em extend aplicam-se a todo o site. Para exigires chaves apenas em páginas de um tipo de conteúdo — o status de um RFC, o service de um runbook — declara-as antes por tipo em content.types:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
content: {
types: {
rfc: {
facets: ["domain", "status"],
frontmatter: {
domain: z.string(),
status: z.enum(["draft", "review", "enforced"]),
},
},
},
},
});
Uma chave pode ser declarada para todo o site ou por tipo, não ambos. Consulta Chaves por tipo para saberes como o âmbito é resolvido.
facets indica as chaves personalizadas cujos valores se tornam metadados filtráveis: acompanham os documentos de pesquisa (blume-search.json e o índice MCP), e as ferramentas MCP aceitam um input filters que faz correspondência com elas, para que um agente possa obter, por exemplo, apenas os RFCs com estado enforced no domínio architecture. Cada faceta tem de ser uma chave personalizada declarada — por tipo ou para todo o site — e apenas os valores do tipo string (ou números/booleanos convertidos em string) funcionam como facetas.
GitHub
Aponta o Blume para o teu repositório com github. É o que alimenta a ligação para o repositório no cabeçalho e as ações de página Editar no GitHub e Enviar feedback:
github: {
owner: "acme",
repo: "docs",
}
| Opção | Predefinição | Descrição |
|---|---|---|
owner |
— | Conta ou organização do GitHub proprietária do repositório. |
repo |
— | Nome do repositório. |
branch |
"main" |
Branch para onde apontam as ligações de edição. |
dir |
— | Caminho da raiz do repositório até à raiz do projeto (para monorepos). |
Última modificação
Mostra uma linha “Última atualização em …” no fundo de cada página. Desativado por predefinição; define lastModified como true para derivar a data de cada página a partir do respetivo histórico do git:
lastModified: true,
| Valor | Descrição |
|---|---|
false |
Desativado (predefinição). |
true |
Lê a data a partir do histórico do git (datas dos commits). |
{ type: "git" } |
O mesmo que true, escrito explicitamente. |
{ type: "frontmatter" } |
Nunca executa o git — usa apenas o campo lastModified do frontmatter. |
A fonte git lê o commit mais recente que tocou em cada ficheiro, pelo que funciona em qualquer repositório git — incluindo monorepos — e precisa do histórico do repositório no momento da compilação (evita um checkout superficial com --depth 1 no CI). O lastModified do frontmatter da própria página prevalece sempre, o que é útil para fixar uma data ou para ficheiros que ainda não foram commitados:
---
title: My page
lastModified: 2026-06-20
---
Quando ativada, a data é também emitida como dateModified de schema.org nos dados estruturados da página.
Formato de data
Tanto a marca de “Última atualização” como a cronologia do changelog apresentam as suas datas através do mesmo dateFormat, para que se leiam de igual forma. As datas são sempre apresentadas na localização do site; o dateFormat controla o formato. Por predefinição usa a forma longa (July 21, 2026, 2026年7月21日):
dateFormat: { dateStyle: "long" },
dateFormat é passado diretamente para as opções de Intl.DateTimeFormat. Usa uma predefinição dateStyle para escolher um comprimento:
dateFormat: { dateStyle: "medium" },
Ou os campos de componentes individuais para um estilo numérico próprio como 2026/07/21:
dateFormat: { year: "numeric", month: "2-digit", day: "2-digit" },
| Opção | Descrição |
|---|---|
dateStyle |
Comprimento predefinido: "full", "long", "medium" ou "short". Não pode ser combinado com os campos de componentes. |
weekday, era, year, month, day |
Componentes individuais, p. ex. year: "numeric", month: "2-digit". |
timeZone |
Fuso horário IANA. Por predefinição é UTC, para que uma data se leia da mesma forma independentemente de onde o site é compilado. |
calendar, numberingSystem |
Sistema de calendário (p. ex. "japanese") e sistema de numeração (p. ex. "arab"). |
SEO
Imagens Open Graph, feeds RSS e dados estruturados JSON-LD, agrupados em seo. Consulta o guia de SEO para metadados, substituições no frontmatter e a referência completa.
seo: {
og: { enabled: true },
rss: { enabled: true, types: ["blog", "changelog"] },
sitemap: true,
robots: true,
structuredData: true,
}
| Opção | Predefinição | Descrição |
|---|---|---|
og.enabled |
automático | Imagens Open Graph por página — ativas quando um URL do site está definido. |
rss.enabled |
true |
Cria feeds para conteúdos de blogue e de changelog. |
rss.types |
["blog", "changelog"] |
Tipos de conteúdo que recebem cada um um feed. |
rss.limit |
50 |
Número máximo de itens por feed. |
sitemap |
true |
Gera o sitemap.xml (precisa de deployment.site). |
robots |
true |
Gera o robots.txt com uma ligação para o Sitemap. |
structuredData |
true |
Emite JSON-LD de schema.org no head de cada página. |
Estes funcionam melhor com um deployment.site absoluto, para URLs completos.
Índice da página
O esquema “nesta página” está ativo por predefinição e lista os cabeçalhos H2–H3. Desativa-o, ou altera o intervalo de cabeçalhos, com toc:
export default defineConfig({
toc: false, // hide it everywhere
});
Ou, em alternativa, restringe o intervalo de cabeçalhos:
export default defineConfig({
toc: { minHeadingLevel: 2, maxHeadingLevel: 4 },
});
Opções de funcionalidades
Cada uma delas tem o seu próprio guia. O campo de configuração é o ponto de entrada:
| Campo | O que configura | Guia |
|---|---|---|
theme |
Cor de destaque, raio dos cantos, tipos de letra, modo claro/escuro | Temas |
navigation |
Barra lateral explícita e separadores do cabeçalho | Navegação |
search |
Fornecedor (Orama, Pagefind, Algolia, entre outros) e indexação | Pesquisa |
markdown |
Opções de renderização de Markdown — blocos de código, âncoras de cabeçalhos, zoom em imagens | Sintaxe |
ai |
llms.txt, Ask AI e o servidor MCP alojado para agentes de programação |
IA |
analytics |
Vercel, PostHog e scripts personalizados | Análises |
seo |
Metadados, imagens OG, feeds, dados estruturados | SEO |
deployment |
Modo de saída, adaptador e URL do site | Implementação |
redirects |
Redirecionamentos permanentes e temporários | Implementação |
integrations |
Integrações do Astro acrescentadas depois das integradas do Blume | Personalização |
Precedência
As definições são resolvidas da prioridade mais baixa para a mais alta, para que só tenhas de substituir o que precisas:
Predefinições do Blume
Um valor predefinido sensato para cada campo.
blume.config.ts
Meta da pasta
meta.ts para o título e a ordenação de uma secção.
Frontmatter da página
As substituições por página prevalecem.