HTTP API 默认绑定 0.0.0.0,只允许本机访问需改 Network.bind_host 为 127.0.0.1;浏览器扩展连接默认端口 1700 且必须填 Auth Token,可用 surge token 获取;用 go install 安装需要 Go 1.25+,用户服务不能用 sudo 或管理员权限安装
curl -fsSL https://surgedm.github.io/install | shREADME 未说明具体硬件要求;提供预编译二进制、AppImage 和 Docker 镜像,可在服务器或树莓派上以无头模式运行。
Go 写的终端下载管理器,多连接分块并行下载,适合喜欢键盘操作的工程师
用 Go 写的终端下载管理器,界面是 TUI,主打高速下载,适合习惯在命令行里干活的重度用户。
核心能力
- 默认开 16 个连接分块并行下载
- 支持多镜像源同时下载并自动故障转移
- 提供 Bubble Tea 构建的可定制主题 TUI
- 守护进程架构,多个终端共享同一引擎
- 支持顺序流式下载,可边下边预览媒体
容易踩的坑
- v0.12.4最新正式版2026-10-31 · 2026-10-31 04:43 UTC
Changelog
- 0481d309a2e41ccc7a7bda3b2fc368fcb9c1d892 Add transparent backgrounds and reorganize TUI settings (#767)
- 4ef7f4b1336e5dd31c6115033b0723309dbb932c Harden command API, shutdown, and batch download handling (#735)
- 718e1e6843afba2ead0aeb9735c228e232bdf113 Polish TUI themes, navigation, and category management (#760)
- 0692b61a00648cf7510313dab40aadf70acc9cb0 chore(deps): bump github.com/gen2brain/beeep from 0.11.2 to 0.11.3 (#737)
- 8e4f9574e03d669796f4f37b3152c5be9543290e chore(deps-dev): bump @types/node from 26.6.3 to 26.6.5 in /extension (#738)
- 1e2099a829fbfc6f04434636d21d9fec9678cb6e chore(deps-dev): bump @typescript-eslint/parser in /extension (#740)
- c6cd85acfebe1f6a86b7948e16a76c53cc177f05 chore(deps-dev): bump eslint from 10.11.0 to 10.13.0 in /extension (#742)
- ea538be31f69bae5254134704fb9f7387ee63ca7 chore(deps-dev): bump typescript-eslint in /extension (#739)
- 1eb3ed9a2973c6c9f4af5ffe9a0ab65684af3b3a feat : HTTP API expansion for parity with core DownloadService (#710)
- 95c908ddd61fe257300fc22f56451b0586ca08f1 feat(cli): add bounded terminal progress and truthful transfer metrics (#762)
- 7198cd6ce4adbd258a798a45a1f5491b04b2eecf feat(cli): add verified foreground downloads and artifact receipts (#761)
- 20d4d685058f32a2c5159fe5839d16d0df4b84ba feat(cli): define versioned results and typed error contracts (#753)
- 062235232e75308dd6299ea2e775128eeac09939 feat(cli): return per-input download submission receipts (#754)
- 6a49211e6a4b50be572b18db43c499b09eba71b0 feat(nix): install official releases and automate updates (#752)
- 9de4cfa1a0d85d5660b3c6a7d362633afcc573d7 fix(cli): make listing authoritative and watch output terminal-safe (#755)
- c4898c3af56c82dbc5013845b2363c0a4c6d1da8 fix(events): isolate slow observers from lifecycle delivery (#756)
- 249b6b3020259894ea06ce4d67df6bbd8113e25a fix(nix): refresh vendor hash and correct version flag (#750)
- f805da47b7897ebd7aa1826cdba7e7e11d9c7275 fix(tui): label completion estimate as ETC (#732)
- ca6a36d115438a47cfcb1fa24db63ec85155c110 fix(windows): scope service logon task to current user (#747)
- b51d326c8e4cc73b1ddbee65d741d57245327bc0 fix: enforce single-owner invariant for same-ID downloads (#722)
- b8f518a1eadafc506f9edfb950c6ecca484d13d4 fix: use non-deprecated postflight_steps in generated Homebrew cask (#748)
- 81aa7b18aa96c22e5829379efc47ceb5d5265807 perf(cli): defer engine and local state initialization (#757)
- v0.12.32026-10-22 · 2026-10-22 06:52 UTC
查看更新说明
Changelog
- 59e19c66c0bbd8a0e888ab8530550a61f7cb20ff chore(deps): bump charm.land/bubbletea/v2 from 2.0.10 to 2.1.0 (#724)
- a060e3c581b82c19160589566bb9d9df0c6b42ce chore(deps): bump charm.land/bubbletea/v2 from 2.0.9 to 2.0.10 (#698)
- a13b4fea224f928ed97782438af7424564468e07 chore(deps): bump golang.org/x/net from 0.59.0 to 0.61.0 (#725)
- 3ec8200ebf9a17985234a58754d94ae11c9fb61d chore(deps): bump golang.org/x/sys from 0.48.0 to 0.49.0 (#714)
- 8aec38af5bcb3a76f9f861e57dc5088dd12de0ab chore(deps): bump seroval and solid-js in /extension (#713)
- 3a8be2260d043a617cbb5be1263695a72099f056 chore(deps): bump source-map-js from 1.2.1 to 1.2.2 in /extension (#712)
- b784113b1c36ceeaf37db20d5d11e943e7b24516 chore(deps): bump vite from 8.1.3 to 8.3.5 in /extension (#731)
- 0de61c570c2101cf9c36a1d7465baf3d9fab7d23 chore(deps-dev): bump @types/node from 26.6.1 to 26.6.2 in /extension (#683)
- ce77b5de6b09a3972af6a30fe907835232608198 chore(deps-dev): bump @types/node from 26.6.2 to 26.6.3 in /extension (#702)
- 50861b309a717377e8f6f830b87459c4852ac350 chore(deps-dev): bump @typescript-eslint/eslint-plugin in /extension (#727)
- 28e837919fa0becd2b3969a55a94eef48416b4e1 chore(deps-dev): bump @typescript-eslint/parser in /extension (#728)
- de03dcf671967e400bcf0cd6797f809e7cad2a81 chore(deps-dev): bump brace-expansion from 5.0.7 to 5.0.12 in /extension (#703)
- cf2fc3dd76df5d7c0baae522b1863b458bec0638 chore(deps-dev): bump eslint from 10.10.0 to 10.11.0 in /extension (#682)
- 9b06d368e0ce5e34b0699229864c5dee89d73702 chore(deps-dev): bump eslint-plugin-solid in /extension (#723)
- c57ae1a4dc13f2838fe61ea7de049c3b09cea1c0 chore(deps-dev): bump typescript-eslint from 8.70.1 to 8.71.0 in /extension (#704)
- 57dd1078a02637513d09e3be1d957258a1614c55 chore(deps-dev): bump typescript-eslint in /extension (#687)
- dc1b9b63a969da3ffa47be32f7df5b851fc0a619 chore(deps-dev): bump vitest from 5.0.0 to 5.0.2 in /extension (#699)
- b8d858d2ec6aec7084c4111edf10a99b1e9f68f3 chore(deps-dev): bump vitest from 5.0.2 to 5.0.3 in /extension (#708)
- 01e4ed6eeb11f52eeb96b8ab319b242d51841cd0 dependabot update freq (#707)
- 77758270ac16a635942b35afdc745cef534f7733 feat(extension): make duplicate warnings configurable (#691)
- 20196f158cdf60095bdaf9479f0a147643fe2c0b feat: Add exit confirm TUI for TERMINAL TOO SMALL (#720)
- 30c603c40ac4399778f602de59e835fd44c33793 feat: add adaptive_concurrency_interval to settings UI formatting labels (#634)
- 1be6df614ca6fad21b25d29f912fbb25f9cde751 fix(add): report pending confirmations (#678) (#685)
- a60192933a0f3575113cf0a9e9c50a5b93e60323 fix(ci): checkout sources for AppImage packaging (#684)
- 33f6385e43637f87a523c45d967ed2698add4661 fix(cmd): harden limit command handling (#690)
- c6f0d13f3678bbd22b6db97d0716d1f9aa2e1908 fix(cmd): harden ls output (#693)
- 7caa62fe6b3146328f8e6773efd122ab9667c287 fix(cmd): harden refresh command handling (#695)
- 63d523ec994369508ce3d5b77b92ef7fddbbb6fd fix(cmd): scope instance locks to runtime owner (#692)
- 5190470d31161d916e2099832bd61ede6db4450a fix(concurrent): suppress work stealing while all mirror hosts are in cooldown (#721)
- 01febe6d5976eddf2eb8269fd23c12f1f4c08484 fix(connect): harden remote TUI connections (#688)
- c90ca41b69b333b96fddc1ab4173c99346b84f85 fix(downloader): persist throttle budget across retries, refine challenge/403/fallback logic (#662)
- b90323bc9acdecae0f12160b2e1667c06556d378 fix(resume): make --all functional (#696)
- 5451729771400637c2e36a3ea4f24171426ef901 fix(scheduler): guard queuedTask identity against same-ID reuse and clean queueOrder (#700)
- 8e543a93adb8a21fc5e1c68736be14b530383872 fix: avoid cancelling workers during disk writes (#719)
- 0a29bd1a4858c5ec082ac3fe69f663bf0c5985b2 fix: make pause --all functional (#694)
- 5633d47df8f8b072c9c3b97fd57cbb7d3473b746 make URLs actually clickable (#730)
- 769f803f571f364d142a5a9f618fada87742e9ab refactor(service): replace system daemon with user-scoped services (#673)
- v0.12.22026-09-22 · 2026-09-22 17:51 UTC
查看更新说明
What's Changed
Highlights
- Added a convenient installer for systems without a package manager in #647.
- Introduced authoritative verified download progress and hardened the concurrent download completion lifecycle in #633.
- Added Chocolatey support for Windows in #606.
- Added an AppImage release artifact for Linux in #618.
- Added the category picker and related TUI refinements in #637.
Fixes
- Persist authenticated download headers across resume in #664.
- Prioritize physical completion over late pause requests and guard the scheduler completion boundary in #648.
- Finalize total size for completed unknown-length downloads in #641.
Maintenance
- Updated
go-humanize,x/net,x/sys,bubbles, andflock.
New Contributor
Acknowledgements
- Release automation powered by GoReleaser Pro.
- Development supported by a generous grant from FOSS United.
Full Changelog: https://github.com/SurgeDM/Surge/compare/v0.12.1...v0.12.2
- ext-v2.1.32026-09-20 · 2026-09-20 18:21 UTC
查看更新说明
Extension changes
- ci(extension): scope release changelog (1cda312)
- fix(ci): normalize Chrome service account key (bed8efb)
- ci(extension): use Chrome Web Store API v2 (a42c762)
- fix(extension): restore toolbar icon and show active badge (#663) (cb133b8)
- chore(deps-dev): bump @types/node from 26.2.0 to 26.6.1 in /extension (#654) (b5397fe)
- chore(deps-dev): bump eslint-plugin-solid from 0.15.0 to 0.18.0 in /extension (#656) (b37747b)
- chore(deps): bump solid-js from 1.9.14 to 1.9.15 in /extension (#625) (95e8e8a)
- chore(deps-dev): bump @typescript-eslint/parser from 8.67.0 to 8.70.0 in /extension (#657) (363232c)
- chore(deps-dev): bump vitest from 4.1.11 to 5.0.0 in /extension (#655) (52572c7)
- fix(extension): normalize listed download speed (#661) (0213a96)
- chore(deps-dev): bump eslint from 10.8.1 to 10.10.0 in /extension (#630) (3da9655)
- chore(deps): bump @vitest/mocker and vitest in /extension (#650) (8f721d5)
- chore(deps-dev): bump browserslist from 4.28.4 to 4.28.9 in /extension (#643) (b7b8925)
- chore(deps-dev): bump baseline-browser-mapping from 2.10.40 to 2.11.22 in /extension (#651) (54adbc9)
- v0.12.12026-08-26 · 2026-08-26 06:23 UTC
查看更新说明
Changelog
- 780708a28cb33ced4a1e5de37464223c106d26e6 chore(deps): bump charm.land/bubbles/v2 from 2.1.1 to 2.2.0 (#629)
- aa4b52ab3e440d85ce604cabc3cf4b845d987860 chore(deps): bump charm.land/bubbletea/v2 from 2.0.8 to 2.0.9 (#628)
- b748901c5676d4432ba7060f007706f2d56e9213 chore(deps): bump github.com/stretchr/testify from 1.12.0 to 1.12.1 (#623)
- 6f7951b5cd4a5401861ce567ec65fce6b6b0ccd7 feat: make concurrent downloads throttle-aware (#632)
- 08d09d11199acf6082a89c4da0d19a04749de997 fix(concurrent): tolerate transient worker 403s (#627)
Enjoying Surge? Consider supporting the project to keep it blazing fast!
- GitHub Sponsors
- Buy Me a Coffee
- Release automation powered by GoReleaser Pro
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Surge
Blazing fast TUI download manager built in Go for power users
Documentation • Installation • Usage • Themes • Fonts • Benchmarks • Extension • Settings • CLI Reference
What is Surge?
Surge is designed for power users who prefer a keyboard-driven workflow. It features a beautiful Terminal User Interface (TUI), as well as a background Headless Server and a CLI tool for automation.

Why use Surge?
Most browsers open a single connection for a download. Surge opens multiple (up to 16 by default), splits the file, and downloads chunks in parallel. But we take it a step further:
- Blazing Fast: Designed to maximize your bandwidth utilization and download files as quickly as possible.
- Multiple Mirrors: Download from multiple sources simultaneously. Surge distributes workers across all available mirrors and automatically handles failover.
- Sequential Download: Option to download files in strict order (Streaming Mode). Ideal for media files that you want to preview while downloading.
- Daemon Architecture: Surge runs a single background "engine." You can open 10 different terminal tabs and queue downloads; they all funnel into one efficient manager.
- Beautiful TUI: Built with Bubble Tea & Lipgloss, featuring customizable palettes and full theme engine support.
For a deep dive into how we make downloads faster (like work stealing and slow worker handling), check out our Optimization Guide.
Support the Project
We are just two CS students building Surge in between classes and exams. We love working on this, but maintaining a project of this scale takes time and resources. That's where you come in!
If Surge saves you time, consider supporting the development! Donations go directly toward:
- Publishing the Extension: Paying the Chrome Web Store fee so you can finally install the extension officially (no more sideloading!).
- Dev Tools: Licenses for tools like GoReleaser Pro to help us automate our builds.
- Debrid Integration: Covering subscription costs so we can test and build native Debrid support.
Totally optional-your stars, issues, and contributions already mean the world to us! :)
Installation
Surge is available on multiple platforms. Choose the method that works best for you.
| Platform / Method | Command / Instructions | Notes |
|---|---|---|
| Prebuilt Binary | Download from Releases | Easiest method. Just download and run. |
| macOS / Linux (Install Script) | curl -fsSL https://surgedm.github.io/install | sh | Verifies the release checksum and installs to ~/.local/bin. Run again to update. Script options. |
| Linux AppImage | Download from Releases | Run chmod +x Surge_..._linux_x86_64.AppImage, then ./Surge_..._linux_x86_64.AppImage. Supports delta updates. |
| Arch Linux (AUR) | yay -S surge | Managed via AUR. |
| macOS / Linux (Homebrew) | brew install SurgeDM/tap/surge | Recommended for Mac/Linux users. |
| Nix / NixOS | nix profile install --refresh github:SurgeDM/Surge | Installs the official release and adds surge to your Nix profile. Nix instructions. |
| Windows | winget install surge-downloader.surgeorscoop install surgeorchoco install surge | Recommended for Windows users. |
| Dockerfile | See instructions | Run Surge in server mode with Docker Compose |
| Go Install | go install github.com/SurgeDM/Surge@latest | Requires Go 1.25+ |
Usage
Surge has two main modes: TUI (Interactive) and Server (Headless).
For a full reference, see the customization guide, Settings & Configuration Guide and the CLI reference.
1. Interactive TUI Mode
Just run surge to enter the dashboard. This is where you can visualize progress, manage the queue, and see speed graphs. If you encounter any issues, press ? to open the bug reporting wizard. You can also press Shift + A or use your terminal's paste shortcut to automatically parse a copied browser 'cURL' command straight into a new download.
# Start the TUI
surge
# Start the TUI without the local HTTP API server
surge --no-server
# Start TUI with downloads queued
surge https://example.com/file1.zip https://example.com/file2.zip
# Combine URLs and batch file
surge https://example.com/file.zip --batch urls.txt
--no-server keeps the TUI fully local and skips the embedded HTTP API. CLI control commands such as surge add, surge pause, and browser-extension requests will not be able to target that instance.
The All tab (0) shows downloads in every state. The existing Queued (q), Active (w), and Done (e) tabs keep their filters. Tab/Shift+Tab cycle through all four tabs, and search, category filters, and tab pinning work in All too.
2. Server Mode (Headless)
Great for servers, Raspberry Pis, or background processes.
# Start the server
surge server
# Start the server with a download
surge server https://url.com/file.zip
# Start with explicit API token
surge server --token <token>
3. Auto-Start Service
Surge can run as a service owned by the current user. It uses the same settings, download database, category paths, and API token as that user's CLI and TUI.
# Install and immediately start the user service
surge service install
# Manage the service
surge service start
surge service stop
surge service restart
surge service status
# Uninstall the service
surge service uninstall
[!NOTE] [!IMPORTANT] Run these commands as your normal user, without
sudoor an Administrator terminal. Surge refuses to install a user service as root. The service starts with your login session; see the service guide for platform details and legacy system-service migration.
4. Remote TUI
surge and surge server bind the HTTP API to 0.0.0.0 (all interfaces) by default.
This means the server is accessible via localhost (127.0.0.1) as well as your local network IP.
To accept connections from this machine only, run surge config Network.bind_host 127.0.0.1 and restart Surge.
The API is token-protected. Generate/read your token by running:
# Get the current user's token (the service uses the same token)
surge token
Alternatively, you can find it in the TUI under Settings > Extension.
3. Remote TUI
Connect to a running Surge daemon (local or remote).
# Connect to local server (auto-detected)
surge connect
# Connect to a remote daemon
surge connect 192.168.1.10:1700 --token <token>
# Equivalent global-flag form
surge --host 192.168.1.10:1700 --token <token>
By default, surge connect uses:
http://for loopback and private IP targetshttps://for public/hostname targets
4. Global Connection Flags (CLI + TUI)
These global flags are available on all commands:
--host <host:port>: target server for TUI and CLI operations.--token <token>: bearer token for authentication.
Environment variable fallbacks:
SURGE_HOSTSURGE_TOKEN
5. Server Mode with Docker Compose
Download the compose file and start the container:
wget https://raw.githubusercontent.com/SurgeDM/Surge/refs/heads/main/docker/compose.yml
docker compose up -d
Get the API token:
docker compose exec surge surge token
Save this token - you'll need it to authenticate API requests and connect remotely.
Check downloads/API availability:
docker compose exec surge surge ls
View logs:
docker compose logs -f surge
Fonts
Surge ships a bundled Nerd Font for the TUI, but your terminal controls the actual font selection. See the customization guide for install steps and licensing details.
Benchmarks
We tested Surge against standard tools. Because of our connection optimization logic, Surge significantly outperforms single-connection tools.
| Tool | Time | Speed | Comparison |
|---|---|---|---|
| Surge | 28.93s | 35.40 MB/s | - |
| aria2c | 40.04s | 25.57 MB/s | 1.38× slower |
| curl | 57.57s | 17.79 MB/s | 1.99× slower |
| wget | 61.81s | 16.57 MB/s | 2.14× slower |
Test details: 1GB file, Windows 11, Ryzen 5 5600X, 360 Mbps Network. Results averaged over 5 runs.
We would love to see you benchmark Surge on your system!
To compare fixed and adaptive concurrency under deterministic throttling, run:
go test ./internal/strategy/concurrent -run '^$' -bench BenchmarkThrottle -benchtime=1x -count=5
The native Go benchmark runs persistent-overload and burst-recovery workloads with both policies and reports elapsed time, request amplification, throttled requests, and peak accepted concurrency.
Browser Extension
The Surge extension intercepts browser downloads and sends them straight to your terminal. It communicates with the Surge client on port 1700 by default.
[!IMPORTANT] An Auth Token is required to connect the extension to your Surge server. This can be obtained from the TUI under Settings > Extension, or by running
surge tokenas the user who runs Surge.
Chrome / Edge / Brave
- Stable: Get the Extension from Chrome Web Store
- Development:
- Download
extension-chrome.zipfrom the latest GitHub release. - Unzip it somewhere on disk.
- Open your browser and navigate to
chrome://extensions. - Enable "Developer mode" in the top right corner.
- Click "Load unpacked".
- Select the unzipped
extension-chromefolder. - Click the Surge icon in your browser toolbar and enter your Auth Token in the settings.
- Download
Firefox
- Stable: Get the Add-on
- Development:
- Download
extension-firefox.zipfrom the latest GitHub release. - Navigate to
about:debugging#/runtime/this-firefox. - Click "Load Temporary Add-on...".
- Select the zip file (or unzip and select
manifest.json). - Click the Surge icon in your browser toolbar and enter your Auth Token in the settings.
- Download
Acknowledgements
Huge thanks to the teams and sponsors helping us build and ship Surge:
- FOSS United for their generous grant supporting our development. We genuinely love and appreciate everything they do to build and nurture the FOSS ecosystem in India.
- Charm for the incredible terminal UI ecosystem (Bubble Tea, Lip Gloss, and more).
- GoReleaser Pro for release automation (provided free for open source).
Community & Contributing
We love community contributions! Whether it's a bug fix, a new feature, or just cleaning up typos. PRs are always welcome. For a quick guide, see CONTRIBUTING.md.
For internal TUI visual checks, run ./scripts/visual-test.sh. The fixture uses the production TUI and is compiled only into a temporary test binary. See Visual testing.
You can check out the Discussions for any questions or ideas, or follow us on X (Twitter)!
License
Distributed under the MIT License. See LICENSE for more information.