Codync
A free, open-source 1:1 alternative to Grok Bot and Muse. Message Claude Code, Codex, Cursor and 40+ coding agents as persistent bots from your iPhone, Mac or Linux desktop. Group chats, threads, appr
Desenhe a topologia da sua rede direto no navegador. Exporte em PDF, PNG ou SVG e compartilhe por link.
Translation pending
Developer toolsJavaScript · CSSGitHub @iago069Latest connection check failedOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Grafo: diagramas de rede para provedores (topologia, racks, FTTH) no navegador. Código aberto, AGPL-3.0.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Gerador Rápido Automatizado de Fluxos Organizados — monta diagramas de topologia de rede (OLTs, switches, roteadores, ONUs, servidores, nobreaks…) direto no navegador, a partir dos equipamentos e cabos que você cadastra. Cada pessoa entra com a própria conta e os projetos ficam salvos na nuvem.
Acesse: https://thegrafo.vercel.app
Conta e nuvem
Diagrama
10 gbps → 10G, 2,5g → 2.5G, 100 Mb → 100M).Edição
Shift/Ctrl + clique soma ou tira; Shift + arrastar numa área vazia desenha um retângulo; Ctrl+A seleciona tudo. Os selecionados andam juntos (mouse ou setas), e uma barra mostra Duplicar, Copiar e Excluir.Ctrl+C / Ctrl+V, ou Ctrl+D para duplicar): as cópias ganham nomes novos ("SW-CORE (cópia)"), levam junto os cabos entre elas e respeitam o limite de 35. Dá para colar em outro projeto.Ctrl+Z / Ctrl+Y).Navegação
Projetos e interface
n/35) e aviso ao atingir o limite.Esqueceu a senha? Na tela de login, clique em Esqueci minha senha e siga o link do e-mail.
| Onde | Tecla | Ação |
|---|---|---|
| Qualquer lugar | Ctrl+S | Exportar o projeto (.json) |
| Diagrama | Ctrl+Z / Ctrl+Y (ou Ctrl+Shift+Z) | Desfazer / refazer |
| Diagrama | Ctrl+A | Selecionar todos os equipamentos |
| Diagrama | Shift/Ctrl + clique · Shift + arrastar no vazio | Somar à seleção · retângulo de seleção |
| Seleção | Ctrl+C / Ctrl+V / Ctrl+D | Copiar / colar / duplicar |
| Seleção | Delete | Excluir os selecionados (e os cabos deles) |
| Seleção | Esc | Limpar a seleção |
| Arrastando | Alt | Mover livre, sem grudar nas guias de alinhamento |
| Equipamento selecionado | Enter / F2 | Abrir o editor |
| Equipamento selecionado | ← ↑ → ↓ | Mover a seleção 10 px (Shift + seta: 50 px) |
| Anotação | duplo clique / Enter · Ctrl+Enter na janela | Editar · salvar |
| Cabo selecionado | Enter / F2 | Abrir o editor |
| Busca | Enter / Shift+Enter | Próximo / anterior resultado |
| Busca | Esc | Limpar a busca |
| Janelas | Esc | Fechar |
Ao criar um projeto (botão +), escolha o tipo de diagrama. Dá para trocar depois no seletor que fica no lugar do título, na barra do diagrama. O tipo fica salvo no projeto ("modo" no JSON: topologia, redes ou monitoramento); projetos sem ele são Topologia.
| Tipo | O equipamento mostra | Legenda | Destaques |
|---|---|---|---|
| Topologia | nome, modelo, tipo, IP, portas e status | por tipo | — |
| Diagrama de redes | nome, IP, VLAN / rede, tipo | por tipo | campo VLAN / rede nos formulários |
| Monitoramento | nome, tipo, IP e uma faixa colorida com o status | contagem por status ("3 ativos · 1 offline") | cabo ligado a equipamento offline fica vermelho e tracejado |
Cada tipo também põe primeiro, na lista de Tipo, os equipamentos que fazem sentido para ele (Monitoramento: câmera, NVR, controle de acesso…; Redes: RB/CCR, switch, OLT…). O PDF/PNG/SVG exportado mostra o tipo no cabeçalho, e o nome do arquivo leva -rede ou -monitoramento. O status é o que você marca em cada equipamento (ativo, manutenção, offline); o Grafo não testa os IPs sozinho.
Monta a rede por cima dos municípios (Editar diagrama → Mapa de regiões).
POP-TPA01 → Tapera, pela tabela CNL em data/cnl-siglas.json — ou a cidade escrita no nome) e já põe cada equipamento dentro da sua cidade. Precisa de internet.100G · 20 km); o Grafo nunca calcula quilômetros pelo desenho.O mapa fica salvo no projeto (inclusive a imagem) e sai no PDF, PNG e SVG. Camadas: Mapa e Nome das cidades. Modelo pronto: Rota 100G no mapa (exemplo do PDF de Ibirubá a Boqueirão do Leão, com pendências de revisão na nota).
Disposição física dos equipamentos nos racks — independente do diagrama lógico (IP, VLAN e rotas continuam no diagrama). Crie um projeto do tipo Bayface de Racks (ou troque o tipo de um projeto existente no seletor da barra do diagrama: o diagrama lógico fica guardado e volta quando você troca de novo).
ge1/), largura, profundidade, observações e, opcionalmente, o equipamento do diagrama lógico que ele representa.assets/js/comum/esquema.js): nada passa do topo nem abaixo de U1; duas peças não dividem a mesma U, exceto uma só frente com uma só traseira; peças de várias U ocupam todas elas; posição inválida mostra o motivo e não grava.Os racks ficam no próprio projeto (racks e cabosRack no JSON): salvam no navegador e na nuvem, entram no desfazer, no histórico de versões, nos projetos de equipe e no backup. Limites: 60 racks por projeto, 120 equipamentos por rack, 3000 cabos físicos. O link “Compartilhar” (só leitura) mostra o diagrama lógico.
Projeto → Exportar projeto (.json) e Importar projeto (.json) na barra lateral. A importação cria um projeto novo. Também dá para colar o JSON em Projeto → JSON e CSV → Aplicar JSON (isso substitui o projeto aberto; o ↶ desfaz).
Formato:
{
"projeto": "Meu POP",
"equipamentos": [
{ "id": "olt1", "nome": "OLT-01", "tipo": "OLT", "modelo": "DM4610", "ip": "10.0.0.10", "grupo": "POP Centro", "status": "ativo" },
{ "id": "sw1", "nome": "SW-CORE", "tipo": "Switch", "ip": "10.0.0.2", "grupo": "POP Centro", "status": "manutencao" }
],
"conexoes": [
{ "de": "sw1", "para": "olt1", "tipo": "Fibra", "saida": "sfp2", "chegada": "xe1/1/1", "potencia": "10G", "cor": "#5A7284", "grossura": 2, "estilo": "solid" }
]
}
| Campo | Regras |
|---|---|
id, nome | Obrigatórios; id não pode repetir |
ip | IPv4 ou IPv6, com máscara opcional (10.0.0.0/24) |
status | ativo, manutencao ou offline (aceita "Manutenção", "OFFLINE"…) |
estilo | solid, dashed ou dotted (aceita "contínuo", "tracejado", "pontilhado") |
cor | Formato #1A2B3C |
corIcone (opcional) | Tom do ícone do equipamento, formato #1A2B3C (ex.: switch de core verde). Vazio ou ausente: cores originais. No editor do equipamento: Cor do ícone (marque Original para voltar) |
grossura | De 1 a 10 |
de / para | Precisam ser ids de equipamentos existentes e diferentes entre si |
anotacoes (opcional) | Lista de { "id", "texto", "x", "y", "cor" }: até 50, texto de até 500 caracteres, cor #FFF3B0 (amarelo), #D6ECFF, #DDF5D8, #FFDDE4 ou #ECEFF3 |
Se algo estiver errado, nada é alterado e o app lista cada problema com o item e o campo.
Conexões para equipamentos que não existem (ex.: um cabo de EQ-100 para EQ-999, sem EQ-999 no arquivo) são ignoradas e aparecem num aviso; o restante do arquivo é importado normalmente. O mesmo vale para cabos com origem e destino iguais. Equipamentos sem nenhuma conexão são permitidos.
Limites: 35 equipamentos por diagrama, 2000 cabos e 100 projetos. Um arquivo com mais de 35 equipamentos é recusado.
Na barra lateral, Integração → NetBox e status online:
O site na Vercel não alcança a rede interna, então quem fala com o NetBox e dá o ping é o agente, um programa sem dependências que roda num computador dentro da rede:
cp agente/.env.example agente/.env # preencha NETBOX_URL e NETBOX_TOKEN (token só leitura)
npm run agente # http://localhost:8787
Sem NetBox para testar? npm run netbox-falso sobe uma API falsa em http://localhost:8000 (token teste123) com dois POPs de exemplo; no agente/.env use NETBOX_URL=http://localhost:8000 e NETBOX_TOKEN=teste123. IPs 127.0.0.x respondem ao ping (online) e 10.255.x.x não (offline).
O editor chama http://localhost:8787 (o CSP libera só localhost/127.0.0.1 em http), então o agente deve rodar no mesmo computador em que o Grafo está aberto. ORIGENS limita quais sites podem usá-lo e AGENTE_CHAVE (opcional) exige uma senha.
Em Projeto → JSON e CSV → Importar CSV (o botão Modelo CSV gera um exemplo). Uma linha por cabo; os equipamentos são criados pelos nomes. Linha sem destino cadastra só o equipamento. A importação substitui o projeto aberto (se ele já tiver conteúdo, o Grafo pergunta antes) — o ↶ desfaz.
| Coluna | Também aceita | Exemplo |
|---|---|---|
origem (obrigatória) | de, equipamento, nome | OLT-01 |
destino | para | SW-CORE |
porta_origem / porta_destino | saida / chegada | xe1/1/1 |
ip_origem / ip_destino | ip | 10.0.0.2 |
vlan_origem / vlan_destino | vlan, rede | VLAN 10 · 10.0.0.0/24 |
modelo_origem / modelo_destino | modelo | DM4270 |
tipo_origem / tipo_destino | tipo_equipamento | OLT |
tipo | enlace, cabo | Fibra |
capacidade | potencia, velocidade | 10G |
Separador ;, , ou tab. O arquivo pode estar em UTF-8 ou no formato padrão do Excel em português (Windows-1252). Nomes de coluna não diferenciam maiúsculas nem acentos.
Imagem PNG e Vetor SVG, no menu Exportar acima do diagrama. O arquivo sai com cabeçalho (projeto, data, totais) e legenda.
O botão PDF… (acima do diagrama) abre a barra lateral direita Página e PDF:
| Opção | O que faz |
|---|---|
| Área de desenho (largura × altura) | Limite até onde os equipamentos podem ser arrastados (1000 a 20000 px) |
| Formato | A0, A1, A2, A3, A4 ou A5 |
| Orientação | Retrato ou paisagem |
| Escala | Ajustar à página (tudo numa folha) ou 25% a 200% — com escala fixa, o desenho é dividido em várias páginas, sem cortar nada |
| Margem | 0 a 40 mm |
| Cabeçalho e legenda | Inclui ou não o título, a data, os totais e a legenda |
A prévia mostra as folhas como vão sair (a linha tracejada é a margem) e avisa quando o texto vai ficar pequeno demais para o formato escolhido. Baixar PDF gera o arquivo em vetor: o texto fica nítido em qualquer zoom e pode ser selecionado e pesquisado. Textos com caracteres que a fonte do PDF não tem (emoji, setas, "●") entram como pequenas imagens no mesmo lugar. Se o gerador vetorial não carregar, o PDF sai como imagem de ~200 DPI.
Os projetos ficam na sua conta, no Supabase, e são salvos automaticamente poucos segundos depois de cada mudança. Enquanto você está logado, o navegador mantém uma cópia local separada por usuário; ao clicar em Sair, essa cópia é apagada e os projetos continuam na conta.
Ctrl+S) para guardar também um backup fora da nuvem. Um aviso no topo lembra de fazer isso quando o último backup tem 7 dias ou mais./privacidade, com link no login, no cadastro (aceite obrigatório, guardado na conta) e em Conta. Conta → Baixar todos os meus dados gera um JSON com a conta, os projetos, a biblioteca e as equipes. As fontes ficam em assets/fonts (nada é pedido ao Google). O registro do tratamento, as configurações do painel e o plano para incidentes estão em docs/LGPD.md.O ícone é escolhido pelo tipo ou nome do equipamento, ou manualmente no editor.
| Tipo | Arquivo | Reconhece |
|---|---|---|
| OLT | OLT.png | "olt" |
| Switch | SWITCH.png | "switch" |
| Roteador / MikroTik | MIKROTIK.png | "mikrotik", "roteador", "rb/" |
| ONU / ONT | ONU.svg | "onu", "ont" |
| Servidor | SERVIDOR.svg | "servidor", "server" |
| Nobreak / UPS | NOBREAK.png | "nobreak" |
| Retificador / RPS | RETIFICADOR.png | "retificador", "rps" |
| Ar-condicionado | AR.png | "ar", "hvac", "climatiz…" |
| VOLT | VOLT.png | "volt" |
| Câmera | CAMERA.png | "câmera", "camera" |
Além desses, o quadro de símbolos tem um tipo e um ícone para: Conversor de fibra, Concentrador Hotspot, CX, Decoder, DIO, AP WiFi, POE, UniFi, NVR, DWDM, MUX, DEMUX, Bateria, Switch POE, Conversor de mídia, Controle de acesso, Aligera, Dream Machine e Nuvem VPLS (arquivos com o mesmo nome em assets/images/equipamentos/, lista em SIMBOLOS de src/app/00-catalogo.js). O tipo é reconhecido por palavra inteira, e o nome mais específico ganha: "Switch POE 24p" usa o ícone de Switch POE, e "Rádio" não vira DIO.
Também dá para usar um emoji ou enviar uma imagem própria pelo campo Imagem (é reduzida para 256 px).
A lista de tipos sugeridos vem de data/equipamentos.json — edite ali para adicionar tipos. Ao adicionar ou trocar uma imagem em assets/images/equipamentos/, rode npm run icones para atualizar assets/js/editor/icones-embutidos.js, que a exportação usa para colocar os ícones dentro do PNG/SVG.
O campo Modelo sugere modelos conhecidos (MikroTik CCR/CRS/RB, Cisco Catalyst 2960X, Huawei S5720, Datacom DM4610 e modelos genéricos de OLT, ONU, switch, servidor, nobreak, retificador e câmera). A lista segue o Tipo do equipamento: com "Switch" aparecem só os switches, com "OLT" só as OLTs, com o nome de um fabricante ("MikroTik") todos os modelos dele; com o Tipo vazio, todos. Escolher um modelo com o Tipo vazio preenche o tipo.
O modelo pode ser escrito completo ou só o começo, quando só um modelo começa assim: CRS326 e DM4610 são reconhecidos.
Com o modelo preenchido, os campos Porta origem e Porta destino dos cabos (barra lateral, formulário rápido, editor e Editar em lista) viram uma lista com as portas daquele equipamento:
O modelo é reconhecido pelo nome exato, com o fabricante na frente (MikroTik CRS326-24G-2S+) ou com texto a mais (CRS326-24G-2S+ rack 2).
Os modelos ficam em data/equipamentos.json, na lista "modelos":
{ "nome": "CRS326-24G-2S+", "fabricante": "MikroTik", "tipo": "Switch", "portas": ["ether1-24", "sfp-sfpplus1-2"] }
Em portas, uma faixa termina em início-fim e vira uma porta para cada número: ether1-24 → ether1 … ether24; gpon1/1/1-8 → gpon1/1/1 … gpon1/1/8. Sem faixa, o nome vale como está (pon, combo1). Os nomes das portas seguem a nomenclatura mais comum de cada fabricante; confira com o seu equipamento e ajuste se precisar. O teste tests/unidade/modelos.test.js confere se o arquivo continua válido.
Etiquetas com QR code (barra lateral) gera um PDF para imprimir em folha A4 de etiquetas adesivas, em três tamanhos: 63,5 × 38,1 mm (21 por folha), 99,1 × 38,1 mm (14) e 38,1 × 21,2 mm (65). Imprima em tamanho real (100%), sem "ajustar à página", para cair certo nas etiquetas.
O QR code leva a /?abrir=<id do equipamento>&projeto=<nome> (ou &equipe=<id> em projeto de equipe). Renomear o projeto pessoal invalida as etiquetas impressas dele; as de equipe continuam valendo. O gerador de QR code é o qrcode-generator (MIT), carregado do jsDelivr com versão fixa e integrity.
O login usa Supabase Auth (e-mail e senha). Os projetos ficam na tabela grafo_user_data, protegida por Row Level Security: cada pessoa só lê e grava a própria linha. O navegador recebe a URL e a chave pública do Supabase pela rota /api/auth-config; sem elas, o app mostra um erro de configuração e mantém o editor fechado.
supabase/schema.sql e clique em Run. Deve aparecer "Success. No rows returned".
supabase/migracoes/:
2026-09-28-excluir-conta.sql: sem ele, Excluir conta avisa que a exclusão ainda não está ativada;2026-09-28-compartilhar.sql: sem ele, o botão Compartilhar não aparece.2026-09-29-equipes.sql: sem ele, o botão Equipe não aparece (o resto funciona normalmente).2026-09-29-historico.sql (depois do de equipes): sem ele, a janela Histórico explica que o histórico ainda não está ativado. As versões começam a ser guardadas a partir da instalação.2026-09-30-erros.sql: registro de erros. Quando algo quebra no navegador de alguém logado, assets/js/comum/erros.js grava a mensagem em grafo_erros (no máximo 30 por pessoa por hora; apagados após 90 dias). Veja em Table Editor → grafo_erros ou, agrupados, com select * from grafo_erros_resumo; no SQL Editor. Sem ele, os erros simplesmente não são guardados.https://thegrafo.vercel.apphttps://thegrafo.vercel.app e http://localhost:3000 (e o seu domínio próprio, se tiver). Sem isso, os links de confirmação e de recuperação de senha não voltam para o app.Nunca use a chave
secretouservice_roleno.env, na Vercel ou no front-end. A publishable é feita para ficar pública; a proteção dos dados vem das regras da tabela.
Requer Node.js 18+.
npm install
copy .env.example .env # Windows — no Mac/Linux: cp .env.example .env
Abra o .env e preencha:
SUPABASE_URL=https://abcdxyz.supabase.co
SUPABASE_PUBLISHABLE_KEY=sb_publishable_xxxxxxxxxxxx
Depois:
npm start # http://localhost:3000
O scripts/servidor-local.js lê o .env sozinho ao iniciar — se mudar o arquivo, pare o servidor (Ctrl+C) e rode npm start de novo. O .env não vai para o Git nem para a Vercel.
| Script | O que faz |
|---|---|
npm start | Sobe o servidor local (scripts/servidor-local.js) |
npm run dev | Igual ao start, reiniciando ao salvar o scripts/servidor-local.js |
npm run icones | Gera assets/js/editor/icones-embutidos.js |
npm test | Roda os testes da pasta tests/unidade/ (requer Node.js 22+) |
npm run test:navegador | Abre o site num navegador de verdade e testa página inicial, editor, PDF, celular e tutorial (tests/navegador/) |
npm run test:no-ar | Confere o site publicado (thegrafo.vercel.app): versão do commit, cabeçalhos, login, Supabase e editor sem login (tests/no-ar/). Roda sozinho depois de cada deploy e todo dia às 9h |
npm run montar | Monta assets/js/editor/app.js a partir das partes em src/app/ e gera as versões compactadas que o site carrega (app.min.js e assets/css/styles.min.css) |
Para mudar o editor, edite os arquivos de src/app/, não o assets/js/editor/app.js, e depois rode npm run montar. As partes são fatias, em ordem, de um único bloco de código com estado compartilhado (por isso uma parte sozinha não é um arquivo JavaScript completo). O mesmo vale para o CSS: edite assets/css/styles.css e rode npm run montar. O npm test avisa se o app.js, o app.min.js ou o styles.min.css ficaram desatualizados.
Os testes também rodam sozinhos no GitHub a cada envio (.github/workflows/testes.yml) e na Vercel antes de publicar (buildCommand no vercel.json): se algum falhar, o deploy é cancelado e o site continua na versão anterior.
Os testes de navegador rodam só no GitHub (job navegador), num Chromium com o Supabase simulado. Para rodar no computador: npm install, depois npx playwright install chromium (ou deixe sem: eles usam o Edge ou o Chrome instalados) e npm run test:navegador.
A porta pode ser trocada com a variável PORT. Depois de atualizar os arquivos, recarregue a página com Ctrl+F5.
O projeto thegrafo na Vercel está ligado a este repositório: cada envio para o branch main publica o site automaticamente. O index.html e os assets/ são estáticos; api/equipamentos.js e api/auth-config.js viram funções serverless; o vercel.json redireciona as demais rotas para o index.html.
Variáveis de ambiente (configurar uma vez):
No projeto da Vercel, abra Settings → Environments → Production.
Em Environment Variables, adicione:
| Key | Value |
|---|---|
SUPABASE_URL | Project URL do Supabase |
SUPABASE_PUBLISHABLE_KEY | Publishable key do Supabase |
Repita em Preview se usar deploys de outros branches.
As variáveis só valem para deploys novos: em Deployments, no deploy mais recente, clique em ⋯ → Redeploy.
Para conferir, abra https://thegrafo.vercel.app/api/auth-config: deve mostrar a URL e a chave. Um erro 503 significa que as variáveis não estão configuradas (ou faltou o redeploy).
Também é possível publicar direto do computador com a Vercel CLI: npx vercel deploy --prod.
Segurança. O vercel.json envia cabeçalhos de segurança em todas as páginas (o servidor-local.js envia os mesmos): um CSP que só aceita scripts do próprio site e do jsDelivr, bloqueia scripts embutidos no HTML e impede que o Grafo seja aberto dentro de outro site; além de nosniff, Referrer-Policy, Permissions-Policy e HSTS. Por isso não há <script> embutido nas páginas: o código fica em arquivos (assets/js/conta/sessao.js, assets/js/paginas/ver.js). As bibliotecas do jsDelivr têm versão fixa e integrity (SRI): o navegador recusa o arquivo se o CDN entregar outro conteúdo. Ao atualizar uma delas, recalcule o hash (sha384). O teste tests/unidade/seguranca.test.js confere tudo isso.
| Mensagem ou sintoma | Causa e solução |
|---|---|
| "Configure SUPABASE_URL e SUPABASE_PUBLISHABLE_KEY no servidor" | Faltam as variáveis: no .env (local) ou na Vercel (site). Na Vercel, faça Redeploy depois de criá-las |
| "E-mail ou senha incorretos" | Confira a senha, ou crie a conta primeiro |
| "Confirme seu e-mail antes de entrar" | Clique no link do e-mail de confirmação (veja o spam) |
O link do e-mail abre localhost ou dá erro | Ajuste Site URL e Redirect URLs no Supabase (passo 1.4) |
| "Não foi possível carregar os projetos" | A tabela não existe ou a URL está errada: rode o schema.sql e confira se a URL não termina em /rest/v1/ |
| "Muitas tentativas seguidas" | Limite do Supabase; aguarde um minuto |
npm.ps1 não pode ser carregado (PowerShell) | Use npm.cmd start no lugar de npm start |
EADDRINUSE :::3000 | Já há um servidor rodando na porta 3000; feche o outro terminal |
Cannot find module 'express' | Rode npm install |
index.html o app: login + editor
ver.html página do link compartilhado (/ver?t=...)
privacidade.html Política de Privacidade (/privacidade)
manifest.webmanifest, sw.js instalar como aplicativo e funcionar sem internet (ficam na raiz por causa do escopo)
vercel.json, .vercelignore publicação na Vercel (cabeçalhos de segurança, rotas)
assets/ tudo o que o navegador baixa
css/styles.css estilos, temas e animações
images/
app/ logo, favicon, ícones do aplicativo e logos dos temas
equipamentos/ ícones dos equipamentos (quadro de símbolos)
racks/ fotos dos equipamentos para o Bayface de Racks
js/
comum/ esquema.js (validação), erros.js (registro de erros), interface.js (menus, dicas)
conta/ auth.js (login, cadastro, sincronização), sessao.js (abre o editor rápido)
editor/ app.js e icones-embutidos.js — GERADOS, não edite à mão
paginas/ ver.js (página do link compartilhado)
recursos/ módulos do editor: admin, biblioteca, comandos, compartilhar, equipe,
etiquetas, historico, instalar, integracao, leitor, planilha,
primeiros-passos, racks
vendor/ Zod (validação), servido localmente
src/app/ partes do editor, de 00-catalogo.js a 17-pagina-e-pdf.js — É AQUI QUE SE EDITA
(npm run montar junta tudo em assets/js/editor/app.js, na ordem dos números)
data/equipamentos.json catálogo de tipos e modelos de equipamento (por fabricante)
api/ funções da Vercel: auth-config, equipamentos e ler-imagem (IA)
agente/ agente local do NetBox/ping e um NetBox de teste (.env.example)
supabase/ schema.sql e migracoes/ (veja migracoes/LEIAME.md para a ordem)
scripts/ montar-app.js, gerar-icones-embutidos.js, servidor-local.js
tests/
unidade/ testes rápidos (npm test) e simulador.js (navegador simulado)
navegador/ testes num navegador de verdade (npm run test:navegador) e ajuda.js
no-ar/ teste do site publicado (npm run test:no-ar; workflow site-no-ar.yml)
docs/imagens/ imagens deste README
docs/LGPD.md registro do tratamento de dados e plano para incidentes
.github/workflows/ testes automáticos no GitHub
| Arquivo | Conteúdo |
|---|---|
assets/js/editor/app.js | Editor: estado, formulários, geração do DOT, roteamento dos cabos, exportação. Gerado por npm run montar a partir de src/app/ |
assets/js/editor/icones-embutidos.js | Ícones em base64 para a exportação. Gerado por npm run icones a partir de assets/images/equipamentos/ |
assets/js/conta/auth.js | Login, cadastro, recuperação de senha, uso sem login e sincronização com o Supabase |
assets/js/recursos/equipe.js | Projetos de equipe: grava cada um na própria linha, recebe as alterações dos colegas em tempo real e controla a janela Equipe |
assets/js/recursos/compartilhar.js | Botão Compartilhar: cria, atualiza e desativa os links só para visualizar |
assets/js/recursos/historico.js | Janela Histórico: versões guardadas pelo banco, restaurar e recuperar projeto excluído |
assets/js/recursos/planilha.js | Relatório de inventário: monta o .xlsx no navegador (ZIP + XML, sem biblioteca externa) |
assets/js/recursos/etiquetas.js | PDF de etiquetas com QR code e abertura do equipamento pelo endereço do QR code |
assets/js/comum/esquema.js | Validação dos dados (formulários, JSON, CSV e o que está salvo) |
assets/js/comum/erros.js | Envia os erros do navegador para a tabela grafo_erros do Supabase |
scripts/servidor-local.js | Servidor Express para rodar localmente; lê o .env da raiz |
sw.js | Se mudar a forma de guardar, troque o nome grafo-offline-v4 (o antigo é apagado) |
privacidade.html | Política de Privacidade. Ao mudar o texto, troque a data da versão aqui e em VERSAO_PRIVACIDADE (auth.js) |
Projetos salvos com os caminhos antigos dos ícones (assets/images/OLT.jpeg, assets/images/OLT.png) continuam abrindo: o editor troca pelo caminho atual.
O catálogo fica em
data/, fora deapi/, porque na Vercelapi/equipamentos.jseapi/equipamentos.jsoncolidiriam na mesma rota. O servidor local se chamaservidor-local.js(e nãoserver.js) para a Vercel não tratar o projeto como app Express.
Copyright © 2026 Iago Ariel Gularte Barbosa.
O Grafo é código aberto, sob a licença GNU AGPL-3.0. Você pode usar, estudar, modificar e distribuir o código. Se você modificar o Grafo e colocá-lo no ar para outras pessoas usarem (como site ou serviço), precisa disponibilizar o código-fonte da sua versão sob a mesma licença.
Contribuições são bem-vindas: abra uma issue ou um pull request em github.com/iago069/Grafo-project.
sw.jsmanifest.webmanifesthttps://abcdxyz.supabase.co/rest/v1/sb_publishable_; em projetos antigos, a anon public).