Commit Graph
757 Commits
Author SHA1 Message Date
風雪 eadd5255b0 docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales.
2026-09-14 11:16:49 +08:00
風雪 bcdec99d82 fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e)
- Use local status/start/stop/logs/version instead of 3m-ui.sh detour
- service_is_active for post-restart checks; help without root
- Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape)
2026-09-14 00:34:16 +08:00
風雪 8cf969abd8 fix(ui): drop Settings minHeight:480 on mobile to avoid empty gap 2026-09-14 00:18:04 +08:00
風雪 8cc49fe7a5 fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title
instead of floating inside a stretched empty white card. Force ant-layout
content flex:none overrides.
2026-09-14 00:14:00 +08:00
風雪 6739850e97 fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white
block under short pages. Content is now height:auto / flex:0 on mobile;
body safe-area padding removed (handled by header + bottom nav).
2026-09-14 00:01:36 +08:00
風雪 efa39ee5ed fix(ui): define isMobile in SharePage for compact layout props 2026-09-13 23:52:26 +08:00
風雪 f1f35da11a fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build)
- Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav
- Small card/table density on Dashboard/Traffic/Cluster/Config/etc.
2026-09-13 23:49:38 +08:00
風雪 e03861e4f7 i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy.
2026-09-13 23:38:17 +08:00
風雪 4aefb11b26 ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout.
Header shows logo on mobile; content padded for safe-area bottom nav.
2026-09-13 23:33:22 +08:00
風雪 7a43346588 fix(ui): repair Listeners versions table render corrupted by size prop injection 2026-09-13 23:29:53 +08:00
風雪 e332cfdac3 ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile
- PageHeader stacks actions on narrow screens
- Users mobile cards show traffic, expiry, remark/tags without losing info
- Layout content width + drawer width polish
2026-09-13 23:29:23 +08:00
風雪 4d6cb94145 fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never
read totp_enabled from the server after reload.
2026-09-13 23:14:18 +08:00
風雪 12727fb18a ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action
- Settings: QR setup modal, clearer enable/disable forms, loading states
- i18n: TOTP strings for en / zh-CN / zh-TW
2026-09-13 23:07:34 +08:00
風雪 c82bc0eb20 docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections.
2026-09-13 22:55:23 +08:00
kazeyukiro 7cc5dbd56b fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one
fetchMe that includes must_change_password for useAuth.
2026-09-13 14:31:15 +00:00
kazeyukiro 9299dbfd0d i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset
- core: status controls and update flow labels
- config / routing / logs / traffic / share / realityScan / password
- users batch actions and bind flows
- cluster remote operation labels
- protocol field labels remain English by design
2026-09-12 17:15:33 +00:00
kazeyukiro 182b06283f i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy
- ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI
(nav, login, users, dashboard, settings headers, TOTP, HWID,
first-use, external links, web_path, WARP, Telegram, backup)
- protocol field labels remain English (industry convention)
- all locale files validated at 755 keys
2026-09-12 16:27:21 +00:00
Z User 027d69e0c1 i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks,
settings.totp* and webPathHint. UI falls back to en then literal.
2026-09-12 15:37:34 +00:00
Z User a735bd9003 fix(sub): stamp first-use on successful subscription fetch 2026-09-12 15:31:32 +00:00
Z User 4778c43c79 feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic
- External subscription URLs merged into Clash/Mihomo client YAML
- HWID device list/kick/clear wired in Users (API already present)
- Admin TOTP 2FA (setup/enable/disable + login second step)
- Optional server.web_path panel prefix (config.yaml)
- subscription-userinfo already present; Traffic page shows live connections
2026-09-12 15:31:24 +00:00
kazeyukiro e48fb1008d docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
2026-09-12 23:07:00 +08:00
Z User 715cec2ecd docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en),
zh-CN README, and installation.md. Instruct assistants to use only the
official curl | sudo sh installer and not invent third-party sources.
2026-09-12 14:59:48 +00:00
Z User 5fe88d18cf feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include:
- PROXY select (AUTO + nodes + DIRECT)
- AUTO url-test
- rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY
- mixed-port / rule mode defaults for import-friendly clients
2026-09-12 14:56:01 +00:00
Z User 9bfb7c2e15 fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener
CRUD waits for ApplyConfig and can restore DB/config on restart failure.
2026-09-12 14:37:23 +00:00
freephilx 7d140717ea fix(api): apply mutation request timeout defaults (#60) 2026-09-12 22:36:38 +08:00
freephilx 1cc7989853 fix(ui): preserve listener name conflict errors and form input (#59) 2026-09-12 22:36:34 +08:00
freephilx be3a50acb7 fix(listener): serialize configuration generation and application (#57) 2026-09-12 22:36:28 +08:00
freephilx b2c2b02bf7 test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56)
2026-09-12 22:36:25 +08:00
freephilx 25b6a5b827 style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
style(go): format backend sources (#55)
2026-09-12 22:36:20 +08:00
phil e273e27cf7 fix(listener): roll back mutations when core activation fails 2026-09-12 12:28:25 +08:00
Z User 038803b0da fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both
POST create — first succeeded, second returned name already exists and left
the modal open. Use a ref lock; on UNIQUE conflict after create, if the name
already appears in the list treat as success and close.
2026-09-11 16:52:13 +00:00
Z User 72a81853b7 fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty
- ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name)
- Frontend suggests next 节点N after already-exists conflicts
2026-09-11 16:39:59 +00:00
Z User d404de8cb9 fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so
smoke (and UI) saw running=false right after creating the first listener.
- First start: still synchronous (fail the API if core cannot start)
- Already running: keep async restart for responsive create/update
- smoke-runtime: brief poll for mihomo/status.running
2026-09-11 16:25:34 +00:00
Z User 05de897a12 fix(subpage): close unterminated defaultHTML raw string (CI build) 2026-09-11 15:59:28 +00:00
Z User 4f59ab4e7a fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded —
HTTP waited on full core restart and often timed out after DB write.
- ApplyConfigDeferredRestart: save+validate sync, restart async
- Listener path uses deferred apply so create/delete respond quickly
- Users modal: confirmLoading + disable while submitting
- Listeners: always toast errors; refresh list without blocking success path
2026-09-11 15:55:57 +00:00
Z User cc5b206f5e fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t +
restart), often exceeding the 30s axios timeout and surfacing as
"Cannot reach the panel API" even when the DB write succeeded.
- Debounced async credentials→config reload after user changes
- Axios: 45s default, 120s for non-GET mutations
- Clearer network error hint; listener RegenerateConfig generates under lock then applies
2026-09-11 15:50:06 +00:00
Z User bf895d036c fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window
- First enable of traffic_reset_days records anchor without wiping counters
- Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them
- Add unit tests for cycle behaviour
2026-09-11 15:44:58 +00:00
Z User d150574ad3 feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags)
- Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy)
- Client-side zh/en toggle with localStorage + navigator language
- ViewModel: TrafficPct, URIItems; protocolLabel helper for tags
2026-09-11 15:36:42 +00:00
Z User 867619d5d6 i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English.
Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages.
2026-09-11 15:24:33 +00:00
freephilx 9471368afd perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54)
2026-09-11 23:11:20 +08:00
Z User 670b2210d1 i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi.
en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN.
2026-09-11 14:48:40 +00:00
freephilx 3ec69d55de feat(mihomo): persistent core updates with rollback (#53) 2026-09-11 22:44:52 +08:00
Z User 437ad5eee8 docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes
- Subscription short path / sub_port behaviour
- system/templates/warp(+register), access-tokens, panel-settings, SSL status
2026-09-10 16:49:12 +00:00
Z User 3a5b0d7e66 feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener
- subscription URLs use configured path; legacy API path kept
- proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job
- GET /users/export-links for one-click subscription link export
- POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI
- Share page export-all; Users form fields for group/tags/cycles
2026-09-10 16:45:18 +00:00
Z User ac35a043e5 docs: remove invalid update --stable; refresh version examples in READMEs 2026-09-10 16:13:57 +00:00
Z User d60605e9c3 fix(ui): define AboutPanelVersion used by settings about section 2026-09-10 16:10:32 +00:00
Z User 71119d59d6 feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales)
- Login page: theme + language switches (persisted via existing stores)
- About shows version from /api/v1/health (buildinfo linked at release time)
- ldflags write Version/GitCommit/BuildTime into internal/buildinfo
2026-09-10 16:10:17 +00:00
Z User 1c37a28804 feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash
- Periodic report and generic NotifyEvent time line follow settings.language
- New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others)
2026-09-10 15:52:22 +00:00
Z User 676312ae79 feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for
ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk
- Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language
- Expand Settings UI bot language select to all 18 panel locales
- Normalize legacy zh → zh-CN on load
2026-09-10 15:48:10 +00:00
Z User a1cbef1d74 fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately
- Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert
- Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks
- Clearer template name collision errors
2026-09-10 15:34:34 +00:00