<?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: zhuweiye</title>
    <description>The latest articles on DEV Community by zhuweiye (@antruly).</description>
    <link>https://dev.to/antruly</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%2F4212821%2F75c8a58d-d8ef-4a49-902e-105b1639a90d.jpg</url>
      <title>DEV Community: zhuweiye</title>
      <link>https://dev.to/antruly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antruly"/>
    <language>en</language>
    <item>
      <title>uvscope: the Swiss Army knife of web debugging</title>
      <dc:creator>zhuweiye</dc:creator>
      <pubDate>Wed, 28 Oct 2026 11:20:19 +0000</pubDate>
      <link>https://dev.to/antruly/uvscope-a-local-first-multi-protocol-debugging-workbench-2idh</link>
      <guid>https://dev.to/antruly/uvscope-a-local-first-multi-protocol-debugging-workbench-2idh</guid>
      <description>&lt;p&gt;Debugging a request that crosses HTTP → WebSocket → raw TCP usually means juggling four or five tools: a REST client, a socket client, &lt;code&gt;nc&lt;/code&gt;, a proxy, and a terminal. Every switch costs you context — headers here, frames there, logs somewhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uvscope&lt;/strong&gt; is my attempt to collapse that stack into one place — a Swiss Army knife for web debugging. It puts HTTP, WebSocket, TCP, UDP, TLS, SOAP/WSDL and managed reverse proxies behind a single Vue 3 control plane, backed by a C++ daemon that owns the event loop, the SQLite store, authentication and all outbound network traffic. The browser only renders state and sends commands.&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%2F6injwnnyaokf1xp4ser2.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%2F6injwnnyaokf1xp4ser2.png" alt="uvscope dashboard" width="799" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another debugging tool?
&lt;/h2&gt;

&lt;p&gt;Most tools stop at request/response. uvscope is built around the whole handshake:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One workbench for every protocol&lt;/strong&gt; — HTTP/1.1 and HTTP/2, WebSocket, raw TCP/UDP, X.509 and WSDL-driven SOAP, with the same history, telemetry and export model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real gateway, not a mock&lt;/strong&gt; — reverse proxies with routing rules, weighted upstreams, retries, health checks, circuit breaking and WebSocket pass-through, with live traffic in view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-lived services without a second stack&lt;/strong&gt; — TCP/UDP listeners, SOCKS5 servers, reverse proxies and terminal PTYs run in child processes under one desired-state supervisor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt; — SQLite, server-side sessions, PBKDF2 password hashing, RBAC and a first-run admin flow. No telemetry, no cloud account, no external database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One network stack&lt;/strong&gt; — every target connection is driven by &lt;a href="https://github.com/Antruly/libuvcpp" rel="noopener noreferrer"&gt;libuvcpp&lt;/a&gt; 1.8.2, from socket to UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A UI that keeps context&lt;/strong&gt; — collapsible navigation, cached multi-tab workspaces, live telemetry and an offline command library built with Vue 3, Pinia and Vite.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's inside
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HTTP and APIs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/1.1 + HTTPS debugger with headers, body, timing and history&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Body modes: raw, form-urlencoded, multipart with files&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cURL / HAR / OpenAPI / Postman import and export&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environments with &lt;code&gt;{{variables}}&lt;/code&gt;, pre-request and post-response scripts&lt;/td&gt;
&lt;td&gt;Stable (browser-side)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/2 over TLS with ALPN, stream IDs, GOAWAY and frame summary&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gzip / deflate / brotli decoding with a raw-body toggle&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming download with progress, cancel and Range resume&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response preview: sandboxed HTML, images, audio, video and PDF&lt;/td&gt;
&lt;td&gt;Stable (scripts opt-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOAP 1.1 + WSDL operation discovery&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/3 and raw QUIC probes&lt;/td&gt;
&lt;td&gt;Supported in QUIC-enabled builds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F7hl41073e2yf7dh483kj.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%2F7hl41073e2yf7dh483kj.png" alt="HTTP debugger" width="800" height="437"&gt;&lt;/a&gt;&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%2F3ks5yo62whvb2tlf1ohh.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%2F3ks5yo62whvb2tlf1ohh.png" alt="HTTP/2 frame view" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Realtime and transports
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebSocket console: daemon-side backend sessions and browser-native mode&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend WebSocket headers, subprotocols, frames, ping/pong, close codes&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-shot TCP and UDP probes (text / hex)&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent TCP sessions with repeated sends and event logs&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP / UDP server listeners with sessions, datagrams and replies&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOCKS5 client and server (CONNECT / BIND / UDP ASSOCIATE)&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual terminal (Unix PTY / Windows ConPTY) with offline command library&lt;/td&gt;
&lt;td&gt;Stable — off by default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fu2auh76f87xsz1x13p8e.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%2Fu2auh76f87xsz1x13p8e.png" alt="WebSocket console" width="800" height="451"&gt;&lt;/a&gt;&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%2Fyh4krielndxvikq5bh0c.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%2Fyh4krielndxvikq5bh0c.png" alt="TCP/UDP probes" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gateway and long-lived services
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reverse proxy: exact / prefix / regex rules, redirects and rewrites&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header / method / host conditions, weighted upstreams, retries&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active upstream health checks, per-upstream circuit breaker, QPS/latency metrics&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy config hot reload with runtime config versions&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSocket pass-through in the reverse proxy&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Child-process isolation for proxies, listeners, SOCKS5 servers and terminals&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unified desired-state supervisor with restart, backoff and event log&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed TLS certificates, local CA, CA-signed certs and in-place renewal&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F3wtu7wqtq0c0ytisdea5.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%2F3wtu7wqtq0c0ytisdea5.png" alt="Reverse proxy rules" width="800" height="446"&gt;&lt;/a&gt;&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%2F22njpfryumjv6h4572q1.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%2F22njpfryumjv6h4572q1.png" alt="Upstream health and metrics" width="799" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Operations and security
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQLite persistence, first-run setup, local auth, RBAC (admin / operator / viewer)&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server-side sessions, active-session revocation, audit log&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup download and staged restore&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Module toggles, factory reset, update check, about/help&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese / English UI with browser-language detection and manual switch&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark / light / follow-system theme&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux tar/deb/rpm, Windows zip + installer, macOS tar.gz&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F0iadq3hoajurv8ct4lbn.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%2F0iadq3hoajurv8ct4lbn.png" alt="Virtual terminal" width="800" height="443"&gt;&lt;/a&gt;&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%2F93ayuky91xu3b69mcni2.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%2F93ayuky91xu3b69mcni2.png" alt="TLS certificate management" width="799" height="269"&gt;&lt;/a&gt;&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%2Fb0gsoskkg4mkhy2jubu9.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%2Fb0gsoskkg4mkhy2jubu9.png" alt="Service supervisor" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;C++17 compiler, CMake ≥ 3.20, Ninja&lt;/li&gt;
&lt;li&gt;Node.js 20+ and npm&lt;/li&gt;
&lt;li&gt;libuv, zlib, SQLite and OpenSSL development headers&lt;/li&gt;
&lt;li&gt;Linux, macOS, or Windows with MSYS2 MinGW-w64&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Debian/Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential cmake ninja-build libuv1-dev zlib1g-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libssl-dev libsqlite3-dev git curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build from source
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Antruly/uvscope.git
&lt;span class="nb"&gt;cd &lt;/span&gt;uvscope
./scripts/build.sh
./build/uvscope &lt;span class="nt"&gt;--port&lt;/span&gt; 8787 &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;build.sh&lt;/code&gt; clones the libuvcpp v1.8.2 release into &lt;code&gt;.deps/&lt;/code&gt;, applies one minimal upstream patch shipped in &lt;code&gt;patches/upstream/&lt;/code&gt; (WebSocket handshake headers), builds the frontend, then builds uvscope and runs &lt;code&gt;--self-check&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you already have a libuvcpp 1.8.2 SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; web ci &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; web run build
cmake &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-G&lt;/span&gt; Ninja &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DUVCPP_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/libuvcpp
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;-j&lt;/span&gt;
./build/uvscope &lt;span class="nt"&gt;--self-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://127.0.0.1:8787" rel="noopener noreferrer"&gt;http://127.0.0.1:8787&lt;/a&gt;. The first visit creates the administrator account. Runtime state lives in the data directory printed at startup (&lt;code&gt;~/.local/share/uvscope&lt;/code&gt; on Linux by default; override with &lt;code&gt;--data-dir&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uvscope [options]

  --host &amp;lt;addr&amp;gt;       Listen address (default 127.0.0.1)
  --port &amp;lt;port&amp;gt;       Listen port (default 8787, 0 picks a free port)
  --data-dir &amp;lt;path&amp;gt;   SQLite and runtime data
  --web-root &amp;lt;path&amp;gt;   Built frontend directory
  --tls-cert &amp;lt;pem&amp;gt;    Serve the workbench UI over HTTPS
  --tls-key &amp;lt;pem&amp;gt;     Private key paired with --tls-cert
  --open              Open the workbench in the default browser
  --self-check        Run offline smoke tests and exit
  --version           Print version and exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hidden child modes (&lt;code&gt;--proxy-child&lt;/code&gt;, &lt;code&gt;--listener-child&lt;/code&gt;, &lt;code&gt;--socks5-child&lt;/code&gt;, &lt;code&gt;--terminal-child&lt;/code&gt;, &lt;code&gt;--ipc-child&lt;/code&gt;) are spawned by the daemon and are not meant to be invoked by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vue 3 SPA (multi-tab, cached workspaces)
        │ same-origin HTTP + WebSocket + cookies
        ▼
uvscope daemon (C++17 / libuvcpp)
  ├─ auth + RBAC + SQLite + audit + backup
  ├─ HTTP API and static asset server
  ├─ probes, debug sessions and terminal sessions
  ├─ desired-state supervisor
  └─ optional child processes (isolated services)
        ├─ reverse proxy runtime
        ├─ TCP/UDP listener runtime
        ├─ SOCKS5 server runtime
        └─ terminal PTY / ConPTY
              │
              └─ libuvcpp → libuv → sockets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The daemon is the only process that serves the UI and owns SQLite. In the default in-process mode it also owns every outbound socket; with isolation enabled, a service opens its own sockets inside its child process. The WebSocket view additionally offers a browser-native mode, because origin, mixed-content and certificate prompts are part of what is being debugged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation and supervision
&lt;/h2&gt;

&lt;p&gt;Proxies, TCP/UDP listeners, SOCKS5 servers and virtual terminals accept &lt;code&gt;isolated: true&lt;/code&gt;. The parent process keeps the API state, scrollback and ownership metadata; the service runs in a child process and talks to the parent over a length-prefixed JSON IPC channel.&lt;/p&gt;

&lt;p&gt;All four service kinds are registered with one desired-state supervisor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a crashed child is restarted with exponential backoff (2–60 s) and a new PID;&lt;/li&gt;
&lt;li&gt;restart counts and events are visible in &lt;code&gt;/api/supervisor&lt;/code&gt; and &lt;code&gt;/api/supervisor/events&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;stopping a service clears its desired state, so the watchdog leaves it down;&lt;/li&gt;
&lt;li&gt;deleting a service unregisters it before teardown;&lt;/li&gt;
&lt;li&gt;a normal terminal &lt;code&gt;exit&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; a crash — the child stays alive so scrollback and the exit code remain readable. A crashed terminal is respawned with a fresh shell, and attached WebSocket clients receive a &lt;code&gt;reset&lt;/code&gt; frame before the new output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security model
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Default bind is &lt;code&gt;127.0.0.1&lt;/code&gt;. Do not expose uvscope to an untrusted network without an authenticating proxy.&lt;/li&gt;
&lt;li&gt;Passwords are PBKDF2-HMAC-SHA256 (210,000 iterations); sessions are server-side and stored as SHA-256 token hashes. Cookies are &lt;code&gt;HttpOnly&lt;/code&gt; + &lt;code&gt;SameSite=Lax&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Anyone who can authenticate can reach the host network, start listeners/proxies, and — when the terminal module is enabled — obtain a shell as the daemon user. Treat access as equivalent to code execution on that host.&lt;/li&gt;
&lt;li&gt;Isolated services run as the same OS user; isolation is a fault boundary, not a security sandbox.&lt;/li&gt;
&lt;li&gt;Use the TLS Inspector and “Allow insecure TLS” only against systems you control.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Platforms and downloads
&lt;/h2&gt;

&lt;p&gt;Prebuilt &lt;strong&gt;v1.0.1&lt;/strong&gt; assets are on the &lt;a href="https://github.com/Antruly/uvscope/releases/tag/v1.0.1" rel="noopener noreferrer"&gt;Releases page&lt;/a&gt;, shipped with &lt;code&gt;SHA256SUMS&lt;/code&gt;, a Sigstore keyless signature and a generated SPDX SBOM.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Linux x64&lt;/td&gt;
&lt;td&gt;tar.gz, deb, rpm&lt;/td&gt;
&lt;td&gt;Primary CI and smoke matrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux arm64&lt;/td&gt;
&lt;td&gt;tar.gz, deb, rpm&lt;/td&gt;
&lt;td&gt;Release build and self-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows x64 (MinGW)&lt;/td&gt;
&lt;td&gt;zip, setup.exe&lt;/td&gt;
&lt;td&gt;CI build, self-check and ConPTY smoke&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS arm64&lt;/td&gt;
&lt;td&gt;tar.gz&lt;/td&gt;
&lt;td&gt;CI build, self-check and HTTP/2 runtime check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/3 / QUIC&lt;/td&gt;
&lt;td&gt;QUIC-enabled builds&lt;/td&gt;
&lt;td&gt;Requires OpenSSL 3.6+; default assets keep QUIC off&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Verify a download with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; SHA256SUMS
cosign verify-blob &lt;span class="nt"&gt;--bundle&lt;/span&gt; SHA256SUMS.sigstore.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-identity-regexp&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/Antruly/uvscope/.*'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-oidc-issuer&lt;/span&gt; https://token.actions.githubusercontent.com &lt;span class="se"&gt;\&lt;/span&gt;
  SHA256SUMS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdeyqq3vons8jmpk29knc.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%2Fdeyqq3vons8jmpk29knc.png" alt="Theme and language settings" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;uvscope is MIT-licensed and the docs live at &lt;a href="https://antruly.github.io/uvscope/" rel="noopener noreferrer"&gt;https://antruly.github.io/uvscope/&lt;/a&gt; — including the &lt;a href="https://github.com/Antruly/uvscope/blob/main/docs/API.md" rel="noopener noreferrer"&gt;HTTP API&lt;/a&gt;, &lt;a href="https://github.com/Antruly/uvscope/blob/main/docs/ARCHITECTURE.md" rel="noopener noreferrer"&gt;architecture notes&lt;/a&gt;, &lt;a href="https://github.com/Antruly/uvscope/blob/main/docs/EVENTS.md" rel="noopener noreferrer"&gt;event schema&lt;/a&gt; and &lt;a href="https://github.com/Antruly/uvscope/blob/main/ROADMAP.md" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If it saves you a debugging session, a star on &lt;a href="https://github.com/Antruly/uvscope" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; helps other protocol wranglers find it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
