Skip to Content
S.EE Docs
Developers

CLI

Command-line client for S.EE platform

Use the S.EE CLI to manage short URLs, text snippets, files, bio pages, and QR codes from your terminal.

Features

  • Short URLs: Create, update, and delete links with custom slugs, domains, passwords, and expiration; view history and visit statistics
  • Text Snippets: Share code and notes from stdin or files, with syntax highlighting
  • Files: Upload files from paths or stdin, including private files and resumable uploads up to 5 GB
  • Bio Pages and QR Codes: Create and manage bio pages and dynamic QR codes
  • Account: Check API usage and validate API keys
  • JSON Output: Add --json to any command for machine-readable output

Installation

macOS

brew tap sdotee/homebrew-tap
brew install see

Debian / Ubuntu / RHEL (xTom repository)

xTom packages the CLI in its APT and DNF repository for amd64 and arm64, so you get updates through apt upgrade or dnf upgrade. Supported systems: Debian 12 and 13, Ubuntu 22.04, 24.04 and 26.04 LTS, and RHEL, Rocky Linux and AlmaLinux 9 and 10.

Quick setup, which adds the repository for your system:

curl -sL ba.sh/repo | sudo bash

Then install the see package:

# Debian / Ubuntu
sudo apt install see

# RHEL / Rocky / AlmaLinux
sudo dnf install see

To add the repository by hand instead:

# Debian / Ubuntu
sudo apt install -y ca-certificates curl gnupg
curl -fsSL https://repo.xtom.com/xtom.key | sudo bash -c 'gpg --dearmor > /usr/share/keyrings/xtom.gpg'
echo "deb [signed-by=/usr/share/keyrings/xtom.gpg] https://repo.xtom.com/deb stable main" | sudo tee /etc/apt/sources.list.d/xtom.list
sudo apt update
sudo apt install see

# RHEL / Rocky / AlmaLinux
sudo curl -o /etc/yum.repos.d/xtom.repo https://repo.xtom.com/rpm/xtom.repo
sudo dnf install see

On Debian you can also run sudo extrepo enable xtom to add the repository. See the xTom repository README for more options.

Linux packages

Every release includes packages for amd64 and arm64. Download the one for your system, then install it:

# Debian / Ubuntu
sudo dpkg -i see-cli_<version>_linux_<arch>.deb

# RHEL / Fedora
sudo rpm -i see-cli_<version>_linux_<arch>.rpm

# Alpine
sudo apk add --allow-untrusted see-cli_<version>_linux_<arch>.apk

# Arch Linux
sudo pacman -U see-cli_<version>_linux_<arch>.pkg.tar.zst

For example, see-cli_1.4.0_linux_amd64.deb.

Android (Termux)

Releases from v1.4.1 include a Termux package for aarch64:

dpkg -i see-cli_<version>_android_arm64.termux.deb

Arch Linux (AUR)

yay -S see-cli
# or the pre-built binary
yay -S see-cli-bin

Pre-built binaries

Releases also include archives for macOS, Linux, and FreeBSD (see_<OS>_<arch>.tar.gz) and for Windows (see_Windows_<arch>.zip), on x86_64 and arm64. From v1.4.1 there is also see_Android_arm64.tar.gz. Extract the archive and put the see binary in your PATH.

From source

Requires Go 1.26 or later:

git clone https://github.com/sdotee/cli.git
cd cli
make build   # builds ./see

Or use go install (v1.4.1 and later). Go names the binary after the module path, so it installs as cli; rename it to see:

go install github.com/sdotee/cli@latest
mv "$(go env GOPATH)/bin/cli" "$(go env GOPATH)/bin/see"

Configuration

Set your API key with an environment variable or a flag. Get your key from Tools > API Token.

# Environment variable (recommended)
export SEE_API_KEY="your-api-key"

# Or use the flag
see --api-key "your-api-key" <command>

Configuration Options

OptionEnvironment VariableDescription
--api-keySEE_API_KEYYour S.EE API key (required)
--base-urlSEE_BASE_URLCustom API base URL
--timeoutSEE_TIMEOUTRequest timeout
--json-Output JSON

The two timeout settings use different formats. --timeout takes a duration such as 30s or 2m. SEE_TIMEOUT takes a whole number of seconds such as 30; any other value is ignored and the default timeout is used.

see --timeout 30s domains
SEE_TIMEOUT=30 see domains

Run see help <command> for every flag of a command.

Commands

Domains & Tags

# Domains for short URLs
see domains

# Domains for text and files
see text domains
see file domains

# Your tags
see tags

Short URLs

# Create a short URL (prints the short link)
see shorturl create https://example.com

# Create with options
see shorturl create https://example.com \
  --domain s.ee \
  --slug example \
  --title "Example" \
  --password secret \
  --expire-at 1798761600

# Change the target URL (--target-url is required)
see shorturl update example --domain s.ee --target-url https://example.com/new --title "New Title"

# Delete
see shorturl delete example --domain s.ee

# History and visit statistics
see shorturl history --page 1
see shorturl stats example --domain s.ee --period daily

see url is an alias for see shorturl. --domain defaults to s.ee. --expire-at takes a Unix timestamp in seconds. Other create flags: --tag-ids and --expiration-redirect-url. The statistics period can be daily, monthly, or totally.

Text Snippets

Text commands read from stdin, or from a file with --file.

# Create from stdin
echo "Hello World" | see text create --title "greeting"

# Create from a file
see text create --file ./snippet.txt --title "Code Snippet"

# Create with options
cat script.sh | see text create \
  --domain ba.sh \
  --slug demo \
  --title "Shell Script" \
  --type source_code \
  --password secret

# Update the content and title
see text update demo --domain ba.sh --title "Updated Title" --file ./script.sh

# Delete
see text delete demo --domain ba.sh

# History
see text history --page 1

--type can be plain_text, source_code, or markdown. Every text needs a title: create uses Untitled when --title is omitted, and update requires --title. see text update replaces the content, so it also needs --file or stdin.

Files

# Upload one or more files
see file upload ./image.png ./document.pdf

# Upload with a domain and custom slug
see file upload ./document.pdf --domain fs.to --slug report

# Upload as a private file
see file upload ./invoice.pdf --private

# Upload from stdin (--name is required)
cat image.png | see file upload --name image.png

# History (30 files per page)
see file history --page 1

# Temporary download URL for a private file (valid for about an hour)
see file download-url <file-id>

# Delete with the delete key shown after upload
see file delete <delete-key>

Files up to 100 MB are uploaded in one request. Larger files are uploaded in resumable chunks, up to 5 GB. Stdin always uses a single request.

Bio Pages

see bio create "My Bio" \
  --description "About me" \
  --mastodon-url https://c.im/@s.ee \
  --link Blog=https://example.com

see bio update <id> --title "Updated Bio" --link Blog=https://example.com
see bio history --page 1
see bio delete <id>

--link title=url can be repeated. Links passed to update replace the existing custom links. create also accepts --domain, --slug, and --rss-url.

QR Codes

see qrcode create https://example.com --title "Example"
see qrcode history --page 1
see qrcode delete <slug> --domain s.ee

--title is required. Creating a QR code prints its short URL and the PNG, SVG, and PDF image URLs.

Account

# API, content, file, and storage usage
see usage

# Check the configured API key, or another key
see token check
see token check <api-key>

# Version
see version

JSON Output

Add --json to any command for machine-readable output:

see shorturl create https://example.com --json | jq -r '.short_url'

Examples

Create a short URL and copy it (macOS)

see shorturl create https://example.com | pbcopy

Upload a screenshot and print its URL

see file upload ~/screenshot.png --json | jq -r '.url'

Shorten every URL in a file

while read -r url; do
  see shorturl create "$url"
done < urls.txt

On this page