# Scientific Surfing A CLI for surfing the internet scientifically, written in Go. ## Features - **Clash RSS Subscription Support**: Download and transform clash rss subscriptions - **Hook System**: Customizable scripts for extending functionality - **Core Configuration Management**: Import, export, and manage core configurations - **Binary Management**: Automatic updates for core (mihomo) components - **Service Management**: Install/start/stop/reload mihomo as a system service on Linux (systemd), macOS (launchd), and Windows (native Service Control Manager) ## Installation ### 1. Clone and build ```bash git clone ssh://git@gitea.epss.net.cn:2223/klesh/ss.git cd ss make build ``` This produces a single `ssm` (or `ssm.exe` on Windows) binary with no runtime dependencies — templates and hook scripts are embedded in the binary. ### 2. Add the binary to your system PATH ## Quick Start ### Subscription Management ```bash # add a subscription ssm subscription add # refresh a subscription (with optional backup) ssm subscription refresh [--backup] # delete a subscription ssm subscription rm # rename a subscription ssm subscription rename # update subscription URL ssm subscription set-url # show the URL for a subscription ssm subscription get-url # activate a subscription (additive — other active subscriptions stay active) ssm subscription activate # deactivate a subscription ssm subscription deactivate # move a subscription before/after another (affects list display order and # config apply's merge order — e.g. proxy/proxy-group ordering) ssm subscription move --before ssm subscription move --after # list all subscriptions ssm subscription list # show storage information ssm subscription storage ``` More than one subscription can be active at the same time — `config apply` merges the proxies (and any proxy-groups a subscription bundles, like an "Auto"/"Proxy" group) from every active subscription into the generated config, prefixing each proxy and proxy-group name with its source subscription's name (e.g. `home-sub | HK 01`) so identically-named ones from different subscriptions don't collide. Any reference to a renamed proxy/group within that subscription's own groups *or* rules (e.g. `DOMAIN,example.com,Proxy`, `MATCH,Auto`) is rewritten to match, so nothing ends up pointing at a name that no longer exists. ### Hook Management ```bash # initialize hooks directory with template scripts ssm hook init # show hooks directory location and list all scripts ssm hook list # edit a hook script with system editor ssm hook edit # remove a hook script ssm hook rm ``` ### Core Configuration Management ```bash # import configuration from file ssm config import [--config-file ] # export configuration to file ssm config export [--config-file ] # edit configuration with system editor ssm config edit [--config-file ] # reset configuration to default values ssm config reset [--config-file ] # show current configuration ssm config show [--config-file ] # apply subscription to generate final config (with advanced options) ssm config apply \ [--config-file ] \ [--output-file ] \ [--subscription ] ``` **Options** (available on every `ssm config` subcommand): - `--config-file `: Use a custom config file instead of the default. - `--output-file `: Specify the output path for the generated config file. - `--subscription `: Use only this one specific subscription for config generation, overriding the active set entirely (even if multiple subscriptions are active). ### Automation (`ssm:` block in core-config.yaml) `core-config.yaml` can carry an `ssm:` key — this tool's own automation config, applied when you run `config apply` and always stripped out of the generated config before it's written (mihomo never sees it). It supports three things: 1. **`proxy-groups`** — build a new proxy-group from proxies matching a subscription and/or keyword filter. 2. **`rate-filters`** — build a new proxy-group from proxies whose name encodes a rate/multiplier (e.g. `HK 01 | 1.5x`), extracted via a regexp and compared against a threshold. 3. **`patches`** — append/prepend/replace an arbitrary value at any path in the generated config. ```yaml ssm: proxy-groups: - name: "HK Nodes" type: select # any extra clash proxy-group fields (url, interval, tolerance...) pass through as-is match: subscriptions: ["home-sub"] # optional; omit to match proxies from any subscription name-contains: ["HK", "Hong Kong"] # optional; OR-matched, case-insensitive, matched against the proxy's original (pre-prefix) name rate-filters: - name: "Cheap Nodes" type: select pattern: '([\d.]+)x' # regexp; its first capture group is parsed as the rate operator: "<=" # one of <, <=, >, >=, ==, != value: 1.0 # proxies whose name doesn't match `pattern` at all are excluded match: subscriptions: ["home-sub", "work-sub"] patches: - path: dns.nameserver # dot/bracket path: dots descend into maps, [N] indexes into lists op: prepend # append | prepend | replace value: ["1.1.1.1"] - path: proxy-groups[0].proxies op: append value: ["DIRECT"] - path: rules op: replace value: ["MATCH,PROXY"] ``` `proxy-groups` and `rate-filters` run before `patches`, so patches can reference or further adjust the groups they created (e.g. `proxy-groups[-1]`-style indexing isn't supported — use the group's actual index, or patch `proxy-groups` itself with `append`/`prepend`). ### Core Management ```bash # update mihomo core binary ssm core update [--version ] [--force] ``` ### Service Management ```bash ssm service install [--name ] [--description ] ssm service uninstall [--name ] ssm service start [--name ] ssm service stop [--name ] ssm service restart [--name ] ssm service reload [--name ] # reload config via mihomo's API, no restart ssm service status [--name ] ``` `install`/`uninstall`/`start`/`stop`/`restart` need root/admin privileges: - **Linux / macOS**: just run the command directly — `ssm` re-execs itself under `sudo` automatically, prompting for your password if needed. - **Windows**: run from an elevated/Administrator shell — `ssm.exe service install`. ## Development ```bash make build # build ssm for the current platform make test # go test ./... make vet # go vet ./... make fmt # check formatting (gofmt -l) make help # list all targets ``` ### Releasing ```bash make release VERSION=v1.0.0 ``` Cross-compiles for linux/amd64, darwin/arm64, and windows/amd64, and packages each into `dist/` as a `.tar.gz`/`.zip` alongside a `checksums.txt`. Pushing a `vX.Y.Z` tag runs the same thing via `.drone.yml` and publishes the artifacts as a Gitea release. ## License MIT License - see LICENSE file for details.