📎 Clipto
Instant clipboard, screenshot, and file bridge from your browser or phone to your terminal/remote server.
Ever run an AI agent, Docker container, or SSH session on a remote server, but need to get a screenshot or log file from your local machine to that server?
Clipto solves this. Run clipto in any directory on your machine or remote server, open the link in your browser, and hit Cmd+V / Ctrl+V. Your screenshot or clipboard contents are immediately saved right into that folder.
✨ Features
- ⚡ Zero-Click Paste: Open the page and press
Cmd+VorCtrl+Vanywhere. No buttons or input selection required. - 🖼️ Thumbnail Grid & Lightbox: Visual thumbnail cards with click-to-enlarge full-screen preview.
- 📱 Phone QR Code (
--qr): Print a high-contrast terminal QR code or click "Phone QR" in the web UI to snap and upload from your phone camera. - 🔒 PIN & Password Protection (
--pin/--pass): Protect access with an auto-generated 4-digit PIN or custom passphrase. - 🎯 Drag & Drop: Drop multiple files, images, or documents straight onto the window.
- 📝 Text & Note Box: Paste stack traces, error logs, or notes to save directly as
.txtfiles. - 🤖 AI Agent Friendly (
--once): One-shot mode spins up the server, waits for an upload, writes the file, prints the saved path tostdout, and exits cleanly. - 🔀 Smart Port Hunting: Automatically picks the next free port (
8765,8766, etc.) so multiple instances never collide. - 🏷️ Multi-Instance Context: The UI prominently shows the host machine, target directory, and optional custom
--title. - 🪶 Zero Dependencies: Powered purely by Python's standard library. Installs in milliseconds with zero dependency conflicts.
🚀 Quick Start
Installation
pip install clipto
Basic Usage
Run clipto in whichever directory you want files to land:
clipto
You'll see a clean terminal banner with the local and LAN URLs:
┌─────────────────────────────────────────┐
│ 📎 Clipto v0.1.1 │
│ Saving to: /Users/matt/code/my-project │
│ Local: http://localhost:8765 │
│ Network: http://192.168.1.50:8765 │
└─────────────────────────────────────────┘
- Open the URL in your browser (or pass
-o / --opento auto-open). - Hit
Cmd+Vto paste a screenshot, or drag files onto the page. - The files are instantly written to your current directory!
📱 Mobile & Security Options
Phone Upload with QR Code
clipto --qr
A QR code is rendered directly in your terminal pointing to your LAN/Tailscale IP. Point your phone camera at your terminal to open the upload page instantly!
PIN & Password Protection
To prevent unauthorized access across your local network or future tunnels:
# Auto-generate a secure 4-digit PIN:
clipto --pin
# Or use your own password:
clipto --pass mysecret
- Zero friction for you: The generated terminal hyperlink and QR code automatically include the auth key (
?k=PIN), so clicking or scanning logs you in instantly with zero typing! - Protected against outsiders: Anyone opening the root link without the key must enter the PIN/password on a lock screen.
- Rate-limited: Brute-force attempts are automatically blocked after 5 failed tries.
🤖 Using with AI Agents & Scripts
Clipto is built from the ground up to integrate cleanly into automated agent workflows (Antigravity, Claude Code, Aider, OpenHands, etc.).
One-Shot Mode (--once)
When run with --once (or -1), Clipto waits for a single upload batch, saves the file(s), prints the resolved absolute path to stdout, and shuts down:
# Agent or script runs this:
FILE_PATH=$(clipto --once --title "Submit login bug screenshot" --timeout 120)
echo "Agent received file at: $FILE_PATH"
The agent gets the exact file path back into its visual/multimodal context!
⚙️ CLI Reference
usage: clipto [-h] [-v] [-p PORT] [--no-hunt] [-d DIR] [-1] [-t TITLE] [-o] [-q] [--pin] [--pass PASSWORD] [--host HOST] [--timeout TIMEOUT]
Instant clipboard, screenshot, and file bridge from browser to terminal.
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-p PORT, --port PORT Port to listen on (default: 8765; use 0 for random).
--no-hunt Disable automatic port hunting if port is busy.
-d DIR, --dir DIR Target directory to save files (default: .).
-1, --once One-shot mode: exit after upload and print file path(s).
-t TITLE, --title TITLE
Custom session title or prompt shown in the UI header.
-o, --open Automatically open web UI in default browser on launch.
-q, --qr Display a terminal QR code for the network URL.
--pin Protect access with an auto-generated 4-digit PIN.
--pass PASSWORD Protect access with a custom password.
--host HOST Host to bind to (default: 0.0.0.0).
--timeout TIMEOUT Timeout in seconds (useful with --once).
📄 License
MIT © Matt
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clipto-0.1.2.tar.gz.
File metadata
- Download URL: clipto-0.1.2.tar.gz
- Upload date:
- Size: 36.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d2d55a9b638d81fdc108002592ff96b9cbdca9ebbdfbff83e9de15c4acc656c
|
|
| MD5 |
c1aacd5349dc0fac598dc1765aa0bfdd
|
|
| BLAKE2b-256 |
24d9578e661f38ff61765ee3ed923ce118431b12ec282cbdb324e6eed8fe6861
|
Provenance
The following attestation bundles were made for clipto-0.1.2.tar.gz:
Publisher:
publish.yml on mattintech/clipto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clipto-0.1.2.tar.gz -
Subject digest:
9d2d55a9b638d81fdc108002592ff96b9cbdca9ebbdfbff83e9de15c4acc656c - Sigstore transparency entry: 2741978836
- Sigstore integration time:
-
Permalink:
mattintech/clipto@93a02b077ee765525477d0c3a6434f6ae2aae594 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/mattintech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@93a02b077ee765525477d0c3a6434f6ae2aae594 -
Trigger Event:
release
-
Statement type:
File details
Details for the file clipto-0.1.2-py3-none-any.whl.
File metadata
- Download URL: clipto-0.1.2-py3-none-any.whl
- Upload date:
- Size: 36.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01117aeae9b473002118984c808aa99eb37abb52afc516f46afe2e8636ea1e5d
|
|
| MD5 |
5c1001e4cb1d24697216883f83bdb1ae
|
|
| BLAKE2b-256 |
e3f1678de0f193acd539aa45ab32afa436a4241ffd29006a38df62e29b4b6df0
|
Provenance
The following attestation bundles were made for clipto-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on mattintech/clipto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clipto-0.1.2-py3-none-any.whl -
Subject digest:
01117aeae9b473002118984c808aa99eb37abb52afc516f46afe2e8636ea1e5d - Sigstore transparency entry: 2741978929
- Sigstore integration time:
-
Permalink:
mattintech/clipto@93a02b077ee765525477d0c3a6434f6ae2aae594 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/mattintech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@93a02b077ee765525477d0c3a6434f6ae2aae594 -
Trigger Event:
release
-
Statement type: