π₯ Features π¦ Installation π Quick Start π Commands π€ Contributing
No-Account Shortening- Create short links without signing in β‘Interactive Shorten- Custom alias with live availability check, password, max clicks, expiry, bot blocking, and--qrποΈLinks Browser (TUI)- Navigate, open, copy, edit, archive, and delete every link with a live analytics sidebar βοΈAnalytics Dashboard- Terminal charts: traffic over time with a previous-period overlay, browser/OS/country/city/referrer panels, drill-down filtering, range expressions, and full mouse support πQR Codes- Render any link as a scannable QR code right in the terminal π±Export- Download click data as JSON, CSV, XLSX, or XML π€API Keys- Create, list, and revoke keys for scripting πDevice-Flow Auth- No keys to paste β sign in through the spoo.me device flow, sessions refresh for 30 days πͺͺPipe-Aware---jsonon every command, plain output when piped,NO_COLORhonored, self-host friendly π§°
brew install spoo-me/tap/spooscoop bucket add spoo-me https://github.com/spoo-me/scoop-bucket
scoop install spoogo install github.com/spoo-me/spoo-cli/cmd/spoo@latestGrab a binary for macOS, Linux, or Windows β or a .deb, .rpm, or .apk package β from the releases page.
Tip
Point the CLI at a self-hosted instance any time with export SPOO_API_URL=http://localhost:8000.
Tab-completion covers commands, flags, and live data β your link aliases (spoo open <Tab>), link and key IDs (spoo links delete <Tab>, spoo keys revoke <Tab>), and flag values like --scopes, --domain, and --format.
Installed via Homebrew? It's wired up automatically β just open a new shell.
Installed another way (go install, a raw binary, Scoop, or a Linux package)? Load it for your shell:
source <(spoo completion zsh) # zsh β add to ~/.zshrc
source <(spoo completion bash) # bash β add to ~/.bashrc
spoo completion fish | source # fish
spoo completion powershell | Out-String | Invoke-Expression # PowerShell β add to $PROFILENote
Run spoo completion <shell> --help for instructions on installing the script permanently.
spoo shorten https://example.com/very/long/path # works without an account
spoo auth login # browser one-click authorization
spoo shorten # interactive form
cat urls.txt | spoo shorten # bulk
spoo links # interactive link browser (TUI)
spoo stats launch # charts in your terminal| Command | What it does |
|---|---|
spoo shorten [url] |
Create a link β flags for alias, password, max clicks, expiry, bot blocking, and --qr to print a scannable code. Interactive form with live alias availability when run bare. |
spoo links |
Interactive TUI browser: navigate, open, copy, edit (e, pre-filled form), archive/activate (t), delete (d, type-the-alias confirm), QR (Q). --json or piping prints the list instead. ? shows all keys. |
spoo links update/delete <id> |
Scriptable link management (delete requires --yes). |
spoo stats [code] |
Interactive analytics dashboard: time chart with previous-period overlay (p), browser/OS/country/city/referrer panels, drill-down filtering (enter or click any row), link switcher (g), range expressions (T β 7d, 4h, now - 2w to now - 1w, 2026-01-01 to 2026-02-15), clicksβunique toggle (u), full mouse support. Piped or --plain prints a static report; public stats work logged out. |
spoo export [code] |
Download analytics as JSON, CSV (zip), XLSX, or XML. |
spoo keys |
API keys: create (token shown once), list, revoke. |
spoo open <code> |
Open a short link in your browser. |
spoo inspect <code> |
See where a link points without counting a click. |
spoo qr <code> |
Render a link as a scannable QR code in the terminal (also Q in spoo links). |
spoo auth login/logout/status, spoo whoami |
Account session. |
Note
--json on any command emits machine-readable output. Output is pipe-aware: styled on a terminal, plain when piped.
Sign in with the connected-apps device flow β your browser opens, you approve once, and the CLI receives scoped tokens. It never sees your password, and sessions refresh themselves for 30 days:
spoo auth loginManage or revoke access any time at https://spoo.me/dashboard/apps.
Headless or CI? Skip the browser and pipe in an API key from https://spoo.me/dashboard/keys:
echo $SPOO_TOKEN | spoo auth login --with-tokengo build ./... # build
go test ./... # test (no network, no real keychain)Releases are cut by pushing a v* tag; GoReleaser builds and publishes every platform binary.
Issues and pull requests are welcome. Found a bug or have an idea? Open an issue or join the conversation on Discord.
