<?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>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>
