English | 简体中文
ClashPulse is a lightweight cross-platform Go desktop client for Mihomo: one binary, low idle CPU, no polling or busy loops; strict typed TOML across four shallow files that reload once validation passes after a hand edit; and continuous node latency measurement that switches only when a better node is proven better, with every threshold under user control. It is not a Clash Verge Rev feature clone or a general-purpose proxy panel.
You need Go 1.26.6, a C compiler, and Fyne's native graphics headers. On Debian/Ubuntu:
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libgl1-mesa-dev xorg-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libxxf86vm-dev
go build -o clashpulse ./cmd/clashpulse
./clashpulse versionThe source build reports clashpulse dev. macOS needs Xcode Command Line Tools; Windows needs MinGW/GCC and go build -o clashpulse.exe ./cmd/clashpulse. See desktop build requirements for target details.
make install copies the binary, the icon, and the desktop entry into ~/.local (PREFIX=/usr/local and similar override the prefix). The desktop entry is Linux-only.
./clashpulseThe GUI starts without a proxy profile. Mihomo is a separate executable: put mihomo on PATH, or choose an absolute executable path in Settings. No Mihomo binary is bundled.
The GUI needs a graphical desktop session (X11 or Wayland on Linux). Its tray uses StatusNotifier; GNOME may need the AppIndicator extension to show it.
There is one ClashPulse service and one ClashPulse window per machine. If a service already runs (started by the GUI, clashpulse tui, or clashpulse activate), ./clashpulse opens its window against that service rather than starting a second one; if a window already runs, ./clashpulse reports it and exits instead of opening another. The window is an IPC client, so closing it leaves a service it did not start running. Terminal clients are unaffected: any number of clashpulse tui sessions may attach.
In the GUI, add an HTTPS subscription, refresh it to fetch and validate the candidate profile, then activate it. Open a second terminal for ./clashpulse tui; the TUI connects to the running desktop service and does not start one itself. On Windows use .\clashpulse.exe and .\clashpulse.exe tui.
The GUI, TUI, and CLI use Simplified Chinese when the operating-system locale is zh-CN (including zh_CN.UTF-8 and zh-Hans-CN); other locales retain English. Translation catalogs are embedded in the binary, not loaded from the profile or state directory. Machine IDs, proxy names, source URLs, and credentials are never translated. Chinese glyph rendering uses the system's installed fonts; ClashPulse does not bundle or select a CJK font.
To run a local profile without the GUI:
./clashpulse activate 'my profile.yaml'The command reads the file once, validates it with the selected Mihomo, and prints local profile active; press Ctrl-C to stop only after controller readiness. It owns the same local IPC service, so the TUI can connect while it runs. Ctrl-C stops Mihomo and resets System Proxy settings to the desktop defaults. The source is never edited or imported as a subscription; its path and proxy credentials are not shown over IPC. The private generated config is removed on shutdown. Activation failures print a fixed, credential-safe stage and exit nonzero.
The GUI and TUI Overview show Generated config changes for the active profile. Each entry names an app-managed field, whether it was added, replaced, or removed, and a fixed reason. The report is not a full YAML diff: it carries no source or generated values, credentials, network endpoints, or URLs. Unchanged fields are omitted; a stopped service shows no active override report.
Close the desktop before direct commands; they take the same private-state lock and refuse concurrent service access.
./clashpulse download subscription [id]
./clashpulse refresh
./clashpulse refresh resource [id]download subscription fetches and parses a profile (proxies or proxy-providers required), then stores it as an inactive private snapshot. It does not inspect or run Mihomo. Activation renders the profile, validates the complete generated config with the selected Mihomo, and applies it transactionally. refresh resource [id] also works without an active profile: it caches enabled resources under stable filenames in the private state directory's resources/ root, without starting Mihomo. When a profile is active, Mihomo stops before those files change and restarts only after validation; a failed update restores the prior files and runtime. Remote sources with ETag or Last-Modified use conditional requests, so an unchanged 304 does not download a body or replace a file. Without server validators, the body must be fetched to detect changes. A later profile refresh or activation still validates the generated config before applying it. Without an ID, each command handles all enabled sources in its scope.
Add --show-response to print up to 4 KiB of printable HTTP response text to local stderr on failure. URLs and response bodies remain hidden by default.
Press ? in TUI views for keyboard help (F1 inside editors), or ~ to view and scroll current-session activity; q closes either overlay without quitting. In the GUI, use Overview > View activity. Both activity views show only sanitized IPC diagnostics, not subscription URLs or credentials.
Settings has Mihomo binary, System Proxy, Monitor, and DNS sections. Its sidebar becomes a dropdown when the sidebar and selected section cannot fit side by side.
The tray's Proxies menu selects a member of an active managed select group; its System Proxy item changes the requested OS setting. Controls return when the local IPC service reconnects.
First start seeds config.toml, subscriptions.toml, resources.toml, and filters.toml in the platform config directory (~/.config/clashpulse on Linux unless $XDG_CONFIG_HOME is set). The four reviewed data sources are enabled by default; the exact previous disabled resource seed is migrated once, while customized resource files are left alone. Resources download during validated profile refresh/activation or refresh resource; download subscription remains profile-only. The cn list is downloaded but not routed until configured. Subscription and filter examples remain commented out.
Proxy-delay tests default to Clash Verge's http://cp.cloudflare.com/generate_204, through Mihomo. Plain HTTP can be intercepted; change the URL in Settings if that matters.