<?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: Joey Lee</title>
    <description>The latest articles on DEV Community by Joey Lee (@joey_lee_c96e4ad421791371).</description>
    <link>https://dev.to/joey_lee_c96e4ad421791371</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%2F3841711%2Fe3ace59f-21db-4783-a74b-506bb392eb84.png</url>
      <title>DEV Community: Joey Lee</title>
      <link>https://dev.to/joey_lee_c96e4ad421791371</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joey_lee_c96e4ad421791371"/>
    <language>en</language>
    <item>
      <title>Every AI Startup Should Watch Out: 1000+ Ghost Accounts Drained Our Platform in 15 Days</title>
      <dc:creator>Joey Lee</dc:creator>
      <pubDate>Thu, 16 Apr 2026 12:29:23 +0000</pubDate>
      <link>https://dev.to/joey_lee_c96e4ad421791371/every-ai-startup-should-watch-out-1000-ghost-accounts-drained-our-platform-in-15-days-4k9h</link>
      <guid>https://dev.to/joey_lee_c96e4ad421791371/every-ai-startup-should-watch-out-1000-ghost-accounts-drained-our-platform-in-15-days-4k9h</guid>
      <description>&lt;p&gt;We're building &lt;strong&gt;Nexu&lt;/strong&gt; 🦞, an open-source OpenClaw desktop client on GitHub. When new users sign up, they get free credits to try various LLMs on the platform.&lt;/p&gt;

&lt;p&gt;One day, while cleaning up user data, we noticed something odd — &lt;strong&gt;an email domain we'd never seen before had an abnormally high number of registered users&lt;/strong&gt;. Higher than many corporate domains. Sitting near the top of our domain leaderboard.&lt;/p&gt;

&lt;p&gt;This article is a complete record of how we went from &lt;strong&gt;"that's weird" → multi-dimensional drill-down → baseline comparison → conclusion&lt;/strong&gt;. We also open-sourced the entire investigation methodology as an installable Skill — you'll find it at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  01 / A Domain That Shouldn't Be on the Leaderboard
&lt;/h2&gt;

&lt;p&gt;When we sorted registered users by email domain, the usual suspects were at the top — gmail.com, qq.com, various corporate domains.&lt;/p&gt;

&lt;p&gt;But one domain sat suspiciously high (anonymized as &lt;strong&gt;xx.love&lt;/strong&gt; below). It had over &lt;strong&gt;1,000 registered users&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A domain we'd never heard of, with more signups than many enterprise domains. That alone was a signal worth digging into.&lt;/p&gt;

&lt;p&gt;A quick background check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registered in early 2026, WHOIS privacy protection — no registrant info&lt;/li&gt;
&lt;li&gt;DNS hosted on Cloudflare with MX records — &lt;strong&gt;capable of sending and receiving email&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No A records, no website, no ICP filing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A domain built solely for email, with zero public web presence. Keep this in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  02 / Two Distinctly Different Phases
&lt;/h2&gt;

&lt;p&gt;Plotting these 1,000+ accounts on a timeline revealed they weren't evenly distributed — they &lt;strong&gt;clearly split into two phases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 (Day 1–7): Low-volume probing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Single digits to a few dozen per day, ~150 total. Email prefixes were varied — some looked like real names (linlong, wuyan), some were obvious test inputs (ooo, qwe), plus some mixed strings. Inconsistent, like someone experimenting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 (Day 8 onward): High-volume flood&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;700+ in a single day. Prefixes shifted almost entirely to &lt;strong&gt;6-character alphanumeric random strings&lt;/strong&gt; (e.g., 01mh07, x9k2p3). Within 10-minute windows, we repeatedly saw bursts of 16–18 accounts, with a median registration interval of about &lt;strong&gt;37 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This wasn't just scaling up — the &lt;strong&gt;naming strategy changed entirely&lt;/strong&gt;. From "someone typing at a keyboard" to "a script doing the work."&lt;/p&gt;

&lt;h2&gt;
  
  
  03 / User-Agent Fingerprints Shifted in Sync
&lt;/h2&gt;

&lt;p&gt;Registration behavior alone might not be conclusive, but User-Agent changes added another layer of confirmation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phase 1: Almost exclusively &lt;strong&gt;Chrome N (Windows)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Phase 2: Primary UA shifted to &lt;strong&gt;Chrome N+1 (Windows)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moreover, email prefix patterns correlated with specific UAs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Name-like," "5-char," and "7-char" prefixes → almost all Chrome N&lt;/li&gt;
&lt;li&gt;"6-char random" prefixes → overwhelmingly Chrome N+1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prefix switch and UA switch happened simultaneously. It looked like the entire registration environment was upgraded at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  04 / The Baseline Comparison Exposed Everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Side by side with the general user population, the differences were stark.&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;Metric&lt;/th&gt;
&lt;th&gt;Suspicious Domain&lt;/th&gt;
&lt;th&gt;All Users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Session structure&lt;/td&gt;
&lt;td&gt;Almost all single-session&lt;/td&gt;
&lt;td&gt;Commonly multi-session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-IP / multi-UA switching&lt;/td&gt;
&lt;td&gt;Almost none&lt;/td&gt;
&lt;td&gt;Clearly present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UA diversity&lt;/td&gt;
&lt;td&gt;~1,000+ sessions / 3 UAs&lt;/td&gt;
&lt;td&gt;~4,000 sessions / 190 UAs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registration → first use&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~5 hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~8 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accounts with usage&lt;/td&gt;
&lt;td&gt;73.8%&lt;/td&gt;
&lt;td&gt;81.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highly converged environment.&lt;/strong&gt; Normal users switch devices and browsers all the time — 4,000 sessions mapped to 190 distinct UAs. The suspicious domain? 1,000+ sessions across just 3 UAs. Two orders of magnitude more concentrated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Register first, activate later.&lt;/strong&gt; Normal users start using the product within a median of 8 minutes after signup. These accounts waited a median of 5 hours. Not inactive — more like "build the pool first, activate on schedule."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selective activation.&lt;/strong&gt; 73.8% of accounts eventually made API calls. These weren't throwaway registrations — this was a selectively activated account pool.&lt;/p&gt;

&lt;h2&gt;
  
  
  05 / Not Just Vanity Metrics — Real Resource Drain
&lt;/h2&gt;

&lt;p&gt;If these accounts had just sat idle, the damage would've been minimal. But they didn't — &lt;strong&gt;they were making API calls at scale&lt;/strong&gt;. They consumed &lt;strong&gt;billions of tokens&lt;/strong&gt; across most major models on the platform. The inference cost was significant.&lt;/p&gt;

&lt;p&gt;The calls weren't concentrated on one or two models, but spread broadly — thousands to tens of thousands of calls per model.&lt;/p&gt;

&lt;p&gt;This wasn't "sign up, grab credits, leave." It was &lt;strong&gt;systematic consumption of platform API resources&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  06 / Technical Retro: Four Takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔍 Always establish baselines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many metrics are meaningless in isolation. "Created a session shortly after signup" sounds normal — but 80% of all users do that. Only by comparing against the baseline can you distinguish "normal" from "anomalous."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 Cross-dimensional analysis &amp;gt; single-metric judgment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prefixes alone, UA alone, registration timing alone — each could be dismissed as coincidence. But when all three dimensions shift in sync, the probability of coincidence approaches zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱ Zoom into the timeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aggregated data masks phase transitions. Break it down by day or even by hour to spot the "probing → flooding" inflection point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Restraint is more convincing than accusations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Throughout this analysis, we never said "this is a malicious attack." We only described the patterns the data revealed. Restrained conclusions are actually more persuasive — because the facts speak for themselves.&lt;/p&gt;

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

&lt;p&gt;The 1,000+ accounts under this suspicious domain form a &lt;strong&gt;highly homogeneous, batch-processed, systematized&lt;/strong&gt; account cluster.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Clear "probing → flooding" two-phase transition&lt;/li&gt;
&lt;li&gt;✅ Prefix patterns, UA fingerprints, and registration cadence all shifted in sync&lt;/li&gt;
&lt;li&gt;✅ Compared to the general population: environment convergence, activation timing, and session structure all significantly deviated&lt;/li&gt;
&lt;li&gt;✅ More consistent with "build an account pool, then selectively activate" than simple spam registration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For early-stage SaaS products, this kind of batch registration may not be immediately fatal. But the impact is real — &lt;strong&gt;stolen API costs, polluted growth metrics, and the risk of escalation if left unchecked.&lt;/strong&gt; The sooner you build anomaly detection capabilities, the sooner you stop the bleeding.&lt;/p&gt;

&lt;h2&gt;
  
  
  08 / We Open-Sourced Our Investigation as a Skill
&lt;/h2&gt;

&lt;p&gt;We packaged the entire investigation workflow into an open-source Skill called &lt;strong&gt;abuse-hunter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Install it in Nexu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/skill &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/nexu-io/harness-engineering-guide/tree/main/skills/abuse-hunter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then kick off an investigation with one sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check for email domains with abnormally high registration volumes and look for signs of batch account farming
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It automatically runs a &lt;strong&gt;6-step investigation&lt;/strong&gt; and outputs a scored report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email domain clustering&lt;/strong&gt; — identify domains with abnormal signup volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration cadence analysis&lt;/strong&gt; — organic growth vs. batch injection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix pattern recognition&lt;/strong&gt; — human-created vs. script-generated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UA fingerprint comparison&lt;/strong&gt; — environment diversity vs. convergence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation timing analysis&lt;/strong&gt; — instant use vs. delayed activation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credit consumption stats&lt;/strong&gt; — quantify actual financial impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final output: a 12-point composite score with recommended actions. It also ships with a Python script for offline CSV analysis.&lt;/p&gt;

&lt;p&gt;🔗 abuse-hunter Skill: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/harness-engineering-guide/tree/main/skills/abuse-hunter" rel="noopener noreferrer"&gt;https://github.com/nexu-io/harness-engineering-guide/tree/main/skills/abuse-hunter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📘 Harness Engineering Guide — hands-on tutorials for harness engineering: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/harness-engineering-guide" rel="noopener noreferrer"&gt;https://github.com/nexu-io/harness-engineering-guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  09 / About Nexu
&lt;/h2&gt;

&lt;p&gt;Nexu is a one-click installable OpenClaw desktop client that lets you control everything with AI, locally.&lt;/p&gt;

&lt;p&gt;Whether you use WeChat, Feishu, DingTalk, WeCom, QQ, Slack, Discord, WhatsApp, or Telegram — your Agent lives right in your chat window, helping you write code, fix bugs, run automations, manage schedules, and do research.&lt;/p&gt;

&lt;p&gt;🦞 &lt;strong&gt;Nexu&lt;/strong&gt;: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/nexu" rel="noopener noreferrer"&gt;https://github.com/nexu-io/nexu&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in real-world AI Agent practices — whether it's architecture, product design, or growth security — give us a Star ⭐, or open an Issue / Discussion to chat.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>showdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>The Billion-Token Battle: Shipping Our OpenClaw Windows Client</title>
      <dc:creator>Joey Lee</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:30:30 +0000</pubDate>
      <link>https://dev.to/joey_lee_c96e4ad421791371/the-billion-token-battle-shipping-our-openclaw-windows-client-5aop</link>
      <guid>https://dev.to/joey_lee_c96e4ad421791371/the-billion-token-battle-shipping-our-openclaw-windows-client-5aop</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nexu&lt;/strong&gt; is an open-source, one-click-install OpenClaw desktop client that puts AI in your hands — locally.&lt;br&gt;
GitHub: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/nexu" rel="noopener noreferrer"&gt;https://github.com/nexu-io/nexu&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
⭐ If you find it useful, a Star means the world to us.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last week we shipped Nexu v0.1.12 with full Windows support. As the first open-source OpenClaw desktop client — processing &lt;strong&gt;billions of tokens daily&lt;/strong&gt; — Windows was by far the most requested feature from our community.&lt;/p&gt;

&lt;p&gt;But "Windows support" is three words that hide a complete rebuild of our packaging pipeline. Here's what changed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⏱ Build time&lt;/td&gt;
&lt;td&gt;15 min&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 min&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Install time&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;under 2 min&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 CI builds&lt;/td&gt;
&lt;td&gt;manual&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;fully automated&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 Update logic&lt;/td&gt;
&lt;td&gt;coupled&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;macOS/Windows decoupled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We hit plenty of walls along the way and made some unconventional technical decisions. Since we're open source, &lt;strong&gt;there's no reason to keep these lessons to ourselves&lt;/strong&gt;. This is the first post in a series — hopefully it saves you some pain if you're shipping Electron apps cross-platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where electron-builder Falls Short
&lt;/h2&gt;

&lt;p&gt;electron-builder is the de facto standard for packaging Electron apps. Most projects use it end-to-end, from source to final installer. So did we, initially.&lt;/p&gt;

&lt;p&gt;But once we actually ran the full Windows pipeline in production, the default path started breaking down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nexu's packaged file tree contains roughly &lt;strong&gt;38,000 files&lt;/strong&gt;. Default ZIP compression handles this scale terribly — both in build time and install time&lt;/li&gt;
&lt;li&gt;We needed &lt;strong&gt;custom installer logic&lt;/strong&gt; — data migration options, registry cleanup, user-facing choices that electron-builder's defaults don't support&lt;/li&gt;
&lt;li&gt;macOS and Windows have &lt;strong&gt;fundamentally different update semantics&lt;/strong&gt;. Forcing them into the same code path was creating fragile, hard-to-debug behavior&lt;/li&gt;
&lt;li&gt;CI artifacts need to be &lt;strong&gt;reproducible&lt;/strong&gt; regardless of local machine setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;electron-builder still handles producing &lt;code&gt;win-unpacked&lt;/code&gt; (the raw app directory). But from that point on, we took over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom 7z + NSIS Pipeline
&lt;/h2&gt;

&lt;p&gt;Our new pipeline has two stages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1: electron-builder produces win-unpacked&lt;/strong&gt;&lt;br&gt;
Standard Electron app directory — exe, dlls, resources. electron-builder still does this well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2: Custom packaging takes over&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vendored &lt;strong&gt;7-Zip&lt;/strong&gt; compresses win-unpacked into &lt;code&gt;payload.7z&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;makensis&lt;/strong&gt; compiles a custom NSIS installer&lt;/li&gt;
&lt;li&gt;The installer handles extraction, registry writes, shortcuts, and uninstall cleanup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why 7z?&lt;/strong&gt; With 38,000 files, 7z's solid compression treats the entire tree as a single block — dramatically better compression ratio and extraction speed than ZIP. This is the single biggest reason install time dropped from 10 minutes to under 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why NSIS?&lt;/strong&gt; Full control over every aspect of the install flow — paths, migration options, registry, uninstall. No more fighting framework defaults.&lt;/p&gt;

&lt;p&gt;We also vendored 7-Zip directly into the repo, so both CI and local builds have zero external dependencies. Reproducibility out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Update Drivers
&lt;/h2&gt;

&lt;p&gt;This one bit us hard. Our update logic for macOS and Windows used to share a single code path, branched with &lt;code&gt;if (platform === 'win32')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The problem is that these platforms have fundamentally different update models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS can &lt;strong&gt;silently update in-app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Windows requires &lt;strong&gt;quit → run installer → restart&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cramming both into one path meant every Windows fix risked breaking macOS. So we introduced an &lt;strong&gt;Update Driver&lt;/strong&gt; abstraction — three independent platform drivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mac-update-driver&lt;/strong&gt; — in-app download and install&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;windows-update-driver&lt;/strong&gt; — external download + installer redirect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;unsupported-update-driver&lt;/strong&gt; — graceful fallback for other platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each platform now evolves independently. If you're building cross-platform Electron apps, &lt;strong&gt;introduce this separation early&lt;/strong&gt; — you'll thank yourself later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Path Resolution
&lt;/h2&gt;

&lt;p&gt;Here's a subtle one: after packaging, runtime file locations depend on your build config. Our old code used loose heuristics to find them — which mostly worked, until it didn't.&lt;/p&gt;

&lt;p&gt;Any change in build output layout could silently break runtime discovery. And these failures only showed up in packaged builds — never in local dev.&lt;/p&gt;

&lt;p&gt;We wrote a dedicated Windows runtime locator that resolves paths &lt;strong&gt;explicitly relative to the exe&lt;/strong&gt;. The contract between build output layout, runtime packaging, and runtime discovery is now tight.&lt;/p&gt;

&lt;p&gt;Before: "it's probably around here." Now: &lt;strong&gt;"it must be exactly here, or fail loudly."&lt;/strong&gt; No more silent breakage in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD Pipeline
&lt;/h2&gt;

&lt;p&gt;Previously, Windows builds were a local-only affair — success depended on your machine's toolchain being set up correctly.&lt;/p&gt;

&lt;p&gt;We moved the entire build → package → sign → publish flow to GitHub Actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nightly / beta / release&lt;/strong&gt; — all three workflows now fully support Windows&lt;/li&gt;
&lt;li&gt;Auto-generates &lt;code&gt;latest-win.json&lt;/code&gt; update manifests&lt;/li&gt;
&lt;li&gt;Artifacts include installer, hashes, and metadata — fully traceable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For open-source projects, reproducible CI is everything. Any contributor can build and get the exact same output.&lt;/p&gt;

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

&lt;p&gt;The real value of this work isn't a flashy new feature — it's &lt;strong&gt;infrastructure that compounds&lt;/strong&gt;. More control over packaging, more stable updates, more predictable paths.&lt;/p&gt;

&lt;p&gt;We still have experimental optimizations in the pipeline (like lifecycle-driven Windows data migration), which we'll cover in the next post once they're battle-tested.&lt;/p&gt;

&lt;p&gt;The whole point of open source is &lt;strong&gt;sharing what you learn, not just what you ship&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Speaking of sharing — we're also building a &lt;strong&gt;free, open-source knowledge base for AI Agent engineering&lt;/strong&gt;: the &lt;strong&gt;&lt;a href="https://harness-guide.com" rel="noopener noreferrer"&gt;Harness Engineering Guide&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It covers architecture patterns, technical deep-dives, product comparisons, and frontier research in the AI Agent space. 20+ in-depth articles and growing.&lt;/p&gt;

&lt;p&gt;🌐 Website: &lt;strong&gt;&lt;a href="https://harness-guide.com" rel="noopener noreferrer"&gt;https://harness-guide.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
📦 GitHub: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/harness-engineering-guide" rel="noopener noreferrer"&gt;https://github.com/nexu-io/harness-engineering-guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have insights or hands-on experience with AI Agents, &lt;strong&gt;we'd love your contribution&lt;/strong&gt;. Open an Issue or submit a PR — every submission gets a thorough review.&lt;/p&gt;




&lt;p&gt;Nexu is fully open source: &lt;strong&gt;&lt;a href="https://github.com/nexu-io/nexu" rel="noopener noreferrer"&gt;https://github.com/nexu-io/nexu&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've dealt with similar Electron packaging headaches on Windows — or found a better approach — come talk to us on GitHub. That's what open source is for.&lt;/p&gt;

</description>
      <category>electron</category>
      <category>windows</category>
      <category>openclaw</category>
      <category>opensource</category>
    </item>
    <item>
      <title>We Built an Open-Source OpenClaw Desktop Client That Fixes 17 Pitfalls</title>
      <dc:creator>Joey Lee</dc:creator>
      <pubDate>Tue, 31 Mar 2026 12:46:06 +0000</pubDate>
      <link>https://dev.to/joey_lee_c96e4ad421791371/we-built-an-open-source-openclaw-desktop-client-that-fixes-17-pitfalls-gjn</link>
      <guid>https://dev.to/joey_lee_c96e4ad421791371/we-built-an-open-source-openclaw-desktop-client-that-fixes-17-pitfalls-gjn</guid>
      <description>&lt;p&gt;If you've deployed OpenClaw in production, you've probably hit at least a few of these — and may not even realize it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context window silently truncates&lt;/strong&gt; — response quality tanks and you don't know why&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some channel plugins require a full restart&lt;/strong&gt; on first connect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack quietly drops group messages&lt;/strong&gt; — messages just vanish&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock returns 400&lt;/strong&gt; because of &lt;code&gt;supportsStore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Docker image is 660MB&lt;/strong&gt; and cold-starts in minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've been running OpenClaw for months and hit all 17 known pitfalls. So we built &lt;strong&gt;Nexu&lt;/strong&gt; — an open-source desktop client that auto-fixes every one of them. Double-click to install, no Docker, no CLI, no YAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 500-Line Config Compiler
&lt;/h2&gt;

&lt;p&gt;At Nexu's core is a 500-line config compiler that automatically generates correct OpenClaw configuration, with all 17 pitfalls pre-patched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context: Not Bigger, Smarter
&lt;/h3&gt;

&lt;p&gt;OpenClaw's default context handling brutally truncates when the window fills up. Nexu's compiler injects a &lt;strong&gt;safeguard context compression&lt;/strong&gt; strategy: auto-retry when quality drops instead of silently truncating. It allocates a &lt;strong&gt;200K context window&lt;/strong&gt; — 50% for conversation history, 20K token floor — and auto-archives old conversations to vector memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Channel-Specific Hacks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Channel preheat:&lt;/strong&gt; pre-loads channel plugins at init so first connect does not require an extra restart&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack &lt;code&gt;groupPolicy: open&lt;/code&gt;:&lt;/strong&gt; forced globally — group messages no longer silently swallowed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;supportsStore: false&lt;/code&gt;:&lt;/strong&gt; set globally to prevent Bedrock/LiteLLM 400 errors&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hot-Reload That Actually Works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mixed hot-reload:&lt;/strong&gt; small config changes hot-load instantly; large changes trigger a graceful restart. Zero user-perceived interruption in either case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cut in Half
&lt;/h2&gt;

&lt;p&gt;We use a custom dependency closure algorithm that only bundles actually-used modules, cutting the packaged runtime footprint roughly in half compared to shipping full dependency trees. Every new 1MB dependency = 1MB added to the final package. We track this obsessively.&lt;/p&gt;

&lt;h2&gt;
  
  
  System-Level Process Guard
&lt;/h2&gt;

&lt;p&gt;Not a child process — a macOS native &lt;strong&gt;LaunchAgent&lt;/strong&gt; (system service). Crash auto-restart in 2s with exponential backoff (2s → 4s → 8s → 30s cap). Close the window, your workflows keep running. Reopen, instant re-attach. &lt;code&gt;SIGTERM → 3s → SIGKILL&lt;/code&gt; — no zombie processes ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Sleep Guard
&lt;/h2&gt;

&lt;p&gt;Intercepts &lt;strong&gt;5 types of macOS power events&lt;/strong&gt;. Lid closed, low battery, night — workflows keep processing without forcing screen awake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health Probe: 1000x Faster
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;4.8s → 1-3ms.&lt;/strong&gt; Disconnect detection is now millisecond-level. No more waiting seconds to know your runtime is down.&lt;/p&gt;

&lt;h2&gt;
  
  
  10,000+ Skills, Hot-Install
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;29 curated skills pre-installed.&lt;/strong&gt; Remote catalog with CDN, auto-synced every 24 hours. Install and use immediately — no restart required. Also supports ZIP file and GitHub repo import.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wtvgxb5mp73l13bhpx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wtvgxb5mp73l13bhpx6.png" alt="Nexu skills — 10,000+ skills hot-install" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Channel-Specific Optimizations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slack:&lt;/strong&gt; fix for silent group message loss — &lt;code&gt;groupPolicy: open&lt;/code&gt; enforced globally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram:&lt;/strong&gt; BotFather token flow — no self-hosted webhook server required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp:&lt;/strong&gt; QR scan to connect your account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord:&lt;/strong&gt; native bot gateway with auto-reconnect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feishu/Lark:&lt;/strong&gt; 27 field types, streaming cards — strong for in-org workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Zero Barrier
&lt;/h2&gt;

&lt;p&gt;Double-click to install. OAuth for Slack. QR scan for WhatsApp. BotFather token for Telegram. 10+ models switch without restart. No Docker, no database, no CLI. Universal macOS — Apple Silicon and Intel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdvu3es2sb8fsv5hz2e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdvu3es2sb8fsv5hz2e1.png" alt="Nexu on GitHub" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://github.com/nexu-io/nexu/releases" rel="noopener noreferrer"&gt;github.com/nexu-io/nexu/releases&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Honest Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal macOS&lt;/strong&gt; — Intel + Apple Silicon (one .dmg each)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-user&lt;/strong&gt;, no multi-tenant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel maturity:&lt;/strong&gt; Slack and Discord most battle-tested. WhatsApp and Telegram freshly shipped (v0.1.8)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-source, MIT licensed. → &lt;a href="https://github.com/nexu-io/nexu" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>openclaw</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
