[v0.9.3] - 2026-10-22
🚀 Features & Enhancements
- Interactive In-Panel REST API Documentation (
/panel/docs):- Built a dedicated, interactive REST API Documentation dashboard (
docs.html) directly inside the TX-UI web panel. - Added primary navigation entry in
common_sider.htmlwith an API icon and full localization across all 13 supported languages. - Features real-time endpoint search, category filtering (Auth, Clients, Inbounds, Server, Settings, Xray), HTTP method badges, parameter tables, request body schemas, and response previews.
- Included interactive cURL generator tailored to current host/port/basePath, one-click copy buttons with instant toast feedback, and multi-language integration code examples (Python, Bash, Node.js).
- Added
/panel/docsand/panel/api-docsroute mappings inXUIController(xui.go).
- Built a dedicated, interactive REST API Documentation dashboard (
- Comprehensive Documentation & README Synchronization:
- Synchronized all 6 project READMEs (
README.md,README.fa_IR.md,README.zh_CN.md,README.ru_RU.md,README.es_ES.md,README.ar_EG.md) with the latest v0.9.3 feature set. - Updated API reference tables across all READMEs with Node Client connected device management, Xray core rollback controls, SQLite database optimization/cleanup endpoints, and advanced Xray configuration routes.
- Updated
API.mdwith in-panel documentation links and dedicated protocol credential documentation (password,ssPassword,masquePass,auth).
- Synchronized all 6 project READMEs (
- Automatic & Manual Config State Rollback on Core Error:
- Pre-flight Configuration Verification: Added
TestConfigFileviaxray -test -c <path>to validate configuration files before overwriting activeconfig.json, preventing malformed JSON or incompatible options from reaching production. - Immediate Core Exit Detection: Implemented startup monitoring window in
xray/process.goto catch instant runtime core exits (e.g., port binding conflicts or core initialization errors) and capture detailed diagnostic logs. - Automatic Fallback to Last Working State: On restart failures or core exit errors,
RestartXrayautomatically revertsconfig.jsontoconfig.json.last_workingand restores the database template (lastWorkingXrayTemplateConfig), immediately restarting Xray with the known-good configuration to prevent service disruption. - Crash Recovery in Background Job: Enhanced
CheckXrayRunningJobto automatically recover and rollback toconfig.json.last_workingif the core exits unexpectedly and restarting with the current config fails. - Failed Config Preservation: Automatically archives invalid configurations to
config.json.failedupon test or startup errors for post-mortem troubleshooting. - Manual Rollback API & UI Controls:
- Added backend endpoints:
POST /panel/api/server/rollbackXrayConfigandPOST /panel/xray/rollback. - Added status endpoints:
GET /panel/api/server/getRollbackStatusandGET /panel/xray/getRollbackStatus. - Added rollback action tag and rolled-back warning badge to the Dashboard Xray status card (
index.html). - Added "Rollback Config" action button and rollback notice alert to the Xray Settings page (
xray.html). - Added localization strings across English (
translate.en_US.toml) and Persian (translate.fa_IR.toml).
- Added backend endpoints:
- Pre-flight Configuration Verification: Added
- Xray-core Update to v26.10.21:
- Updated Xray-core to latest release commit
1b1647cd9ddf(v26.10.21). - Synchronized
go.mod,go.sum, and vendor dependencies.
- Updated Xray-core to latest release commit
- Xray v26.10.21 Features:
- Finalmask Source IP ACL Filter: Added
filtermask type to TCP and UDP Finalmask streams withallowedSourceIPsandblockedSourceIPstag-based multi-input controls in Web UI (stream_finalmask.html) and models (inbound.js,outbound.js). - Automatic Filter Mask Stripping: Implemented
StripFilterMasksinxray/finalmask.goand integrated withsubService.go,subJsonService.go, andinbound.js(getFinalMaskForShare) to ensure server-side access control lists are stripped from client share links and subscriptions. - XDRIVE Transport Enhancements: Migrated Google Drive service option to canonical
google-drivewhile preserving backward compatibility with existing databases; addedeagerWindowMsandholeTimeoutMsconfiguration fields in both inbound (stream_xdrive.html) and outbound (outbound.html) modals; enabled UDP mask configuration for XDRIVE. - Extended TLS Cipher Suites: Expanded
TLS_CIPHER_OPTIONacrossinbound.jsandoutbound.jsto include RSA-AES-GCM/CBC, ECDHE-CBC-SHA256, and 3DES cipher suites supported by Xray-core.
- Finalmask Source IP ACL Filter: Added
- Design Pattern Consistency & UI Optimization:
- Standardized all newly added form components, tag selectors, and modal inputs with Ant Design Vue design tokens and theme-aware dropdown styling (
:dropdown-class-name="themeSwitcher.currentTheme"). - Added comprehensive localization for Finalmask filter and XDRIVE settings in
translate.en_US.tomlandtranslate.zh_CN.toml.
- Standardized all newly added form components, tag selectors, and modal inputs with Ant Design Vue design tokens and theme-aware dropdown styling (
🐛 Bug Fixes & Shadowsocks Protocol Alignment
- Complete Shadowsocks & Shadowsocks 2022 Architecture Overhaul & Bug Fixes:
- Single-User vs Multi-User 2022 Protocol Enforcement: Fixed Xray core crash (
shadowsocks 2022 (multi-user): only blake3-aes-*-gcm methods are supported) by enforcing single-user mode for2022-blake3-chacha20-poly1305inCheckShadowsocks2022Keysand automatically strippingclientsarray inBuildInboundConfig. - Traditional Multi-User Shadowsocks Method Injection: Added automatic client
methodassignment for legacy ciphers (aes-128-gcm,aes-256-gcm,chacha20-ietf-poly1305,xchacha20-ietf-poly1305) inBuildInboundConfig, eliminatingunsupported cipher methoderrors while strippingmethodfor SS 2022 users as strictly required by core spec. - Graceful Single-User Hot-Add Promotion: Resolved
proxy is not a UserManagererror inhotAddUserToInboundandhotRemoveUserFromInbound; gracefully catches single-user proxy states and schedules seamless core reload into multi-user mode without alarming warning logs. - Accurate Subscription Link Credential Routing: Updated
subService.goandsubJsonService.goto prioritizeclient.SSPasswordover genericPasswordfor Shadowsocks inbounds, guaranteeing valid SIP002 and Shadowsocks 2022 links (method:serverKey:clientKey@host:port). - Clarified Inbound & Client UI Form Semantics: Labeled Shadowsocks 2022 inbound password field as
Server PSK (Master Key)inform/protocol/shadowsocks.htmlto eliminate ambiguity with user client passwords, added warning alert on selecting2022-blake3-chacha20-poly1305single-user cipher, and improved placeholder text and password generation inclients.html.
- Single-User vs Multi-User 2022 Protocol Enforcement: Fixed Xray core crash (
- Full Protocol-Separated Password Generation & Persistence (Trojan, Shadowsocks & MASQUE):
- Added dedicated
RandomUtil.randomMasquePassword()inutils.jsalongsiderandomTrojanPassword()andrandomShadowsocksPassword(method). - Fully decoupled credentials in Node Clients modal (
clients.html): provided distinct form items with dedicated generator controls for Password (Trojan), Key (Shadowsocks), and Password (MASQUE), eliminating shared password fields. - Added
ssPasswordandmasquePassfields toNodeClientandClientstructs inmodel.gowith automatic GORM database migration, ensuring each protocol preserves its dedicated credential. - Resolved password reversion bug across all protocols: updated
NodeClientController.updateto properly bind and persistssPasswordandmasquePass, ensuring edited passwords are not reverted or overwritten. - Synchronized
node_client.go(credsChanged,synthesiseClient,MergeIntoInboundConfig) andinbound.go(syncNodeClientOnUpdate,BuildInboundConfig) to route distinct credentials per protocol and protect against cross-protocol overwrite. - Added proactive Shadowsocks 2022 key auto-repair in
BuildInboundConfigto prevent core startup failures (proxy/shadowsocks_2022: bad key) and unwanted config rollbacks. - Added safe fallback polyfills in
common/js.html,clients.html, andform/client.htmlpreventing cached asset runtime exceptions.
- Added dedicated
- Complete Internationalization (i18n) Synchronization Across All 13 Languages:
- Audited all TOML localization files against
translate.en_US.toml, achieving 100% key coverage (0 missing keys across all languages). - Added natural, native translations for missing core rollback keys, Finalmask IP ACL filters, XDRIVE configuration, Node Client device management, bulk linking, and protocol credential tooltips across:
- Persian (
translate.fa_IR.toml) - Simplified Chinese (
translate.zh_CN.toml) - Traditional Chinese (
translate.zh_TW.toml) - Russian (
translate.ru_RU.toml) - Arabic (
translate.ar_EG.toml) - Spanish (
translate.es_ES.toml) - Indonesian (
translate.id_ID.toml) - Japanese (
translate.ja_JP.toml) - Portuguese (
translate.pt_BR.toml) - Turkish (
translate.tr_TR.toml) - Ukrainian (
translate.uk_UA.toml) - Vietnamese (
translate.vi_VN.toml)
- Persian (
- Audited all TOML localization files against
- Decoupled Trojan & Shadowsocks Client Password Generation:
- Separated client password generation across all views: introduced dedicated
RandomUtil.randomTrojanPassword()(alphanumeric string) andRandomUtil.randomShadowsocksPassword(method)(strict 16/32-byte Base64 key). - Refactored
form/client.htmlinto distinct form items for Trojan, Shadowsocks, and MASQUE, eliminating mixed password generators. - Enhanced Node Clients management (
clients.html): added distinct Trojan (Trojan ⟳) and Shadowsocks (SS 🔑) generator badges, dynamic placeholder hinting key format, intelligent default protocol detection inshowAdd(), and automatic cipher-aware Base64 key generation in bulk creation (handleBulkModalOk). - Added backend safeguards in
node_client.go(addClientToInboundSettingsandhotAddUserToInbound) guaranteeing valid Shadowsocks 2022 Base64 keys when attaching or dynamically loading clients into Shadowsocks 2022 inbounds. - Updated
fix_client_passwords.pyscript: separated Trojan and Shadowsocks generators, added automatic validation and repair of bad Shadowsocks 2022 keys (ErrBadKeyfix), added MASQUE protocol support, and synchronized credentials withnode_clients.
- Separated client password generation across all views: introduced dedicated
- Shadowsocks 2022 Key Generation & "Bad Key" Resolution:
- Fixed
RandomUtil.randomShadowsocksPassword(method)inutils.jsto generate correct key lengths: 16 bytes (Base64) for 128-bit ciphers (2022-blake3-aes-128-gcm,aes-128-gcm) and 32 bytes (Base64) for 256-bit ciphers (2022-blake3-aes-256-gcm,2022-blake3-chacha20-poly1305, etc.), completely resolving theErrBadKeyfailure. - Added automatic Base64 key length validation and re-generation on method change in
inbound_modal.html. - Fixed inbound method resolution in
client_modal.html,client_bulk_modal.html, andform/client.htmlwhen generating client passwords.
- Fixed
- Single-User Legacy Shadowsocks Password Visibility:
- Corrected conditional visibility in
form/protocol/shadowsocks.htmlso single-user legacy Shadowsocks correctly displays the password input field.
- Corrected conditional visibility in
- Cipher Suite Cleanup:
- Removed duplicate and redundant Shadowsocks ciphers (
chacha20-poly1305,xchacha20-poly1305) fromSSMethodsacrossinbound.jsandoutbound.js, standardizing on canonicalchacha20-ietf-poly1305andxchacha20-ietf-poly1305.
- Removed duplicate and redundant Shadowsocks ciphers (
- Xray API Dynamic User Alteration:
- Fixed
xray.AddUserfor Shadowsocks 2022: corrected protobuf account payload fromshadowsocks_2022.ServerConfigtoshadowsocks_2022.Account{Key: password}and added fallback tomethodwhencipheris not explicitly passed.
- Fixed
- Backend Validation & Subscription Alignment:
- Enforced client and single-user password presence checks in
internal/web/service/inbound.go. - Enhanced
genShadowsocksLinkinsubService.goandgenServerinsubJsonService.goto support single-user Shadowsocks link generation and correct multi-user SIP002/SIP022 formatting.
- Enforced client and single-user password presence checks in
- MASQUE Subscription Link & JSON Generation:
- Included
masquein database subscription queries insubService.go(getInboundsBySubId,getInboundsByEmail) and added fallback touserssettings array, resolving HTTP 400 errors when fetching subscriptions for MASQUE users. - Implemented
genMasqueLinkinsubService.gowith full support for external proxies, TLS parameters (sni,alpn,fp,insecure,ech), and Finalmask export. - Implemented
genMasqueinsubJsonService.gogenerating valid Xray client proxy outbounds withnetwork: "masque", TLS settings, and MASQUE credentials (user,pass). - Added unit test coverage in
sub_test.go(TestMasqueSubService_LinkAndExternalProxy,TestMasqueSubJsonService).
- Included