<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luis Peixoto</title>
    <description>The latest articles on DEV Community by Luis Peixoto (@luispeixoto).</description>
    <link>https://dev.to/luispeixoto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1422947%2Fa47580f2-3633-481e-ac32-6b6b3b545683.jpeg</url>
      <title>DEV Community: Luis Peixoto</title>
      <link>https://dev.to/luispeixoto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luispeixoto"/>
    <language>en</language>
    <item>
      <title>Criei um laboratório de debug open source para emuladores Android e simuladores iOS</title>
      <dc:creator>Luis Peixoto</dc:creator>
      <pubDate>Sun, 15 Nov 2026 14:03:21 +0000</pubDate>
      <link>https://dev.to/luispeixoto/criei-um-laboratorio-de-debug-open-source-para-emuladores-android-e-simuladores-ios-hnl</link>
      <guid>https://dev.to/luispeixoto/criei-um-laboratorio-de-debug-open-source-para-emuladores-android-e-simuladores-ios-hnl</guid>
      <description>&lt;p&gt;Quando depuro um app mobile, acabo com seis ferramentas abertas: o Logcat, a janela do Instruments, os profilers do Android Studio, um proxy como o Charles, um terminal cheio de &lt;code&gt;adb shell&lt;/code&gt; e &lt;code&gt;xcrun simctl&lt;/code&gt;, e um editor de texto para ler algum banco de dados que puxei do dispositivo. Cada uma conhece uma fatia do que o emulador sabe, e nenhuma conversa com as outras.&lt;/p&gt;

&lt;p&gt;Por isso criei o &lt;strong&gt;EmuLabZip&lt;/strong&gt;: um app open source que se conecta aos seus emuladores Android e simuladores iOS em execução e traz tudo isso para uma janela só. Ele é escrito em Rust, vem como app desktop (Tauri + Svelte) e como ferramenta de linha de comando, e nada é instalado no dispositivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrdvs5yfwl7jrcdphwi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrdvs5yfwl7jrcdphwi9.png" alt="A visão geral de um emulador Android no EmuLabZip" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que ele faz
&lt;/h2&gt;

&lt;p&gt;Você inicia um emulador ou liga um simulador, e ele aparece. Não há configuração no dispositivo e nada para adicionar ao seu app. A partir daí:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logs&lt;/strong&gt; do logcat e do unified log do iOS em uma única tabela que continua fluida com milhares de linhas por segundo, com filtros por nível, tag, texto, regex e por app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desempenho e memória&lt;/strong&gt;: CPU, memória, taxa de quadros, frames travados e bateria do app que você escolher, snapshots de memória que você compara por categoria, e heap dumps do Android com um detector de vazamentos embutido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: um proxy de debug que decifra HTTPS, com mocks, breakpoints, limitação de banda, e decodificação de GraphQL e gRPC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: navegue pelos arquivos de um app e abra SQLite, SharedPreferences, property lists, MMKV, Realm e mais, ali mesmo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crashes&lt;/strong&gt;: crashes, crashes nativos e ANRs com suas stacks, legíveis quando você fornece o &lt;code&gt;mapping.txt&lt;/code&gt; do R8, o source map ou o dSYM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions&lt;/strong&gt;: grave uma execução inteira (logs, requisições, crashes, vídeo da tela, toques) em um único arquivo que você pode abrir depois, comparar ou coletar no CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbsy4ipbymrguhl0vmrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbsy4ipbymrguhl0vmrl.png" alt="Requisições ao vivo de um emulador Android, com o protocolo usado por cada uma" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que Rust, e por que sem agente no dispositivo
&lt;/h2&gt;

&lt;p&gt;O EmuLabZip não injeta nada no seu app. Ele usa as interfaces públicas de cada plataforma: no Android, tem um cliente async próprio para o protocolo host do ADB (sem precisar chamar o &lt;code&gt;adb&lt;/code&gt; a cada operação), e no iOS controla o &lt;code&gt;xcrun simctl&lt;/code&gt;. O código de Android e o de Apple ficam em crates separados, atrás de uma única trait &lt;code&gt;Backend&lt;/code&gt;, então o app desktop e a CLI usam exatamente o mesmo código.&lt;/p&gt;

&lt;p&gt;Isso também significa que ele continua funcionando quando o Xcode ou o Android Studio atualizam, porque depende de interfaces que eles precisam manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os mesmos dados no terminal
&lt;/h2&gt;

&lt;p&gt;Tudo o que o app mostra também é um comando. Inicie um dispositivo e rode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulabzip devices
emulabzip logs
emulabzip mem com.example.app
emulabzip net --har capture.har
emulabzip crashes --app com.example.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada comando imprime tabelas para pessoas e &lt;code&gt;--json&lt;/code&gt; para scripts. O mesmo motor roda no CI: &lt;code&gt;emulabzip ci&lt;/code&gt; grava uma sessão em volta do seu comando de teste e sai com o mesmo código de saída dele, então o pipeline se comporta como antes e você ganha um arquivo para abrir quando algo falha. Vou escrever sobre isso em um próximo post.&lt;/p&gt;

&lt;h2&gt;
  
  
  E conversa com assistentes de IA
&lt;/h2&gt;

&lt;p&gt;O EmuLabZip inclui um servidor MCP (&lt;code&gt;emulabzip mcp&lt;/code&gt;). Conecte o Claude, o Cursor ou o VS Code e o assistente consegue ler seus logs e crashes, acompanhar o tráfego ao vivo, controlar a tela e gravar uma sessão. Ele não consegue apagar nem reescrever nada, a menos que você inicie o servidor com &lt;code&gt;--allow-writes&lt;/code&gt;, e aí cada alteração pede sua confirmação antes. Também vai ter um post sobre isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimente
&lt;/h2&gt;

&lt;p&gt;O app desktop tem instaladores para macOS, Windows e Linux. A ferramenta de linha de comando se instala com o Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo install --git https://github.com/LuisPeixoto/EmuLabZip emulabzip-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois inicie um emulador ou simulador e rode &lt;code&gt;emulabzip devices&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site e documentação: &lt;a href="https://emulabzip.luispeixoto.dev/pt/" rel="noopener noreferrer"&gt;emulabzip.luispeixoto.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Guia de primeiros passos: &lt;a href="https://emulabzip.luispeixoto.dev/pt/docs/getting-started/" rel="noopener noreferrer"&gt;emulabzip.luispeixoto.dev/pt/docs/getting-started/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Código-fonte e releases (MIT): &lt;a href="https://github.com/LuisPeixoto/EmuLabZip" rel="noopener noreferrer"&gt;github.com/LuisPeixoto/EmuLabZip&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se algo quebrar ou estiver faltando, me avise em uma issue. É um projeto de uma pessoa só e o roadmap segue o que as pessoas precisam.&lt;/p&gt;




&lt;p&gt;Também em inglês: &lt;a href="https://dev.to/luispeixoto/i-built-an-open-source-debugging-lab-for-android-emulators-and-ios-simulators-527c"&gt;I built an open-source debugging lab for Android emulators and iOS simulators&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I built an open-source debugging lab for Android emulators and iOS simulators</title>
      <dc:creator>Luis Peixoto</dc:creator>
      <pubDate>Sun, 15 Nov 2026 14:02:43 +0000</pubDate>
      <link>https://dev.to/luispeixoto/i-built-an-open-source-debugging-lab-for-android-emulators-and-ios-simulators-527c</link>
      <guid>https://dev.to/luispeixoto/i-built-an-open-source-debugging-lab-for-android-emulators-and-ios-simulators-527c</guid>
      <description>&lt;p&gt;When I debug a mobile app I end up with six tools open: Logcat, the Instruments window, Android Studio's profilers, a proxy like Charles, a terminal full of &lt;code&gt;adb shell&lt;/code&gt; and &lt;code&gt;xcrun simctl&lt;/code&gt;, and a text editor to read some database I pulled off the device. Every one of them knows a slice of what the emulator knows, and none of them talk to each other.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;EmuLabZip&lt;/strong&gt;: one open-source app that connects to your running Android emulators and iOS simulators and brings all of that into one window. It is written in Rust, ships as a desktop app (Tauri + Svelte) and as a command line tool, and nothing gets installed on the device.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrdvs5yfwl7jrcdphwi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrdvs5yfwl7jrcdphwi9.png" alt="The overview of an Android emulator in EmuLabZip" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You start an emulator or boot a simulator, and it shows up. There is no setup on the device and nothing to add to your app. From there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logs&lt;/strong&gt; from logcat and the iOS unified log in one table that stays smooth at thousands of lines per second, with level, tag, text, regex and per-app filters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance and memory&lt;/strong&gt;: CPU, memory, frame rate, janky frames and battery for the app you pick, memory snapshots you can diff by category, and Android heap dumps with a built-in leak finder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: a debugging proxy that decrypts HTTPS, with mocks, breakpoints, throttling, GraphQL and gRPC decoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: browse an app's files and open SQLite, SharedPreferences, property lists, MMKV, Realm and more in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crashes&lt;/strong&gt;: crashes, native crashes and ANRs with their stacks, readable when you give it your R8 &lt;code&gt;mapping.txt&lt;/code&gt;, source map or dSYM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions&lt;/strong&gt;: record a whole run (logs, requests, crashes, screen video, touches) into one file you can open later, compare, or collect from CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbsy4ipbymrguhl0vmrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbsy4ipbymrguhl0vmrl.png" alt="Live requests of an Android emulator, with the protocol each one used" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust, and why no agent on the device
&lt;/h2&gt;

&lt;p&gt;EmuLabZip does not inject anything into your app. It speaks the public interfaces of each platform: for Android it has its own async client for the ADB host protocol (no need to shell out to &lt;code&gt;adb&lt;/code&gt; for every call), and for iOS it drives &lt;code&gt;xcrun simctl&lt;/code&gt;. The Android and Apple code lives in separate crates behind one &lt;code&gt;Backend&lt;/code&gt; trait, so the desktop app and the CLI use exactly the same code.&lt;/p&gt;

&lt;p&gt;That also means it keeps working when Xcode or Android Studio update, because it depends on interfaces they have to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same data in a terminal
&lt;/h2&gt;

&lt;p&gt;Everything the app shows is also a command. Start a device, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulabzip devices
emulabzip logs
emulabzip mem com.example.app
emulabzip net --har capture.har
emulabzip crashes --app com.example.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each command prints tables for people and &lt;code&gt;--json&lt;/code&gt; for scripts. The same engine runs in CI: &lt;code&gt;emulabzip ci&lt;/code&gt; records a session around your test command and exits with its exit code, so a pipeline behaves as before and you get a file to open when something fails. I will write about that in a later post.&lt;/p&gt;

&lt;h2&gt;
  
  
  And it talks to AI assistants
&lt;/h2&gt;

&lt;p&gt;EmuLabZip includes an MCP server (&lt;code&gt;emulabzip mcp&lt;/code&gt;). Connect Claude, Cursor or VS Code and the assistant can read your logs and crashes, follow the traffic live, drive the screen and record a session. It cannot wipe or rewrite anything unless you start the server with &lt;code&gt;--allow-writes&lt;/code&gt;, and then each change asks you first. There is a post about that too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The desktop app has installers for macOS, Windows and Linux. The command line tool installs with Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo install --git https://github.com/LuisPeixoto/EmuLabZip emulabzip-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start an emulator or simulator and run &lt;code&gt;emulabzip devices&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website and documentation: &lt;a href="https://emulabzip.luispeixoto.dev/" rel="noopener noreferrer"&gt;emulabzip.luispeixoto.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Getting started guide: &lt;a href="https://emulabzip.luispeixoto.dev/docs/getting-started/" rel="noopener noreferrer"&gt;emulabzip.luispeixoto.dev/docs/getting-started/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source code and releases (MIT): &lt;a href="https://github.com/LuisPeixoto/EmuLabZip" rel="noopener noreferrer"&gt;github.com/LuisPeixoto/EmuLabZip&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something breaks or is missing, tell me in an issue. It is a one-person project and the roadmap follows what people need.&lt;/p&gt;




&lt;p&gt;Also in Portuguese: &lt;a href="https://dev.to/luispeixoto/criei-um-laboratorio-de-debug-open-source-para-emuladores-android-e-simuladores-ios-hnl"&gt;Criei um laboratório de debug open source para emuladores Android e simuladores iOS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>mobile</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Debug HTTPS traffic with a free, open-source proxy (ProxyZip)</title>
      <dc:creator>Luis Peixoto</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:13:04 +0000</pubDate>
      <link>https://dev.to/luispeixoto/debug-https-traffic-with-a-free-open-source-proxy-proxyzip-561</link>
      <guid>https://dev.to/luispeixoto/debug-https-traffic-with-a-free-open-source-proxy-proxyzip-561</guid>
      <description>&lt;p&gt;Your app calls an API, something comes back wrong, and the only thing you can see is a spinner. The request is encrypted, the logs say nothing useful, and you end up guessing.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;debugging proxy&lt;/strong&gt; fixes that: it sits between your app and the server, decrypts the HTTPS on your own machine and shows you every request and response. I built &lt;a href="https://luispeixoto.github.io/ProxyZip/" rel="noopener noreferrer"&gt;ProxyZip&lt;/a&gt;, a free, open-source HTTP and HTTPS debugging proxy, and this post walks through what it does using a small example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capture and inspect HTTPS traffic from any app on macOS, Windows and Linux&lt;/li&gt;
&lt;li&gt;Pause a request, edit it and send it on&lt;/li&gt;
&lt;li&gt;Mock an API that does not exist yet, or validate real traffic against an OpenAPI file&lt;/li&gt;
&lt;li&gt;Turn captured requests into tests and run them in CI&lt;/li&gt;
&lt;li&gt;MIT licensed, written in Rust, no account and no telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is ProxyZip?
&lt;/h2&gt;

&lt;p&gt;ProxyZip is an HTTP and HTTPS debugging proxy with a desktop app and a command line. The engine is Rust (tokio, hyper, rustls); the app is Tauri and Svelte. The app and the &lt;code&gt;proxyzip&lt;/code&gt; command run the same engine, so what you learn in one works in the other.&lt;/p&gt;

&lt;p&gt;The example below uses a fictional shop API at &lt;code&gt;api.shopwave.dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9opc3m0nsmd2owbhha6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9opc3m0nsmd2owbhha6.webp" alt="ProxyZip showing the JSON response of GET /v1/products/sku_1042 next to the request list" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; luispeixoto/proxyzip/proxyzip

&lt;span class="c"&gt;# Windows&lt;/span&gt;
scoop bucket add proxyzip https://github.com/LuisPeixoto/scoop-proxyzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installers for macOS, Windows and Linux (&lt;code&gt;.dmg&lt;/code&gt;, &lt;code&gt;.msi&lt;/code&gt;, &lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.AppImage&lt;/code&gt;, &lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt;) are on the &lt;a href="https://github.com/LuisPeixoto/ProxyZip/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;. The command line alone installs with &lt;code&gt;cargo install --git https://github.com/LuisPeixoto/ProxyZip proxyzip-cli&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect HTTPS traffic
&lt;/h2&gt;

&lt;p&gt;HTTPS needs one extra step. ProxyZip creates a local certificate authority on your machine; once you trust it, the proxy can show you what your apps send. The private key never leaves your disk, and you can exclude any host from decryption.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proxyzip ca &lt;span class="nb"&gt;install
eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;proxyzip &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
proxyzip start &lt;span class="nt"&gt;--port&lt;/span&gt; 19191
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;proxyzip env&lt;/code&gt; points the current terminal at the proxy and makes curl, Node.js, Python, Go, Git, Cargo and others trust the certificate. Every finished request prints as it happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 GET     https://api.shopwave.dev/v1/products 469B 1ms [mock]
200 GET     https://api.shopwave.dev/v1/products/sku_1042 142B 70ms [mock]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the app you get the same requests as a list, with headers, cookies, timing, TLS details and the body as a JSON tree. Use &lt;code&gt;jq&lt;/code&gt; filters on a body, or compare two requests side by side.&lt;/p&gt;

&lt;p&gt;Binary protocols are covered too. gRPC, gRPC-Web and plain Protobuf messages are decoded even without the &lt;code&gt;.proto&lt;/code&gt; files, which makes gRPC debugging a lot less painful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13tofxshbkgw8ju5fs8d.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13tofxshbkgw8ju5fs8d.webp" alt="A gRPC-Web response decoded into numbered Protobuf fields" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change traffic instead of only reading it
&lt;/h2&gt;

&lt;p&gt;Right-click a request to set a &lt;strong&gt;breakpoint&lt;/strong&gt;: the next matching request stops before it leaves, and you can edit the method, URL, headers or body. &lt;strong&gt;Map Local&lt;/strong&gt; answers with a file from your disk, &lt;strong&gt;Map Remote&lt;/strong&gt; sends the request to another host, and rewrite rules change headers, bodies and status codes. You can also throttle to a slow network or block a host to see how your app copes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg4apgqpmscsh2f2xkhn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg4apgqpmscsh2f2xkhn.webp" alt="Context menu with Set breakpoint, Map Local, Map Remote and Block" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mock an API that does not exist yet
&lt;/h2&gt;

&lt;p&gt;When the backend is not ready, or has to fail in a specific way, a mock server answers for it: routes with status codes, headers, bodies and delays, plus a small template language. Right-click a captured response and choose &lt;strong&gt;Create a mock from this response&lt;/strong&gt;, or import an OpenAPI 3 file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proxyzip mock petstore.yaml &lt;span class="nt"&gt;--port&lt;/span&gt; 4010 &lt;span class="nt"&gt;--delay&lt;/span&gt; 200
proxyzip validate petstore.yaml capture.pzsession
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;proxyzip validate&lt;/code&gt; checks captured traffic against the specification and exits with &lt;code&gt;1&lt;/code&gt; if anything does not conform, so it works as a CI step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyr60zt8w5sonz5ndx0d.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyr60zt8w5sonz5ndx0d.webp" alt="The Mocks window with routes for products, cart and checkout" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn requests into API tests
&lt;/h2&gt;

&lt;p&gt;Select the requests of a flow, right-click and choose &lt;strong&gt;Add to a suite&lt;/strong&gt;. A suite is a single &lt;code&gt;.pzsuite&lt;/code&gt; file with checks on status and body, variables and environments, and values passed between steps with &lt;code&gt;jq&lt;/code&gt;. It belongs in version control, and it runs headless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proxyzip run checkout.pzsuite &lt;span class="nt"&gt;--env&lt;/span&gt; staging &lt;span class="nt"&gt;--junit&lt;/span&gt; report.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command exits with &lt;code&gt;1&lt;/code&gt; when a request fails and writes a JUnit report that CI systems can display. Postman collections run the same way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4z5uddepjc5f4o4f3xxo.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4z5uddepjc5f4o4f3xxo.webp" alt="A suite run showing ten requests passed" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Phones, emulators and AI assistants
&lt;/h2&gt;

&lt;p&gt;To debug an iPhone or Android device, point its Wi-Fi proxy at your computer and open &lt;code&gt;http://proxyzip.cert&lt;/code&gt; to install the certificate. The Devices window shows the address and a QR code, and has one-click setup for simulators and emulators. See the &lt;a href="https://luispeixoto.github.io/ProxyZip/features/mobile-debugging/" rel="noopener noreferrer"&gt;mobile debugging guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;ProxyZip also has a built-in &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; server, so assistants such as Claude Code, Cursor and VS Code can read your captured traffic. It is off by default, listens on localhost only, needs an access token and redacts secrets unless you ask otherwise. The &lt;a href="https://luispeixoto.github.io/ProxyZip/features/ai-assistants-mcp/" rel="noopener noreferrer"&gt;MCP guide&lt;/a&gt; has the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private and open
&lt;/h2&gt;

&lt;p&gt;There is no account to create and nothing phones home; the only extra request is an optional, signed update check. The code is MIT licensed, so you can read it, fork it and ship it. Use it only on traffic you are allowed to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website and docs: &lt;a href="https://luispeixoto.github.io/ProxyZip/" rel="noopener noreferrer"&gt;luispeixoto.github.io/ProxyZip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/LuisPeixoto/ProxyZip" rel="noopener noreferrer"&gt;github.com/LuisPeixoto/ProxyZip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Downloads: &lt;a href="https://github.com/LuisPeixoto/ProxyZip/releases/latest" rel="noopener noreferrer"&gt;latest release&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it saves you an afternoon of guessing, a star on GitHub helps other developers find it, and issues and pull requests are welcome. What would you want from a debugging proxy that the tools you use today do not do?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>api</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
