<?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: Denis Rybakov</title>
    <description>The latest articles on DEV Community by Denis Rybakov (@shinomontaz).</description>
    <link>https://dev.to/shinomontaz</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%2F3575266%2F9d91a539-d840-429a-9c7f-183455223cf7.jpeg</url>
      <title>DEV Community: Denis Rybakov</title>
      <link>https://dev.to/shinomontaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shinomontaz"/>
    <language>en</language>
    <item>
      <title>Circumventing Internet Censorship: Protocols, Techniques, and the Arms Race</title>
      <dc:creator>Denis Rybakov</dc:creator>
      <pubDate>Sun, 15 Feb 2026 23:21:45 +0000</pubDate>
      <link>https://dev.to/shinomontaz/circumventing-internet-censorship-protocols-techniques-and-the-arms-race-20ff</link>
      <guid>https://dev.to/shinomontaz/circumventing-internet-censorship-protocols-techniques-and-the-arms-race-20ff</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 2 of the series: "Internet Censorship in Russia: A Technical Deep Dive"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Educational Purpose:&lt;/strong&gt; This article examines the technical architecture of internet filtering systems for educational purposes. The author does not encourage violation of local laws. All information is based on publicly available sources and open-source research.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Quick Recap: What We Learned in Part 1
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/shinomontaz/russias-internet-filtering-infrastructure-evolution-and-architecture-cel"&gt;Part 1&lt;/a&gt;, we examined Russia's TSPU (Technical Means of Counteracting Threats) infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points to remember:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What TSPU can do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See SNI (Server Name Indication) in TLS Client Hello — primary blocking method&lt;/li&gt;
&lt;li&gt;Analyze metadata: packet sizes, timing patterns, connection duration&lt;/li&gt;
&lt;li&gt;Use ML/statistics to fingerprint VPN protocols&lt;/li&gt;
&lt;li&gt;Actively probe suspicious servers&lt;/li&gt;
&lt;li&gt;Send RST packets to kill connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What TSPU cannot do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decrypt modern TLS without MITM (Man-in-the-Middle)&lt;/li&gt;
&lt;li&gt;Process 100% of traffic deeply (performance constraint at 100 Gbps)&lt;/li&gt;
&lt;li&gt;Block without collateral damage (shared IPs, CDN problem)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fundamental trade-off is usual: &lt;strong&gt;performance versus accuracy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight from Part 1:&lt;/strong&gt; TSPU has limitations imposed by physics (processing speed) and architecture (distributed internet).&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Sides of Technical Conflict
&lt;/h2&gt;

&lt;p&gt;To understand circumvention approaches, we need to think from both perspectives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Attacker" side&lt;/strong&gt; (conditional term, not moral judgment):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People wanting access to blocked resources&lt;/li&gt;
&lt;li&gt;Privacy enthusiasts&lt;/li&gt;
&lt;li&gt;Engineers researching censorship resistance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; exploit architectural weaknesses of filtering infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Defender" side&lt;/strong&gt; (conditional term, not moral judgment):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TSPU operators&lt;/li&gt;
&lt;li&gt;Government filtering mandate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; maximize blocking effectiveness within architectural and economic constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this part, we'll "wear shoes" of both sides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What weakness does attacker exploit?&lt;/li&gt;
&lt;li&gt;How can defender adapt?&lt;/li&gt;
&lt;li&gt;What is next move in response?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is engineering analysis of distributed systems under adversarial conditions.&lt;/p&gt;

&lt;p&gt;Now we look at &lt;strong&gt;how circumvention techniques exploit TSPU limitations&lt;/strong&gt;. First we recall OSI model to understand where encryption happens. Then we discuss what architectural weaknesses can be exploited.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding Network Layers and Encryption
&lt;/h2&gt;

&lt;p&gt;To understand why specific technique works, it is useful to look at where encryption happens in network stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where&lt;/strong&gt; encryption operates determines &lt;strong&gt;what&lt;/strong&gt; DPI can see. Despite fact that DPI doesn't rely only on visible data, but also on packet and traffic patterns, visible part is checked first due to simplicity.&lt;/p&gt;

&lt;h3&gt;
  
  
  OSI Model: Where Things Happen
&lt;/h3&gt;

&lt;p&gt;The OSI model describes network communication in layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│ L7: Application (HTTP, SSH)         │
├─────────────────────────────────────┤
│ L6: Presentation                    │
├─────────────────────────────────────┤
│ L5: Session (TLS operates here)     │
├─────────────────────────────────────┤
│ L4: Transport (TCP, UDP)            │
├─────────────────────────────────────┤
│ L3: Network (IP)                    │
├─────────────────────────────────────┤
│ L2: Data Link                       │
├─────────────────────────────────────┤
│ L1: Physical                        │
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TLS is often mapped to OSI Session/Presentation layers, but in modern TCP/IP model it acts as a security layer between application and transport.&lt;/p&gt;

&lt;h3&gt;
  
  
  What DPI Sees at Different Layers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Normal HTTPS connection (TLS-encrypted):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐
│ HTTP (L7)            │
├──────────────────────┤
│ TLS (L5)             │ ← Encrypts HTTP
├──────────────────────┤
│ TCP (L4)             │
├──────────────────────┤
│ IP (L3)              │
└──────────────────────┘

What DPI sees:
✅ IP addresses (source, destination)
✅ TCP ports (443 for HTTPS)
✅ TLS handshake (Client Hello, Server Hello)
✅ SNI field in Client Hello ← PLAINTEXT
❌ HTTP content (encrypted by TLS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The critical point:&lt;/strong&gt; SNI must be sent before encryption begins (TLS specification requirement). This is primary blocking method in Part 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nested Encryption: Protocol Inside Protocol
&lt;/h3&gt;

&lt;p&gt;Here is interesting property of network stack: &lt;strong&gt;upper layer protocols can encapsulate lower layer protocols&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: HTTPS inside SSH tunnel&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐
│ HTTP (L7)            │
├──────────────────────┤
│ TLS (L5)             │ ← Encrypts HTTP
├──────────────────────┤
│ SSH (L7)             │ ← Encrypts TLS!
├──────────────────────┤
│ TCP (L4)             │
├──────────────────────┤
│ IP (L3)              │
└──────────────────────┘

What DPI sees:
✅ IP addresses
✅ TCP ports
✅ SSH protocol handshake
❌ TLS Client Hello (hidden inside SSH)
❌ SNI (hidden inside SSH)
❌ HTTP content (double-encrypted)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is called &lt;strong&gt;nested encryption&lt;/strong&gt; or &lt;strong&gt;protocol tunneling&lt;/strong&gt;. We will return to this idea later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exploiting TSPU Architectural Weaknesses
&lt;/h2&gt;

&lt;p&gt;Let's recall DPI limitations and specefics from Part 1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cannot decrypt encrypted traffic&lt;/li&gt;
&lt;li&gt;Must work at line speed (100 Gbps)&lt;/li&gt;
&lt;li&gt;Can analyze unencrypted hello-part of TLS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we address each limitation and see how "attacker" side can use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Weakness 1: Cannot See Inside Encrypted Traffic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Attacker approach:&lt;/strong&gt; Use transport layer (L4) and build own encryption on top, where all traffic is encrypted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; WireGuard protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defender response:&lt;/strong&gt; Two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ban all encrypted non-standard traffic (too broad, breaks legitimate apps)&lt;/li&gt;
&lt;li&gt;Learn patterns of encrypted traffic (current approach)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How defender detects WireGuard:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For now, DPI in Russia detects pure WireGuard due to simple traffic patterns — standard size of first segment and reply. This is based on encryption specifics.&lt;/p&gt;

&lt;p&gt;Detection logic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is it UDP?&lt;/li&gt;
&lt;li&gt;Is first packet 148 bytes?&lt;/li&gt;
&lt;li&gt;Is second packet 92 bytes?&lt;/li&gt;
&lt;li&gt;Are data packets 16-byte aligned?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If all yes → WireGuard detected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attacker counter-adaptation:&lt;/strong&gt; Use noise in protocol to break standard and repeated sizes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: AmneziaWG&lt;/strong&gt; — WireGuard updated with random padding rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it changes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Packet size randomization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal WireGuard:
[Header: 16 bytes][Payload: 132 bytes] = 148 bytes (fixed!)

AmneziaWG:
[Header: 16 bytes][Payload: 132 bytes][Random padding: 0-100 bytes]
= 148-248 bytes (varies each packet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Junk packet injection:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send random UDP packets mixed with real WireGuard packets&lt;/li&gt;
&lt;li&gt;Real packets have correct structure&lt;/li&gt;
&lt;li&gt;Junk packets are random data&lt;/li&gt;
&lt;li&gt;Server knows which are real (based on crypto validation)&lt;/li&gt;
&lt;li&gt;DPI sees inconsistent packet sizes, garbage mixed with data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Protocol constants modification:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User can configure custom values that control padding behavior and junk generation&lt;/li&gt;
&lt;li&gt;Different configurations create different fingerprints&lt;/li&gt;
&lt;li&gt;Each client-server pair has unique "noise signature"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This is basic idea of how AmneziaWG works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vulnerability to government MITM:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AmneziaWG and WireGuard are &lt;strong&gt;not vulnerable&lt;/strong&gt; to CA-based MITM because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work at UDP level (no TLS involved)&lt;/li&gt;
&lt;li&gt;Implement own crypto (not certificate-based)&lt;/li&gt;
&lt;li&gt;Government CA certificates are irrelevant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is advantage over TLS-based approaches.&lt;/p&gt;




&lt;h3&gt;
  
  
  Weakness 2: TLS Client Hello Must Be Plaintext
&lt;/h3&gt;

&lt;p&gt;We have TLS that cannot be decoded by DPI after handshake. But Client Hello is plaintext — can &lt;strong&gt;attacker&lt;/strong&gt; still use strong side of TLS (encrypted traffic) while making unencrypted Hello useless for blocking?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea (related to nested encryption from OSI section):&lt;/strong&gt; Deploy specific proxy-server with conditional behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If authorized client → redirect through "white" site, then use encrypted channel as tunnel&lt;/li&gt;
&lt;li&gt;If unauthorized client (DPI probe) → just proxy to real "white" site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, Client Hello goes to innocent site (passes checks), but encrypted channel carries real traffic.&lt;/p&gt;

&lt;p&gt;This idea found implementation in &lt;strong&gt;VLESS+Reality protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  How VLESS+Reality Works
&lt;/h4&gt;

&lt;p&gt;VLESS+Reality works roughly like this (simplified understanding, not exact implementation):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reality is proxy server that receives TLS connections and makes decision: "is this my real client or someone else (maybe DPI probe)?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision based on secret marker hidden in Client Hello.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For authorized client (knows the secret):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Client initiates TLS to github.com
   Client Hello contains:
   - SNI: github.com ← looks innocent
   - Secret marker in TLS session_id field

2. Reality server receives Client Hello
   - Extracts session_id
   - Checks secret marker
   - If valid → this is authorized client

3. Reality proxies TLS handshake to REAL github.com
   - Connects to actual GitHub servers
   - Gets GitHub's real certificate
   - Sends it to client
   - Client validates (it's real GitHub cert!)

4. TLS handshake completes → encrypted channel established

5. Reality switches connection into VLESS tunnel mode
   - Traffic inside TLS is VLESS protocol
   - VLESS can proxy connections anywhere
   - All hidden inside encrypted channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For unauthorized client (DPI probe or random person):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Client connects without correct secret marker

2. Reality server detects invalid/missing marker
   - Acts as transparent proxy to github.com
   - Passes everything to real GitHub

3. Client talks to actual GitHub
   - Gets real GitHub responses
   - Cannot tell Reality server is involved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this design is beautiful:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What TSPU sees in both cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authorized client:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SNI: github.com ✓&lt;/li&gt;
&lt;li&gt;Destination IP: GitHub's actual IP ✓&lt;/li&gt;
&lt;li&gt;TLS handshake: normal ✓&lt;/li&gt;
&lt;li&gt;Certificate: real GitHub certificate ✓&lt;/li&gt;
&lt;li&gt;After handshake: encrypted traffic ✓&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unauthorized client (DPI probe):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SNI: github.com ✓&lt;/li&gt;
&lt;li&gt;Destination IP: GitHub's actual IP ✓&lt;/li&gt;
&lt;li&gt;TLS handshake: normal ✓&lt;/li&gt;
&lt;li&gt;Certificate: real GitHub certificate ✓&lt;/li&gt;
&lt;li&gt;After handshake: connection to real GitHub ✓&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;From outside, both look identical!&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How TSPU Can Still Detect Reality and how &lt;strong&gt;defender&lt;/strong&gt; adapts:
&lt;/h4&gt;

&lt;p&gt;Despite sophistication, VLESS+Reality has weaknesses:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Statistical patterns:&lt;/strong&gt; Normal GitHub or other innocent site sessions are short and bursty in common. VPN tunnels are long-lived with continuous bidirectional flow. ML can flag anomalies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP reputation:&lt;/strong&gt; If many clients connect to one IP with "github.com" SNI but IP is in VPS range → suspicious → triggers probing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Government MITM:&lt;/strong&gt; In case when user has Ministry root CA installed, government can substitute certificate, decrypt TLS, see VLESS inside. It works like follow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal:
Client → Reality → GitHub → Real cert → Client ✓

With MITM:
Client → [DPI intercepts] → Reality
         ↓
    DPI generates substitute certificate
    Signed by Ministry CA

If client have a Ministry root CA installed, then:
→ Accepts substitute certificate
→ TLS connection is to DPI, not Reality
→ DPI decrypts all traffic
→ Sees VLESS protocol inside
→ Connection blocked or compromised
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Weakness 3: DPI operates at line speed
&lt;/h3&gt;

&lt;p&gt;From Part 1 we've learned a TSPU's trade-off of accuracy versus speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defender constraint:&lt;/strong&gt; Must process packets in microseconds at 100 Gbps.&lt;br&gt;
&lt;strong&gt;Attacker exploit:&lt;/strong&gt; Make analysis expensive enough that DPI cannot keep up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example tools:&lt;/strong&gt; GoodbyeDPI, Zapret.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Idea:&lt;/strong&gt; Make analysis expensive enough to slow down a DPI filtering speed. Base idea is to split segments to smaller parts, wich force TSPU to gather a session, add a short-living segments that take a time to analyze but not received by destination - set a proper TTL and other teqniques.&lt;/p&gt;
&lt;h4&gt;
  
  
  TCP Segmentation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt; Split TLS Client Hello across multiple TCP segments so complete data is not visible in single packet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normal (one packet):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TCP packet (seq=1000):
┌────────────────────────────────────┐
│ TCP Header | TLS Client Hello      │
│            | SNI: blocked-site.com │
└────────────────────────────────────┘

DPI: sees complete data → fast check → BLOCK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With segmentation (two packets):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Packet 1 (seq=1000):
┌────────────────────────────────────┐
│ TCP Header | TLS partial...        │
│            | SNI: "blocked-si      │ ← incomplete!
└────────────────────────────────────┘

Packet 2 (seq=1050):
┌────────────────────────────────────┐
│ TCP Header | te.com"...            │
└────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What defender (DPI) must do:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buffer packet 1 (requires memory)&lt;/li&gt;
&lt;li&gt;Wait for packet 2 (requires state tracking)&lt;/li&gt;
&lt;li&gt;Reassemble TCP stream (requires CPU)&lt;/li&gt;
&lt;li&gt;Extract complete data&lt;/li&gt;
&lt;li&gt;Check against blocklist&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  TTL Manipulation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt; Send two copies with different TTL (Time To Live) values. Or send a junk with short-living TTL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Packet 1 (decoy):
TTL = 5 → expires at DPI node
SNI: "google.com"

Packet 2 (real):
TTL = 64 → reaches destination
SNI: "blocked-site.com"

Logic:
- DPI analyzes packet 1, sees "google.com" → allow
- Packet 1 expires before destination
- Packet 2 arrives, DPI cache says "allowed" → passes
- Destination receives only packet 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some other tricks, that base on the same idea of manipulation of data in frames of allowed OSI stack.&lt;/p&gt;

&lt;h4&gt;
  
  
  Current effectiveness:
&lt;/h4&gt;

&lt;p&gt;Highly dependent on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ISP's TSPU configuration&lt;/li&gt;
&lt;li&gt;Time of day (better during peak hours when TSPU under load)&lt;/li&gt;
&lt;li&gt;Specific blocklist entries (some enforced stricter)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, a circumvention software should be often updated to keep up with the changes in TSPU. &lt;/p&gt;




&lt;h2&gt;
  
  
  What we've learned:
&lt;/h2&gt;

&lt;p&gt;Circumvention is not about "unbreakable" protocol. It's about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding system's architectural constraints&lt;/li&gt;
&lt;li&gt;Finding weakness in constraint&lt;/li&gt;
&lt;li&gt;Exploiting it&lt;/li&gt;
&lt;li&gt;Adapting when system adapts&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, we'll examine real-world case studies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;YouTube throttling&lt;/strong&gt; — how selective slowdown works (GGC manipulation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roblox complexity&lt;/strong&gt; — why modern cloud architecture is hard to block (WebRTC, dynamic IPs, collateral damage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FaceTime blocking&lt;/strong&gt; — surgical, protocol-specific filtering with minimal collateral damage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll also discuss future: whitelisting scenarios, ECH status in Russia, QUIC challenges, and other constraints.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in series: Part 3 - "Case Studies: YouTube, Roblox, FaceTime, and  what comes next"&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dpi</category>
      <category>network</category>
      <category>architecture</category>
      <category>security</category>
    </item>
    <item>
      <title>Russia's Internet Filtering Infrastructure: Evolution and Architecture</title>
      <dc:creator>Denis Rybakov</dc:creator>
      <pubDate>Sat, 07 Feb 2026 11:37:15 +0000</pubDate>
      <link>https://dev.to/shinomontaz/russias-internet-filtering-infrastructure-evolution-and-architecture-cel</link>
      <guid>https://dev.to/shinomontaz/russias-internet-filtering-infrastructure-evolution-and-architecture-cel</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 of the series: "Internet Censorship in Russia: A Technical Deep Dive"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Educational Purpose:&lt;/strong&gt; This article examines the technical architecture of internet filtering systems for educational purposes. The author does not encourage violation of local laws. All information is based on publicly available sources and open-source research.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction: Why This Matters for Engineers
&lt;/h2&gt;

&lt;p&gt;What makes Russia's internet filtering infrastructure technically interesting for us, engineers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; Distributed real-time system operating at main network speeds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity:&lt;/strong&gt; Combining networking, cryptography, and ML/staticsics in a single architecture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolution:&lt;/strong&gt; A genuine "arms race" of algorithms, protocols and ideas happening in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; Lessons applicable to any high-throughput, stateful inspection system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here we examines the technical aspects from an engineering perspective, without political commentary using Russia as example. There is also another notorious example of such systems: China Great Firewall, and we will make some comparison with this two. We'll look at how they work, what problems they solve, and what trade-offs engineers make. We'll also discuss how circumvention works and what means exist to bypass these systems and how.&lt;/p&gt;

&lt;p&gt;A red thread of this topic is that &lt;em&gt;no event or technology should be considered in only present state&lt;/em&gt;, we need a historical perspective to understand what is happening now and why some decisions were made.&lt;/p&gt;

&lt;p&gt;This isn't a political piece. Here we discuss architecture, engineering problems, trade-offs and solutions on both sides.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Volens-nolens, to understand a topic, we need to look from both perspectives&lt;/em&gt;: the filtering and the circumvention sides. Not to pick one, but to understand what tools exist and what decisions engineers make.&lt;/p&gt;

&lt;p&gt;Whether you're interested in network security, distributed systems, or privacy-preserving technologies, understanding how modern internet filtering works provides valuable insights.&lt;/p&gt;




&lt;h2&gt;
  
  
  From IP Blocking to Deep Packet Inspection: The Evolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Early Stage: Simple IP Blocking
&lt;/h3&gt;

&lt;p&gt;In the beginning, internet filtering in Russia was primitive—blocking by IP addresses. This worked against small websites with dedicated IPs, but quickly proved ineffective:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems with IP blocking:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collateral damage:&lt;/strong&gt; A single IP can host thousands of websites (shared hosting, CDN)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block one site → accidentally block hundreds of legitimate sites&lt;/li&gt;
&lt;li&gt;Example: Blocking a Cloudflare IP affects 10,000+ domains&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy circumvention:&lt;/strong&gt; Change the server's IP address&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes 5 minutes to update DNS&lt;/li&gt;
&lt;li&gt;Blocking is always playing catch-up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloud infrastructure:&lt;/strong&gt; Services like Telegram use thousands of IP addresses&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2018: Attempted Telegram block resulted in ~18 million IPs blocked&lt;/li&gt;
&lt;li&gt;Collateral damage: AWS, Google Cloud services affected&lt;/li&gt;
&lt;li&gt;Telegram remained operational via proxy networks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example of an IP-based blocking in Russia&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2018 it was a notorious Telegram blocking attempt. The Russian government blocked ~18 million IP addresses with heavy collateral damage ( Academy of Sciences made a lawsuit against network censorship ministry ) but without any real effect on Telegram.&lt;/p&gt;

&lt;p&gt;What happened? AWS services went down for businesses, Google Cloud was &lt;br&gt;
affected, random legitimate websites became unreachable, Sites and services of a Russian Academy of Sciences, some goverment detachments were blocked.&lt;br&gt;
And as icing on a cake: &lt;strong&gt;Russia network censoship ministry services was also blocked in process&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In those time it was a big problem for Russian government but for regular users future looks brilliant and cloudless, seems no real censorship possible.&lt;/p&gt;

&lt;p&gt;But it was not the end of the story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system needed to evolve.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Evolution Path
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2012-2015: IP-based blocking
    ↓
2015-2017: DNS filtering
    ↓
2017-2019: SNI inspection (TLS handshake analysis)
    ↓
2019-present: Deep Packet Inspection + Behavioral analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  What is Deep Packet Inspection (DPI)?
&lt;/h3&gt;

&lt;p&gt;DPI is &lt;strong&gt;not just a filter&lt;/strong&gt;—it's a &lt;strong&gt;real-time traffic classification system&lt;/strong&gt; operating at network backbone speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyzes packet contents, not just headers ( despite of it is impossible to decrypt TSL after hello exchange )&lt;/li&gt;
&lt;li&gt;Maintains state across connections (stateful inspection)&lt;/li&gt;
&lt;li&gt;Makes decisions in microseconds&lt;/li&gt;
&lt;li&gt;Must handle 10-100+ Gbps throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to both &lt;strong&gt;capabilities and limitations&lt;/strong&gt;, which we'll explore next.&lt;/p&gt;


&lt;h2&gt;
  
  
  TSPU: Russia's DPI Infrastructure
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is TSPU?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TSPU&lt;/strong&gt; (Технические Средства Противодействия Угрозам, "Technical Means of Counteracting Threats") is Russia's DPI-based filtering infrastructure, mandated by the "Sovereign Internet" law of 2019.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aspects of TSPU in Russia is classified&lt;/em&gt;, but we can make a educated guess based on behavior.&lt;br&gt;
&lt;em&gt;Areas in Russia differs by filtering rules&lt;/em&gt;, this difference looks like testing of new rules before rollout or some local restrictions. This can lead us to key architecture principles of this system.&lt;br&gt;
Another key insight is a law and a demand to set up TSPU in every ISP in Russia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key differences from China's Great Firewall:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;China (GFW)&lt;/th&gt;
&lt;th&gt;Russia (TSPU)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centralized: ~3 major backbone chokepoints&lt;/td&gt;
&lt;td&gt;Distributed: Thousands of ISP nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct government operation&lt;/td&gt;
&lt;td&gt;Installed at ISPs, remotely managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Border filtering (international traffic)&lt;/td&gt;
&lt;td&gt;Both domestic and international&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transparency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Black box"&lt;/td&gt;
&lt;td&gt;Legal framework with ISP obligations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's said that distributed architecture means Russia can't simply "flip a switch" to filter all traffic at once and in same time - like China can, but it actually does not matters for users - if a "switch flipped" in Russia it results in a gradual filtering rules implementation, but at the end - &lt;strong&gt;result the same&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deployment Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where TSPU is installed:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ISP nodes&lt;/strong&gt; (mandatory for major operators)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At Internet Service Provider facilities&lt;/li&gt;
&lt;li&gt;Both mobile and fixed-line networks&lt;/li&gt;
&lt;li&gt;Operators legally required to allow installation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backbone channels&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Major inter-city links&lt;/li&gt;
&lt;li&gt;Internet Exchange Points (IX)&lt;/li&gt;
&lt;li&gt;International gateway connections&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two operational modes:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Active mode (inline filtering):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet traffic → TSPU (analyzes &amp;amp; filters) → Destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;All traffic passes through TSPU&lt;/li&gt;
&lt;li&gt;Can block or modify packets in real-time&lt;/li&gt;
&lt;li&gt;Adds latency (milliseconds)&lt;/li&gt;
&lt;li&gt;More effective filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Passive mode (monitoring):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet traffic → TAP/SPAN port → TSPU (analyzes copy)
                ↓
            Direct flow (unaffected)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Receives copy of traffic for analysis&lt;/li&gt;
&lt;li&gt;Can send RST packets to terminate connections&lt;/li&gt;
&lt;li&gt;Cannot modify packets in-flight&lt;/li&gt;
&lt;li&gt;Lower latency impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why two modes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My understanding: most ISPs run active mode as primary filtering, but use &lt;br&gt;
passive mode as a complement.&lt;/p&gt;

&lt;p&gt;_Active mode catches obvious violations in real-time. Passive mode is for &lt;br&gt;
the non-obvious cases — suspicious patterns that need deeper analysis without _ blocking traffic immediately. &lt;strong&gt;TSPU need to pass packet if it fails to analize it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's like having a bouncer at the door (active) and security cameras &lt;br&gt;
watching for unusual behavior (passive).&lt;/p&gt;
&lt;h3&gt;
  
  
  Technical Capabilities
&lt;/h3&gt;
&lt;h4&gt;
  
  
  What TSPU Can See and Do
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Unencrypted data visibility:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP addresses and ports (always visible)&lt;/li&gt;
&lt;li&gt;DNS queries&lt;/li&gt;
&lt;li&gt;HTTP headers (if not HTTPS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SNI in TLS Client Hello&lt;/strong&gt; ← Primary blocking method for HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why SNI matters:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TLS Handshake (simplified):

Client → Server: Client Hello
├─ TLS version
├─ Supported ciphers
└─ SNI: "blocked-site.com" ← VISIBLE IN PLAINTEXT

[Rest of handshake encrypted]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;em&gt;SNI (Server Name Indication)&lt;/em&gt; tells the server which domain the client wants to reach. It's transmitted &lt;strong&gt;before encryption&lt;/strong&gt; begins, making it perfect for filtering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Metadata analysis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packet sizes and patterns&lt;/li&gt;
&lt;li&gt;Intervals between packets&lt;/li&gt;
&lt;li&gt;Connection duration&lt;/li&gt;
&lt;li&gt;Volume of transferred data&lt;/li&gt;
&lt;li&gt;Flow direction: upload vs download ratio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Machine Learning classification:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol identification by traffic patterns&lt;/li&gt;
&lt;li&gt;VPN service fingerprinting&lt;/li&gt;
&lt;li&gt;Behavioral analysis:

&lt;ul&gt;
&lt;li&gt;Normal web browsing: burst patterns (page load → pause)&lt;/li&gt;
&lt;li&gt;VPN: continuous bidirectional flow&lt;/li&gt;
&lt;li&gt;Streaming: large download, small upload&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Active probing:&lt;/strong&gt;&lt;br&gt;
Here is what TSPU passive mode seems designed for. When TSPU detects suspicious traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Client connects to suspicious IP:port
2. TSPU records: IP 1.2.3.4:8443
3. TSPU initiates its own connection to 1.2.3.4:8443
4. Sends typical VPN handshake packets
5. Analyzes server response
6. If server responds like VPN → add to blocklist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why running a VPN server on a public IP is increasingly difficult—TSPU will discover and block it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Government certificates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ministry of Digital Development root certificates&lt;/li&gt;
&lt;li&gt;Enables MITM (Man-in-the-Middle) attacks on TLS&lt;/li&gt;
&lt;li&gt;Currently limited deployment (pilot projects)&lt;/li&gt;
&lt;li&gt;If widely adopted: could decrypt all HTTPS traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why someone need to install a Goverment root certificate? It is obligatory if we need to connect to some legal services for online service: tax, socials, medicine.&lt;/p&gt;

&lt;h4&gt;
  
  
  What TSPU Cannot Do
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Decrypt TLS traffic (without MITM):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern TLS with forward secrecy&lt;/li&gt;
&lt;li&gt;No way to decrypt past traffic even with keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Inspect encrypted tunnels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPN protocols use their own encryption&lt;/li&gt;
&lt;li&gt;Cannot see contents of WireGuard, OpenVPN, etc.&lt;/li&gt;
&lt;li&gt;Can only analyze metadata and patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Process 100% of traffic:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The performance constraint:&lt;/strong&gt; At 100 Gbps backbone speeds, there's &lt;br&gt;
~0.1 microseconds per packet. Deep analysis is physically impossible &lt;br&gt;
for all traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is why circumvention exists.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TSPU architects know this. They made a conscious trade-off: optimize &lt;br&gt;
for the 80% case (SNI blocking), use sampling for the rest.&lt;/p&gt;

&lt;p&gt;This creates opportunities. When TSPU is under load (peak hours, DDoS, &lt;br&gt;
major events), filtering quality degrades. Sophisticated circumvention &lt;br&gt;
techniques slip through.&lt;/p&gt;

&lt;p&gt;It's not a bug. It's an inherent limitation of real-time systems at scale.&lt;/p&gt;

&lt;p&gt;Here's the fundamental trade-off:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analysis Depth vs. Coverage:

┌──────────────────────────────────┐
│ Fast check (SNI)                 │ ← 100% of traffic
├──────────────────────────────────┤
│ Statistical analysis             │ ← ~50-70% (sampling)
├──────────────────────────────────┤
│ ML classification                │ ← ~10-20% (expensive)
├──────────────────────────────────┤
│ Deep reconstruction              │ ← &amp;lt;1% (suspicious only)
└──────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The performance constraint:&lt;/strong&gt; At 100 Gbps backbone speeds, there's ~0.1 microseconds to make a decision per packet. Deep analysis is simply too expensive for all traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Block without collateral damage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared IP problem: One IP = hundreds of sites&lt;/li&gt;
&lt;li&gt;CDN infrastructure: Cloudflare, AWS, etc.&lt;/li&gt;
&lt;li&gt;Blocking Cloudflare IP → hundreds of innocent sites affected&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Detection Methods: How TSPU Identifies VPNs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Statistical Fingerprinting
&lt;/h3&gt;

&lt;p&gt;VPN traffic has characteristic patterns that differ from normal HTTPS:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Packet size distribution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal HTTPS:
Size: [52, 1460, 1460, 52, 150, 1460, ...]
      Small requests, large responses

VPN:
Size: [148, 92, 1320, 1280, 1350, ...]
      More uniform distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Timing analysis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal HTTPS:
Packets: [0ms, 50ms, 51ms, 2000ms, 2050ms, ...]
         Bursts (page load), then pauses

VPN:
Packets: [0ms, 25000ms, 50000ms, 75000ms, ...]
         Regular keepalive packets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Connection characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-lived connections (hours vs minutes)&lt;/li&gt;
&lt;li&gt;Balanced bidirectional traffic&lt;/li&gt;
&lt;li&gt;Continuous data flow (not a burst)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Protocol Signatures
&lt;/h3&gt;

&lt;p&gt;Each VPN protocol has recognizable patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WireGuard:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handshake Initiation: exactly 148 bytes&lt;/li&gt;
&lt;li&gt;Handshake Response: exactly 92 bytes&lt;/li&gt;
&lt;li&gt;UDP protocol (not TCP)&lt;/li&gt;
&lt;li&gt;Specific packet size alignment (multiples of 16)&lt;/li&gt;
&lt;li&gt;pure WG is useless in Russia due to static handshake pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;OpenVPN:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Characteristic handshake sequence&lt;/li&gt;
&lt;li&gt;Currently in Russia this protocol useless for censorship circumventing - outdated and well-known patterns seen by DPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shadowsocks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specific SOCKS5 patterns&lt;/li&gt;
&lt;li&gt;Currently in Russia this protocol useless for censorship circumventing - it seen by DPI and blocked with ease.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Active Probing
&lt;/h3&gt;

&lt;p&gt;TSPU doesn't just passively observe—it actively tests suspicious servers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Probing workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Detect: Suspicious traffic pattern to IP:port
2. Record: Store IP and port
3. Probe: TSPU connects to the same IP:port
4. Test: Send VPN-like handshake packets
5. Analyze: Check if server responds like VPN
6. Block: If confirmed VPN → add to blocklist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;This is one of the way how TSPU handle with advanced VLESS+Reality approach&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most VPN servers respond predictably to handshakes&lt;/li&gt;
&lt;li&gt;TSPU can test without being an actual client&lt;/li&gt;
&lt;li&gt;Automated discovery of new VPN servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How VPN protocols defend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication before responding (VLESS+Reality approach)&lt;/li&gt;
&lt;li&gt;Whitelist of allowed client IPs&lt;/li&gt;
&lt;li&gt;Respond differently to unauthorized connections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Replay Attacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt; Record legitimate traffic and replay it to suspicious servers&lt;/p&gt;

&lt;p&gt;But here is not a much information and me personally does not see such behavior, only rumors.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fundamental Trade-off
&lt;/h2&gt;

&lt;p&gt;TSPU faces an inherent constraint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Performance ←→ Accuracy

High throughput processing:
- Fast, simple checks (SNI lookup)
- Low false positives
- Easy to circumvent

Deep analysis:
- Expensive (CPU, memory, latency)
- Better accuracy
- Cannot apply to all traffic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This trade-off is &lt;strong&gt;why circumvention is possible&lt;/strong&gt;. Under load, TSPU must choose between:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dropping packets (network failure)&lt;/li&gt;
&lt;li&gt;Letting suspicious traffic through&lt;/li&gt;
&lt;li&gt;Heavy sampling (miss some VPNs)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In peak hours, filtering quality degrades—this is exploitable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architectural Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Decentralized Network Problem
&lt;/h3&gt;

&lt;p&gt;Unlike China's centralized Great Firewall, Russia has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hundreds of ISPs (not 3-4 major ones)&lt;/li&gt;
&lt;li&gt;No single network chokepoint&lt;/li&gt;
&lt;li&gt;International connections via multiple routes&lt;/li&gt;
&lt;li&gt;Difficulty coordinating across all nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Inconsistent filtering across ISPs and regions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Economic Constraints
&lt;/h3&gt;

&lt;p&gt;Aggressive filtering has costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collateral damage → business complaints&lt;/li&gt;
&lt;li&gt;AWS/Cloudflare blocking → economic impact&lt;/li&gt;
&lt;li&gt;Performance degradation → legal users and intergoverment exchange have problems&lt;/li&gt;
&lt;li&gt;Investment in TSPU infrastructure → budget constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The state must balance &lt;strong&gt;control vs. economic functionality&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Debt
&lt;/h3&gt;

&lt;p&gt;Modern internet architecture is inherently distributed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CDN networks (Cloudflare, Akamai, Fastly)&lt;/li&gt;
&lt;li&gt;Cloud providers (AWS, Google Cloud, Azure)&lt;/li&gt;
&lt;li&gt;Peer-to-peer protocols (WebRTC, BitTorrent)&lt;/li&gt;
&lt;li&gt;Dynamic IPs and load balancing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Old model (pre-2010s):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Website → Fixed IP → Easy to block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;New model (2020s):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Service → CDN → 10,000 IPs → Shared with other services → Hard to block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trying to block a single service often requires blocking entire CDN ranges, causing massive collateral damage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We've Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Key insights about TSPU architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ &lt;strong&gt;Distributed system&lt;/strong&gt; operating at massive scale (100+ Gbps)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Real-time classification&lt;/strong&gt; with microsecond decision windows&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Trade-off between depth and coverage&lt;/strong&gt; (can't deeply analyze all traffic)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Primary method:&lt;/strong&gt; SNI inspection (simple, fast, effective)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Advanced methods:&lt;/strong&gt; ML, statistical analysis, active probing&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Cannot decrypt&lt;/strong&gt; modern TLS without MITM&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Collateral damage problem&lt;/strong&gt; with shared infrastructure&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Performance constraints&lt;/strong&gt; limit deep inspection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; TSPU is a sophisticated system, but it has fundamental limitations imposed by physics (processing speed), economics (cost vs. benefit), and architecture (distributed internet infrastructure).&lt;/p&gt;




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

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we'll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How protocols exploit TSPU's weaknesses&lt;/li&gt;
&lt;li&gt;The OSI model through a security lens&lt;/li&gt;
&lt;li&gt;VPN protocols: WireGuard, VLESS+Reality, Shadowsocks&lt;/li&gt;
&lt;li&gt;Packet manipulation techniques (TCP segmentation, TTL tricks)&lt;/li&gt;
&lt;li&gt;Why nested encryption (SSH tunneling TLS) works&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Internet_censorship_in_Russia" rel="noopener noreferrer"&gt;TSPU Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.themoscowtimes.com/2019/11/01/russia-successfully-tests-its-unplugged-internet-a67920" rel="noopener noreferrer"&gt;Russia's "Sovereign Internet" Law&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Deep_packet_inspection" rel="noopener noreferrer"&gt;DPI Technology Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cloudflare.com/encrypted-client-hello/" rel="noopener noreferrer"&gt;TLS 1.3 Encrypted Client Hello&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Next in series: Part 2 - "Circumventing Internet Censorship: Protocols, Techniques, and the Arms Race"&lt;/em&gt;&lt;/p&gt;

</description>
      <category>network</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Denis Rybakov</dc:creator>
      <pubDate>Mon, 20 Oct 2025 21:57:53 +0000</pubDate>
      <link>https://dev.to/shinomontaz/-25de</link>
      <guid>https://dev.to/shinomontaz/-25de</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/shinomontaz" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3575266%2F9d91a539-d840-429a-9c7f-183455223cf7.jpeg" alt="shinomontaz"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/shinomontaz/building-ai-workflow-and-project-context-from-memory-banks-to-simple-markdown-27np" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building AI Workflow and Project Context: From Memory Banks to Simple Markdown&lt;/h2&gt;
      &lt;h3&gt;Denis Rybakov ・ Oct 20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vscode&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>productivity</category>
      <category>vscode</category>
      <category>go</category>
    </item>
    <item>
      <title>Building AI Workflow and Project Context: From Memory Banks to Simple Markdown</title>
      <dc:creator>Denis Rybakov</dc:creator>
      <pubDate>Mon, 20 Oct 2025 19:53:05 +0000</pubDate>
      <link>https://dev.to/shinomontaz/building-ai-workflow-and-project-context-from-memory-banks-to-simple-markdown-27np</link>
      <guid>https://dev.to/shinomontaz/building-ai-workflow-and-project-context-from-memory-banks-to-simple-markdown-27np</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;After experimenting with AI tools like memory-bank, Spec Kit, and Boomerang Tasks, I found that simple &lt;code&gt;.md&lt;/code&gt; files for project context and planning often work better.&lt;br&gt;
They keep you in control, preserve project knowledge, and avoid “monstrous” setups that drift away from your actual work.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Path So Far
&lt;/h3&gt;

&lt;p&gt;This is a short reflection on how I built my AI-assisted workflow — from early code generation experiments to trying to make VSCode as “aware” as Windsurf.&lt;/p&gt;

&lt;p&gt;At first, I used AI chat for code generation — no project context, just verbose descriptions and snippets for examples or refactoring.&lt;/p&gt;

&lt;p&gt;Then I added AI autocomplete via Continue — still using it.&lt;br&gt;
Next came &lt;strong&gt;Claude 4&lt;/strong&gt; wrapped in Windsurf, plus the console tool &lt;code&gt;factory.ai&lt;/code&gt; and &lt;code&gt;claude code&lt;/code&gt; later.&lt;br&gt;
In parallel, I tried a “semi-free” Windsurf setup using VSCode + RooCode — semi, because without a paid backend, you hit the limit quickly: &lt;strong&gt;Gemini 2.5 Pro&lt;/strong&gt; just doesn’t pull it off.&lt;/p&gt;

&lt;p&gt;That’s my current baseline setup.&lt;/p&gt;

&lt;h4&gt;
  
  
  MCP, Context7, and the Memory-Bank Phase
&lt;/h4&gt;

&lt;p&gt;At some point, I heard about &lt;strong&gt;MCP&lt;/strong&gt; and rushed to set up &lt;code&gt;context7&lt;/code&gt;, thinking every self-respecting dev already had it running.&lt;br&gt;
Turned out it wasn’t that useful for my particular workflow.&lt;/p&gt;

&lt;p&gt;Next came &lt;strong&gt;memory-bank&lt;/strong&gt; — an attempt to preserve project context and bring the VSCode + RooCode setup closer to Windsurf, where it comes &lt;em&gt;out of the box&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In various videos, memory-bank often appeared in clickbait titles like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Speed up your AI agent 100x by saving context and cutting token usage!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was… &lt;em&gt;partly true&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But some limitations surfaced quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;either you have &lt;strong&gt;one big bank&lt;/strong&gt; across all projects (which sometimes confuses them and creates new banks randomly),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;or a &lt;strong&gt;separate workspace&lt;/strong&gt; for each project — which is inconvenient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Soon it became clear: a &lt;code&gt;.md&lt;/code&gt; file could do 80% of what I needed.&lt;br&gt;
You can simply write your context and tell the model (via &lt;code&gt;.rules&lt;/code&gt;) to always read it — because, well, we do have hands.&lt;br&gt;
Then I started including not just architecture notes but also &lt;strong&gt;plans, problems, steps, and key decisions&lt;/strong&gt;.&lt;br&gt;
All in a separate file — since &lt;code&gt;.rules&lt;/code&gt; should stay universal and project-independent.&lt;/p&gt;

&lt;h4&gt;
  
  
  Boomerang Tasks and Spec Kit
&lt;/h4&gt;

&lt;p&gt;Then I watched a few more videos and got the feeling that I was doing something “wrong,” while serious people were doing it properly.&lt;br&gt;
So I tried &lt;strong&gt;Boomerang Tasks&lt;/strong&gt; (with &lt;strong&gt;RooCode&lt;/strong&gt;) and &lt;strong&gt;Spec Kit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Boomerang didn’t show real advantages over a regular &lt;code&gt;.md&lt;/code&gt; context/plan file, especially since the file can be edited directly, instead of waiting for the plugin to “catch up.”&lt;br&gt;
Maybe it was the backend’s fault, but that’s also the point: Boomerang is tied to RooCode, while your context file works equally well with &lt;strong&gt;Droid&lt;/strong&gt; or &lt;strong&gt;Windsurf&lt;/strong&gt;.&lt;br&gt;
That flexibility matters, especially when you prefer a lightweight, cost-efficient setup.&lt;/p&gt;

&lt;p&gt;With Spec Kit, results were similar.&lt;br&gt;
When refactoring a small 2D game on &lt;strong&gt;Go + Ebiten + ECS&lt;/strong&gt;, the very first “refactor step” expoded the scope and hit the daily token limit before finishing.&lt;br&gt;
In the end, Spec Kit didn’t replace my manual, more controlled way of defining refactoring steps.&lt;br&gt;
You don’t expect a “serious” tool to face same problems as your homegrown scripts — but it happens.&lt;br&gt;
That was the end of my Spec Kit story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;These trials taught me a few things. Now I work like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ask the AI to analyze project problems and produce two plans — minimum and maximum (in the &lt;em&gt;Leninist&lt;/em&gt; sense: program-minimum and program-maximum).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the minimum plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review the maximum plan separately — decide which steps to split or delay.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I’m starting a new project, I may use Spec Kit — but often a simple plan made with chat is a good starting point that followed with manual fixes and careful revision.&lt;/p&gt;

&lt;p&gt;For now, doing it in &lt;em&gt;chat+hands&lt;/em&gt; manner, without fully automated task slicing gives better results.&lt;br&gt;
Why?&lt;/p&gt;

&lt;p&gt;a) the project context stays with you,&lt;br&gt;
b) one or two &lt;code&gt;.md&lt;/code&gt; files are far easier to manage than those monstrous setups like memory-bank or Spec Kit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I Still Value Manual Control
&lt;/h3&gt;

&lt;p&gt;Why keep manual control where an AI agent &lt;em&gt;could&lt;/em&gt; technically handle everything — if only you crafted the perfect prompt?&lt;/p&gt;

&lt;p&gt;Two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First:&lt;/strong&gt;&lt;br&gt;
When working on large projects, heavy vibe-coding quickly makes the project &lt;em&gt;no longer yours&lt;/em&gt;.&lt;br&gt;
For simple cases it doesn't matter.&lt;br&gt;
But when working with edge cases, memory allocation trade-offs, algorithmic subtleties or complex component dependency (like in game dev), preserving project knowledge is critical.&lt;/p&gt;

&lt;p&gt;Vibe-coding destroys that knowledge fast.&lt;br&gt;
I’ve found that maintaining a few manual steps helps me stay in sync with the project and skip (or severely reduce) the “re-read everything every few days” routine.&lt;br&gt;
In this sense, local &lt;code&gt;.md&lt;/code&gt; files are useful: simple, transparent, and preserving the best parts of tools like memory-bank or Boomerang Tasks without their overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second:&lt;/strong&gt;&lt;br&gt;
A good prompt usually appears &lt;em&gt;after&lt;/em&gt; a few hours of bad ones.&lt;br&gt;
Experience and understanding, as I see it, come only through the struggle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;Automation is powerful, but context ownership is better.&lt;/p&gt;

&lt;p&gt;If the tool starts thinking for you, it will also start forgetting what you meant.&lt;br&gt;
A plain &lt;code&gt;.md&lt;/code&gt; file won’t do that, but it gives you just enough automation support, keeps things easy to handle by yourself, and offers a kind of two-chair balance between automation and manual work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>vscode</category>
      <category>go</category>
    </item>
  </channel>
</rss>
