Logo
Overview

Como criar um blog com Astro e GitHub Pages

February 13, 2026
4 min read

O que é o Astro?

O Astro é um framework web moderno, otimizado para sites focados em conteúdo como blogs, documentação e portfólios. A grande diferença dele para frameworks como Next.js ou Nuxt é que o Astro envia zero JavaScript por padrão — seu site é HTML puro, super rápido.

Tip

O Astro usa a arquitetura de ilhas (Islands Architecture): somente os componentes que precisam de interatividade recebem JavaScript. Todo o resto é HTML estático.

Estrutura de um projeto Astro

Quando você cria um projeto Astro, a estrutura de pastas é assim:

Terminal window
meu-blog/
├── public/ # Arquivos estáticos (fontes, imagens, favicon)
├── src/
├── components/ # Componentes reutilizáveis (.astro)
├── content/ # Conteúdo do blog (posts em .md/.mdx)
├── blog/ # Posts do blog
└── authors/ # Perfis de autores
├── layouts/ # Templates de página
├── pages/ # Rotas do site (cada arquivo = uma página)
└── styles/ # CSS global
├── astro.config.ts # Configuração do Astro
├── package.json # Dependências
└── tsconfig.json # Configuração TypeScript

Como funciona o conteúdo?

Content Collections

O Astro usa o conceito de Content Collections — coleções tipadas de conteúdo. No nosso blog, temos três coleções:

  • blog — posts do blog (arquivos .md ou .mdx)
  • authors — perfis de autores
  • projects — projetos para o portfólio

Cada coleção tem um schema definido com Zod, que valida o frontmatter automaticamente:

src/content.config.ts
const blog = defineCollection({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
schema: ({ image }) =>
z.object({
title: z.string(),
description: z.string(),
date: z.coerce.date(),
tags: z.array(z.string()).optional(),
authors: z.array(z.string()).optional(),
draft: z.boolean().optional(),
}),
})

Escrevendo um post

Para criar um novo post, basta criar uma pasta dentro de src/content/blog/ com um arquivo index.mdx:

Terminal window
src/content/blog/
└── meu-primeiro-post/
└── index.mdx

O conteúdo do arquivo usa frontmatter (metadados no topo entre ---) seguido do conteúdo em Markdown:

src/content/blog/meu-primeiro-post/index.mdx
---
title: 'Meu Primeiro Post'
description: 'Uma descrição curta do post.'
date: 2026-02-13
tags: ['exemplo']
authors: ['fabricio']
---
Aqui começa o conteúdo do post em **Markdown**!
Note

O campo authors referencia os IDs dos arquivos em src/content/authors/. Por exemplo, ['fabricio'] referencia o arquivo src/content/authors/fabricio.md.

Usando MDX: Markdown com superpoderes

Arquivos .mdx permitem usar componentes dentro do Markdown. Por exemplo, este callout que você está vendo é um componente:

import Callout from '@/components/Callout.astro'
<Callout variant="warning">
Cuidado com este trecho!
</Callout>

Tipos de callout disponíveis: note, tip, warning, danger, example, quote.

Deploy no GitHub Pages

Passo 1: Repositório no GitHub

Crie um repositório no GitHub (pode ser privado). O nosso está em:

https://github.com/fabricioctelles/blog.ft.ia.br

Passo 2: GitHub Actions (deploy automático)

O arquivo .github/workflows/deploy.yml configura o deploy automático. Toda vez que você faz git push na branch main, o GitHub:

  1. Faz checkout do código
  2. Instala dependências (npm ci)
  3. Executa astro build
  4. Publica os arquivos estáticos no GitHub Pages
Tip

Você não precisa configurar nada manualmente. O workflow já está pronto neste repositório!

Passo 3: Configurar o domínio personalizado

Para usar um domínio como blog.ft.ia.br:

  1. No seu provedor DNS, crie um registro CNAME apontando para fabricioctelles.github.io
  2. No GitHub, vá em Settings → Pages → Custom domain e configure blog.ft.ia.br
  3. No repositório, o arquivo public/CNAME já contém o domínio

Passo 4: Ativar GitHub Pages

No repositório do GitHub:

  1. Vá em SettingsPages
  2. Em Source, selecione GitHub Actions
  3. Pronto! O deploy acontecerá automaticamente

Fluxo de trabalho diário

Para publicar um novo post, o processo é simples:

Terminal window
# 1. Criar a pasta do post
mkdir -p src/content/blog/nome-do-post
# 2. Criar o arquivo do post
# (edite o index.mdx com seu conteúdo)
# 3. Testar localmente
npm run dev
# Acesse http://localhost:1234
# 4. Publicar
git add .
git commit -m "novo post: Nome do Post"
git push
# Deploy automático em ~2 minutos!
Warning

Para testar localmente, use npm run dev — o site estará disponível em http://localhost:1234. Verifique sempre antes de publicar!

Funcionalidades do template

Este template já vem com:

  • Syntax highlighting — blocos de código com tema, numeração de linhas e seções colapsáveis
  • KaTeX — renderização de fórmulas matemáticas (E=mc2E = mc^2)
  • Table of Contents — índice lateral automático baseado nos headings
  • Tags — categorização de posts com navegação por tag
  • RSS — feed RSS automático em /rss.xml
  • Sitemap — mapa do site em /sitemap-index.xml
  • SEO — meta tags, Open Graph e canonical URLs
  • Dark mode — tema claro/escuro automático
  • Responsivo — funciona perfeitamente em mobile
  • Subposts — posts hierárquicos (parent/child)
  • Múltiplos autores — suporte a vários autores por post

Próximos passos

Agora que você entende a estrutura, é hora de criar conteúdo! Nos próximos posts, vou explorar mais funcionalidades avançadas do Astro e como personalizar ainda mais o blog.