github-timeline.frangolab.com · Comece agora · Badge · Como contribuir
O gráfico de contribuições mostra quanto alguém programou. O GitHub Timeline conta o quê: digite um username e veja a trajetória ano a ano, com as linguagens que chegaram, os projetos que ganharam stars, as viradas de stack e os marcos que ficam escondidos numa lista de repositórios.
Nada é escrito à mão nem inventado. Cada frase sai dos dados públicos do GitHub.
Não precisa instalar nada. Troque <username> pelo perfil que quiser:
| Quero… | Endereço |
|---|---|
| ver a timeline de alguém | https://github-timeline.frangolab.com/u/<username> |
| comparar dois perfis | https://github-timeline.frangolab.com/u/<a>...<b> |
| uma imagem para compartilhar | https://github-timeline.frangolab.com/u/<username>/card.png |
| um badge para o README | https://github-timeline.frangolab.com/badge/<username>.svg |
A primeira visita a um perfil dispara a coleta, e a página mostra o progresso ao vivo. Daí em diante o snapshot fica salvo e abre na hora.
- Manchete: o perfil resumido numa frase, como "9 anos de código. De Python a Go." ou "12k ★ em seu-projeto."
- Capítulos por ano: o que estreou em cada ano (linguagens, topics) e os repositórios em destaque, ordenados por stars, forks, descrição e atividade.
- Contribuições reais: grade mensal com os dados do calendário de contribuições do GitHub, inclusive em organizações.
- Conquistas: primeiro repo, primeiro fork, 100 e 1.000 stars, poliglota, ano recorde, uma década de código e outras.
- Organizações: perfis de organização mostram os maiores contribuidores.
- Dois temas: claro e escuro, seguindo o sistema ou a sua escolha, em layout pensado também para celular.
Junte dois usernames com ... e veja os dois lado a lado: números, linguagens em comum, quem estreou primeiro e um resumo do duelo.
https://github-timeline.frangolab.com/u/torvalds...gvanrossum
Toda timeline tem um PNG 1200×630, já usado nas meta tags Open Graph. Colou o link no LinkedIn, no X ou no Discord, a prévia aparece sozinha.
/u/<username>/card.png?tema=claro&variante=numero
| Parâmetro | Valores | Padrão |
|---|---|---|
tema |
escuro, claro |
escuro |
variante |
headline (manchete), numero (total de repositórios) |
headline |
Um selo que se atualiza sozinho e leva quem clicar direto para a sua timeline:
[](https://github-timeline.frangolab.com/u/seu-username)O badge mostra o intervalo de anos e o total de repositórios, por exemplo 2019–2026 · 83 repos.
Os mesmos dados da página, em JSON:
| Rota | Retorna |
|---|---|
GET /api/profile/<username> |
snapshot completo (manchete, anos, linguagens, conquistas…) |
GET /api/status/<username> |
progresso da coleta via Server-Sent Events |
GET /healthz |
estado do servidor e cota restante da API do GitHub |
curl -s https://github-timeline.frangolab.com/api/profile/torvalds | jq .headlineusername ─▶ coleta (REST + GraphQL) ─▶ snapshot no SQLite ─▶ páginas SSR, card PNG, badge SVG
- Coleta: o servidor busca perfil, repositórios públicos, organizações e o calendário de contribuições com o próprio token.
- Derivação: anos, linguagens, manchete e conquistas são calculados a partir dos metadados (datas de criação e push, linguagem, topics, stars, forks, homepage).
- Snapshot: o resultado fica guardado por 12 h. Depois disso, a próxima visita coleta de novo.
- Render: páginas renderizadas no servidor com Hono, card desenhado com Satori + resvg, badge em SVG puro.
- Só dados públicos: repositórios privados nunca aparecem.
- No máximo 3 coletas simultâneas e 10 timelines novas por IP a cada 10 minutos. Perfis já salvos não contam.
- Com menos de 10% da cota do GitHub, o servidor serve só snapshots salvos e avisa quando o dado está antigo.
- Visitas guardam apenas username, dia e um hash diário do IP, por 30 dias. Servem para a seção "Em alta".
TypeScript · Hono (rotas e JSX no servidor) · SQLite via better-sqlite3 · Satori + resvg (card PNG) · Vitest · Docker. Fontes Mona Sans e JetBrains Mono hospedadas no próprio servidor, sem dependência de CDN.
Contribuições são muito bem-vindas! Encontrou um bug, pensou numa conquista nova ou numa forma melhor de contar a história de um perfil? Abra uma issue ou mande um pull request; o guia Como contribuir mostra como rodar o projeto na sua máquina.
Feito por @Moscarde · se o projeto te ajudou, deixe uma ⭐