<?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: Maksim Lanies</title>
    <description>The latest articles on DEV Community by Maksim Lanies (@ilanies).</description>
    <link>https://dev.to/ilanies</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3103025%2Fb8a112d3-2e9a-48fe-93a3-fd82e6389b55.jpg</url>
      <title>DEV Community: Maksim Lanies</title>
      <link>https://dev.to/ilanies</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ilanies"/>
    <language>en</language>
    <item>
      <title>Stop Mixing Up Your RDP Sessions: Auto-Label Remote Desktop Windows</title>
      <dc:creator>Maksim Lanies</dc:creator>
      <pubDate>Fri, 12 Dec 2025 07:57:46 +0000</pubDate>
      <link>https://dev.to/ilanies/stop-mixing-up-your-rdp-sessions-auto-label-remote-desktop-windows-3mop</link>
      <guid>https://dev.to/ilanies/stop-mixing-up-your-rdp-sessions-auto-label-remote-desktop-windows-3mop</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Every SysAdmin Knows Too Well
&lt;/h2&gt;

&lt;p&gt;You have 8 Remote Desktop windows open. One is &lt;strong&gt;PROD-DB&lt;/strong&gt;, one is &lt;strong&gt;TEST-APP&lt;/strong&gt;, another is your local dev box. They all look identical. You need to restart a service... and you click the wrong window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production is down.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sound familiar? The native Windows MSTSC client doesn't give you visual cues. Sure, you can hover over the taskbar to see the hostname, but when you're moving fast, mistakes happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Old School" Workaround (And Why It Sucks)
&lt;/h2&gt;

&lt;p&gt;Most admins resort to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Editing the remote machine's hostname&lt;/strong&gt; to include &lt;code&gt;[PROD]&lt;/code&gt; or &lt;code&gt;[TEST]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using third-party RDP managers&lt;/strong&gt; like mRemoteNG or RD Tabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Just being really, really careful&lt;/strong&gt; (spoiler: doesn't work)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But what if you could keep using the &lt;strong&gt;native MSTSC&lt;/strong&gt; client and still get instant visual feedback?&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing: RDP Title Master
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RDP Title Master&lt;/strong&gt; is a tiny background utility that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitors all your RDP windows in real-time&lt;/li&gt;
&lt;li&gt;Matches window titles against your custom rules (IP addresses, hostnames)&lt;/li&gt;
&lt;li&gt;Overlays a &lt;strong&gt;color-coded badge&lt;/strong&gt; directly on the MSTSC toolbar&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I'd love to show you a screenshot, but ironically, I switched to macOS right after building this tool! If you try it out, please share a screenshot in the comments — I'd genuinely love to see it in action. 😅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example Config (&lt;code&gt;settings.json&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🔥 PRODUCTION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#e74c3c"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🏠 LOCAL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#2ecc71"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🧪 TEST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#3498db"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you connect to &lt;code&gt;prod-db-01.company.com&lt;/code&gt;, the toolbar instantly shows a &lt;strong&gt;red badge&lt;/strong&gt; saying "PRODUCTION". No more guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works (Technical Deep Dive)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Window Detection
&lt;/h3&gt;

&lt;p&gt;The tool uses &lt;code&gt;EnumWindows&lt;/code&gt; to scan all top-level windows, looking for the RDP window class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsRdpWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetClassName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"TscShellContainerClass"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Title Matching
&lt;/h3&gt;

&lt;p&gt;Once an RDP window is found, we grab its title (which usually contains the hostname or IP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StringComparison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrdinalIgnoreCase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. GDI+ Overlay
&lt;/h3&gt;

&lt;p&gt;We create a transparent bitmap with &lt;strong&gt;anti-aliased text&lt;/strong&gt; and a &lt;strong&gt;rounded badge background&lt;/strong&gt;, then apply it using &lt;code&gt;UpdateLayeredWindow&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bmp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SmoothingMode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SmoothingMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AntiAlias&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextRenderingHint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextRenderingHint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AntiAliasGridFit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Draw rounded rectangle badge&lt;/span&gt;
    &lt;span class="nf"&gt;FillRoundedRectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bgBrush&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;badgeRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Draw text on top&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;textBrush&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Daemon Mode
&lt;/h3&gt;

&lt;p&gt;The app runs in an infinite loop (every 3 seconds), checking for new RDP windows. This means you can start it once in the morning and forget about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why C# and Not Python/PowerShell?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Performance and distribution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single .exe&lt;/strong&gt;: No runtime dependencies. Just download and run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GDI+ Quality&lt;/strong&gt;: Native access to Windows graphics APIs for smooth rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt;: With trimming enabled, the final binary is ~50MB (self-contained .NET 8).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original prototype was in Python (still available in the repo's &lt;code&gt;legacy_python/&lt;/code&gt; folder), but C# made it production-ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation &amp;amp; Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download the latest release from &lt;a href="https://github.com/mlanies/mstsc_title_bar/releases" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Edit &lt;code&gt;settings.json&lt;/code&gt; with your server patterns&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;MstscTitleBar.exe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open any RDP session and watch the magic happen&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Building 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/mlanies/mstsc_title_bar.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mstsc_title_bar/MstscTitleBar
dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a portable executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet publish &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-r&lt;/span&gt; win-x64 &lt;span class="nt"&gt;--self-contained&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;:PublishSingleFile&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Environment Management
&lt;/h3&gt;

&lt;p&gt;If you manage DEV/STAGE/PROD environments, color-code them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 Red = Production (danger zone)&lt;/li&gt;
&lt;li&gt;🟡 Yellow = Staging (proceed with caution)&lt;/li&gt;
&lt;li&gt;🟢 Green = Dev (break things freely)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Client Segregation
&lt;/h3&gt;

&lt;p&gt;Consultants managing multiple clients can use patterns like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"client-a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Client A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#9b59b6"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"client-b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Client B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#f39c12"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Datacenter Identification
&lt;/h3&gt;

&lt;p&gt;Label servers by location:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🇺🇸 Virginia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#3498db"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eu-west"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🇪🇺 Ireland"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ColorHex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#2ecc71"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Known Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windowed Mode Only&lt;/strong&gt;: Full-screen RDP hides the toolbar (by design).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows 10/11&lt;/strong&gt;: Uses WinAPI calls specific to modern Windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refresh Delay&lt;/strong&gt;: 3-second polling interval (configurable in code).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Want to contribute? PRs welcome!&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you've ever typed &lt;code&gt;rm -rf /&lt;/code&gt; in the wrong terminal or restarted the wrong server, you know the value of visual cues. &lt;strong&gt;RDP Title Master&lt;/strong&gt; is a simple, zero-configuration tool that makes your daily workflow safer.&lt;/p&gt;

&lt;p&gt;Try it out and let me know what you think in the comments!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mlanies/mstsc_title_bar" rel="noopener noreferrer"&gt;https://github.com/mlanies/mstsc_title_bar&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you built tools to prevent "production accidents"? Share your stories below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>sysadmin</category>
      <category>devops</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Quic-test: an open tool for testing QUIC, BBRv3, and FEC under real-world network conditions</title>
      <dc:creator>Maksim Lanies</dc:creator>
      <pubDate>Thu, 11 Dec 2025 19:05:53 +0000</pubDate>
      <link>https://dev.to/cloudbridge/quic-test-an-open-tool-for-testing-quic-bbrv3-and-fec-under-real-world-network-conditions-2791</link>
      <guid>https://dev.to/cloudbridge/quic-test-an-open-tool-for-testing-quic-bbrv3-and-fec-under-real-world-network-conditions-2791</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was prepared as part of the CloudBridge Research project focused on optimizing network protocols (BBRv3, MASQUE, FEC, QUIC).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/cloudbridge-research/quic-test" rel="noopener noreferrer"&gt;github.com/cloudbridge-research/quic-test&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/user-attachments/assets/b3124696-1ab8-48e3-8b04-1cec3881c3a4" rel="noopener noreferrer"&gt;Video demo of quic-test&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&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.amazonaws.com%2Fuploads%2Farticles%2Fdial92u6kqjijvk9hwwn.jpg" alt="Screenshot of interface" width="800" height="543"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Why we built this
&lt;/h2&gt;

&lt;p&gt;When we began studying the behavior of QUIC, BBRv3, and Forward Error Correction in real networks — from Wi-Fi to mobile networks and regional backbones — we ran into a simple problem: there were almost &lt;strong&gt;no tools capable of accurately reproducing real-world network conditions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use iperf3, but it’s about TCP and basic UDP. You can take standalone QUIC libraries, but they lack visualization and load generation. You can write custom simulators, but they do not reflect real channel behavior. Want to test how BBRv3 performs between Moscow and Novosibirsk? Please: find three servers across different datacenters, configure netem, manually collect metrics and &lt;em&gt;hope&lt;/em&gt; results will be reproducible.&lt;/p&gt;

&lt;p&gt;There was no comprehensive QUIC tester with charts, channel profiles, FEC, BBRv3 support, TUI, and Prometheus metrics.&lt;br&gt;
So we built &lt;strong&gt;quic-test&lt;/strong&gt; — an open tool we use inside CloudBridge Research for all experiments. And now we share it with the community, universities, and engineers.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is quic-test
&lt;/h2&gt;

&lt;p&gt;A fully open laboratory environment for analyzing the behavior of QUIC, BBRv3, and FEC in real networks.&lt;br&gt;
Not a simulator, but a real engineering instrument — all our research is based on measurements collected with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Who quic-test is for
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Network engineers&lt;/strong&gt; — compare TCP/QUIC/BBRv3 in your own networks and understand where QUIC provides real benefits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SRE and DevOps teams&lt;/strong&gt; — test service behavior under packet loss and high RTT, prepare for production issues before they appear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Educators and students&lt;/strong&gt; — run modern labs on transport protocols with real metrics and visualization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Researchers&lt;/strong&gt; — gather datasets for ML routing models, publish reproducible results.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key capabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Protocols:&lt;/strong&gt; QUIC (RFC 9000), HTTP/3, 0-RTT resumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congestion Control:&lt;/strong&gt; BBRv2 (stable), BBRv3 (experimental), CUBIC, Reno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forward Error Correction:&lt;/strong&gt; XOR-FEC (working), RS-FEC (in development).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network profiles:&lt;/strong&gt; mobile (4G/LTE), Wi-Fi, lossy (3–5% loss), high-latency (regional routes).&lt;br&gt;
All profiles are based on real measurements from our CloudBridge Edge PoPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metrics:&lt;/strong&gt; Prometheus, Grafana, TUI visualization (&lt;strong&gt;quic-bottom&lt;/strong&gt; in Rust).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparison:&lt;/strong&gt; TCP vs QUIC under identical conditions.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;The simplest way to start is with ready Docker images:&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="c"&gt;# Run client (performance test)&lt;/span&gt;
docker run mlanies/quic-test:latest &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;demo.quic.tech:4433

&lt;span class="c"&gt;# Run server&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 4433:4433/udp mlanies/quic-test:latest &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server
&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/twogc/quic-test
&lt;span class="nb"&gt;cd &lt;/span&gt;quic-test

&lt;span class="c"&gt;# Build FEC library (requires clang)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;internal/fec &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../..

&lt;span class="c"&gt;# Build main tool (requires Go 1.21+)&lt;/span&gt;
go build &lt;span class="nt"&gt;-o&lt;/span&gt; quic-test cmd/quic-test/main.go

&lt;span class="c"&gt;# Run&lt;/span&gt;
./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;demo.quic.tech:4433
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  First test: QUIC vs TCP
&lt;/h2&gt;

&lt;p&gt;Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server &lt;span class="nt"&gt;--listen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:4433
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1:4433 &lt;span class="nt"&gt;--duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;QUIC vs TCP comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1:4433 &lt;span class="nt"&gt;--compare-tcp&lt;/span&gt; &lt;span class="nt"&gt;--duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TUI visualization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;quic-bottom &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1:4433
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results include RTT, jitter, throughput, retransmissions, packet loss, FEC recovery, and fairness under parallel tests.&lt;br&gt;
These are the exact metrics we used when achieving jitter &amp;lt;1 ms on PoP↔PoP.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real network profiles
&lt;/h2&gt;

&lt;p&gt;Profiles are based on actual measurements from CloudBridge Edge PoPs (Moscow, Frankfurt, Amsterdam).&lt;/p&gt;
&lt;h3&gt;
  
  
  Mobile (4G/LTE)
&lt;/h3&gt;

&lt;p&gt;RTT 50–150 ms (avg ~80), throughput 5–50 Mbps (avg ~20), 0.1–2% loss, jitter 10–30 ms.&lt;br&gt;
On this profile we tested FEC and achieved ~+10% goodput at 5% loss.&lt;/p&gt;
&lt;h3&gt;
  
  
  Wi-Fi
&lt;/h3&gt;

&lt;p&gt;Burst losses and micro-drop behavior typical for office/home Wi-Fi.&lt;/p&gt;
&lt;h3&gt;
  
  
  Lossy
&lt;/h3&gt;

&lt;p&gt;3–5% stable loss — ideal for testing FEC recovery efficiency.&lt;/p&gt;
&lt;h3&gt;
  
  
  High-latency
&lt;/h3&gt;

&lt;p&gt;RTT 50–150 ms — typical interregional RU↔EU routes that we tested.&lt;/p&gt;

&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mobile &lt;span class="nt"&gt;--compare-tcp&lt;/span&gt; &lt;span class="nt"&gt;--duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom profiles
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="nt"&gt;--profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;custom &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rtt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100ms &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bandwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10mbps &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1% &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jitter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Metrics &amp;amp; Grafana integration
&lt;/h2&gt;

&lt;p&gt;Server with Prometheus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server &lt;span class="nt"&gt;--prometheus-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Available metrics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;quic_rtt_ms&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quic_jitter_ms&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quic_loss_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fec_recovered&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcp_goodput_mbps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quic_goodput_mbps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bbrv3_bandwidth_est&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quic_datagram_rate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;connection_drops&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queue_delay_ms&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We use these metrics in Grafana and in &lt;a href="https://github.com/twogc/ai-routing-lab" rel="noopener noreferrer"&gt;AI Routing Lab&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Research examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Case 1: Mobile profile (5% loss)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Baseline QUIC&lt;/th&gt;
&lt;th&gt;QUIC + FEC 10%&lt;/th&gt;
&lt;th&gt;Gain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Goodput&lt;/td&gt;
&lt;td&gt;3.628 Mbps&lt;/td&gt;
&lt;td&gt;3.991 Mbps&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+10%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jitter&lt;/td&gt;
&lt;td&gt;0.72 ms&lt;/td&gt;
&lt;td&gt;0.72 ms&lt;/td&gt;
&lt;td&gt;stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTT P50&lt;/td&gt;
&lt;td&gt;51.25 ms&lt;/td&gt;
&lt;td&gt;51.25 ms&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;TCP CUBIC shows 4–6× degradation here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: VPN tunnels with 10% loss
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;TCP&lt;/th&gt;
&lt;th&gt;QUIC&lt;/th&gt;
&lt;th&gt;QUIC + FEC 15%&lt;/th&gt;
&lt;th&gt;Gain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;25 Mbps&lt;/td&gt;
&lt;td&gt;45 Mbps&lt;/td&gt;
&lt;td&gt;68 Mbps&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+172%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retransmissions&lt;/td&gt;
&lt;td&gt;18,500&lt;/td&gt;
&lt;td&gt;12,200&lt;/td&gt;
&lt;td&gt;3,800&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-79%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P99 RTT&lt;/td&gt;
&lt;td&gt;450 ms&lt;/td&gt;
&lt;td&gt;320 ms&lt;/td&gt;
&lt;td&gt;210 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-53%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Other results
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PoP↔PoP (Moscow—Frankfurt—Amsterdam): jitter &amp;lt;1 ms, connection time 9.20 ms&lt;/li&gt;
&lt;li&gt;BBRv2 vs BBRv3 on satellite-like profiles: +16% throughput&lt;/li&gt;
&lt;li&gt;Production profile: 9.258 Mbps goodput at 30 connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More in &lt;code&gt;docs/reports/&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Usage in universities
&lt;/h2&gt;

&lt;p&gt;quic-test was originally designed as a teaching laboratory environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Available lab works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lab #1: QUIC basics&lt;/strong&gt; — RTT, jitter, handshake, 0-RTT, connection migration.&lt;br&gt;
&lt;strong&gt;Lab #2: TCP vs QUIC&lt;/strong&gt; — losses, HOL blocking, performance.&lt;br&gt;
&lt;strong&gt;Lab #3: Losses &amp;amp; FEC&lt;/strong&gt; — redundancy trade-offs.&lt;br&gt;
&lt;strong&gt;Lab #4: BBRv3 vs CUBIC&lt;/strong&gt; — congestion control comparison.&lt;br&gt;
&lt;strong&gt;Lab #5: NAT traversal&lt;/strong&gt; — ICE/STUN/TURN.&lt;br&gt;
&lt;strong&gt;Lab #6: HTTP/3 performance&lt;/strong&gt; — multiplexing vs HOL-blocked HTTP/2.&lt;/p&gt;

&lt;p&gt;Materials are available in &lt;code&gt;docs/labs/&lt;/code&gt;.&lt;/p&gt;


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

&lt;p&gt;Detailed scheme in &lt;code&gt;docs/ARCHITECTURE.md&lt;/code&gt;. Summary:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go core&lt;/strong&gt; — transport, QUIC, measurements (quic-go v0.40, BBRv2 and experimental BBRv3).&lt;br&gt;
&lt;strong&gt;Rust TUI&lt;/strong&gt; — &lt;em&gt;quic-bottom&lt;/em&gt; real-time visualization.&lt;br&gt;
&lt;strong&gt;C++ FEC module&lt;/strong&gt; — AVX2 SIMD optimized, stable XOR-FEC, experimental RS-FEC.&lt;br&gt;
&lt;strong&gt;Metrics&lt;/strong&gt; — Prometheus, HDR histograms.&lt;br&gt;
&lt;strong&gt;Network emulation&lt;/strong&gt; — token bucket, delay queue, random drop.&lt;/p&gt;


&lt;h2&gt;
  
  
  Project status
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stable&lt;/strong&gt; — QUIC client/server, TCP vs QUIC comparison, profiles, Prometheus, TUI.&lt;br&gt;
&lt;strong&gt;Experimental&lt;/strong&gt; — BBRv3, RS-FEC, MASQUE CONNECT-IP, TCP-over-QUIC.&lt;br&gt;
&lt;strong&gt;Planned&lt;/strong&gt; — automatic plotting, eBPF latency inspector, mini-PoP container.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why we opened the project
&lt;/h2&gt;

&lt;p&gt;CloudBridge Research is an independent research center (ANO "Center for Network Technology Research and Development", founded in 2025).&lt;br&gt;
Our goal is to create an open stack of tools for engineers and universities.&lt;br&gt;
We believe that open research accelerates technological progress and makes it accessible to everyone.&lt;/p&gt;


&lt;h2&gt;
  
  
  Related projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/twogc/ai-routing-lab" rel="noopener noreferrer"&gt;AI Routing Lab&lt;/a&gt;&lt;/strong&gt; — uses quic-test metrics to train delay prediction models (&amp;gt;92% accuracy target).&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/twogc/masque-vpn" rel="noopener noreferrer"&gt;masque-vpn&lt;/a&gt;&lt;/strong&gt; — QUIC/MASQUE VPN load-tested with quic-test, including high-loss scenarios.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to reproduce our results
&lt;/h2&gt;

&lt;p&gt;All configs and commands are in the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production profile (0.1% loss, 20 ms RTT):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server &lt;span class="nt"&gt;--listen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:4433 &lt;span class="nt"&gt;--prometheus-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9090

./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;server-ip&amp;gt;:4433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--connections&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60s &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--congestion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bbrv3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;custom &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rtt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20ms &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.1%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mobile profile (5% loss) with FEC:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--listen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:4433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fec-redundancy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.10

./quic-test &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;server-ip&amp;gt;:4433 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mobile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fec-redundancy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other scenarios are described in &lt;code&gt;scripts/&lt;/code&gt; and &lt;code&gt;docs/reports/&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contributions &amp;amp; feedback
&lt;/h2&gt;

&lt;p&gt;We welcome issues, PRs, test reports, feature proposals, and integrations into university courses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/cloudbridge-research/quic-test" rel="noopener noreferrer"&gt;https://github.com/cloudbridge-research/quic-test&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:info@cloudbridge-research.ru"&gt;info@cloudbridge-research.ru&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="https://cloudbridge-research.ru" rel="noopener noreferrer"&gt;https://cloudbridge-research.ru&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you need to honestly evaluate how QUIC, BBRv3, and FEC behave in real networks — from Wi-Fi to mobile to regional backbones — try &lt;strong&gt;quic-test&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;All results are reproducible, all tools are open, and this is a living engineering project that evolves with the community.&lt;/p&gt;

&lt;p&gt;Try it, reproduce our findings, share your results — together we make networks better.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>testing</category>
      <category>opensource</category>
      <category>networking</category>
    </item>
    <item>
      <title>Desktop UI for Cloudflare Tunnel: Making Remote Access Simple</title>
      <dc:creator>Maksim Lanies</dc:creator>
      <pubDate>Fri, 05 Dec 2025 18:40:58 +0000</pubDate>
      <link>https://dev.to/ilanies/a-simple-desktop-ui-for-cloudflare-tunnels-rdp-ssh-tcp-3dj9</link>
      <guid>https://dev.to/ilanies/a-simple-desktop-ui-for-cloudflare-tunnels-rdp-ssh-tcp-3dj9</guid>
      <description>&lt;h2&gt;
  
  
  What is Cloudflare Tunnel?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt; provides you with a secure way to connect your resources to Cloudflare &lt;strong&gt;without a publicly routable IP address&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Instead of sending traffic to an external IP, a lightweight daemon (&lt;code&gt;cloudflared&lt;/code&gt;) in your infrastructure creates &lt;strong&gt;outbound-only connections&lt;/strong&gt; to Cloudflare's global network. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;No inbound ports to open&lt;/strong&gt; - Your firewall stays closed&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No exposed origin IP&lt;/strong&gt; - Your infrastructure stays hidden&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Bidirectional communication&lt;/strong&gt; - Despite being outbound-only, traffic flows both ways&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Protection from bypass attacks&lt;/strong&gt; - All traffic routes through Cloudflare's edge&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Can You Connect?
&lt;/h3&gt;

&lt;p&gt;Cloudflare Tunnel can securely connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/HTTPS web servers&lt;/strong&gt; - Expose web applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH servers&lt;/strong&gt; - Secure shell access (&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/" rel="noopener noreferrer"&gt;guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDP (Remote Desktop)&lt;/strong&gt; - Windows remote desktop (&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/rdp/" rel="noopener noreferrer"&gt;guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP services&lt;/strong&gt; - Databases, custom applications, any TCP protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMB file shares&lt;/strong&gt; - Network file access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC services&lt;/strong&gt; - Modern API protocols&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more in the &lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/cloudflare/cloudflared" rel="noopener noreferrer"&gt;&lt;code&gt;cloudflared&lt;/code&gt;&lt;/a&gt; is an amazing tool — lightweight, secure, and battle-tested by millions of connections daily.&lt;/p&gt;

&lt;p&gt;But there's a common pain point:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For quick, ad-hoc connections, the CLI/YAML workflow can feel heavy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quickly RDP into a remote Windows machine&lt;/li&gt;
&lt;li&gt;Open an SSH tunnel for a few minutes&lt;/li&gt;
&lt;li&gt;Share a local dev server with a colleague&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You typically need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write or edit a YAML configuration file
&lt;/li&gt;
&lt;li&gt;Remember specific CLI flags and syntax
&lt;/li&gt;
&lt;li&gt;Manually manage tunnel processes
&lt;/li&gt;
&lt;li&gt;Track which ports are in use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For production deployments, this workflow makes sense. But for &lt;strong&gt;temporary, one-off connections&lt;/strong&gt;, it can slow you down.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Solution: A Desktop UI for cloudflared
&lt;/h1&gt;

&lt;p&gt;What if you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click "Connect to RDP" and get instant access?&lt;/li&gt;
&lt;li&gt;See all your active tunnels in one place?&lt;/li&gt;
&lt;li&gt;Never worry about port conflicts or process management?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built exactly that:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mlanies/desktop-argo-tunnel" rel="noopener noreferrer"&gt;https://github.com/mlanies/desktop-argo-tunnel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboard
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fo1npsigzfly2dtdo1lt1.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.amazonaws.com%2Fuploads%2Farticles%2Fo1npsigzfly2dtdo1lt1.png" alt="Dashboard" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What the app does
&lt;/h1&gt;

&lt;p&gt;The UI wraps &lt;code&gt;cloudflared&lt;/code&gt; to make common tasks instant:&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;One-Click Connections&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch RDP tunnels instantly&lt;/li&gt;
&lt;li&gt;Connect to SSH servers with a button click&lt;/li&gt;
&lt;li&gt;Forward any TCP service without typing commands&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Zero Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App automatically downloads and installs &lt;code&gt;cloudflared&lt;/code&gt; if needed&lt;/li&gt;
&lt;li&gt;No manual setup required&lt;/li&gt;
&lt;li&gt;Works out of the box&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Port Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic port assignment (10000-60000 range)&lt;/li&gt;
&lt;li&gt;No port conflicts&lt;/li&gt;
&lt;li&gt;See exactly which local port each tunnel uses&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Secure Credential Storage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in KeePass (.kdbx) integration&lt;/li&gt;
&lt;li&gt;AES-256 encrypted password storage&lt;/li&gt;
&lt;li&gt;Import/export existing KeePass databases&lt;/li&gt;
&lt;li&gt;Password quality analysis&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Real-Time Monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View all active tunnels with their PIDs&lt;/li&gt;
&lt;li&gt;Monitor connection health&lt;/li&gt;
&lt;li&gt;Track recent activity&lt;/li&gt;
&lt;li&gt;Stop tunnels with one click&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No YAML files.&lt;br&gt;&lt;br&gt;
No terminal commands.&lt;br&gt;&lt;br&gt;
Just "Connect" and "Disconnect".&lt;/p&gt;


&lt;h1&gt;
  
  
  Why build this?
&lt;/h1&gt;
&lt;h3&gt;
  
  
  The Use Case Gap
&lt;/h3&gt;

&lt;p&gt;Cloudflare Tunnel documentation covers two main scenarios well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Production deployments&lt;/strong&gt; - Full YAML configs, ingress rules, DNS routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Access integration&lt;/strong&gt; - Zero Trust with identity policies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But there's a third scenario that's less documented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Quick, temporary TCP tunneling&lt;/strong&gt; - "I just need to RDP into that server right now"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This app fills that gap.&lt;/p&gt;
&lt;h3&gt;
  
  
  Who Benefits?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DevOps Engineers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Quick access to remote servers without VPN overhead&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support Teams&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non-technical staff can connect to services without CLI knowledge&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instant SSH/RDP access during debugging sessions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small Teams&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Simple remote access without complex Zero Trust setup&lt;/p&gt;


&lt;h1&gt;
  
  
  How it works
&lt;/h1&gt;

&lt;p&gt;The app acts as a friendly wrapper around &lt;a href="https://github.com/cloudflare/cloudflared" rel="noopener noreferrer"&gt;&lt;code&gt;cloudflared&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Installation&lt;/strong&gt;: Downloads and installs &lt;code&gt;cloudflared&lt;/code&gt; if not present&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Generation&lt;/strong&gt;: Translates UI actions into correct &lt;code&gt;cloudflared&lt;/code&gt; CLI arguments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Management&lt;/strong&gt;: Starts, monitors, and stops &lt;code&gt;cloudflared&lt;/code&gt; processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Feedback&lt;/strong&gt;: Shows active connections, local ports, and process IDs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Under the hood, it's using &lt;code&gt;cloudflared access tcp&lt;/code&gt; commands like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared access tcp &lt;span class="nt"&gt;--hostname&lt;/span&gt; ssh.example.com &lt;span class="nt"&gt;--url&lt;/span&gt; localhost:12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But you never have to type that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Architecture
&lt;/h3&gt;

&lt;p&gt;Built with modern, performant technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rust + Tauri 2.0&lt;/strong&gt; - Lightweight native backend (~50MB total)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 18 + TypeScript&lt;/strong&gt; - Type-safe, responsive UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KeePass integration&lt;/strong&gt; - Secure credential storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform&lt;/strong&gt; - Windows, macOS, and Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For technical details, see the &lt;a href="https://github.com/mlanies/desktop-argo-tunnel/blob/main/docs/ARCHITECTURE.md" rel="noopener noreferrer"&gt;Architecture Documentation&lt;/a&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Features in Detail
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Zero Configuration
&lt;/h3&gt;

&lt;p&gt;The app can automatically download and install &lt;a href="https://github.com/cloudflare/cloudflared" rel="noopener noreferrer"&gt;&lt;code&gt;cloudflared&lt;/code&gt;&lt;/a&gt; if it's not present on your system. No manual setup required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secure Credential Management
&lt;/h3&gt;

&lt;p&gt;Built-in KeePass (.kdbx) database support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and manage password containers&lt;/li&gt;
&lt;li&gt;Store credentials with AES-256 encryption&lt;/li&gt;
&lt;li&gt;Import/export existing KeePass databases&lt;/li&gt;
&lt;li&gt;Password quality analysis and security scoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-time Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;View all active tunnels with local ports and PIDs&lt;/li&gt;
&lt;li&gt;Monitor connection health and statistics&lt;/li&gt;
&lt;li&gt;Track recent activity and connection history&lt;/li&gt;
&lt;li&gt;Copy local ports to clipboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multi-language Support
&lt;/h3&gt;

&lt;p&gt;Full internationalization with English and Russian support (more languages coming soon).&lt;/p&gt;




&lt;h1&gt;
  
  
  Comparison with Standard Workflow
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Traditional CLI Approach
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Remember the syntax&lt;/span&gt;
cloudflared access tcp &lt;span class="nt"&gt;--hostname&lt;/span&gt; rdp.example.com &lt;span class="nt"&gt;--url&lt;/span&gt; localhost:3389

&lt;span class="c"&gt;# 2. Keep track of the process&lt;/span&gt;
&lt;span class="c"&gt;# 3. Remember to kill it when done&lt;/span&gt;
&lt;span class="c"&gt;# 4. Hope you didn't forget which port you used&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With Desktop UI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click server name&lt;/li&gt;
&lt;li&gt;Click "Connect"&lt;/li&gt;
&lt;li&gt;See local port displayed&lt;/li&gt;
&lt;li&gt;Click "Disconnect" when done&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Looking for feedback
&lt;/h1&gt;

&lt;p&gt;I would love to hear your thoughts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this fill a real need in your workflow?&lt;/li&gt;
&lt;li&gt;What other features would make this more useful?&lt;/li&gt;
&lt;li&gt;Should Cloudflare consider an official desktop UI?&lt;/li&gt;
&lt;li&gt;Any UX suggestions or improvements?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm actively collecting feedback to shape the next iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/mlanies/desktop-argo-tunnel" rel="noopener noreferrer"&gt;https://github.com/mlanies/desktop-argo-tunnel&lt;/a&gt;  &lt;/p&gt;




&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Official Cloudflare Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/" rel="noopener noreferrer"&gt;Cloudflare Tunnel Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/how-tunnel-works/" rel="noopener noreferrer"&gt;How Tunnel Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/" rel="noopener noreferrer"&gt;SSH Use Case&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/rdp/" rel="noopener noreferrer"&gt;RDP Use Case&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cloudflare/cloudflared" rel="noopener noreferrer"&gt;cloudflared GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  This Project
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mlanies/desktop-argo-tunnel" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mlanies/desktop-argo-tunnel/blob/main/docs/ARCHITECTURE.md" rel="noopener noreferrer"&gt;Architecture Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mlanies/desktop-argo-tunnel/blob/main/docs/USER_GUIDE.md" rel="noopener noreferrer"&gt;User Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is a community project, not an official Cloudflare tool. It's designed to complement &lt;code&gt;cloudflared&lt;/code&gt; for specific use cases, not replace it.&lt;/p&gt;

&lt;p&gt;Thanks for reading and huge respect to the Cloudflare team for building an amazing tunneling ecosystem!&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>ui</category>
    </item>
  </channel>
</rss>
