Skip to content

Matheuscara/devsplit

devsplit

devsplit — proxy de desenvolvimento que divide o tráfego do seu gateway de stage: os caminhos que você escolher rodam no seu localhost, o resto continua indo pro ambiente real. Sem Docker, sem mudar o front.

Linux macOS Windows security-scan testes stack licença

O que é · O problema · A interface · Como funciona · Rodar · Status · Docs


O que é

Um app de desktop que fica entre o seu navegador e o gateway HTTP de um ambiente de stage. Ele intercepta o domínio do stage na sua máquina e faz split por path-prefix:

  • os prefixos que você marca (/transporte, /auth, …) vão para serviços rodando no seu localhost;
  • todo o resto faz passthrough para o stage real — com o certificado validado de verdade (sem insecureSkipVerify).

O front não muda: continua apontando para a URL de stage. Você liga/desliga rotas numa interface, e o devsplit cuida do TLS local confiável, do /etc/hosts e do roteamento.

Tela de Rotas do devsplit
Tela Rotas: domínio interceptado, perfil ativo, botão liga/desliga, painel de Saúde e a tabela de rotas (local × passthrough).

O problema que resolve

"Pra rodar 1 task eu preciso subir 10 microsserviços + RabbitMQ + observabilidade. Meu PC não aguenta."

Com o devsplit você roda só o serviço que está mexendo. O resto da malha (auth, banco, filas, os outros microsserviços) continua sendo o stage, que já está de pé. Acabou o "sobe tudo localmente pra mexer em um pedaço".

front (browser) ─▶ https://api.stage.acme.com     (no seu PC, resolve p/ 127.0.0.1)
                        │
                        ▼
                 devsplit  (:443, TLS local confiável)
                   ├─ /transporte, /auth ─▶ 127.0.0.1:3000 / :3001   (LOCAL)
                   └─ /*                  ─▶ IP_REAL_DO_STAGE:443      (PASSTHROUGH, cert validado)

A interface

Seis telas, foco em densidade e clareza (estilo dev-tool — Linear/Raycast).

Tela O que faz
Rotas Liga/desliga a interceptação, escolhe o perfil, edita as rotas (prefixo → porta local) e mostra o painel de Saúde (cert / hosts / :443 / stage).
Tráfego Inspector ao vivo: cada requisição com método, caminho, decisão (local/passthrough), status e latência; latência p50/p95 por rota; filtro e copy-as-curl / export HAR.
Sessão Decodifica o JWT do header Authorization: Bearer visto no tráfego (claims, expiração).
Certificado Status da CA local (mkcert), algoritmo, validade, trust store; botão Instalar certificado.
Hosts O que o devsplit escreveu no /etc/hosts (bloco demarcado, reversível).
Config O devsplit.yaml resolvido, perfis e autostart.
Inspector de tráfego ao vivo
Tráfego — inspector ao vivo + latência por rota.
Status do certificado
Certificado — CA local confiável (mkcert), validação por SNI.

As capturas usam dados de exemplo (modo de demonstração da UI). No app real, os mesmos painéis refletem o seu devsplit.yaml e o tráfego de verdade.

Como funciona (invariantes)

  • Transparência: o front aponta p/ a URL de stage; o /etc/hosts manda o FQDN p/ 127.0.0.1; o devsplit termina o TLS com um cert local confiável (via mkcert).
  • Anti-loop: o IP real do stage é descoberto por DNS direto (hickory, nameserver explícito) que ignora o /etc/hosts — senão o proxy conectaria em si mesmo.
  • Passthrough seguro: conecta no IP real e valida o cert remoto contra o SNI (FQDN), sem desabilitar verificação.
  • Hot-reload: a tabela de rotas vive num ArcSwap; ligar/desligar rota não derruba conexões em voo (inclusive WebSocket).
  • Segurança no inspector: headers como cookie/x-api-key/*secret*/*token* são redatados; só authorization fica visível (é o que o painel de Sessão decodifica).
  • 1 prompt de senha por sessão (Linux): elevação só para editar o /etc/hosts e liberar a :443. O app roda sem root.

Stack

Tauri v2 — núcleo em Rust (crates/devsplit-core: proxy hyper+rustls, TLS rcgen+mkcert, DNS hickory, hosts, config) e UI em React + Tailwind + TypeScript (app/src). App nativo único, leve. Desenho completo em BLUEPRINT.md e em docs/.

Rodar

Testes do núcleo (só precisa de Rust)

cargo test -p devsplit-core              # 18 testes (inclui e2e cliente-TLS → proxy → backend)
cargo test -p devsplit-core -- --ignored # + teste de rede (DNS direto)

O app (Linux — verificado)

# 1. webview nativo (Arch/CachyOS):
sudo pacman -S webkit2gtk-4.1 libsoup3        # Debian/Ubuntu: libwebkit2gtk-4.1-dev librsvg2-dev
# 2. mkcert no PATH (TLS confiável):           https://github.com/FiloSottile/mkcert
# 3. rodar (carrega o frontend embutido no binário — sem dev server):
cd app && npm install && npm run build
cd src-tauri && cargo run

Não use cargo tauri dev em máquina apertada de RAM: ele sobe o Vite (dev server), que pode dar OOM. O cargo run carrega o dist/ embutido. Detalhes em docs/getting-started.md e docs/troubleshooting.md.

Explorar a UI no navegador (dados de exemplo)

cd app && npm install && npm run dev   # http://localhost:1420 — sem backend, modo demo

Configurar

Copie examples/devsplit.yaml para a raiz do seu repo como devsplit.yaml e ajuste o upstream.host (FQDN do stage) e os profiles.*.routes (prefixos → portas locais). Referência: docs/10-referencia-devsplit-yaml.md.

Instalar

Para o time (qualquer Linux) — 1 comando

curl -fsSL https://raw.githubusercontent.com/Matheuscara/devsplit/main/packaging/install.sh | bash

Detecta a distro e baixa o artefato certo do último release: .deb (Debian/Ubuntu/Mint via apt), .rpm (Fedora/RHEL via dnf, openSUSE via zypper) ou .AppImage (qualquer outra, registrada no launcher sem root). Já garante o mkcert (gerenciador da distro; sem sudo → baixa o binário oficial p/ ~/.local/bin), checa o polkit/pkexec e semeia o ~/.config/dev.devsplit.app/devsplit.yaml — crucial: sem ele o app não acha o stage e o botão ligar não faz nada. Desinstala com curl -fsSL …/install.sh | bash -s -- --uninstall.

Variáveis: DEVSPLIT_TAG=v0.1.0 fixa a versão; DEVSPLIT_FORCE_APPIMAGE=1 força o AppImage.

NixOS

nix profile install github:Matheuscara/devsplit   # ou rodar 1x: nix run github:Matheuscara/devsplit

O flake.nix embrulha o .AppImage (appimageTools) e injeta mkcert + nssTools no PATH do app. No seu configuration.nix: security.polkit.enable = true e boot.kernel.sysctl."net.ipv4.ip_unprivileged_port_start" = 443 — no Nix o setcap não pega no /nix/store (read-only), então o app cai no fallback sysctl p/ bindar a :443.

Manual, por distro

Baixe o artefato da sua distro na página de Releases:

Distro Instala No launcher
Debian/Ubuntu/Mint sudo apt install ./devsplit_<ver>_amd64.deb sim (auto)
Fedora/RHEL/Rocky sudo dnf install ./devsplit-<ver>-1.x86_64.rpm sim (auto)
openSUSE sudo zypper install ./devsplit-<ver>-1.x86_64.rpm sim (auto)
Arch/CachyOS/Manjaro AUR via packaging/PKGBUILDmakepkg -si (extrai o .deb do release) sim (auto)
Qualquer outra .AppImage + packaging/install-appimage.sh <arquivo> sim (registra)

Todas exigem mkcert + polkit/pkexec no runtime. Em WM enxutos (niri/sway/hyprland) tenha um agente polkit ativo, senão o prompt de senha não aparece.

Do código (contribuidores)

./packaging/install-local.sh        # build do fonte + binario, icones, .desktop e seed da config (~/.local, sem root)

Compila e instala por-usuário; --uninstall remove. Detalhes em docs/04-build-distribuicao.md.

Publicar um release (mantenedor)

Os instaladores saem do CI: empurre uma tag e o build.yml builda nos 3 SOs e publica o release com .AppImage/.deb/.rpm/.dmg/.msi:

git tag v0.1.0 && git push origin v0.1.0

releaseDraft: false publica direto (o instalador 1-linha lê releases/latest, que ignora drafts). Quer revisar antes de expor? Volte p/ releaseDraft: true e rode gh release edit <tag> --draft=false ao fim.

Status por plataforma

Plataforma Estado
Linux rodando de ponta a ponta — app compila, abre, intercepta; núcleo 18 testes
macOS 🟡 implementado (elevação via osascript); compila no Linux via cfg!, build/runtime via CI
Windows 🟡 implementado (elevação via UAC/PowerShell); build/runtime via CI

Build dos 3 SOs + release com instaladores: CI em .github/workflows/build.yml (tauri-action, matriz ubuntu/macos/windows; tag v* → release draft com .AppImage/.deb/.dmg/.msi). Painel completo de entregas em docs/STATUS.md.

Documentação

Guia completo em docs/. Atalhos: getting-started · 00-blueprint · 02-arquitetura · 04-build-distribuicao · 11-tls-privilegios-seguranca · troubleshooting · STATUS.

Logo & design

A marca — um fluxo que se divide em local (preenchido) e passthrough (vazado) — está em design/: icon.svg (fonte), logo.png, banner.png, e as capturas em design/shots/. Os ícones do app são gerados da marca (cargo tauri icon design/logo.png). Mockup estático da UI em design/mockup.html.

Layout

devsplit/
├── README.md · BLUEPRINT.md           # front-door + desenho completo
├── docs/                              # documentação (pt-BR)
├── crates/devsplit-core/              # NÚCLEO Rust (sem GUI) — compila/testa em qualquer lugar
├── app/
│   ├── src/                           # UI React (TypeScript)
│   └── src-tauri/                     # casca Tauri (Rust): comandos, tray, elevação por-SO
├── design/                            # logo, banner, ícones-fonte, capturas, mockup
├── examples/devsplit.yaml             # config de time (commitável)
└── .github/workflows/build.yml        # CI: testa + builda os 3 SOs + release

Licença

Licenciado sob MIT (LICENSE-MIT) ou Apache-2.0 (LICENSE-APACHE), à sua escolha.

Salvo indicação em contrário, qualquer contribuição enviada por você para inclusão neste projeto, conforme a Apache-2.0, será dual-licenciada como acima, sem termos adicionais.

About

proxy de desenvolvimento que divide o tráfego do seu gateway de stage: os caminhos que você escolher rodam no seu localhost, o resto continua indo pro ambiente real. Sem Docker, sem mudar o front.

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors