- Refactor updater.mjs: extract shared utilities, remove dead alpha
channel, add `autobuild` channel via CLI arg
- Add override-updater-endpoints.mjs to switch tauri.conf.json
endpoints to updater-autobuild at build time
- Add release-update-autobuild job to autobuild workflow
- Change allowDowngrades to true so custom compareVersions handles
build-metadata versions (+autobuild.MMDD.hash) correctly
- Fix original bug: linux-x86/i686 wrote .url instead of .signature
in the .sig handler
- Dispose Monaco editor instances on dialog close to prevent cycle leak
- Replace gcTime: Infinity with finite TTLs and evict orphaned subscription queryKeys
- Add missing useEffect cleanup for timers, move setTimeout out of useMemo
- Add 10s startup grace period before TUN auto-disable logic activates;
service IPC may not be ready when the frontend first queries, causing
a transient isServiceOk=false that incorrectly persists
- Replace placeholderData (which set isLoading=false with stale data)
with a proper isStartingUp guard; query now polls every 2s during
startup to catch service readiness quickly
- Add 'getSystemState' to refresh-verge-config invalidation keys to
fix key mismatch that prevented event-driven refetches from working
URLs with percent-encoded characters in credentials (e.g. %40 for @) were
being double-encoded after Url::parse() + as_str() serialization, causing
the constructed Basic Auth header to contain the wrong credentials and
resulting in 401 Unauthorized errors.
Replace swr with @tanstack/react-query v5 across all hooks, providers,
and components. Introduce singleton QueryClient, WS subscription pattern
via useQuery+useEffect, and enforce component-layer cache access contract.
Preserve SWR cache in onConnected to avoid replacing accumulated logs
with kernel buffer on reconnect. Add KeepAlive for the logs page so
its DOM stays mounted across route changes, removing the visible blank
window when navigating back.
Add leading-edge throttle to useMihomoWsSubscription, reduce SWR retry
aggressiveness, and increase WebSocket reconnect delay to prevent event
storms when switching profiles under poor network conditions.
- use-system-state: convert module-level `disablingTunMode` to useRef
to isolate state per hook instance, fix no-op clearTimeout, add
proper effect cleanup
- use-profiles: convert forEach to for..of so selectNodeForGroup is
properly awaited, remove fire-and-forget setTimeout around mutate
- use-clash: add useLockFn to patchInfo for concurrency safety
* feat: show detailed results in hotkey notifications
* fix: Japanese locale appears to have a truncated translation key label
* fix: variable naming
* Update documentation to English
* Remove unnecessary mut
* feat: enhance system proxy notifications with toggle state
* chore: update changelog to include new shortcut notification feature
* fix: remove unnecessary quotes from system proxy toggle messages in localization files
* fix: tun mode toggled hotkey notifications
* fix: correct toggle_tun_mode logic to handle current state and errors
---------
Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
- Remove unused `dns_settings_enabled` localStorage writes in
setting-clash.tsx — state is sourced from verge config, these
writes were never read anywhere.
- Replace hardcoded `'last_check_update'` localStorage read in
system-info-card.tsx with exported `readLastCheckTime()` from
the useUpdate hook, keeping the key in a single source of truth.
The settings page "Check for updates" did not update the homepage
"last check update time" because each page managed the timestamp
independently. Centralizes the timestamp in the useUpdate hook
via SWR + localStorage so both pages share a single data source.
Closes https://github.com/clash-verge-rev/clash-verge-rev/issues/6605#issuecomment-4147144987
The profile-update-completed event handler was missing a mutate('getProfiles')
call, causing the "X time ago" display to show stale timestamps after
backend timer auto-updates.
* fix(proxy): resolve system proxy toggle stuck and state desync (#6614)
Backend: replace hand-rolled AtomicBool lock in update_sysproxy() with
tokio::sync::Mutex so concurrent calls wait instead of being silently
dropped, ensuring the latest config is always applied.
Move blocking OS calls (networksetup on macOS) to spawn_blocking so
they no longer stall the tokio worker thread pool.
Frontend: release SwitchRow pendingRef in .finally() so the UI always
re-syncs with the actual OS proxy state, and rollback checked on error.
Closes#6614
* fix(changelog): add note for macOS proxy toggle freeze issue
The onCheckUpdate handler never persisted the timestamp to localStorage
or dispatched it to component state, so clicking "Last Check Update"
would report the result but leave the displayed time stale.
* chore(ci): improves AI slop reviewer aw based on feedback
* chore(ci): update agent workflow pull request trigger types to include reopened state
---------
Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
- Consolidate 3 near-identical icon getter functions into load_icon/default_icon with IconKind enum
- Merge two platform-gated update_icon implementations into one
- Extract update_menu_and_icon to eliminate duplicate combo in feat/config.rs and feat/clash.rs