Skip to content

Releases: MHSanaei/3x-ui

Dev build 8cec47a8

Dev build 8cec47a8 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Jun 16:17
8cec47a

Rolling development build — installs via the panel's Dev update channel.

commit=8cec47a8a5593c586537e9f7005871e9b43a896f
built=2026-08-17T00:45:59Z

Automated per-commit build from main. Not a stable release.

v3.6.0

Choose a tag to compare

@MHSanaei MHSanaei released this 30 Jul 01:16

🚀 Trend-First Overview, xray-core v26.7.28, Subscription Correctness & Panel Hardening

  • 🧭 Overview rebuilt as a command deck — the ten small cards are gone: four vitals tiles with 72-sample sparklines, a two-series throughput chart, a TCP/UDP connections chart, a grouped system strip, and a sidebar that became an auto-collapsed icon rail expanding on hover.
  • 🛡 xray-core v26.7.28 — the XMC finalmask breaking change is absorbed end to end: incomplete masks are rejected at save time with the missing field named, and only the offending mask is dropped at config-generation time so one bad row can no longer take every inbound offline.
  • 🔗 Subscription output correctness — a long run of link and format fixes (forwarded-URL trust, coalesced external refreshes, Clash scalars a YAML parser would misread, VLESS flow gating, external link names, WireGuard Allowed IPs) plus opt-in identity tokens on every link, raw download actions, live online status with a new ?format=info endpoint, and User-Agent format auto-detection.
  • 🔐 Panel surface tightenedopenapi.json moved behind session auth (it was serving the whole admin API surface unauthenticated), node API tokens became write-only, production sourcemaps no longer ship inside the binary, and the default freedom rules block private-range egress.
  • 🧹 Two large verified audit sweeps — 54 fixes from a repo-wide self-correcting audit and 16 more from a bug-label issue sweep, spanning email, node sync, subscriptions, xray config and the database.
  • 🗃 Data integrity — SQLite backup snapshots are taken online, legacy string tgId values in inbound settings are repaired on upgrade, and client_traffics rows are no longer deleted for detached-but-alive clients or left stale when an email is reused.
  • 🎛 Settings UX — settings sitting at their shipped default are tagged as such, clearing a port field keeps the stored port instead of writing zero, date-pickers commit on selection rather than on confirm, and the REALITY client version range is validated at save time.
  • 🧰 Frontend platform — the component Storybook became a validated, fully covered workbench and is published on the docs site, every axe accessibility violation in the library is resolved, react-router 8 and Node 24 LTS landed, and 210 dead translation keys were deleted with a test that fails the build on new ones.

ℹ️ Heads-up: The bundled core moved to xray-core v26.7.28, where the XMC finalmask usernames list was replaced by a required profiles array (username + UUID + both Mojang texture fields, no "default to Dream" fallback) — a mask saved by an older panel is now rejected at save time, and stripped from the generated config with a warning rather than failing the whole core, so anyone using that obfuscation must refill their profiles. A database migration repairs legacy string tgId values in inbound settings that previously broke every client operation on the affected inbound. Two surfaces changed behavior for existing setups: GET /panel/api/openapi.json now requires an authenticated session (it was reachable without one), and node API tokens are write-only — the API no longer returns them, so tooling that read a token back must store it at creation time. The default freedom finalRules also gain a geoip:private block rule, applied in place to installs still carrying the stock rules.

🆕 New

⚡️ Update & improvement

🐞 Bug fixed

Read more

v3.5.0

Choose a tag to compare

@MHSanaei MHSanaei released this 12 Jul 20:09
4e928a1

🚀 MTProto Multi-Client, SQLite→PostgreSQL Migration, 500k-Scale Performance & Node Sync Hardening

  • 📬 MTProto goes multi-client — MTProto inbounds now run on the mtg-multi engine with one FakeTLS secret per client, per-client ad-tags, and per-client quota & expiry enforced in the sidecar; client edits hot-apply through a management API so live connections survive.
  • 🐘 SQLite → PostgreSQL, end to end — the PostgreSQL panel restore now accepts SQLite .db files and migration dumps directly (uploads are sniffed automatically), cross-db migration became lossless, transactional and pre-checked, and a new x-ui pgclient command installs or upgrades the PostgreSQL client tools.
  • 🚄 Built for 500k clients — batched ip-limit lookups, depleted-client disables by id, delta WebSocket stats above a snapshot threshold, and subscriptions resolved from normalized tables — pinned by a scale test suite at 500,000 clients.
  • 🧠 Frontend platform overhaul — full React Hook Form migration, axios replaced with the native Fetch API, charts moved to uPlot, and Husky / lint-staged / MSW / Storybook dev tooling.
  • 🛰️ Node sync hardening — host overrides adopted into the master, no more premature inbound sweeps or Postgres deadlocks in sync, client edits no longer tear down node inbounds, and node auto-renewals open a fresh quota window.
  • 🌍 Outbound insight — egress metadata (IP + country) per outbound, a real-delay connection test measured on a warm connection, and a targetStrategy field in the outbound editor.
  • ⚖️ Routing & balancers — balancer-to-balancer fallback, a default outbound in basic routing, encrypted DNS presets, and private-IP dns.servers allowed past the geoip:private block rule.
  • 🔎 Panel QoL — text search on the inbound list and node selects, column sorting, per-client realtime speed, bulk-adding hosts to multiple inbounds, and WireGuard export split into config and links tabs.

ℹ️ Heads-up: MTProto inbounds are now natively multi-client — legacy single-secret inbounds migrate automatically to the clients model, and tg:// deep links no longer carry the remark fragment. The bundled core was bumped to xray-core v26.7.11, and the Final Mask + REALITY combination is now rejected (it crashes Xray-core). A database migration also repairs overflowed traffic counters and drops the legacy UNIQUE constraint on inbound ports.

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Read more

v3.4.2

Choose a tag to compare

@MHSanaei MHSanaei released this 29 Jun 18:30
f3a57d4

🚀 WireGuard Multi-Client, Panel Accessibility, Balancer Observatory & Hardened Settings

  • 🔐 WireGuard goes multi-client — WireGuard inbounds are now first-class multi-client (native users), with a reworked client-config UX, a collapsible config card, configurable DNS, and client IPs allocated inside the existing peer subnet.
  • Panel accessibility — screen-reader and keyboard accessibility were brought across the whole panel.
  • ⚖️ Balancer Observatory — a tabbed Observatory / Burst Observatory form, validation that defers errors until a field is touched or saved, and a burst observer for random/roundRobin strategies with a fallbackTag.
  • 🛡️ Hardened settings & restore — sensitive setting changes now require re-confirming 2FA, and the database-restore body-cap exemption was tightened.
  • 🛰️ REALITY target scanner — a live REALITY target scanner with IP/CIDR discovery.
  • 🧪 Dev channel from stable — opt into the rolling dev channel directly from a stable build.
  • 🔗 Subscription & inbound polish — Host VLESS Route baked into subscription UUIDs, {{EMAIL}} shown on the first sub-body link only, a remark template applied to Export all inbound links, and legacy externalProxy converted to hosts on import.
  • 🧰 Dev toolchain & deps — a canonical Makefile, golangci-lint v2, plus Ant Design 6.5 and xray-core v26.6.27.

ℹ️ Heads-up: WireGuard inbounds are now natively multi-client — existing single-peer inbounds migrate automatically to the clients model. The minimum eligible Xray version was raised (bundled core bumped to xray-core v26.6.27); update any custom cores accordingly. With 2FA enabled, sensitive setting changes now prompt for a fresh 2FA confirmation before they apply.

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Reports

Total Download

New Contributors

Full Changelog: v3.4.1...v3.4.2

v3.4.1

Choose a tag to compare

@MHSanaei MHSanaei released this 25 Jun 22:54
b1fb39c

🚀 Rolling Dev Channel, Logs Viewer Overhaul, Leaner Memory & Client Bulk Ops

  • 🧪 Rolling Dev update channel — opt into per-commit builds from the panel, node updates, the x-ui.sh menu, and the installer (dev-latest); the dev build version is surfaced in the UI, bot, and CLI, and dev nodes report dev+<commit> so they aren't flagged stale.
  • 🧾 Logs & Access Logs viewer overhaul — the Xray access-log viewer is now labeled Access Logs across all languages, with an auto-update toggle, a 1000-row option, and verbatim rendering of plain log notices.
  • 📉 Leaner memory & tiered metrics history — real process RSS reporting plus a smaller footprint via GOGC + periodic release, and a tiered rollup that keeps 7 days of metrics history at ~1.5 MB.
  • 👥 Client bulk operations — bulk enable/disable and bulk-set XTLS flow from the Adjust dialog, with selection actions tidied into a More menu.
  • 🧬 VLESS encryption modes & tunnel health — new VLESS encryption modes plus an Xray tunnel health monitor.
  • 🔗 Subscription engine upgrades — new PROTOCOL/TRANSPORT/SECURITY remark variables, Incy client integration + routing tab, template-driven display remarks, and recovery of {{TRAFFIC_USED}} for orphaned traffic rows.
  • 🛰️ Node traffic history — import per-client traffic history on a node-hosted inbound's first sync so totals don't start from zero.
  • 🧹 Uninstall & deploy cleanup — the uninstaller now offers to purge PostgreSQL, and the legacy AWS golden-image build stack was dropped.

ℹ️ Heads-up: The new Dev update channel ships rolling per-commit builds for testers — stable deployments stay on the release channel unless you switch. The uninstaller now also offers to purge PostgreSQL when removing the panel; decline if you share that database with other apps.

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Reports

total
amd64
arm64
386
armv7
armv6
armv5
s390x
windows

New Contributors

Full Changelog: v3.4.0...v3.4.1

v3.4.0

Choose a tag to compare

@MHSanaei MHSanaei released this 23 Jun 15:49
3fa4edd

🚀 Multi-Node Hardening, Notification Event Bus, Managed Hosts & Scale to 100k Clients

  • 🛰️ Per-node outbound routing & node hardening — route each node through its own outbound, plus mTLS, hashed + zstd reconcile transport, and per-node network metrics.
  • 🔔 Notification event bus — a pub/sub architecture with Telegram and SMTP subscribers, a card-based notification settings layout, and memory-threshold alerts.
  • 🌐 Managed Hosts — per-host overrides for subscription links so each host can advertise its own address.
  • 🧾 Subscription engine upgrades — dynamic remark variables (Jalali date, transport, status tokens), full XHTTP mapping for Clash/Mihomo, per-client external links + remote subscriptions, and an option to hide server settings (happ).
  • 📈 Scale & stability to 50k–100k clients — faster traffic/auto-renew/node bulk ops, DB indexes on hot columns, atomic config writes, panic-recovering cron/jobs, and bounded gRPC deadlines & response sizes.
  • 🛡️ fail2ban-native IP limiting — IP limit is now gated on fail2ban (auto-installed on install/update) and reads onlines without parsing access.log.
  • 🔐 Native TLS/REALITY pinning — remote cert pinning via a native uTLS handshake (no xray subprocess), ported xray TLS/REALITY fields, and cert-hash helpers.
  • 🎯 Real client IP behind CDN/relay — capture the visitor IP behind a CDN/relay and attribute IP-limit per node.
  • 🧬 Xray-core v26.6.22 — core upgrade with XHTTP sessionID table/length controls, WireGuard field cleanup, and trustedXForwardedFor honored on gRPC inbounds.
  • 🛠️ Deployment pipeline & test-quality audit — release-driven golden-image & unattended-install pipeline, plus a test-quality pass adding mutation/fuzz/CI tooling.

ℹ️ Heads-up: IP limiting now relies on fail2ban, which is auto-installed on install/update, and no longer parses access.log. Legacy panelProxy / tgBotProxy settings are cleared automatically on upgrade. If you previously tuned IP limiting or those proxy settings, review them after upgrading.

🆕 New

⚡ Update & improvement

Read more

v3.3.1

Choose a tag to compare

@MHSanaei MHSanaei released this 12 Jun 18:49

🚀 Live Config Apply, Native Geodata, Smarter Nodes & a Big Internal Refactor

  • Live config apply — inbound / outbound / routing changes now apply over the Xray gRPC API without a full core restart, so existing connections survive edits.
  • 🌍 Native geodata auto-update — the custom geo manager is gone; geo files now auto-update through Xray-core's built-in mechanism.
  • 📡 Access-log-free online tracking — onlines and per-client IP limits now read from Xray's online-stats API instead of parsing access.log.
  • 🕸️ Smarter multi-node sync — filter inbounds and clients by node, push global client usage to nodes for display + local enforcement, and a per-inbound share-address strategy that carries through to subscriptions.
  • 🌉 Outbound-based egress bridge — the panel proxy URL is replaced by a proper outbound egress bridge; a balancer can now serve as the panel traffic outbound.
  • 🔐 MTProto upgrades — domain-fronting and essential mtg options, plus Telegram egress routed through your Xray routing rules.
  • 🧩 WireGuard refresh — latest Xray-core WireGuard features and per-peer comments to identify devices.
  • 🛡️ Security fixlog.access / log.error paths are confined to the panel log folder (GHSA-jm48 arbitrary file write).
  • 🛠️ Internal refactor — focused service files, leaf subpackages and a cleaner internal/ layout (no API surface change).

ℹ️ Heads-up: geo data now auto-updates via Xray-core and the old panel proxy URL is superseded by the outbound egress bridge. If you relied on either, review your settings after upgrading.

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Read more

v3.3.0

Choose a tag to compare

@MHSanaei MHSanaei released this 08 Jun 23:51
v3.3.0
f8e89cc

🚀 MTProto, WARP Rotation, Subscription Outbounds & a Typed API

  • 🛡️ MTProto (FakeTLS) — new protocol served through a managed mtg sidecar, no external setup required.
  • 🌐 WARP IP rotation — rotate WARP egress IPs manually or automatically on a schedule, with API requests routed through the panel proxy.
  • 🔄 Subscription-based outbounds — import outbounds straight from a subscription URL, with automatic refresh.
  • 🎨 Customizable subscription pages — bring-your-own templates for the subscription landing page.
  • 📑 Typed API & OpenAPI — components, schemas, and response examples generated directly from the Go structs; /panel/setting and /panel/xray consolidated under /panel/api.
  • 🕸️ Multi-hop nodes — correct traffic attribution across chained sub-nodes, synchronized access.log client IPs across nodes, and a distinct purple indicator when the panel is online but the Xray core has failed.
  • 📊 Per-group traffic — used traffic now shown for each group in the groups table.

⚠️ Breaking: /panel/setting and /panel/xray moved under /panel/api. Update any integrations that call those paths.

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Reports

total
amd64
arm64
386
armv7
armv6
armv5
s390x
windows

Full Changelog: v3.2.8...v3.3.0

v3.2.8

Choose a tag to compare

@MHSanaei MHSanaei released this 05 Jun 09:11
db118cb

🚀 Multi-Node Resilience, ECH & Scale

  • 🌐 Multi-node resilience — client/inbound edits survive an offline node, remote updates are scoped to a single inbound, and stale node snapshots no longer re-enable disabled clients or miscount traffic.
  • 🔐 End-to-end ECH — now carried in TLS share links, JSON subscriptions, outbound import, and per-entry external proxy.
  • 🧩 Modern Xray JSON subscriptions — new format with a unified finalmask editor.
  • 🧭 Clash routing — routing rules and an enable-routing option for Clash subscriptions.
  • 💾 DB migration — SQLite ⇄ .dump conversion and Download Migration from the Overview page.

⚡ Performance — scales to ~200k clients

Benchmarked on PostgreSQL 16 (gains are largest on Postgres, where every round-trip pays network latency):

Operation Scale Before After Improvement
Toggle one client (SyncInbound) 50k-client inbound 8m 54s 0.9s ~600× (~99.8%)
Seed clients 50k clients 2m 48s 1.6s ~100× (~99%)
Bulk create large inbound 8m 35s ~1–5s ~99%
Bulk detach large inbound 52s ~4s ~92%
Bulk delete large inbound 16s ~1–4s ~85%
Bulk adjust large inbound 20s ~7–10s ~55%
Delete-all clients 100k-client inbound ❌ crashed (param limit) ~7s now works
Bulk group add/remove 100k clients ~6s scaled
Full client list 100k clients ~1s scaled
GetClientTrafficByEmail flat in N 439ms ~1.5ms ~290× (~99.7%)

🆕 New

⚡ Update & improvement

🐞 Bug fixed

Reports

total
amd64
arm64
386
armv7
armv6
armv5
s390x
windows

Full Changelog: v3.2.7...v3.2.8

v3.2.7

Choose a tag to compare

@MHSanaei MHSanaei released this 03 Jun 21:04
5c1d64b

New

Update & improvement

Bug fixed

Reports

total
amd64
arm64
386
armv7
armv6
armv5
s390x
windows

Full Changelog: v3.2.6...v3.2.7