<?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: Maxim</title>
    <description>The latest articles on DEV Community by Maxim (@vedomyyy).</description>
    <link>https://dev.to/vedomyyy</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%2F3995263%2Fa2006ec4-cf56-4e98-a461-dd608896918b.jpg</url>
      <title>DEV Community: Maxim</title>
      <link>https://dev.to/vedomyyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vedomyyy"/>
    <language>en</language>
    <item>
      <title>I built a cross-platform VPN client in Flutter because nothing out there fit what I wanted</title>
      <dc:creator>Maxim</dc:creator>
      <pubDate>Sun, 21 Jun 2026 12:17:16 +0000</pubDate>
      <link>https://dev.to/vedomyyy/i-built-a-cross-platform-vpn-client-in-flutter-because-nothing-out-there-fit-what-i-wanted-42jf</link>
      <guid>https://dev.to/vedomyyy/i-built-a-cross-platform-vpn-client-in-flutter-because-nothing-out-there-fit-what-i-wanted-42jf</guid>
      <description>&lt;p&gt;I'm a front-end-leaning dev (React/TS), so naturally I decided my next project should involve TUN interfaces, raw sockets, and Windows networking internals. No regrets. Mostly.&lt;br&gt;
The problem&lt;br&gt;
I wanted a VPN client for VLESS + Reality that:&lt;/p&gt;

&lt;p&gt;Worked the same way on Windows and Android&lt;br&gt;
Didn't require admin rights for basic use&lt;br&gt;
Wasn't an Electron app eating 300MB of RAM to show a toggle switch&lt;/p&gt;

&lt;p&gt;Couldn't find one. So I built To the Max — Flutter on both platforms, one codebase, two very different networking stacks underneath.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interesting parts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows has two modes. System Proxy mode just flips the registry proxy settings and routes through xray.exe — no admin needed, works for browsers and most apps. TUN mode is the real deal: spins up a WinTUN adapter, routes all OS traffic through it, and yes, that means requireAdministrator in the manifest. Getting the routing table right (bypass route for the VPN server IP, default route through the tunnel) took longer than I'd like to admit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android was its own beast. flutter_v2ray handles the heavy lifting, but here's a fun gotcha: if your AndroidManifest.xml doesn't have extractNativeLibs="true" and your Gradle config doesn't use useLegacyPackaging, libtun2socks.so just sits inside the APK unable to execute. Spent an evening confused about a "successful" connection routing zero bytes before finding that one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mux vs vision-flow. Most VLESS+Reality guides push xtls-rprx-vision as the gold standard flow. Turns out it's incompatible with Mux multiplexing — pick one. I went with Mux for the reduced handshake overhead across multiple streams, which meant explicitly not using the flow everyone recommends. Small thing, but it's the kind of detail that's easy to get wrong if you're following guides without reading the fine print.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kill switch, auto-reconnect on network change, split tunneling are on the roadmap. If anyone's dealt with reliable network-change detection on Flutter desktop, I'm all ears — that one's been more annoying than the TUN stuff.&lt;/p&gt;

&lt;p&gt;GPL-3.0, no telemetry, no accounts&lt;br&gt;
&lt;a href="https://github.com/vedomyyy/To-the-Max-VPN" rel="noopener noreferrer"&gt;https://github.com/vedomyyy/To-the-Max-VPN&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>flutter</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
