<?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: abokenan444</title>
    <description>The latest articles on DEV Community by abokenan444 (@abokenan444).</description>
    <link>https://dev.to/abokenan444</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%2F3825238%2F1407e7ff-2828-4a1f-b2c2-44bf2f963f3b.png</url>
      <title>DEV Community: abokenan444</title>
      <link>https://dev.to/abokenan444</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abokenan444"/>
    <language>en</language>
    <item>
      <title>I Built an Open‑ Source OS for AI Agents – And It’s Ready for You</title>
      <dc:creator>abokenan444</dc:creator>
      <pubDate>Sun, 19 Apr 2026 08:40:48 +0000</pubDate>
      <link>https://dev.to/abokenan444/i-built-an-open-source-os-for-ai-agents-and-its-ready-for-you-4b2g</link>
      <guid>https://dev.to/abokenan444/i-built-an-open-source-os-for-ai-agents-and-its-ready-for-you-4b2g</guid>
      <description>&lt;p&gt;Two weeks ago, Web Agent Bridge was a clever middleware that helped AI agents talk to websites without breaking.&lt;/p&gt;

&lt;p&gt;Today, it’s a completely different beast.&lt;/p&gt;

&lt;p&gt;After a massive rewrite (v2.0 → v3.1), WAB has evolved into a full Agent Operating System – with its own protocol, an open‑core business model, a desktop browser, and even a no‑code workspace for non‑developers.&lt;/p&gt;

&lt;p&gt;And yes, it’s still MIT‑licensed at its core.&lt;/p&gt;

&lt;p&gt;Let me show you what changed – and why you should care.&lt;/p&gt;




&lt;p&gt;🔥 The Problem That Never Died&lt;/p&gt;

&lt;p&gt;Every AI agent that needs to click a button or fill a form relies on DOM scraping – CSS selectors, XPath, waiting for elements.&lt;br&gt;
It breaks every time a designer moves a &lt;/p&gt;. It’s slow, fragile, and a nightmare to maintain.

&lt;p&gt;WAB flips the model: websites expose a window.AICommands interface. Agents discover actions (signup, add_to_cart, checkout) and execute them directly. No parsing, no guesswork.&lt;/p&gt;

&lt;p&gt;That was v1.0.&lt;br&gt;
Now, v3.1 is something else entirely.&lt;/p&gt;



&lt;p&gt;⚙️ What’s New in WAB v3.1 (The “Agent OS” Release)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent Operating System (Agent OS)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;· Standardised agent‑to‑agent protocol (WABP) with command registry and capability negotiation.&lt;br&gt;
· Complete runtime: event bus, task scheduler, state management, replay engine.&lt;br&gt;
· Built‑in observability – logs, traces, metrics.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Web Agent Protocol (WAP)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;· A discovery‑first protocol using /.well-known/agent-tools.json.&lt;br&gt;
· Sites declare their capabilities once, and any agent (MCP, REST, or browser‑based) can understand them.&lt;br&gt;
· WAP is transport‑agnostic – same interface works for CLI, WebSocket, or HTTP.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open‑Core + Growth Suite&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;· Core remains MIT (the bridge script, SDK, WAP, and Agent OS runtime).&lt;br&gt;
· Premium features (Fairness Engine, Threat Shield, Dynamic Pricing Shield) are server‑side only.&lt;br&gt;
· First‑class billing, metering, and a marketplace for agent components (15% revenue share).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent Workspace (No‑Code UI)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;· Drag‑and‑drop interface for regular users.&lt;br&gt;
· Create price‑comparison agents, hotel booking agents, or local‑store finders without a single line of code.&lt;br&gt;
· Full RTL + Arabic support.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WAB Desktop Browser + PWA&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;· Electron browser with ad blocker (80+ domains), scam shield, fairness ranking, and a built‑in AI agent chat.&lt;br&gt;
· Mobile PWA works offline – install it like any other app.&lt;/p&gt;



&lt;p&gt;🧠 Why This Matters for Developers&lt;/p&gt;

&lt;p&gt;· You can build agents that actually work.&lt;br&gt;
  WABAgent (Puppeteer/Playwright) gives you agent.execute('addToCart', { sku: '...' }) – no selectors, no waits.&lt;br&gt;
· You can extend WAB via plugins.&lt;br&gt;
  Dynamic hook system, priority ordering, and audit logging. Build your own pricing shield or custom action pack.&lt;br&gt;
· You can run everything locally.&lt;br&gt;
  No cloud required. npx web-agent-bridge start spins up the full Agent OS on your machine.&lt;br&gt;
· You can monetise your work.&lt;br&gt;
  The built‑in marketplace lets you sell agent templates, vision models, or automation packs.&lt;/p&gt;



&lt;p&gt;🚀 Try It in 30 Seconds&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;npx web-agent-bridge start
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Then open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; – you’ll see the new Sovereign Dashboard, the Agent Workspace, and the live demo store.&lt;/p&gt;

&lt;p&gt;Or download the WAB Browser (desktop) and browse any site with an AI agent in your sidebar.&lt;/p&gt;




&lt;p&gt;📦 What’s Still Open Source (MIT)&lt;/p&gt;

&lt;p&gt;· window.AICommands bridge script&lt;br&gt;
· Agent SDK (WABAgent for Puppeteer/Playwright)&lt;br&gt;
· WAP protocol + discovery&lt;br&gt;
· React / Vue / Svelte / LangChain packages&lt;br&gt;
· WordPress plugin&lt;br&gt;
· All agent examples and templates&lt;/p&gt;

&lt;p&gt;The code you love is still free. The extra muscle (fairness, threat detection, pricing shield, marketplace) is what makes the project sustainable.&lt;/p&gt;




&lt;p&gt;👉 I Need Your Feedback&lt;/p&gt;

&lt;p&gt;· Does the Agent OS feel like the right abstraction?&lt;br&gt;
· Would you use WAP to make your own site agent‑ready?&lt;br&gt;
· What’s missing before you’d bet your production automation on it?&lt;/p&gt;

&lt;p&gt;Star the repo, try the demo, and let me know.&lt;br&gt;
Let’s build the agent‑first web – together.&lt;/p&gt;

&lt;p&gt;🔗 GitHub: github.com/abokenan444/web-agent-bridge&lt;br&gt;
🌐 Website: webagentbridge.com&lt;br&gt;
📦 npm: npx web-agent-bridge start&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How I made a Tor-based messenger use 400% less battery (without breaking privacy)</title>
      <dc:creator>abokenan444</dc:creator>
      <pubDate>Sun, 15 Mar 2026 11:41:29 +0000</pubDate>
      <link>https://dev.to/abokenan444/how-i-made-a-tor-based-messenger-use-400-less-battery-without-breaking-privacy-376o</link>
      <guid>https://dev.to/abokenan444/how-i-made-a-tor-based-messenger-use-400-less-battery-without-breaking-privacy-376o</guid>
      <description>&lt;p&gt;How I Built a Tor-Native Messenger That Uses 400% Less Battery (Without Sacrificing Privacy)&lt;/p&gt;

&lt;p&gt;By abokenan444 – Solo developer, privacy advocate, and creator of Shield Messenger&lt;/p&gt;




&lt;p&gt;📱 The Problem: Why Most "Private" Messengers Aren't Really Private&lt;/p&gt;

&lt;p&gt;When I started Shield Messenger, I asked myself a simple question: Why do even the most secure messengers still leak metadata?&lt;/p&gt;

&lt;p&gt;Signal, for example, encrypts your messages beautifully. But their servers still know:&lt;/p&gt;

&lt;p&gt;· Who you're talking to (even if they don't know what you're saying)&lt;br&gt;
· When you're talking (timing patterns)&lt;br&gt;
· Your IP address (unless you use a VPN)&lt;/p&gt;

&lt;p&gt;I wanted something different. A messenger that treats privacy as architecture, not a feature.&lt;/p&gt;

&lt;p&gt;The obvious answer was Tor. But there's a reason most apps don't build directly on Tor: battery life is terrible.&lt;/p&gt;



&lt;p&gt;🔋 The Battery Nightmare: Why Tor Kills Your Phone&lt;/p&gt;

&lt;p&gt;When you run a Tor hidden service (which is how P2P messaging works), your phone has to maintain several persistent TCP connections to guard nodes. This prevents the operating system from entering deep sleep mode.&lt;/p&gt;

&lt;p&gt;On Android, deep sleep is when the CPU shuts down almost entirely, saving massive amounts of power. But with Tor, your phone stays awake, listening for incoming connections 24/7.&lt;/p&gt;

&lt;p&gt;The result: A messaging app that drains your battery 10-15% per hour, even when you're not using it.&lt;/p&gt;

&lt;p&gt;I measured it. It was unusable for daily communication.&lt;/p&gt;



&lt;p&gt;🚫 Why I Rejected Firebase/APNs (The Easy Way Out)&lt;/p&gt;

&lt;p&gt;The standard solution to battery drain is to use Firebase Cloud Messaging (FCM) or Apple Push Notification service (APNs) . Instead of keeping a persistent connection, the app sleeps, and Google/Apple's servers wake it up when a message arrives.&lt;/p&gt;

&lt;p&gt;But this creates two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Another centralized point of failure – Google or Apple could be forced to block your notifications.&lt;/li&gt;
&lt;li&gt;Metadata leakage – Now Google/Apple knows who's messaging you and when.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a privacy-first messenger, this was unacceptable. I needed a solution that kept 100% of traffic inside the Tor network.&lt;/p&gt;



&lt;p&gt;💡 The Solution: Tor Push + Smart Sleep Mode&lt;/p&gt;

&lt;p&gt;After months of experimentation, I developed a hybrid approach that I call "Tor Push with Smart Sleep Mode."&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;p&gt;The Architecture&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Normal Operation]
    │
    ├── User actively chatting → Keep Tor circuits alive, instant delivery
    │
    └── Phone idle (screen off)
         │
         └── Smart Sleep Mode activated
              │
              ├── All non-essential circuits closed
              ├── Keep ONE lightweight guard connection
              ├── Schedule wake-up via AlarmManager every 15 min
              └── Wait for incoming TCP packets to trigger instant wake
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Smart Sleep Detection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the Android app, I monitor user activity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;powerManager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;POWER_SERVICE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PowerManager&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;shouldEnterSleepMode&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Check if screen is off&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;powerManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isInteractive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;

        &lt;span class="c1"&gt;// Check if user has been inactive for 5 minutes&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;lastActivity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PreferenceManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLastActivityTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastActivity&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;

        &lt;span class="c1"&gt;// Check if any voice calls are active&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CallManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasActiveCall&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&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;ol&gt;
&lt;li&gt;Modifying Arti for Sleep Support&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The real magic happens in the Rust core. I extended Arti (Tor's Rust implementation) with a new sleep_mode() API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In secure-legion-core/src/tor/arti.rs&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;TorClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;set_sleep_mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Reduce circuit maintenance frequency&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.circuit_manager&lt;/span&gt;&lt;span class="nf"&gt;.set_maintenance_interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 15 min&lt;/span&gt;

            &lt;span class="c1"&gt;// Close all but one guard connection&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.guard_mgr&lt;/span&gt;&lt;span class="nf"&gt;.set_min_guards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Store circuit state for quick recovery&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.persist_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Tell the runtime to use fewer timers&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.runtime&lt;/span&gt;&lt;span class="nf"&gt;.set_timer_interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Restore normal operation&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.circuit_manager&lt;/span&gt;&lt;span class="nf"&gt;.set_maintenance_interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.guard_mgr&lt;/span&gt;&lt;span class="nf"&gt;.set_min_guards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.restore_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.runtime&lt;/span&gt;&lt;span class="nf"&gt;.set_timer_interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_millis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&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;ol&gt;
&lt;li&gt;The Wake-Up Mechanism&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: TCP packets themselves can wake the device. When an incoming message arrives at your .onion address, the kernel receives a packet and can wake the app.&lt;/p&gt;

&lt;p&gt;On Android, this requires holding a partial wake lock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TorService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;wakeLock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WakeLock&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;POWER_SERVICE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newWakeLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PARTIAL_WAKE_LOCK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Shield:TorWakeLock"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Looper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMainLooper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c1"&gt;// Called when Rust detects incoming traffic&lt;/span&gt;
    &lt;span class="k"&gt;external&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onIncomingTraffic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;handleIncomingMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Acquire wake lock briefly&lt;/span&gt;
        &lt;span class="n"&gt;wakeLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 5 seconds max&lt;/span&gt;

        &lt;span class="c1"&gt;// Process message&lt;/span&gt;
        &lt;span class="nf"&gt;processMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;// Return to sleep if no activity&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="nf"&gt;hasActiveUsers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postDelayed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nf"&gt;goToSleep&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;goToSleep&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Tell Rust to enter sleep mode&lt;/span&gt;
        &lt;span class="nc"&gt;TorRust&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setSleepMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wakeLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&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;ol&gt;
&lt;li&gt;Scheduled Maintenance with AlarmManager&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even in sleep mode, Tor circuits need occasional maintenance. I use Android's AlarmManager for precise, battery-efficient wake-ups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitMaintenanceScheduler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;alarmManager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ALARM_SERVICE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;AlarmManager&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;scheduleMaintenance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;intent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MaintenanceReceiver&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;pendingIntent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBroadcast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="nc"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FLAG_UPDATE_CURRENT&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="nc"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FLAG_IMMUTABLE&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// Schedule inexact repeating alarm (battery efficient)&lt;/span&gt;
        &lt;span class="n"&gt;alarmManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setInexactRepeating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;AlarmManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ELAPSED_REALTIME_WAKEUP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;SystemClock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;elapsedRealtime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;AlarmManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;INTERVAL_FIFTEEN_MINUTES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;AlarmManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;INTERVAL_FIFTEEN_MINUTES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;pendingIntent&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MaintenanceReceiver&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;BroadcastReceiver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onReceive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Wake up Tor for maintenance&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;wakeLock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;POWER_SERVICE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newWakeLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PowerManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PARTIAL_WAKE_LOCK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Shield:MaintenanceWakeLock"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;wakeLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1 minute max&lt;/span&gt;

        &lt;span class="c1"&gt;// Tell Rust to perform circuit maintenance&lt;/span&gt;
        &lt;span class="nc"&gt;TorRust&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;performMaintenance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;// Release after maintenance&lt;/span&gt;
        &lt;span class="n"&gt;wakeLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&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;p&gt;📊 The Results: 400% Battery Improvement&lt;/p&gt;

&lt;p&gt;After implementing Smart Sleep Mode, I ran extensive tests on multiple devices:&lt;/p&gt;

&lt;p&gt;Scenario Before (Standard Tor) After (Smart Sleep) Improvement&lt;br&gt;
Idle (screen off, 8 hours) 18% battery drain 3% battery drain 500% better&lt;br&gt;
Light usage (5 messages/hour) 12%/hour 2.5%/hour 380% better&lt;br&gt;
Heavy usage (constant chatting) 22%/hour 8%/hour 175% better&lt;br&gt;
Voice call (30 min) 15% drain 12% drain 25% better&lt;/p&gt;

&lt;p&gt;Average improvement: ~400% reduction in background battery consumption.&lt;/p&gt;

&lt;p&gt;And crucially, message delivery latency remained under 1 second in most cases. When a message arrives, the TCP packet wakes the device instantly.&lt;/p&gt;




&lt;p&gt;🎯 Lessons Learned (For Other Tor-Native App Developers)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The 15-Minute Sweet Spot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Android's AlarmManager is optimized for intervals of 15 minutes or more. Anything shorter and you lose the battery benefits of inexact alarms.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Partial Wake Locks Are Your Friend&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Never use FULL_WAKE_LOCK – it turns on the screen. PARTIAL_WAKE_LOCK keeps the CPU running but allows the screen to stay off.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store Circuit State&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When going to sleep, serialize your circuit state to disk. If the app is killed, you can restore circuits quickly when waking.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Padding Matters Even in Sleep&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To prevent traffic analysis, I send small dummy packets even when sleeping. This maintains consistent traffic patterns and makes it harder to distinguish real messages from maintenance.&lt;/p&gt;




&lt;p&gt;🌐 Beyond Battery: What's Next for Shield Messenger&lt;/p&gt;

&lt;p&gt;Smart Sleep Mode was just the beginning. Shield Messenger now includes:&lt;/p&gt;

&lt;p&gt;· Aethernet integration – When internet is down, it switches to community mesh networks (LibreMesh-based)&lt;br&gt;
· Post-quantum crypto – ML-KEM-1024 + X25519 hybrid key exchange&lt;br&gt;
· Built-in wallet – Real Solana + Zcash support, keys never leave device&lt;br&gt;
· Duress PIN – A fake PIN that wipes everything and shows a decoy database&lt;/p&gt;




&lt;p&gt;🤝 How You Can Help&lt;/p&gt;

&lt;p&gt;Shield Messenger is open source and looking for contributors:&lt;/p&gt;

&lt;p&gt;· Security researchers – Audit the crypto core, find vulnerabilities&lt;br&gt;
· Rust developers – Help improve Arti integration&lt;br&gt;
· Mobile devs – Polish the Android/iOS UI&lt;br&gt;
· Privacy advocates – Spread the word&lt;/p&gt;

&lt;p&gt;GitHub repo: github.com/abokenan444/shield-messenger&lt;/p&gt;

&lt;p&gt;Join the discussion on Hacker News: &lt;a href="https://news.ycombinator.com/threads?id=abokenan444" rel="noopener noreferrer"&gt;https://news.ycombinator.com/threads?id=abokenan444&lt;/a&gt;&lt;br&gt;
Web:&lt;br&gt;
&lt;a href="https://shieldmessenger.com" rel="noopener noreferrer"&gt;https://shieldmessenger.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Building a truly private messenger is hard. Building one that people can actually use every day without carrying a charger is harder. But I believe it's possible – and I hope Shield Messenger proves it.&lt;/p&gt;

&lt;p&gt;– abokenan444, March 2026&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
