MHSanaei/3x-ui v3.9.0
一句话概括:本次发布把 TUIC v5 变成面板内置的 Go 原生服务,支持在节点上直接创建 AmneziaWG/TUIC/MTProto 入站,升级到 Xray-core v26.9.30,并大幅修复客户端流量重置、续费与配额在多节点间的同步问题(含多项必须手动处理的兼容性变更)。
新增能力
- 原生 TUIC v5 服务端:TUIC 现在直接在面板内以 Go 进程运行,无需下载外部二进制,支持 BBR/New Reno 拥塞控制、原生与 QUIC UDP 中继、完整 Xray 路由,并带崩溃安全的流量日志(durable traffic journal)。
- 节点上的协议入站:AmneziaWG、TUIC、MTProto 现在可以从主控直接创建并克隆到节点。
- Xray-core 升至 v26.9.30:存储的 XDNS mask 与 WireGuard outbound 配置会自动迁移为新核心的结构。
- 客户端生命周期一致性:reset、续费、配额削减现在会同步到所有节点上的所有计数器;保存入站或编辑客户端不再回滚期间发生的变更。
- Telegram Bot 访问分级:未关联账号被锁定,客户可通过邀请链接自助绑定,管理员可向所有客户端广播(
/broadcast 支持文本、媒体、整个相册,带进度与取消)。
- 每周日历续费:客户端可按固定星期几续费,个人与批量表单均提供后续续费日期预览。
- 订阅控制增强:可对单个入站设置 "exclude from subscription"(隐藏链接但继续服务与计量流量);客户端导出/导入现在携带流量计数且不虚增分组总量;可配置拉取外部订阅所用的 User-Agent。
- 客户端 App 管理:可视化路由配置编辑器(可选广告拦截、LAN 直连预设);为第二个客户端 App 新增订阅头,支持按 App 分流、分片、UDP noise、DoH 预解析、banner 等。
- 安全加固:API token 轮换(
-tokenScope <scope> 指定作用域)、数据库恢复、证书抓取、Bot 命令面均收紧;CLI 重新生成具名 API token 不再把受限/带过期时间的 token 静默变成永久全权限 token。
- 其他:赞助位(概览、侧边栏、登录页 + Sponsors 页面,可设置开始日期、可隐藏 24 小时);Finalmask noise 支持新的 tag-expression 类型;TUN 暴露 gateway-DNS 与 leak-block 选项。
性能与改进
- TUIC 吞吐:在 loopback + BBR 下经 Xray 的吞吐从约 2.4 Gbit/s 提升到 3.4 Gbit/s。
- 前端基线升级到 Node 26 / npm 11(Go、前端与文档依赖均已刷新)。
- 客户端 App 设置页从 7 个 tab 合并为 4 个。
- 测试套件运行速度提升数倍,并在 PostgreSQL 上隔离每个 package。
- README 截图更新为当前 UI。
修复重点
- 客户端与流量:入站保存不再回滚续费/到期/配额/期间新增客户端/启用开关/期间计费流量;删除客户端后保存入站不会"复活"已吊销凭证;客户端流量重置会到达所有承载节点及 MTProto 配额;配额或时间耗尽的客户端会从它所属的每个入站移除(而非只移除最后一个);在节点上重置某入站流量不再打到无关入站;WireGuard
allowedIPs 写成 10.10.2.9/24 不再抢占其他客户端流量;客户端搜索/分组过滤支持非 ASCII 大写字母;设备数限制、IP 限制(fail2ban、PostgreSQL 并发)、v2.x 面板导出的入站导入等问题修复。
- 订阅与链接:带 Host SNI 的 REALITY 入站的 JSON 订阅不再生成客户端核心拒绝启动的配置;WireGuard/AmneziaWG/TUIC 配置在所有出口都播报入站的 Hosts 而非面板地址;同一客户端在多个 WG/AmneziaWG 入站下会获得各自的密钥与地址;VLESS REALITY 分享链接携带 ML-KEM 密钥交换提示;Clash 订阅包含 Hysteria2 证书 pin、保留外部 VLESS 链接加密;手机下载不再把
peer.conf 存成 peer.conf.txt。
- 协议与核心:Hysteria 客户端变更改为热应用(不再重启入站卡住所有连接);IPv4 入站可与 IPv6-only 通配入站共用端口;AmneziaWG 不再把连接重定向到嗅探域名、IPv6 出口不影响 IPv4、padding/header 校验与实际引擎一致、无 IPv6 的隧道停止解析 AAAA、在 Windows 构建上可用;
config.json 在热应用后写入,备份不再包含过期规则。
- Bot 与面板:Bot 在 Xray 之后启动时可正确接管 Panel Outbound;订阅域名无法从服务器解析时单个链接与二维码仍可用;新增客户端向导支持 WireGuard/AmneziaWG;同群两个管理员不再共享一个向导;更新后浏览器存在旧 chunk 时导航可恢复;Syslog 视图在慢 journal 下不再卡死;EL7 上 fail2ban 引入的 firewalld 不再封堵面板端口;Docker 镜像恢复可构建。
⚠️ 升级前必读(Breaking Change / 需手动操作)
/panel/api/inbounds/update 与入站 JSON 编辑器不再修改入站持有的客户端列表、其 enable/expiry/quota/renewal 字段,以及入站自身的启用标志。脚本需改用客户端 endpoints,开关入站用 /panel/api/inbounds/setEnable/:id。
- Telegram Bot 对未关联客户端、也非管理员的账号只响应
/start 和 /id。需为曾使用 /usage、/status 的客户在客户端上设置其 Telegram ID,或从客户端卡片发送新的邀请链接。
- XDNS finalmask 在 Xray-core v26.9.30 中改变了线格式,使用该 mask 的客户端必须升级到 v26.9.30 或更新版本,否则无法连接。
- 每周续费模式会被旧二进制忽略,旧面板的"耗尽客户端清理"可能删除仅按周续费的客户端:启用周模式前升级所有节点;降级前把周模式客户端转换为其他模式。
- 向节点部署 AmneziaWG/TUIC/MTProto 时,若节点版本低于引入该协议的版本会被拒绝(MTProto v3.5.0、AmneziaWG v3.7.0、TUIC v3.8.0),需先升级节点。
- WireGuard/AmneziaWG 中与其他客户端范围重叠的
allowedIPs 现在会被拒绝;已有重叠客户端仍可用但无法保存,编辑时需收窄范围(例如 10.10.2.9/24 → 10.10.2.9/32)。
- 自建 Docker 镜像:前端 stage 改用 Node 26,需从更新后的
Dockerfile 重新构建,旧副本会在 npm ci 处失败。
自动迁移与运行要求
- 启动时一次性迁移会重写存储的 XDNS finalmask(入站、hosts、Xray 模板、JSON 订阅 mask、缓存的 outbound 订阅)、把 WireGuard outbound 的
domainStrategy 移到 sockopt.domainStrategy / targetStrategy(remoteDNS: "local" 变为 targetStrategy),并新增 excludeFromSub、周续费列以及 node_pending_resets、tuic_traffic_receipts 表;迁移失败会导致面板无法启动。
- 安装/更新脚本会移除旧的
tuic-server 二进制、其 bin/tuic 配置及残留进程,TUIC 入站由内置服务接管。
x-ui setting -getApiToken -tokenName <name> 保留重新生成 token 的作用域与过期时间,已过期的 token 会被拒绝而非轮换。
- 面板最多每小时从
sponsors.sanaei.dev 拉取一次赞助列表并代理 logo,管理端浏览器不会直连第三方。
- 运行要求:Go 1.27.1 · Xray-core v26.9.30 · Node 26(仅从源码构建前端时需要)。
▸ Release Notes 英文原文(20034 字符)
## 🚀 Native TUIC, Tunnels on Nodes, Xray-core v26.9.30 & Reliable Client Resets
- 🚀 **Native TUIC v5 server** — TUIC now runs inside the panel in Go, with no external binary to download, BBR congestion control and crash-safe traffic accounting.
- 🌐 **AmneziaWG, TUIC & MTProto on nodes** — these inbounds can now be created and cloned from the master straight onto a node.
- ⚙️ **Xray-core v26.9.30** — stored XDNS masks and WireGuard outbound settings are migrated to the new core's shape automatically.
- 🔁 **Client lifecycle you can trust** — resets, renewals and quota cuts now reach every counter on every node, and saving an inbound or editing a client no longer reverts changes made in the meantime.
- 🤖 **Telegram bot access levels** — unknown accounts are locked out, customers link themselves with an invite link, and admins can broadcast to every client.
- 🗓️ **Weekly calendar renewal** — clients can renew on a fixed weekday, with a preview of the upcoming schedule.
- 📦 **Subscription controls** — hide an inbound from subscriptions without disabling it, carry traffic through export/import, and set the User-Agent used for external subscriptions.
- 🔐 **Security hardening** — API token rotation, database restore, certificate fetching and the bot's command surface are all tightened.
---
## ⚠️ Before you upgrade
### Action required
- `/panel/api/inbounds/update` and the inbound JSON editor no longer change which clients an inbound holds, their enable/expiry/quota/renewal fields, or the inbound's own enable flag — **do this:** move any script that edits clients through an inbound update to the client endpoints, and use `/panel/api/inbounds/setEnable/:id` to switch an inbound on or off.
- The Telegram bot now answers only `/start` and `/id` for accounts that are not linked to a client or listed as an admin — **do this:** link customers who used `/usage` or `/status` by setting their Telegram ID on the client, or send them the new invite link from the client card.
- XDNS finalmask changed its wire format in Xray-core v26.9.30 — **do this:** update clients that use an XDNS mask to a core of v26.9.30 or newer, or they will not connect.
- Weekly renewal is ignored by older binaries, and an older panel's depleted-client cleanup can delete a weekly-only client — **do this:** upgrade every node before enabling weekly mode, and convert weekly clients to another mode before any downgrade.
- Deploying an AmneziaWG, TUIC or MTProto inbound to a node is refused when the node is older than the release that introduced the protocol (MTProto v3.5.0, AmneziaWG v3.7.0, TUIC v3.8.0) — **do this:** upgrade the node first.
- WireGuard and AmneziaWG `allowedIPs` that overlap another client's range are now rejected; existing overlapping clients keep working but cannot be saved until fixed — **do this:** narrow such ranges (for example `10.10.2.9/24` → `10.10.2.9/32`) when editing them.
- Self-built Docker images: the frontend stage now uses Node 26 — **do this:** rebuild from the updated `Dockerfile`; an older copy fails at `npm ci`.
### Automatic — no action needed
- One-time startup migrations rewrite stored XDNS finalmasks (inbounds, hosts, Xray template, JSON-subscription mask, cached outbound subscriptions) into the new object shape, and move a WireGuard outbound's `domainStrategy` to `sockopt.domainStrategy` / `targetStrategy` (`remoteDNS: "local"` becomes `targetStrategy`). They also add the `excludeFromSub` and weekly-renewal columns and the `node_pending_resets` and `tuic_traffic_receipts` tables. A migration failure stops the panel from starting.
- The install and update scripts remove the old `tuic-server` binary, its `bin/tuic` configs and any leftover processes; TUIC inbounds come back up on the built-in server.
- `x-ui setting -getApiToken -tokenName <name>` now keeps the regenerated token's scope and expiry instead of turning it into a non-expiring admin token; an already expired token is refused rather than rotated.
- The panel fetches the sponsor list from `sponsors.sanaei.dev` at most once an hour and proxies sponsor logos itself, so admin browsers never contact a third party.
### Requirements
Go 1.27.1 · Xray-core v26.9.30 · Node 26 (only for building the frontend from source)
---
### 🔐 Security
- Regenerating a named API token from the CLI no longer silently turns a scoped or expiring token into a permanent full-admin one ([#6700](https://github.com/MHSanaei/3x-ui/pull/6700)) @rokokol
- Fetching a remote certificate for pinning now refuses private and loopback addresses unless the admin confirms, matching the REALITY target scan ([`ede275e4`](https://github.com/MHSanaei/3x-ui/commit/ede275e4))
- Restoring a SQL dump can no longer open or create any database file other than the panel's own ([`d31465e3`](https://github.com/MHSanaei/3x-ui/commit/d31465e3))
- The Telegram bot no longer lets unlinked accounts run client commands or press client buttons; invite-link claims are rate-limited and cannot be used to probe for valid subscription IDs ([#6518](https://github.com/MHSanaei/3x-ui/pull/6518)) @pcxzs
- Saving an inbound no longer restores a client that was deleted while the edit dialog was open, which brought revoked credentials back to life ([`823db059`](https://github.com/MHSanaei/3x-ui/commit/823db059))
- Subscriptions can tell supported client apps to require authentication on their local SOCKS/HTTP proxy, so other apps on the device can no longer use it to bypass per-app routing or learn the server address ([#6628](https://github.com/MHSanaei/3x-ui/pull/6628)) @rudenko-ks
### 🆕 New
- TUIC v5 is now served by a native in-process Go server with BBR/New Reno congestion control, native and QUIC UDP relay, full Xray routing and a durable traffic journal — no external binary ([#6577](https://github.com/MHSanaei/3x-ui/pull/6577)) @poise52
- AmneziaWG, TUIC and MTProto inbounds can be created and cloned onto nodes from the master ([`ed31ee43`](https://github.com/MHSanaei/3x-ui/commit/ed31ee43))
- Calendar weekly renewal, plus a preview of upcoming renewal dates in the individual and bulk client forms ([#6524](https://github.com/MHSanaei/3x-ui/pull/6524)) @JacktheRanger
- Telegram bot invite links: the client card offers a link that binds the first account to open it ([#6518](https://github.com/MHSanaei/3x-ui/pull/6518)) @pcxzs
- Telegram bot `/broadcast` sends any admin message — text, media or a whole album — to every linked client, with progress and cancel ([#6510](https://github.com/MHSanaei/3x-ui/pull/6510)) @DIMFLIX
- Per-inbound "exclude from subscription" hides an inbound's links while it keeps serving and counting traffic ([#6463](https://github.com/MHSanaei/3x-ui/pull/6463)) @mrchatam
- Portable client export/import now carries traffic counters, without inflating group totals ([#6469](https://github.com/MHSanaei/3x-ui/pull/6469)) @mrchatam
- Visual routing-profile editor for client apps, with optional ad blocking and a LAN-bypass preset ([#6545](https://github.com/MHSanaei/3x-ui/pull/6545)) @NgaiYeanCoi
- App-management subscription headers for a second client app: per-app split tunnelling, fragmentation, UDP noise, DoH pre-resolution, banners and more ([#6650](https://github.com/MHSanaei/3x-ui/pull/6650)) @DIMFLIX
- Configurable User-Agent for fetching external subscriptions ([#6613](https://github.com/MHSanaei/3x-ui/pull/6613)) @mrchatam
- `x-ui setting -getApiToken -tokenScope <scope>` chooses the scope of the issued token ([#6700](https://github.com/MHSanaei/3x-ui/pull/6700)) @rokokol
- Finalmask noise items accept the new tag-expression type, and TUN exposes the new gateway-DNS and leak-block options ([`62423cac`](https://github.com/MHSanaei/3x-ui/commit/62423cac))
- Sponsor slots on the overview, sidebar and login page plus a Sponsors page, with scheduled start dates; each slot can be hidden for 24 hours ([`fd7b3559`](https://github.com/MHSanaei/3x-ui/commit/fd7b3559), [`09617f04`](https://github.com/MHSanaei/3x-ui/commit/09617f04), [`dcaadd48`](https://github.com/MHSanaei/3x-ui/commit/dcaadd48))
### ⚡ Improved
- Xray-core updated to v26.9.30 ([`62423cac`](https://github.com/MHSanaei/3x-ui/commit/62423cac))
- Go, frontend and docs dependencies refreshed; the frontend baseline is now Node 26 / npm 11 ([`86302d2f`](https://github.com/MHSanaei/3x-ui/commit/86302d2f), [`99bc68fa`](https://github.com/MHSanaei/3x-ui/commit/99bc68fa))
- TUIC throughput through Xray rises from about 2.4 to 3.4 Gbit/s on loopback with BBR ([#6577](https://github.com/MHSanaei/3x-ui/pull/6577)) @poise52
- The client-app settings page is folded from seven tabs into four ([`8f47b538`](https://github.com/MHSanaei/3x-ui/commit/8f47b538))
- The test suite runs several times faster and isolates each package on PostgreSQL ([`12d51d71`](https://github.com/MHSanaei/3x-ui/commit/12d51d71), [#6594](https://github.com/MHSanaei/3x-ui/pull/6594)) @n0ctal
- README screenshots refreshed for the current UI ([`17d7dd46`](https://github.com/MHSanaei/3x-ui/commit/17d7dd46))
### 🐞 Fixed
**Clients & traffic**
- Saving an inbound no longer reverts client renewals, expiry, quotas, clients added meanwhile, the inbound's enable switch or traffic counted while the dialog was open ([`1110caaa`](https://github.com/MHSanaei/3x-ui/commit/1110caaa), [`823db059`](https://github.com/MHSanaei/3x-ui/commit/823db059))
- Adding, editing or deleting a client no longer undoes a renewal of another client that committed at the same moment ([`63ffc083`](https://github.com/MHSanaei/3x-ui/commit/63ffc083))
- A client traffic reset now reaches every node hosting the client and the MTProto quota, so a reset client is no longer switched off again on the next tick ([`4210a50c`](https://github.com/MHSanaei/3x-ui/commit/4210a50c))
- A client that ran out of quota or time is now dropped from every inbound it belongs to, not only the last one it was attached to ([`7c84ca96`](https://github.com/MHSanaei/3x-ui/commit/7c84ca96))
- Resetting an inbound's traffic on a node now hits that inbound instead of an unrelated one ([#6717](https://github.com/MHSanaei/3x-ui/pull/6717)) @ChesterFishmansWork
**Subscriptions**
- JSON subscriptions for REALITY inbounds with a Host SNI no longer ship a config the client core refuses to start ([#6691](https://github.com/MHSanaei/3x-ui/pull/6691)) @FZ1010
- WireGuard, AmneziaWG and TUIC configs now advertise the inbound's Hosts on every surface, not the panel address ([`aee45ca3`](https://github.com/MHSanaei/3x-ui/commit/aee45ca3))
- A client on several WireGuard/AmneziaWG inbounds now gets each inbound's own keys and address in its subscription ([#6653](https://github.com/MHSanaei/3x-ui/pull/6653)) @mvanhorn
**Protocols**
- Hysteria client changes are applied live instead of restarting the inbound and stalling every connected client ([#6606](https://github.com/MHSanaei/3x-ui/pull/6606)) @iblchv
- A WireGuard `allowedIPs` written as `10.10.2.9/24` can no longer claim other clients' traffic ([`c8a182b6`](https://github.com/MHSanaei/3x-ui/commit/c8a182b6))
<details><summary>All 45 fixes in this release</summary>
**Clients & traffic**
- Saving an inbound no longer reverts client renewals, expiry, quotas, clients added meanwhile, the inbound's enable switch or traffic counted while the dialog was open ([`1110caaa`](https://github.com/MHSanaei/3x-ui/commit/1110caaa), [`823db059`](https://github.com/MHSanaei/3x-ui/commit/823db059))
- Adding, editing or deleting a client no longer undoes a renewal of another client that committed at the same moment ([`63ffc083`](https://github.com/MHSanaei/3x-ui/commit/63ffc083))
- A traffic reset no longer leaves a quota-disabled client looking enabled while it is dropped from the core ([`feb8451b`](https://github.com/MHSanaei/3x-ui/commit/feb8451b))
- A client traffic reset now reaches every node hosting the client and the MTProto quota, so a reset client is no longer switched off again on the next tick ([`4210a50c`](https://github.com/MHSanaei/3x-ui/commit/4210a50c))
- Resetting inbound traffic no longer hands every MTProto client a fresh quota, and a per-inbound client reset no longer touches other inbounds ([`fb7418f7`](https://github.com/MHSanaei/3x-ui/commit/fb7418f7))
- A client that ran out of quota or time is now dropped from every inbound it belongs to, not only the last one it was attached to ([`7c84ca96`](https://github.com/MHSanaei/3x-ui/commit/7c84ca96))
- Resetting an inbound's traffic on a node now hits that inbound instead of an unrelated one ([#6717](https://github.com/MHSanaei/3x-ui/pull/6717)) @ChesterFishmansWork
- Inbounds exported from v2.x panels import again ([`15d82a5e`](https://github.com/MHSanaei/3x-ui/commit/15d82a5e))
- A WireGuard `allowedIPs` written as `10.10.2.9/24` can no longer claim other clients' traffic ([`c8a182b6`](https://github.com/MHSanaei/3x-ui/commit/c8a182b6))
- Client search and group filter match names with non-ASCII capitals ([#6685](https://github.com/MHSanaei/3x-ui/pull/6685)) @freeb5d
- Changing a client's device limit can no longer be overwritten by a concurrent traffic cycle ([#6591](https://github.com/MHSanaei/3x-ui/pull/6591)) @n0ctal
- IP-limit bans reach fail2ban only after the scan is saved, so a failed save can no longer ban addresses the panel never recorded ([#6590](https://github.com/MHSanaei/3x-ui/pull/6590)) @n0ctal
- On PostgreSQL, concurrent IP-limit updates no longer drop node-reported IPs ([#6612](https://github.com/MHSanaei/3x-ui/pull/6612)) @mrchatam
**Subscriptions & links**
- JSON subscriptions for REALITY inbounds with a Host SNI no longer ship a config the client core refuses to start ([#6691](https://github.com/MHSanaei/3x-ui/pull/6691)) @FZ1010
- Spider settings in a REALITY spiderX query are kept in share links and JSON subscriptions ([#6694](https://github.com/MHSanaei/3x-ui/pull/6694)) @FZ1010
- VLESS REALITY share links carry the ML-KEM key-exchange hint ([#6712](https://github.com/MHSanaei/3x-ui/pull/6712)) @libmur-dev
- Fragment settings export in a form older client cores understand, and inbounds with UDP-only masks no longer break the QR, info and export views ([#6702](https://github.com/MHSanaei/3x-ui/pull/6702)) @artemk1337
- WireGuard, AmneziaWG and TUIC configs now advertise the inbound's Hosts on every surface, not the panel address ([`aee45ca3`](https://github.com/MHSanaei/3x-ui/commit/aee45ca3))
- A client on several WireGuard/AmneziaWG inbounds now gets each inbound's own keys and address in its subscription ([#6653](https://github.com/MHSanaei/3x-ui/pull/6653)) @mvanhorn
- Clash subscriptions include the Hysteria2 certificate pin, so self-signed certificates are accepted ([#6651](https://github.com/MHSanaei/3x-ui/pull/6651)) @libmur-dev
- Clash subscriptions keep the encryption of external VLESS links ([#6576](https://github.com/MHSanaei/3x-ui/pull/6576)) @SakikoTogawa0214
- The server description in external link remarks is no longer mangled ([#6580](https://github.com/MHSanaei/3x-ui/pull/6580)) @sdhfsl
- Outbound subscription fetches send the same device ID as external links, so device-limited providers count the panel once ([#6579](https://github.com/MHSanaei/3x-ui/pull/6579)) @sdhfsl
- Behind a proxy that sends only `X-Real-IP`, links no longer advertise the subscriber's own IP as the server ([#6608](https://github.com/MHSanaei/3x-ui/pull/6608)) @mrchatam
- The JSON-subscription template no longer triggers a deprecation warning for its direct outbound ([#6609](https://github.com/MHSanaei/3x-ui/pull/6609)) @mrchatam
- Downloads on phones keep their file name, so `peer.conf` is no longer saved as `peer.conf.txt` ([`99047c0a`](https://github.com/MHSanaei/3x-ui/commit/99047c0a))
**Protocols & core**
- Hysteria client changes are applied live instead of restarting the inbound and stalling every connected client ([#6606](https://github.com/MHSanaei/3x-ui/pull/6606)) @iblchv
- An IPv4 inbound can share a port with an IPv6-only wildcard inbound ([#6603](https://github.com/MHSanaei/3x-ui/pull/6603)) @lin-finegold
- `config.json` is written after a hot apply, so config backups no longer upload stale rules ([#6686](https://github.com/MHSanaei/3x-ui/pull/6686)) @freeb5d
- AmneziaWG no longer redirects connections to a sniffed domain, and its IPv6 egress no longer breaks IPv4 traffic ([#6654](https://github.com/MHSanaei/3x-ui/pull/6654)) @rudenko-ks
- AmneziaWG padding and header ranges are validated the way the engine enforces them, accepting real configs that were refused and rejecting ones that would fail to start ([#6642](https://github.com/MHSanaei/3x-ui/pull/6642)) @rudenko-ks
- AmneziaWG tunnels without IPv6 stop resolving AAAA records, and the outbound form exposes I2–I5 ([#6611](https://github.com/MHSanaei/3x-ui/pull/6611)) @mrchatam
- AmneziaWG inbounds and outbounds work on Windows builds ([`044e2926`](https://github.com/MHSanaei/3x-ui/commit/044e2926), [`75f3702d`](https://github.com/MHSanaei/3x-ui/commit/75f3702d))
- The node-token key file loads on Windows ([`3fc3992a`](https://github.com/MHSanaei/3x-ui/commit/3fc3992a))
**Bots**
- The Telegram bot picks up Panel Outbound when Xray starts after it, instead of staying unreachable on filtered hosts ([`bb18734c`](https://github.com/MHSanaei/3x-ui/commit/bb18734c))
- The bot's individual-links and QR actions work when the subscription host does not resolve from the server ([`4df570b3`](https://github.com/MHSanaei/3x-ui/commit/4df570b3))
- The bot's add-client wizard offers WireGuard and AmneziaWG inbounds and no longer shows an empty picker ([#6621](https://github.com/MHSanaei/3x-ui/pull/6621)) @romus204
- Two admins in one group chat no longer share one add-client wizard ([#6604](https://github.com/MHSanaei/3x-ui/pull/6604)) @sdhfsl
**Panel & system**
- Panel navigation recovers after an update leaves the browser with stale page chunks ([#6679](https://github.com/MHSanaei/3x-ui/pull/6679)) @mvanhorn
- The Syslog view no longer hangs on a slow journal ([#6689](https://github.com/MHSanaei/3x-ui/pull/6689)) @freeb5d
- On EL7, firewalld pulled in by fail2ban no longer blocks the panel's ports ([#6688](https://github.com/MHSanaei/3x-ui/pull/6688)) @freeb5d
- The `x-ui` menu opens instantly on hosts with large journals ([`092cbd55`](https://github.com/MHSanaei/3x-ui/commit/092cbd55))
- A legacy inbound-tag cleanup no longer fails every startup migration when its target tag already exists ([#6592](https://github.com/MHSanaei/3x-ui/pull/6592)) @n0ctal
- The Docker image builds again ([`9b957b96`](https://github.com/MHSanaei/3x-ui/commit/9b957b96))
- The REALITY "Min Client Ver" hint states which cores accept every client when the field is empty ([`3308c816`](https://github.com/MHSanaei/3x-ui/commit/3308c816))
</details>
---
### Reports

### New Contributors
* @pcxzs made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6518
* @SakikoTogawa0214 made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6576
* @lin-finegold made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6603
* @iblchv made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6606
* @romus204 made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6621
* @rudenko-ks made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6628
* @libmur-dev made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6651
* @freeb5d made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6685
* @artemk1337 made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6702
* @ChesterFishmansWork made their first contribution in https://github.com/MHSanaei/3x-ui/pull/6717
**Full Changelog**: https://github.com/MHSanaei/3x-ui/compare/v3.8.10...v3.9.0