O JobScouter resolve um problema pratico: buscar vagas em multiplas fontes, reduzir ruido de dados e transformar volume em decisao.
Em vez de apenas baixar anuncios, o sistema:
- centraliza a coleta de vagas;
- aplica filtros de negocio para remover ruido cedo;
- enriquece o resultado com analise de compatibilidade por IA;
- disponibiliza dados estruturados via API e dashboard web.
Jornada do dado de ponta a ponta:
Ingestao (Legacy Core)
-> coleta e deduplica vagas por fonte/URL
Analise (Legacy Core)
-> aplica filtros estaticos e, quando elegivel, score por IA
API Service (FastAPI)
-> expoe consulta e gatilhos de sincronizacao de forma estruturada
Dashboard (Next.js)
-> interface para visualizar e gerenciar oportunidades
Componentes principais:
BaseScraper: contrato comum para novas fontes.RemoteOKScrapereRemotarScraper: conectores de ingestao.JobIngestionService: persistencia idempotente.JobFilterService: filtros estaticos por palavras-chave.ProfileEnricher: expande ossearch_termsconfigurados via Gemini antes da busca.AIAnalyzerService: compatibilidade por Gemini.
Antes de iniciar a ingestao, os search_terms do FilterConfig sao expandidos automaticamente via Gemini:
- Frameworks/bibliotecas: adiciona alternativas do mesmo tipo (ex:
Django→Flask,FastAPI). - Linguagens: adiciona os principais frameworks associados (ex:
Python→Django,Flask,FastAPI). - Conceitos genericos (
fullstack,backend, etc.): sem expansao.
O scraper e chamado uma vez por termo efetivo (originais + adicionados pela IA). A validacao de assertividade continua usando filter_config.include_keywords diretamente — nao os termos de busca expandidos.
Sem GEMINI_API_KEY, ou em caso de falha na chamada, o sistema usa os termos originais sem interrupcao.
cp .env.example .env
docker compose up -d --buildServicos disponiveis apos subir:
- Entrada unica (NGINX):
http://localhost - Frontend via proxy:
http://localhost/ - API via proxy:
http://localhost/api/v1 - Swagger via proxy:
http://localhost/docs
Modo local (sem stack completa de containers):
make run-back # apenas backend (inclui bootstrap + API)
make run-front # apenas frontend
make run-dev # backend + frontend locais (db via compose)
make down # derruba os servicos do composeOperacoes uteis no modo containerizado:
docker compose logs -f
docker compose downO projeto usa .env na raiz (backend e frontend).
Variaveis essenciais:
| Variavel | Obrigatoria | Default | Uso |
|---|---|---|---|
APP_ENV |
Nao | development |
Ambiente de execucao; em production a API desabilita /docs e /openapi.json |
DATABASE_URL |
Sim | postgresql+psycopg://postgres:postgres@localhost:5432/jobscouter |
Persistencia da API/CLI |
LOG_LEVEL |
Nao | INFO |
Nivel de log |
REQUEST_TIMEOUT |
Nao | 20 |
Timeout de requisicao HTTP |
REMOTEOK_API_URL |
Nao | https://remoteok.com/api |
Fonte RemoteOK |
REMOTAR_BASE_URL |
Nao | https://remotar.com.br |
Fonte Remotar |
REMOTAR_API_URL |
Nao | https://api.remotar.com.br |
Fonte Remotar |
GEMINI_API_KEY |
Sim (analise IA e expansao de termos) | - | Chave Gemini; sem ela, analise IA e expansao de termos sao desativadas |
GEMINI_MODEL |
Nao | models/gemini-2.5-flash-lite |
Modelo preferencial; deve ser da familia gemini-2.5-flash-lite ou gemini-2.5-flash — modelos fora dessa allowlist sao ignorados com aviso no log |
GEMINI_RETRY_DELAY_SECONDS |
Nao | 1.5 |
Retry em rate limit |
DATABASE_URL_DOCKER |
Nao | postgresql+psycopg://postgres:postgres@db:5432/jobscouter |
URL do banco usada no servico backend do Compose |
POSTGRES_DB |
Nao | jobscouter |
Nome do banco no servico db |
POSTGRES_USER |
Nao | postgres |
Usuario do banco no servico db |
POSTGRES_PASSWORD |
Sim | - | Senha do banco no servico db (defina valor forte) |
NEXT_PUBLIC_API_BASE_PATH |
Nao | /api/v1 |
Base relativa da API no frontend |
NEXT_PUBLIC_API_BASE_URL |
Nao | vazio | URL do backend para rewrite no modo local sem NGINX |
Observacao: para ambiente de producao, defina APP_ENV=production para desabilitar publicamente os endpoints de documentacao da API (/docs, /openapi.json e /redoc).
Observacao: no build do backend via Compose, APP_ENV=production instala o pacote em modo nao-editavel; em outros ambientes, usa install editavel para favorecer hot reload de desenvolvimento.
Observacao: para frontend em modo dev no container (next dev), alterar NEXT_PUBLIC_* exige reiniciar o container frontend para recarregar o ambiente. Em fluxo de build/producao (next build), essas variaveis sao build-time e exigem rebuild da imagem.
Embora o JobScouter ofereca experiencia completa via API + Dashboard, os modulos de ingestao e analise podem rodar de forma independente para pipelines customizados.
jobscouter-ingest --source all --limit 20
jobscouter-ingest --source remoteok --keyword django --limit 10jobscouter-analyze --limit 20Regras de status utilizadas no fluxo:
pending: sem match de include/exclude.ready_for_ai: passou no filtro e segue para IA.discarded: vetada por palavra excluida.analyzed: analise concluida.
Endpoints principais:
GET /api/v1/jobsPOST /api/v1/control/sync/ingestPOST /api/v1/control/sync/analyzeGET /api/v1/configPATCH /api/v1/config
Query params suportados em GET /api/v1/jobs:
page(opcional, default:1, minimo:1)size(opcional, default:50, minimo:1, maximo:100)status(opcional:pending,ready_for_ai,discarded,analyzed)min_score(opcional)
Exemplo de requisicao:
curl "http://127.0.0.1:8000/api/v1/jobs?page=2&size=20&status=analyzed&min_score=1"Exemplo de resposta:
{
"items": [
{
"id": 101,
"title": "Python Developer",
"company": "Acme",
"url": "https://example.com/jobs/101",
"description_raw": "...",
"status": "analyzed",
"ai_score": 8,
"ai_summary": "Boa aderencia para backend Python.",
"ai_analysis_at": "2026-03-28T18:20:31Z"
}
],
"total": 240,
"page": 2,
"size": 20
}Detalhes de desenvolvimento do dashboard Next.js (variaveis, scripts e comportamento de paginacao por URL) estao em web/README.md.
make lint
make test
make lint-front
make test-frontObs.: no estado atual, make test-front roda um placeholder definido em web/package.json.
- Multi-nicho: estrutura pronta para expansao alem de vagas de tech.
- Novas fontes: onboarding de provedores adicionais com
BaseScraper. - IA de matching: evoluir para comparacao curriculo vs vaga.
- Maturidade de produto: ampliar observabilidade, testes frontend e deploy automatizado.
Fluxo de colaboracao e padroes de commit estao em CONTRIBUTING.md.
Ao abrir contribuicoes, use os templates:
- Issue de bug: Bug Report
- Issue de feature: Feature Request
- Pull request: PR Template
Este projeto esta sob a licenca MIT. Veja LICENSE.