- Move `sha256_hex` and cookie constants to module level; drop `token_is_hash` param in favour of regex auto-detection - Make `_respond()` accept `status`/`headers`; add `_redirect()` helper to eliminate boilerplate in auth routes - Simplify `_dispatch()` with a `PUBLIC_ROUTES` set and positive-logic early-return - Restrict CORS header to file API; auth responses no longer send `Access-Control-Allow-Origin: *` - Extract `clearPager()` in frontend and deduplicate `copyText` fallback path
Share
Local network file sharing via web page. Drag & drop, Ctrl+V paste, download.
No dependencies — Python 3 stdlib only.
Setting this up on a new machine? See SETUP.md.
Quick start
./install.sh # generates a token, installs + starts the systemd service
Or run it in the foreground without installing anything:
cp share.config.example share.config # then set `token` in it
python3 share.py
Open https://localhost:3001 in a browser. The network address is printed at
startup. The cert is self-signed, so expect a browser warning on first visit.
Options
CLI flags override share.config.
python3 share.py -p 3001 -d ~/Downloads/shared --ttl 7
| Flag | Default | Description |
|---|---|---|
-p, --port |
3001 |
Port |
-d, --dir |
~/Downloads/shared |
Upload directory |
--ttl |
7 |
File lifetime in days (0 = keep forever) |
--token |
Auth token (empty = open access) | |
--cert |
Path to SSL certificate | |
--key |
Path to SSL key |
Authentication
Set token in share.config or pass --token. All endpoints require a valid
token. An empty token means open access to everyone on the network.
The token is accepted as an Authorization: Bearer header or the share_token
cookie set by the login page. A ?token= link works only on / — it is exchanged
for the cookie and redirected away so the secret does not linger in the URL.
share.config is gitignored because it holds the secret — share.config.example
is the tracked template.
The token can be stored as plain text or as a SHA-256 hash:
# generate hash
python3 share.py hash mytoken
# store in share.config
token = 9c56cc51b374c3ba189210d5b6d0d04...
If the value is a 64-character hex string, it is treated as a hash. Otherwise it is hashed automatically at startup.
systemd (Arch)
Installed by ./install.sh from share.service.template to
~/.config/systemd/user/share.service. Restart after editing share.config —
it is only read at startup.
systemctl --user enable --now share # start + autostart
systemctl --user restart share # restart
systemctl --user stop share # stop
journalctl --user -u share -f # logs
Features
- Drag & drop files onto the page
- Ctrl+V to paste images / files from clipboard
- Click the drop zone to open file picker
- Upload progress bar
- File list with download and delete
- Auto-cleanup of old files (configurable via
--ttl)