Repository navigation
Releases: 0xAKIRAVX/UMBRA
Release list
UMBRA v4.2.0 — AKAMAI: real IPs, real measurement
EN
The two complaints, fixed at the root: the Akamai IPs "are fake and don't work", and the app "finds IPs too fast to actually measure their ping, speed and stability".
- AKAMAI now probes www.bing.com — the census-proven host. The old mode validated against
www.akamai.com, which every edge answers… with a 1.7 KB 403 stub — a technically-valid TLS proof that measures nothing and left you holding IPs you couldn't use. A live 5-SNI matrix census (2026-10-25) across 9 live edges showed 9/9 serve bing with a valid certificate, HTTP 200 and a real ~78 KB body (microsoft/tesla/download.microsoft.com are NOT served from every edge). One host now serves validation, the deep samples AND the throughput measure. Remember: Akamai's edge routes strictly by SNI — the validated IPs serve Akamai-hosted hosts; use such an SNI/host in your config. - DEEP MEASURE — new phase in every mode. After validation, the top endpoints are re-probed with 8 spaced fresh samples (full TLS+cert round trips; extra WireGuard handshake + in-tunnel ping rounds in ENDPOINT mode), and the reported ping, jitter, loss and the final ranking all come from that multi-sample measurement — not one lucky round trip. Flaky endpoints (≥25% loss) are flagged honestly.
- Real AKAMAI throughput. v4.1 skipped the speed phase entirely. v4.2 measures it on repeated real bing page fetches, counting only body-transfer time — live-verified 35–42 Mbps on near edges. پرسرعتترین is finally real.
- +10 census-verified Akamai blocks (29 total), TCP-storm probe-budget ladder, deep-measure controls in the advanced engine section.
319/319 unit tests green · all live suites re-verified against production · DEX verified.
فارسی
دو شکایت اصلی، از ریشه رفع شد: «آیپیهای آکامای فیک هستن و کار نمیکنن» و «برنامه سریع آیپیها رو پیدا میکنه و فرصت نمیکنه پینگ و سرعت و پایداریشون رو واقعی بسنجد».
- اسکن آکامای حالا www.bing.com را میسنجد — میزبانی که با census زنده اثبات شده. حالت قبلی www.akamai.com را اعتبارسنجی میکرد که هر ادج فقط با یک صفحه ۴۰۳ کوچک جواب میدهد — اثباتی که هیچ چیزی را نمیسنجد. census زنده روی ۹ ادج واقعی نشان داد ۹/۹ یعنی همه bing را با گواهی معتبر و HTTP 200 و بدنه واقعی ~۷۸KB سرو میکنند. این IPها فقط هاستهای پشت آکامای را سرو میکنند — در کانفیگ خود چنین SNI/هاستی بگذارید.
- سنجش عمیق — فاز جدید در همه حالتها. بعد از اعتبارسنجی، اندپوینتهای برتر با ۸ نمونه فاصلهدار دوباره سنجیده میشوند و پینگ، جیتر، اتلاف و رتبهبندی نهایی همگی از همین سنجههای چندنمونهای میآیند — نه از یک رفتوبرگشت شانسی. اندپوینتهای ناپایدار (اتلاف ≥۲۵٪) صادقانه علامتگذاری میشوند.
- سرعت واقعی آکامای. نسخه قبل فاز سرعت را کلاً رد میکرد؛ حالا توان عبوری با دریافت مکرر صفحه واقعی bing سنجیده میشود (فقط زمان انتقال بدنه) — در تست زنده ۳۵ تا ۴۲ مگابیت بر ثانیه.
- ۱۰ بلوک آکامای دیگر با census تأییدشده (مجموع ۲۹)، نردبان بودجه پروب در طوفان TCP، و کنترلهای سنجش عمیق در بخش موتور پیشرفته.
۳۱۹/۳۱۹ تست واحد سبز · همه تستهای زنده دوباره روی شبکه واقعی تأیید شد · DEX تأیید شد.
⚠ SECURITY: the GitHub token used in chat history is exposed — rotate it (Settings → Developer settings → Personal access tokens) after installing.
UMBRA v4.1.1 — Bug Hunt Round 3
v4.1.1 — Bug Hunt Round 3
تمام باگهای برنامه رو بگیر — a fresh-eyes audit of the whole v4.1.0 tri-lingual codebase (engine, controller, service, both native bridges, the debug system, every screen, i18n parity) found 3 real defects — all fixed, all pinned with 13 new regression tests.
1. THE frozen-IDENTITY-phase fix 🔒
On a network where api.cloudflareclient.com is blocked or DNS-poisoned — exactly the networks this app is built for — the scan sat in a silent IDENTITY phase for 50–80 seconds (phase bar stuck, 0/0 tested, 0.0/s, elapsed ticking) even when a perfectly valid WARP identity was already stored on disk. Registration tried the API up to 3 times (each attempt = 10 s domain connect + 4 × 4 s pinned-IP connects) and only then fell back to the stored identity.
- The stored identity is now the primary source, consulted before any network call (BPB's
warp.jsonsemantics) — every scan after the first starts instantly, on every network - A stale stored identity is still self-healed by the witness gate (fresh re-registration + recovery sweep)
- A transport-level unreachable API now fast-fails after one attempt (the 700 ms backoff retries remain for HTTP-level rate limiting, where they actually help)
- Bonus: the registration API is no longer poked with a fresh account every 15 minutes on networks where it works
2. The notification shade was half-English 🌐
The scan notification's title, STOP action and channel were localized — but its content was hardcoded English ("warming up engine", "phase identity · tested 504/508 · alive 25", "UMBRA · Scan Complete", "alive 25 · tested 504/508 · 12s"). Persian users saw a half-English notification on every scan. All content lines now follow the app language (EN + FA), with the v4.0.2 ASCII locale-hardening contract (tr/fa hostile locales) preserved and re-pinned.
3. Best endpoint + the last English choosers 📋
- The final notification showed the bare best IP — in random-port mode (the ENDPOINT default) that identifies nothing usable. It now shows the full
[ip]:portendpoint (IPv6 bracketed) — the notification was the last surface showing a bare IP Exporters.shareText's hardcoded English choosers (the results board's "Share via" and the diagnostics tab's "UMBRA debug journal") were the last untranslated choosers — both now localized
Verification: 309/309 unit tests green (13 new Patch411Test) · all live suites re-verified against production Cloudflare & Akamai through the new registration path (Kotlin + Rust WG handshakes with in-tunnel pings, endpoint scan, Akamai live scan, ghost-key control, census) · DEX post-build verification passed · same signing key.
Install v4.1.1 over any v3.2+ / v4.0.x / v4.1.0 — same signature.
v4.1.1 — دور سوم شکار باگ
تمام باگهای برنامه رو بگیر — ممیزی کامل کدبیس سهزبانهٔ نسخهٔ ۴٫۱٫۰، ۳ باگ واقعی پیدا کرد که هر سه رفع و با ۱۳ تست رگرسیون جدید قفل شدند.
۱. رفع فریزِ فاز IDENTITY 🔒
روی شبکههایی که api.cloudflareclient.com در آنها مسدود یا DNS-آلود است — دقیقاً شبکههای مخاطب این برنامه — اسکن ۵۰ تا ۸۰ ثانیه بیصدا در فاز IDENTITY میماند (نوار فاز ثابت، ۰/۰ تستشده، ۰٫۰/ث) حتی وقتی یک هویت کاملاً معتبر از قبل روی دیسک ذخیره شده بود. حالا هویت ذخیرهشده منبع اصلی است و قبل از هر تماس شبکهای خوانده میشود (رفتار warp.json در BPB) — هر اسکنِ بعد از اولی، روی هر شبکهای، فوری شروع میشود. هویت کهنه همچنان توسط گیت witness خودترمیم میشود و APIِ کاملاً بلاکشده بعد از یک تلاشِ سرراست رها میشود.
۲. نوتیفیکیشن نیمهانگلیسی بود 🌐
عنوان، دکمه و کانالِ نوتیفیکیشن فارسی بودند ولی متنش انگلیسی ثابت بود — حالا همهٔ خطوط محتوا از زبان برنامه پیروی میکنند (انگلیسی + فارسی) و قرارداد ASCII نسخهٔ ۴٫۰٫۲ (اعداد و حروف لاتین در localeهای ترکی/فارسی) حفظ و دوباره پین شده است.
۳. بهترین اندپوینت + آخرین انگلیسیها 📋
- نوتیفیکیشن پایانی فقط IPِ خالی نشان میداد — در حالت پورت تصادفی بیاستفاده است؛ حالا اندپوینت کامل
[ip]:port(با براکت IPv6) را نشان میدهد - دو انتخابگر اشتراک انگلیسیِ باقیمانده («Share via» در برد نتایج و «UMBRA debug journal» در تب دیاگ) هم فارسی شدند
راستیآزمایی: ۳۰۹/۳۰۹ تست واحد سبز (۱۳ تست جدید) · همهٔ تستهای زنده دوباره روی Cloudflare و Akamaiِ واقعی از مسیر ثبتنام جدید تأیید شدند (هندشیک WG در هر دو هستهٔ Kotlin و Rust + پینگ داخل تونل، اسکن اندپوینت، اسکن زندهٔ آکامای، کنترل کلید مرده، سرشماری) · تأیید DEX پاس · همان کلید امضا.
نصب v4.1.1 روی هر نسخهٔ v3.2+ / v4.0.x / v4.1.0 — امضای یکسان.
UMBRA v4.1.0 — AKAMAI Scanner (پرسرعتترین IPهای CDN آکامای)
EN
A second CDN: the AKAMAI scan mode
User request: scan the Akamai CDN and return its fastest IPs. A fourth mode tile — AKAMAI — samples Akamai's published edge network (19 IPv4 blocks, ~13.7M addresses, + 3 IPv6 blocks) and applies the same honesty contract the app enforces on Cloudflare:
- Alive = TLS-cert-verified for
www.akamai.com. Akamai's shared edge routes strictly by SNI (live-verified: an edge IP either serves the valid property certificate or resets the connection). DPI fake-accepts and non-serving IPs die at the strict-TLS filter — every reported IP genuinely carries Akamai's property, directly usable in v2rayNG / Hiddify withhost = www.akamai.comor your own Akamai-fronted domain. - Runs on the Kotlin core, on purpose — the Go clean-IP engine's verify phase demands Cloudflare's
/cdn-cgi/trace(a zone filter no Akamai edge can answer), so Akamai is excluded from the Go path and uses the pure certificate-verification pipeline instead. - Latency-ranked, honestly — Akamai has no metered throughput endpoint, so the speed phase is skipped (visible log line, no SPEED segment) and results carry
—for speed instead of a fabricated number. Ranking = TCP RTT + TLS handshake + jitter + loss. - Third smart-pick bucket — WARP / CF EDGE / AKAMAI rows side by side; an Akamai edge is never presented as a Cloudflare edge.
- Zero-result scans explain themselves — the verdict names the SNI-routing contract and the remedies.
- CUSTOM-mode fix found by the live run: pasting exact IPs (
104.16.1.1/32) used to generate zero candidates (the v4 net/broadcast guard swallowed whole /32s) — fixed and pinned.
Live-verified against production Akamai: 192 candidates → 70 TCP-alive → 12–16 TLS-verified edges per run (the rest discarded by the SNI filter), drawn from 23.0.0.0/12, 104.64.0.0/10, 184.x, 69.192.0.0/16 and more — the whole edge network, not one PoP. All other live suites re-verified.
296/296 unit tests green · DEX verification passed · same signing key — installs over any v3.2+ / v4.0.x.
فارسی
اسکنر آکامای — CDN دوم برنامه
درخواست شما: CDN آکامای اسکن شود و پرسرعتترین IPها تحویل داده شود. حالت چهارم — AKAMAI — از محدودههای رسمی ادجِ آکامای (۱۹ بلوک IPv4 با حدود ۱۳.۷ میلیون آدرس + ۳ بلوک IPv6) نمونهگیری میکند و همان قرارداد صداقت برنامه را اجرا میکند:
- «فعال» یعنی گواهی معتبرِ
www.akamai.com. ادجِ آکامای دقیقاً بر اساس SNI مسیریابی میشود (بهصورت زنده تأیید شد: هر IP یا گواهی معتبر سرو میکند یا اتصال را قطع میکند)؛ پس IPهای جعلیِ DPI و بدون سرویس در فیلتر TLS حذف میشوند — هر IP گزارششده واقعاً سرویس آکامای را حمل میکند و مستقیماً باhost = www.akamai.com(یا دامنه اختصاصی پشت آکامای خودتان) در v2rayNG / Hiddify قابل استفاده است. - عمداً روی هسته Kotlin اجرا میشود — موتور Go برای تأیید، پاسخ 200 از
/cdn-cgi/traceکلادفلر را لازم دارد؛ مسیری که هیچ ادجِ آکامایی نمیتواند جواب دهد. - رتبهبندی بر پایه تأخیر، صادقانه — در آکامای اندپوینتِ سنجش سرعت وجود ندارد؛ پس فاز سرعت با یک خطِ شفاف رد میشود و بهجای عددِ ساختگی، ستون سرعت «—» میماند.
- باکت سوم نتایج — ردیفهای WARP / CF EDGE / AKAMAI کنار هم؛ هرگز IP آکامای بهعنوان ادج کلادفلر نمایش داده نمیشود.
- اسکنِ بدونِ نتیجه خودش را توضیح میدهد.
- رفع باگ حالت CUSTOM: چسباندن IPهای دقیق (
/32) قبلاً صفر کاندیدا میساخت — رفع و پین شد.
تأیید زندهٔ بر شبکه واقعی: ۱۹۲ کاندیدا ← ۷۰ زندهٔ TCP ← ۱۲ تا ۱۶ ادجِ تأییدشده با TLS در هر اجرا. ۲۹۶/۲۹۶ تست سبز · همان کلید امضا — روی هر نسخه v3.2+ / v4.0.x نصب میشود.
UMBRA iOS — sideload build
UMBRA iOS — sideload build (unsigned)
English
This .ipa is unsigned — install it entirely on your iPhone, no computer needed:
- Install Esign (or Scarlet / GBox) from its official page via Safari.
- Download
UMBRA-unsigned.ipafrom this release (Safari → Downloads). - In the signing app: Import the
.ipafrom Files → Sign with a certificate (your own Apple ID certificate created inside the app, or a shared/free certificate) → Install. - Settings → General → VPN & Device Management → Trust the profile → open UMBRA.
Free certificates expire (7 days for a personal Apple ID; shared certs rotate) — if the app stops opening, re-sign and re-install the SAME
.ipa. Your scan results and WARP identity survive on the device.
Computer available? Sideloadly / AltStore also work (7-day free certificates, $99/yr for 1-year/TestFlight)
- Install Sideloadly on Windows/macOS (Windows also needs iTunes for USB drivers).
- Connect the iPhone via cable, drag the
.ipainto Sideloadly, sign with your Apple ID, press Start. - On the iPhone: Settings → General → VPN & Device Management → Trust the developer profile.
- If Apple ID login fails, create an App-Specific Password at appleid.apple.com and use that.
Full Persian walkthrough for the computer path: ios/INSTALL-FA.md.
فارسی — نصب کاملاً بدون کامپیوتر
این فایل .ipa بدون امضاست — همهچیز را روی خودِ آیفون انجام میدهید، بدون کامپیوتر، بدون دامنه، بدون سرور:
- برنامه Esign (یا Scarlet / GBox) را از صفحه رسمیاش با Safari نصب کنید.
- فایل
UMBRA-unsigned.ipaرا از همین ریلیز دانلود کنید (Safari → Downloads). - داخل برنامه امضا: Import فایل از Files → Sign با گواهی (اپلآیدی خودتان را داخل برنامه وارد کنید تا گواهی ساخته شود، یا گواهی رایگان/اشتراکی برنامه) → Install.
- Settings → General → VPN & Device Management → گواهی را Trust کنید → UMBRA را باز کنید.
گواهیهای رایگان منقضی میشوند (اپلآیدی شخصی: ۷ روز؛ گواهیهای اشتراکی چرخشی) — اگر برنامه باز نشد، همین
.ipaرا دوباره امضا و نصب کنید. نتایج اسکن و هویت WARP روی گوشی حفظ میشوند.
Built by GitHub Actions (cloud Mac) from main. The WG crypto/protocol stack is verified byte-for-byte on the simulator against the same warp_vectors.json reference vectors the Android build passes (BLAKE2s, HMAC, X25519, ChaCha20-Poly1305, a complete handshake + transport round-trip) before this .ipa is packaged.
UMBRA v4.0.2 — the Go-path integrity pass
UMBRA v4.0.2 — the Go-path integrity pass
A second fresh-eyes audit over the whole tri-lingual codebase, aimed at the paths the v4 rebuild grew around the Go clean-IP engine.
Fixes
- The ACTIVE stat was poisoned on every CLEAN-IP scan. The Go engine's
prgevents report the absolute number of busy goroutine lanes; the sink'sonActivecontract is a delta (the Kotlin storm sends +1/−1 around each probe). The pass-through added the whole busy count on every progress event — the ACTIVE figure on the stats card climbed monotonically to nonsense for the entire scan, on the app's primary mode. An absolute→delta converter now tracks the true lane count and flushes its residual to zero at scan end (cancellations included). - Duplicate draws stranded the progress bar below 100%. The Go sampler draws candidates with replacement (unlike the Kotlin generator, which deduplicates): on small CIDRs — a pasted /24 in CUSTOM mode — duplicate
ip:porttargets were probed twice while the result store merged them, sotestedcould never reach the announcedcandidatesand the completion line overcounted. The engine now keeps a unique-id ledger and reconciles the announcement at scan end with an honest "duplicate ip draws merged" line. - Two more locale traps closed. The Go engine's colo narration line formatted its TLS time with the default locale (Persian digits inside the ASCII scan log on fa devices — the v4.0.1 sweep fixed the same class on the recovery sweep and missed this one), and the foreground notification lowercased the phase label with the default locale ("IDENTITY" → "ıdentıty" on Turkish devices, in the status bar of all places). Both pinned to
Locale.US/Locale.ROOT. - Deep-test crash feedback. A crash inside the Diagnostics deep endpoint test used to return
nulland the button silently un-busied. The console now carries an honest "deep test crashed" line. - Hex-dump truncation marker. A truncated hex dump printed its "+N bytes" marker after every row; it now appears once, at the end.
Verification
- 14 new regression tests — 284/284 unit tests green
- All live suites re-verified against production Cloudflare through both native cores (real WG handshakes + in-tunnel pings through the Rust core, ghost-key control, census, endpoint scan)
- DEX verification passed (JNI bridge + gomobile classes + feature strings + versionName)
UMBRA v4.0.2 — پاکسازی مسیر Go
یک ممیزی کامل دوم روی کل کدبیس سهزبانه، متمرکز روی مسیرهایی که بازسازی v4 دور موتور Go ساخت.
رفعها
- آمار ACTIVE در هر اسکن CLEAN-IP خراب میشد. رویدادهای
prgموتور Go تعداد مطلقِ خطوط busy را گزارش میکنند، اما قراردادonActiveسینک، دلتا است (طوفان Kotlin برای هر پروب +1/−1 میفرستد). کد قبلی کل تعداد busy را در هر رویداد انباشته میکرد — عدد ACTIVE در کارت آمار در کل طول اسکن بیوقفه بالا میرفت، در حالت اصلیِ برنامه. حالا یک مبدل مطلق→دلتا تعداد واقعی خطوط را ردیابی میکند و باقیمانده را در پایان اسکن (حتی لغو شده) صفر میکند. - کشیدگی تکراری، نوار پیشرفت را زیر ۱۰۰٪ گیر میانداخت. نمونهگیر Go آدرسها را با جایگذاری مجدد میکشد (برخلاف مولد Kotlin که حذف تکراری میکند): در CIDRهای کوچک — مثلاً یک /24 چسباندهشده در حالت CUSTOM — هدفهای
ip:portتکراری دوبار پروب میشدند در حالی که مخزن نتایج یکیشان میکرد؛ پسtestedهرگز بهcandidatesاعلامشده نمیرسید. حالا دفترچه idهای یکتا در پایان اسکن شمارش را صادقانه سازگار میکند. - دو تلهی locale دیگر بسته شد. خط روایت colo موتور Go زمان TLS را با locale پیشفرض فرمت میکرد (ارقام فارسی داخل لاگ ASCII در دستگاههای فارسی)، و نوتیفیکیشن foreground برچسب فاز را با lowercase پیشفرض مینوشت ("IDENTITY" → "ıdentıty" در دستگاههای ترکی). هر دو با
Locale.US/Locale.ROOTپین شدند. - بازخورد کرش تست عمیق. کرش داخل تست عمیق تب Diagnostics بیصدا قورت داده میشد — حالا خط صادقانه «deep test crashed» در کنسول میآید.
- نشان کوتاهشدن hex dump. نشان «+N bytes» بعد از هر ردیف چاپ میشد؛ حالا فقط یکبار، در انتها.
تأیید
- ۱۴ تست رگرسیون جدید — ۲۸۴/۲۸۴ تست واحد سبز
- همهی تستهای live دوباره در برابر Cloudflare واقعی از طریق هر دو هستهی بومی تأیید شدند
- تأیید DEX با موفقیت انجام شد
⚠️ Security note: the GitHub token previously shared in chat history should be rotated (Settings → Developer settings → Personal access tokens).
UMBRA v4.0.1 — locale hardening + gate fixes
UMBRA v4.0.1 — Locale Hardening + Gate Fixes
چه چیزی فیکس شد / What's fixed (5)
-
ارقام فارسی در لاگ موتور — Persian digits in the engine log. روی دستگاههای فارسی (مخاطب اصلی اپ)، لاگهای ASCII موتور با ارقام فارسی/عربی (۵ ms) قاطی میشدند — خط recovery sweep و verdict دیاگnostیک. الان همه با Locale.US پین شدهاند.
On فارسی devices the recovery-sweep log and diagnostics verdict rendered extended Arabic-Indic digits ("۵ ms") inside otherwise-ASCII engine lines — every format now pinsLocale.US. -
دام lowercase ترکی — Turkish lowercase traps. روی دستگاههای ترکی "IPv4" به "ıpv4" تبدیل میشد، یک SNI تمامحروفبزرگ مثل SPEED.CLOUDFLARE.COM از فیلتر test-only VLESS رد میشد (لینک جعلی که هیچوقت پروکسی نمیکرد)، و سطحبندی خطوط دیباگ (ERROR/WARN) خراب میشد. همه با Locale.ROOT بسته شدند.
On Turkish devices the defaultlowercase()turned "IPv4" into "ıpv4" in the session line, let an all-caps test-only SNI slip past the VLESS guard (forging a never-proxying link), and broke the debug journal's level inference — all closed withLocale.ROOT. -
کلید دیباگ حالا واقعاً کار میکند — the DEBUG toggle now gates the per-probe stream. هسته Rust همیشه خطوط dbg میفرستد و هر اسکن کنسول دیباگ را با hex هر پروب پر میکرد حتی وقتی کلید خاموش بود. الان ارسال فقط با کلید روشن انجام میشود.
The Rust core force-emits per-probe debug lines; every scan flooded the console with hex even with the toggle OFF. Forwarding is now gated; the deep probe keeps its full narration. -
گیت دوطرفه دیاگnostیک ↔ اسکن — both-direction gate. شروع اسکن وسط بازجویی کامل شبکه، پروبهای witness و رجیستراسیون را قاطی میکرد (همان درس NETSENSE در v3.2). حالا startGate هر دو جهت را نگه میدارد.
A scan starting mid-diagnostics raced the witness probes and registration (the v3.2 NETSENSE lesson applied to the diagnostics system). -
پورت پیشفرض دیپپروب WG + ضد کرش — WG deep-probe defaults + crash net. IP خام در دیپپروب WG به :443 میرفت در حالی که WARP روی 2408/894/928 صحبت میکند (اندپوینت زنده گزارش «مرده» میشد)؛ و پروب عمیق دیگر با یک Error (OOM) کل اپ را نمیکشد.
A bare IP now defaults to :2408 for WG probes (was :443 — reporting live endpoints as dead), and the deep probe is wrapped in a crash net (the Compose scope has none).
تأیید / Verification
- 268/268 unit tests green (11 new regression tests, each forcing hostile default locales: fa-IR, ar-EG, tr-TR)
- All live suites re-verified against production Cloudflare through both native cores — Kotlin witness, Rust-core handshake + in-tunnel ping, ghost-key control, endpoint census, recovery sweep
- DEX post-build verification passed (JNI bridge + gomobile bindings intact, all feature strings present, BigInteger.TWO = 0)
- Same signing key — installs in place over v4.0.0 / any v3.x
⚠ SECURITY NOTE: a GitHub personal access token was shared in chat history during development. Rotate it now — GitHub → Settings → Developer settings → Personal access tokens → delete/regenerate. Treat the exposed token as compromised.
UMBRA v4.0.0 — the tri-lingual rebuild (Rust + Go + Kotlin)
v4.0.0 merge resolution: v3.12 diagnostics + tri-lingual rebuild coex…
UMBRA v3.12.0 — Diagnostics · Debug System
UMBRA v3.12.0 — سیستم دیباگ واقعی / The DIAGNOSTICS Release
«تمام باگها، مشکلات شبکه و اتصال + یک سیستم دیباگ» — این نسخه ابزارِ گمشده را اضافه میکند: تب جدید DIAG که شبکهی شما را بازجویی میکند، هر اندپوینت را زیر میکروسکوپ میبرد و تمام رخدادهای داخلی برنامه را زنده نشان میدهد.
فارسی
۱. عیبیابی کامل شبکه — یک دکمه
اتصال (معتبر؟ VPN سیستم فعال است؟ — قاتل خاموشِ شمارهیک: تونلهای VPN فقط-TCP تمام پروبهای UDP را بیصدا میبلعند در حالی که وب درست کار میکند)، رزولوشن DNS، خروجی TCP و UDP (شاهد NTP داخل و خارج کلادفلر)، هویت WARP و هندشیک زندهی WireGuard روی seedهای سرشماری (v4 + v6). نتیجه یک حکم واضح است که دقیقاً کلاس خطا را نام میبرد:
NO USABLE NETWORK·SYSTEM VPN IS ACTIVE AND UDP IS DEAD INSIDE ITS TUNNEL·DNS BROKEN·UDP EGRESS BLOCKED·WARP FILTERED — IPv6/ایاسپی دیگر امتحان کنید·REGISTRATION BLOCKED·WARP PATH PROVEN- زیرش تختهی شواهد: هر بررسی با جزئیات و وضعیت OK/WARN/FAIL.
۲. تست عمیق اندپوینت — میکروسکوپ
هر ip / ip:port / [ipv6]:port / host:port را بدهید: زمانبندی هر مرحله (parse → resolve → هویت → ساخت بسته → ارسال → انتظار)، هگز خامِ بستهی ۱۴۸ بایتی initiation با حاشیهنویسی فیلدبهفیلد، هگز پاسخ، و دستهبندی بایتبهبایت: HANDSHAKE_OK (با تأیید AEAD) · COOKIE_REPLY (زنده تحت فشار) · SILENT · SOCKET_ERROR (ICMP port-unreachable = مسیر شما را رد کرد) · REPLY_UNPARSEABLE. خروجی قابل اشتراک — در issue گیتهاب بگذارید تا علت دقیق دیده شود.
۳. کنسول دیباگ زنده — ژورنال سراسری
یک جریان واحد که همهی لایهها به آن آینه میشوند: خطوط اسکن (سطح خطا از متن موتور حد زده میشود — abort و failure قرمز)، رویدادهای crash، مراحل NETSENSE، بررسی بهروزرسانی و خود عیبیابی. فیلتر برچسب، رنگبندی سطح، کپی/اشتراک کل ژورنال.
English
1. Full network diagnostics — one button
Connectivity (validated? system VPN active? — the #1 silent killer: TCP-only proxy VPNs swallow every UDP probe while the web works fine), DNS resolution, TCP & UDP egress (NTP witnesses inside and outside Cloudflare), WARP identity, and live WireGuard handshakes against the census seeds (v4 + v6 twins). The output is a plain-words verdict naming the exact failure class, backed by an evidence check board. The verdict decision tree is pure and unit-tested against every failure class UMBRA has ever shipped a fix for.
2. Deep endpoint test — the microscope
Type any endpoint and watch the exact WG handshake attempt: per-stage timings, the raw hex of the 148-byte initiation packet annotated field-by-field (type · sender index · ephemeral · encrypted static/timestamp · MAC1/MAC2), the reply's hex, and byte-level classification (handshake / cookie / silent / ICMP-rejected / unparseable). Shareable as a plain-text report.
3. Live debug console — the app-wide journal
One ordered stream every layer mirrors into (scan lines with auto-inferred severity, crashes, NETSENSE steps, update checks, diagnostics progress). Tag-filterable, color-coded, copy/share the whole journal.
۲۵۱/۲۵۱ تست سبز (۲۹ تست جدید) · همهی سوئیتهای live دوباره روی production کلادفلر تأیید شدند · تأیید DEX پاس شد
251/251 tests green (29 new) · all live suites re-verified against production Cloudflare · DEX verification passed
⚠ امنیت/Security: این توکن گیتهاب که در چت در دسترس بوده است: حتماً بچرخانید (Settings → Developer settings → Personal access tokens). / The GitHub token exposed in chat must be rotated (Settings → Developer settings → Personal access tokens).
دانلود APK از همین صفحه / grab the APK from this page's assets.
UMBRA v3.11.0 — Full Bug-Hunt Polish
v3.11.0 — Full Bug-Hunt Polish (تمام باگها)
A fresh-eyes audit of every source file (engine, net stack, controller, settings, all 5 screens, all 8 components, i18n, manifest) — 6 real defects found and fixed, regression-pinned by 7 new unit tests (221/221 green) plus the full live suite re-verified against production Cloudflare.
Fixed
- Masked zero-result diagnosis — on any device that had ever run NETSENSE, a zero-result scan's Done panel showed the net-profile log line instead of the engine's actual verdict (blocked registration, filtered network, probe tally…). The honesty feature was silently skipped. The error line is now captured before the profile line is appended.
2 Clean verdict lines — the gate-abort evidence line no longer starts with a dangling·and empty evidence is no longer logged as a blank line. - CUSTOM mode family filter was invisible — the family selector was hidden in CUSTOM mode while it silently filtered your pasted CIDR list; leaving IPv6 selected from a previous session + pasting v4 CIDRs = "no valid candidates" with no visible control to fix it. The selector now shows in every mode.
- Slider/display mismatch — persisted values outside a slider's own range (timeout up to 8000 ms vs the 6000 ms slider, samples up to 5000 vs 3000, endpoints 10..50) rendered a clamped thumb with the true value text. All slider inits are now clamped into their boxes.
- Smart-pick board shows usable endpoints — picks now display the full
[ip]:port(IPv6 bracketed) instead of a bare IP, which identified nothing usable in random-port mode. - Persian UI completeness — 7 hardcoded English toasts/chooser titles (export feedback, copy feedback, share dialogs, crash counter) are now properly translated.
Verified
- 221/221 unit tests (7 new regression tests)
- Live against production Cloudflare: WG handshakes + in-tunnel pings, identity registration (domain + pinned-IP), recovery sweep across the full 56-port grid, honest dead-path verdict
- DEX post-build verification (no JDK21-only refs, no removed-WARP refs, all feature strings present)
- Same signing key as every previous release
فارسی — نسخه ۳.۱۱.۰ (رفع کامل باگها)
بازبینی کامل تکتک فایلهای برنامه — ۶ ایرام واقعی پیدا و رفع شد:
- تشخیصِ «نتیجه صفر» در پنل پایان، وقتی نتسنج اجرا شده بود، جای خط واقعی موتور را میگرفت — حالا همیشه حکم واقعی نمایش داده میشود.
- خطوط شاهد در حکم توقف، دیگر با جداکننده آویزان یا خالی لاگ نمیشوند.
- فیلتر نسل IP در حالت سفارشی پنهان بود ولی لیست CIDR شما را بیصدا فیلتر میکرد — حالا انتخابگر در همه حالتها دیده میشود.
- مقادیر ذخیرهشده بیرون از بازه اسلایدرها، هماهنگ شدند (انگشت، عدد و اسکن شروعشده یکساناند).
- برد انتخابهای هوشمند، اندپوینت کامل
[ip]:portرا نشان میدهد — در حالت پورت تصادفی، IP تنها قابل استفاده نیست. - هفت توست و عنوان اشتراک انگلیسیِ ثابت، فارسی شدند.
۲۲۱ تست واحد سبز (۷ تست جدید) + کل مجموعه زنده دوباره روی سرور واقعی کلادفلر تأیید شد.
⚠️ Security: the GitHub token used in this project's chat history is exposed — rotate it in GitHub → Settings → Developer settings → Personal access tokens.
UMBRA v3.10.0 — The Recovery Ladder (0-ALIVE fix)
EN — The recovery ladder
"بازم مشکل داره" — the screen: SCAN COMPLETE · 0 ALIVE · 0/504 TESTED · 12S · endpoint scan aborted — 504 dead probes would only repeat this verdict · try: random ports · ipv6 · another network/isp · disconnect any active vpn.
v3.9 made the abort honest — but on a recoverable network an honest dead verdict is still a dead app. The gate had two blind spots, both fixed:
- The witness never probed a single IPv6 pair on a dual-stack scan. The pool tail it drew from was 100% IPv4 — so on the classic filtered-mobile pattern "v4 WARP DPI-killed · v6 passes", the gate aborted before the first v6 probe while 250 v6 pairs sat unprobed in the pool. The witness is now family-balanced (4 census seeds + 6 v4 + 6 v6).
- Silence aborted — recovery was manual. "Try: random ports" meant you, reconfiguring by hand. Now a full-port recovery sweep runs automatically after identity-round silence: every one of the 56 canonical WARP ports on the census + pool IPs, v4 grid first, then the IPv6 twins, single 1.5 s attempt, up to 128 elastic lanes. Any answering
ip:portis a proven path: the pool is re-aimed onto the winning ports (and family — a v4-only scan whose only live path is v6 flips to v6, logged), the winners lead the pool, and the storm rolls. A sweep that answers with the stored identity also proves that key is alive — a blocked registration API no longer reads as "identity expired".
Only a network where nothing anywhere answers still aborts — and that verdict now names the sweep coverage that proved it (56 ports × N ips on v4+v6), no longer advising what the app could have tried itself.
Live-verified from an open network: the sweep grid found 105 answering paths across 51 ports, best 5 ms — notably not 2408 (now dark from several PoPs; port diversity is real). On a port-filtered network, this same sweep is what turns the 0-alive abort into a working scan.
- 214/214 unit tests green (16 new: family-balanced witness, sweep grid, re-aim policy, port-choices generator, all four ladder flows)
- All live suites re-verified against production Cloudflare WARP, including the new live sweep test
- DeadIdentityLiveTest retargeted to the census-verified seed endpoints (its hardcoded :2408 list went dark from this PoP — the control failed on a healthy network)
Install over any v3.5.x–v3.9.0 — same signature.
FA — نردبان بازیابی
"بازم مشکل داره" — اسکرین: اسکن کامل · ۰ زنده · ۰/۵۰۴ تستشده · ۱۲ ثانیه · اسکن لغو شد — ۵۰۴ پروبِ مرده فقط همین حکم را تکرار میکرد · امتحان کن: پورتهای تصادفی · IPv6 · شبکه/اپراتور دیگر · قطع VPN فعال.
v3.9 لغو را صادقانه کرد — ولی روی شبکهای که راه عبور دارد، یک حکمِ مردهی صادقانه هم هنوز برنامهی مرده است. گیت دو نقطهی کور داشت، هر دو رفع شد:
- شاهد (witness) هرگز حتی یک جفت IPv6 را روی اسکن دوپشته نمیآزمود. دنبالهی استخری که از آن نمونه میگرفت ۱۰۰٪ IPv4 بود — روی الگوی کلاسیک موبایلِ فیلترشده ("IPv4 وارپ با DPI کشته شده · IPv6 پاس میدهد") گیت قبل از اولین پروبِ IPv6 لغو میکرد، در حالی که ۲۵۰ جفت IPv6 دستنخورده در همان استخر منتظر بودند. شاهد حالا متعادلشده است: ۴ بذر سرشماری + ۶ v4 + ۶ v6.
- سکوت یعنی لغو — بازیابی دستی بود. "پورت تصادفی را امتحان کن" یعنی خودت، دستی. حالا بعد از سکوتِ مرحلهی هویت، جاروی تمامپورت خودکار اجرا میشود: هر ۵۶ پورت کانونی WARP روی IPهای سرشماری + استخر، اول گرید IPv4 بعد دوقلوهای IPv6، هرکدام ۱ تلاش × ۱.۵ ثانیه، تا ۱۲۸ لِین کشسان. هر
ip:portپاسخدهنده یک مسیر اثباتشده است: استخر روی پورتهای برنده (و خانواده — اسکنِ فقط-v4 که تنها مسیر زندهاش v6 باشد به v6 میچرخد، با لاگ) بازنشانه میشود، برندهها صدر استخر را میگیرند تا نتایج معتبر در همان ثانیههای اول جاری شوند، و توفان اجرا میشود. جارویی که با هویتِ ذخیرهشده هم پاسخ بگیرد، آن کلید را زنده هم اثبات میکند — APIِ ثبتنام بسته دیگر یعنی «هویت منقضی» نمیخواند.
فقط شبکهای که هیچجا به هیچچیز پاسخ نمیدهد هنوز لغو میشود — و آن حکم حالا پوشش جارو را که آن را اثبات کرد نام میبرد، بهجای اینکه چیزهایی را توصیه کند که خود برنامه میتوانست امتحان کند.
تأیید زنده از یک شبکهی باز: گرید جارو ۱۰۵ مسیر پاسخدهنده روی ۵۱ پورت، بهترین ۵ms پیدا کرد — که بهطور قابلتوجه 2408 نبود (از چند PoP تاریک شده؛ تنوع پورت واقعی است). روی شبکهی پورتفیلتر، همین جاروست که لغوِ صفر-زنده را به اسکنِ کارا تبدیل میکند.
- ۲۱۴/۲۱۴ تست واحد سبز (۱۶ تست جدید)
- همهی سویتهای زنده مقابل Cloudflare WARP واقعی مجدداً تأیید شدند، شامل تست زندهی جدید جارو
روی هر نسخهی v3.5.x تا v3.9.0 نصب شود — امضای یکسان.