{"id":50765090,"url":"https://github.com/felipesauer/monitor-sefaz","last_synced_at":"2026-06-11T13:01:30.084Z","repository":{"id":362151661,"uuid":"1257334045","full_name":"felipesauer/monitor-sefaz","owner":"felipesauer","description":"Monitor open-source de disponibilidade dos webservices da SEFAZ (NF-e, NFC-e, CT-e, MDF-e e DC-e) por UF — status em tempo real, sem certificado. Roda como SPA estática no GitHub Pages.","archived":false,"fork":false,"pushed_at":"2026-06-09T23:56:11.000Z","size":440,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T00:08:46.778Z","etag":null,"topics":["brasil","cte","mdfe","monitoring","nfce","nfe","nota-fiscal-eletronica","react","sefaz","status-page","typescript"],"latest_commit_sha":null,"homepage":"https://felipesauer.github.io/monitor-sefaz/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/felipesauer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-02T15:23:56.000Z","updated_at":"2026-06-09T23:56:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/felipesauer/monitor-sefaz","commit_stats":null,"previous_names":["felipesauer/monitor-sefaz"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/felipesauer/monitor-sefaz","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipesauer%2Fmonitor-sefaz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipesauer%2Fmonitor-sefaz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipesauer%2Fmonitor-sefaz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipesauer%2Fmonitor-sefaz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/felipesauer","download_url":"https://codeload.github.com/felipesauer/monitor-sefaz/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipesauer%2Fmonitor-sefaz/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34199516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brasil","cte","mdfe","monitoring","nfce","nfe","nota-fiscal-eletronica","react","sefaz","status-page","typescript"],"created_at":"2026-06-11T13:01:29.134Z","updated_at":"2026-06-11T13:01:30.085Z","avatar_url":"https://github.com/felipesauer.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 📡 Monitor SEFAZ\n\n**Status em tempo real dos webservices da SEFAZ — NF-e, NFC-e, CT-e, MDF-e e DC-e, por UF.**\n\n[![Site](https://img.shields.io/badge/site-online-22c55e?style=flat-square)](https://felipesauer.github.io/monitor-sefaz/)\n[![License: MIT](https://img.shields.io/badge/license-MIT-4f46e5?style=flat-square)](LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178c6?style=flat-square\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![Deploy](https://img.shields.io/badge/GitHub%20Pages-deploy-181717?style=flat-square\u0026logo=github)](https://felipesauer.github.io/monitor-sefaz/)\n\n[**🌐 Acessar o monitor →**](https://felipesauer.github.io/monitor-sefaz/)\n\n\u003c/div\u003e\n\n---\n\nMonitor open-source de disponibilidade dos serviços de documentos fiscais\neletrônicos brasileiros. Coleta o status de cada autorizador da **página oficial\nde disponibilidade da SEFAZ** (pública, **sem certificado digital**), classifica\no resultado e exibe num dashboard limpo, com tema claro/escuro e histórico de\nuptime — inspirado no [monitorsefaz.com.br](https://monitorsefaz.com.br).\n\n## 🎯 Para quem é\n\n- **Quem emite nota fiscal** e precisa saber, num relance, se a SEFAZ do seu\n  estado está no ar antes de transmitir.\n- **Times de TI / ERPs** que querem um painel de disponibilidade próprio,\n  self-hosted ou estático, sem depender de serviços de terceiros.\n- **Desenvolvedores** que precisam de um motor TypeScript reutilizável para\n  consultar o status dos webservices da SEFAZ.\n\n## 📋 O que ele monitora\n\nOs **5 documentos fiscais eletrônicos**, nas **27 UFs**, resolvendo automaticamente\nqual autorizador atende cada estado (próprio, SVRS, SVAN…):\n\n| Documento | Descrição |\n| --------- | --------- |\n| 🧾 **NF-e**  | Nota Fiscal Eletrônica (modelo 55) |\n| 🛒 **NFC-e** | Nota Fiscal de Consumidor Eletrônica (modelo 65) |\n| 🚚 **CT-e**  | Conhecimento de Transporte Eletrônico |\n| 📦 **MDF-e** | Manifesto Eletrônico de Documentos Fiscais |\n| 📄 **DC-e**  | Declaração de Conteúdo eletrônica |\n\n### Estados\n\n| cStat | Estado | Cor |\n| ----- | ------ | --- |\n| 107 | Operacional | 🟢 verde |\n| 108 | Instável | 🟡 amarelo |\n| 109 | Indisponível | 🔴 vermelho |\n| — | Sem dados | ⚪ cinza |\n\n## 🚀 Como usar\n\nA forma mais simples é abrir o site:\n\n### 🌐 **[felipesauer.github.io/monitor-sefaz](https://felipesauer.github.io/monitor-sefaz/)**\n\nOs dados são atualizados automaticamente a cada 15 minutos por um GitHub Actions.\nClique em qualquer serviço para ver o histórico de uptime e latência.\n\n## ⚙️ Rodando localmente\n\nRequer **Node 20+** e **pnpm**.\n\n```bash\npnpm install\n\n# Gera os dados de status (consulta a SEFAZ real)\npnpm --filter @monitor-sefaz/collector collect \"$PWD/apps/web/public/data\"\n\n# Sobe o dashboard em http://localhost:5173\npnpm --filter @monitor-sefaz/web dev\n```\n\n### 📦 Três modos de deploy\n\nO mesmo motor de coleta (`@monitor-sefaz/core`) alimenta três formas de rodar:\n\n| Modo | Como funciona | Infra |\n| ---- | ------------- | ----- |\n| **SPA estática** (GitHub Pages) | Um GitHub Actions coleta e commita JSONs; a SPA só os lê | Nenhuma |\n| **Cloudflare Worker** | Worker faz o scraping ao vivo com CORS; SPA consome | Serverless |\n| **Self-host** | API Fastify + Redis + scheduler, servindo o dashboard | Docker |\n\n```bash\n# Self-host completo (API + Redis + dashboard)\ndocker compose up --build       # http://localhost:3333\n\n# Cloudflare Worker (requer `wrangler login`)\npnpm --filter @monitor-sefaz/worker deploy\n```\n\n### 🔧 Scripts\n\n| Comando | Descrição |\n| ------- | --------- |\n| `pnpm dev` | Sobe os apps em modo desenvolvimento |\n| `pnpm build` | Builda todos os pacotes/apps |\n| `pnpm test` | Roda os testes (Vitest) |\n| `pnpm typecheck` | Checagem de tipos (project references) |\n| `pnpm lint` | ESLint |\n| `pnpm --filter @monitor-sefaz/collector collect \u003cdir\u003e` | Gera `status.json` / `summary.json` / `history.json` |\n\n### 🔐 Variáveis de ambiente\n\nVeja [`.env.example`](.env.example). As principais:\n\n| Variável | Padrão | Uso |\n| -------- | ------ | --- |\n| `VITE_API_BASE_URL` | _(vazio)_ | Front: definido → API/Worker ao vivo; vazio → JSONs estáticos |\n| `STATUS_SOURCE` | `availability` | Self-host: `availability` (scraping) ou `soap` |\n| `REDIS_URL` | `redis://localhost:6379` | Self-host |\n| `SEFAZ_CERT_PATH` / `SEFAZ_CERT_PASSPHRASE` | _(vazio)_ | Certificado A1 para o modo `soap` (mTLS) |\n\n## 🏗️ Arquitetura\n\nMonorepo TypeScript (**pnpm + Turborepo**), em classes seguindo SOLID e Clean\nCode. Interface em PT-BR; código, contratos e APIs em inglês.\n\n```\npackages/\n  catalog/     dados do MOC: UFs, cStat, endpoints e mapa UF→autorizador\n  core/        motor: AvailabilityCollector (scraping) + SOAP (Envelope/Parser/Checker)\n  contracts/   schemas Zod + DTOs compartilhados (single source of truth)\napps/\n  collector/   CLI → gera os JSONs versionados (usado pelo GitHub Actions)\n  worker/      Cloudflare Worker → scraping ao vivo com CORS\n  api/         Fastify self-host → scheduler + REST + SSE + Redis\n  web/         React + Vite → status page (fonte de dados plugável)\n```\n\n\u003e **Como obtém os dados sem certificado:** a SEFAZ publica uma página oficial de\n\u003e disponibilidade (`disponibilidade.aspx`), pública e sem mTLS. O monitor faz o\n\u003e scraping dela — a mesma estratégia de monitores públicos. MDF-e e DC-e são\n\u003e centralizados no SVRS, então derivam do estado desse autorizador.\n\n## 🧪 Testes\n\n```bash\npnpm test\n```\n\nAs respostas da SEFAZ são mockadas por fixtures em `packages/core/test/fixtures/`\n— o CI **nunca** bate na SEFAZ real.\n\n## 🤝 Contribuindo\n\nContribuições são bem-vindas! Veja o [CONTRIBUTING.md](CONTRIBUTING.md) para o\nfluxo de desenvolvimento, padrões de código e como adicionar um novo documento\nou autorizador. Encontrou uma falha de segurança? Veja [SECURITY.md](SECURITY.md).\n\n## 🧰 Tech Stack\n\n**Core / Back-end:** TypeScript · Fastify · ioredis · cheerio · axios · Zod\n**Front-end:** React · Vite · TanStack Query\n**Infra:** pnpm · Turborepo · Vitest · Docker · Cloudflare Workers · GitHub Actions\n\n## ❓ Perguntas frequentes\n\n**Preciso de certificado digital A1?**\nNão para o uso padrão — a fonte é a página pública de disponibilidade. O\ncertificado só é necessário no modo `soap` (consulta direta aos webservices).\n\n**Os dados são em tempo real?**\nNo GitHub Pages, atualizam a cada 15 min (cron do Actions). Nos modos Worker e\nself-host, são ao vivo / a cada checagem do scheduler.\n\n**Posso hospedar a minha própria instância?**\nSim — em qualquer um dos três modos. Faça um fork e ajuste a URL do Pages, ou\nsuba via Docker / Cloudflare.\n\n**Por que homologação não aparece?**\nA página pública da SEFAZ só cobre produção. Homologação só é alcançável pelo\nmodo `soap` (com rede e certificado).\n\n## 📄 Licença\n\n[MIT](LICENSE) © Felipe Sauer\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nDados: [Portal Nacional da NF-e](https://www.nfe.fazenda.gov.br/portal/disponibilidade.aspx) ·\nprojeto independente, **não afiliado** à SEFAZ ou à Receita Federal.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipesauer%2Fmonitor-sefaz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelipesauer%2Fmonitor-sefaz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipesauer%2Fmonitor-sefaz/lists"}