style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
style: gofmt for CI
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
fix: dashboard CPU/memory/disk metrics units and sampling
- Memory and disk used/total now returned as bytes (frontend formatBytes)
- Clamp percents to 0–100; improve CPU sampling (200ms + fallback)
- Disk usage probes /, HOME, panel data dirs
- Dashboard: safer formatBytes and Progress clamping
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
fix: audit — persist login TG notify; repair share modal; sing-box guard
- Settings save now includes notify_on_login (was toggled but never sent)
- TelegramSettings TS type includes notify_on_login
- Users share modal: fix broken JSX, proper Sing-box link with ?/&
- Sing-box generator guards empty tag list before selector default
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete (3x-ui recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
fix: audit — do not undo ApplyConfig rollback; hard-delete proxy users
- Startup soft-fail no longer re-writes a failed Mihomo candidate after
ApplyConfig already restored/removed the previous file
- SaveConfig treats missing config as first-boot (errors.Is NotExist)
- Proxy user / binding deletes are Unscoped so username+UUID unique
indexes can be reused after delete ( recreate parity)
- Subscription Content-Disposition no longer overwrites Profile-Title name
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
fix: panel must start even if Mihomo/SSL fails on boot
- Soft-fail ApplyConfig / config generation / SSL bind so the management
UI remains reachable after deploy
- Preserve os.IsNotExist in ConfigManager.ReadConfig (first-boot path)
- systemd unit: CAP_NET_BIND_SERVICE + LimitNOFILE for optional ACME
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
chore: keep Ant Design only; fix mihomo service syntax and Reality test
- Fix Start/Stop/RestartMihomo: split "} s.applyMu.Lock()" syntax error
- Accept []interface{} for Reality short-id/server-names in tests (JSON decode)
- README: drop leftover alternative-frontend release note
- Project is Ant Design-only (frontend/); no variant UIs
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
fix(vless): pair encryption/decryption correctly for TCP Vision
- Stop copying server decryption into client encryption
- Store both fields; strip encryption (client-only) from server Compile
- Form + capability + schema support encryption for subscription export
- Tests for export and compile stripping
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass
test(telegram): prevent chat allowlist ID alias bypass