diff --git a/Cargo.lock b/Cargo.lock
index 74a16ff..6b6e1f2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2624,7 +2624,7 @@ dependencies = [
[[package]]
name = "mhrv-rs"
-version = "1.9.25"
+version = "1.9.26"
dependencies = [
"base64 0.22.1",
"bytes",
diff --git a/Cargo.toml b/Cargo.toml
index 12b0aaa..1f31447 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "mhrv-rs"
-version = "1.9.25"
+version = "1.9.26"
edition = "2021"
description = "Rust port of MasterHttpRelayVPN -- DPI bypass via Google Apps Script relay with domain fronting"
license = "MIT"
diff --git a/docs/changelog/v1.9.26.md b/docs/changelog/v1.9.26.md
new file mode 100644
index 0000000..ea127c9
--- /dev/null
+++ b/docs/changelog/v1.9.26.md
@@ -0,0 +1,12 @@
+
+
+
+• **بهینهسازی Full mode Apps Script: batch کردن Edge-DNS cache lookupها** ([PR #958](https://github.com/therealaleph/MasterHttpRelayVPN-RUST/pull/958) by @dazzling-no-more). مسیر `CodeFull.gs` قبلاً برای هر DNS query داخل batch یک `CacheService.get` جداگانه میزد. روی batchهای شلوغ، همین چند round-trip داخلی به CacheService میتونست latency بسازه، مخصوصاً وقتی چند lookup مشابه پشت سر هم میاومدن. حالا DNS candidateها در دو pass پردازش میشن: اول همه keyها جمع میشن، بعد یک `cache.getAll(keys)` برای کل batch انجام میشه، و جوابهای DoH موفق هم داخل همان batch دوباره استفاده میشن تا query تکراری دوباره به resolver نخوره.
+
+• **مسیر امن fallback حفظ شده**. اگر CacheService خطا بده، DoH هنوز از داخل شبکه Google انجام میشه ولی `cache.put` غیرفعال میمونه؛ اگر parse/DoH شکست بخوره، همان op مثل قبل به tunnel-node forward میشه. qnameهای خیلی بلند هم بهجای skip شدن، با SHA-256 زیر namespace جداگانه cache میشن تا محدودیت ۲۵۰ کاراکتری key در CacheService شکسته نشه. هیچ config migration یا تغییر سمت client لازم نیست؛ فقط `CodeFull.gs` جدید را deploy کنید.
+
+
+---
+• **Optimize Full mode Apps Script by batching Edge-DNS cache lookups** ([PR #958](https://github.com/therealaleph/MasterHttpRelayVPN-RUST/pull/958) by @dazzling-no-more). `CodeFull.gs` previously issued one `CacheService.get` per DNS query inside a tunnel batch. On busy batches, those repeated internal CacheService round-trips could add avoidable latency, especially when several lookups repeated the same qname/qtype. DNS candidates now run in two passes: collect all cache keys first, perform one `cache.getAll(keys)` for the whole batch, then reuse successful DoH answers inside the same batch so duplicate queries do not hit the resolver again.
+
+• **The safe fallback behavior is preserved**. If CacheService fails, DoH still runs from inside Google's network but `cache.put` is skipped; if parse/DoH fails, the op falls back to the existing tunnel-node forward path. Very long qnames now use a SHA-256 cache key under a separate namespace instead of skipping cache entirely, keeping keys below CacheService's 250-character limit. No client config migration is required; deploy the new `CodeFull.gs`.