<?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: Alexandr Tsvetkov</title>
    <description>The latest articles on DEV Community by Alexandr Tsvetkov (@lordtao).</description>
    <link>https://dev.to/lordtao</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%2F3722156%2Faeff0edf-f88a-4c7b-bb19-0e425ce1febc.jpg</url>
      <title>DEV Community: Alexandr Tsvetkov</title>
      <link>https://dev.to/lordtao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lordtao"/>
    <language>en</language>
    <item>
      <title>Can we build a messenger with zero servers? My attempt at a truly serverless P2P tool.</title>
      <dc:creator>Alexandr Tsvetkov</dc:creator>
      <pubDate>Tue, 20 Jan 2026 17:16:01 +0000</pubDate>
      <link>https://dev.to/lordtao/can-we-build-a-messenger-with-zero-servers-my-attempt-at-a-truly-serverless-p2p-tool-oi1</link>
      <guid>https://dev.to/lordtao/can-we-build-a-messenger-with-zero-servers-my-attempt-at-a-truly-serverless-p2p-tool-oi1</guid>
      <description>&lt;p&gt;TL;DR: I’ve spent the last few months experimenting with a "clean room" approach to P2P communication. By using Kotlin Multiplatform and WebRTC, I managed to establish direct device-to-device communication using manual SDP (Offer/Answer) file exchange. No accounts, no servers, zero metadata footprint.&lt;/p&gt;

&lt;p&gt;The Story Behind the Project&lt;/p&gt;

&lt;p&gt;I’ve been working on this project as a personal challenge. I was tired of seeing "secure" messengers that still rely on central hubs. While End-to-End Encryption (E2EE) is great, the signaling server remains a massive point of metadata collection: who is talking to whom, when, and from which IP.&lt;/p&gt;

&lt;p&gt;I wanted to see if I could build something that physically cannot leak metadata because there's nowhere to leak it to.&lt;/p&gt;

&lt;p&gt;The Concept: Manual Signaling&lt;/p&gt;

&lt;p&gt;To achieve 100% independence, I replaced the automated signaling server with the user. In this implementation:&lt;/p&gt;

&lt;p&gt;User A generates an Offer (a small encrypted JSON/file).&lt;/p&gt;

&lt;p&gt;User A sends this file via any trusted out-of-band channel (Encrypted email, physical drive, QR code).&lt;/p&gt;

&lt;p&gt;User B imports the file, generates an Answer, and sends it back.&lt;/p&gt;

&lt;p&gt;A direct, encrypted P2P tunnel is established.&lt;/p&gt;

&lt;p&gt;Once the tunnel is up, the conversation exists only in the RAM of the two devices.&lt;/p&gt;

&lt;p&gt;Technical Challenges: The "P2P Paradox"&lt;/p&gt;

&lt;p&gt;Developing with WebRTC in a purely serverless environment revealed several non-obvious hurdles:&lt;/p&gt;

&lt;p&gt;The "Silent" Channel Problem: Maintaining a text-only (SCTP/UDP) channel is surprisingly harder than video. Without a signaling server to "re-kick" the session, home routers often close NAT mappings during silence. I had to implement a specific heartbeat logic to keep the NAT session alive.&lt;/p&gt;

&lt;p&gt;ICE Expiration &amp;amp; Connection Drops: Since ICE candidates are "frozen" inside the manual exchange file, the session is extremely sensitive to network changes. Switching from Wi-Fi to LTE kills the session instantly, requiring a new manual exchange.&lt;/p&gt;

&lt;p&gt;KMP Stack: Building this with Kotlin Multiplatform allowed me to share the security logic between Android and Windows, ensuring identical behavior across platforms.&lt;/p&gt;

&lt;p&gt;Privacy Auditability &amp;amp; Zero Bloatware&lt;/p&gt;

&lt;p&gt;Since I anticipate skepticism regarding closed-source software in the privacy space, I focused on making the app's behavior fully transparent:&lt;/p&gt;

&lt;p&gt;No Tracking or Ads: There are absolutely no third-party SDKs like Firebase, Google Play Services, or analytics. It’s a "clean" build ideal for De-Googled devices.&lt;/p&gt;

&lt;p&gt;Zero Network Calls: You can monitor the app with Wireshark or PCAPDroid. You will see 0.0kb of traffic to any external IP until the P2P handshake starts.&lt;/p&gt;

&lt;p&gt;Minimal Permissions: The app doesn't request access to contacts, SMS, or location.&lt;/p&gt;

&lt;p&gt;Why do this?&lt;/p&gt;

&lt;p&gt;This isn't meant to replace Telegram or Signal for daily use. It's a tool for specific cases where you need a "Clean Room" environment, or when you are operating in a network where all known messenger servers are blocked.&lt;/p&gt;

&lt;p&gt;I’m looking for feedback on the viability of manual SDP exchange. Does the removal of the signaling server justify the loss of convenience?&lt;/p&gt;

&lt;p&gt;More available on GitHub:&lt;br&gt;
&lt;a href="https://github.com/lordtao/apps-in-google-play" rel="noopener noreferrer"&gt;https://github.com/lordtao/apps-in-google-play&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  showdev, #p2p, #privacy, #webrtc.
&lt;/h1&gt;

</description>
      <category>networking</category>
      <category>privacy</category>
      <category>serverless</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
