Ranking real das universidades brasileiras com base na nota contínua do ENADE.
O MEC publica o Conceito Enade como nota inteira de 1 a 5. Isso esconde diferenças enormes: dois cursos com notas 2.95 e 3.94 recebem o mesmo Conceito 4. O OpenEnade expõe a nota contínua real, permitindo comparações justas entre instituições.
- 78 cursos em 4 ciclos avaliativos (2019, 2021, 2022, 2023)
- 34 mil+ avaliações institucionais
- Fonte: INEP/MEC (dados públicos)
openenade/
etl/ Pipeline Python/Polars (XLSX -> JSON)
web/ Frontend React 19 + Vite + TypeScript
Pipeline ETL que processa os XLSX do INEP e gera JSON estático por curso/ano.
cd etl
uv sync --dev
uv run pytest -v # 31 testes (95% cobertura)
uv run python -m src.pipeline \
data/raw/conceito_enade_2023.xlsx \
data/outputEtapas: ingest (XLSX) -> transform (normalização de colunas) -> normalize (rede, modalidade, texto) -> rank (posição nacional) -> export (JSON por curso).
Por que ETL e não ELT: os dados do INEP têm inconsistências entre anos (nomes de colunas, separadores decimais, nomes de planilhas). Transformamos antes de disponibilizar para garantir dados limpos desde o primeiro acesso.
SPA estática que consome os JSON gerados pelo ETL.
cd web
npm install
npm run dev # http://localhost:5173
npm run build # dist/
npm run lintStack: React 19, Vite 7, TypeScript 5.9, Tailwind 4, i18next (PT/EN), Recharts, @joivo/design-system.
Páginas:
/- Busca de cursos + ranking com filtros (UF, rede, faixa) + comparação entre IES/comparar- Comparação lado a lado com métricas e gráfico de evolução/sobre- Projeto, história, time/metodologia- Ciclo avaliativo, pipeline de dados, links para datasets originais
GitHub Actions (ci.yml) roda em push/PR para main:
| Job | O que faz |
|---|---|
| ETL Tests | uv sync --dev && uv run pytest -v (31 testes, 95% cobertura) |
| Web Build | npm ci && npm run build (tsc + vite) |
| Web Lint | npm ci && npm run lint (eslint) |
| i18n Parity | Verifica que pt.json e en.json têm as mesmas chaves |
O npm run build gera, alem do bundle Vite:
dist/sitemap.xml-- 108 URLs indexaveisdist/og/*.png-- 106 imagens 1200x630 para previews sociais (satori + resvg)worker/src/courses.ts-- metadados dos cursos para o Worker
Alem disso: robots.txt (bloqueia /comparar), SeoHead com og:image, twitter:card e JSON-LD por pagina.
Um Cloudflare Worker intercepta bots sociais e retorna HTML com meta tags corretas sem SSR. Detalhes em worker/README.md.
cd web && npm run build
cd .. && npx wrangler deployProjeto final da disciplina de Engenharia de Software, Ciência da Computação, UFCG (2019). Originalmente chamado RUE (Ranking Universitário Enade). Ressuscitado em abril de 2026 por @joivo com arquitetura nova.
Código: MIT. Dados: INEP/MEC (domínio público).