Local Share is a tiny LAN web app for temporary file and text exchange. It has no accounts, no database, and no persistent storage by default. Shared items expire after 5 minutes unless a different lifetime is selected while sharing.
go run .Open http://localhost:8080.
docker build -t local-share .
docker run --rm -p 8080:8080 local-shareOpen the host machine from another device on the same network with:
http://<host-ip>:8080
When a GitHub Release is published, the release workflow builds a multi-architecture Docker image and publishes it to GitHub Container Registry as:
ghcr.io/timbornemann/local-share:<release-tag>
The workflow also attaches downloadable packages named like local-share-v1.0.0-docker.zip and local-share-v1.0.0-docker.tar.gz. Each package contains:
run.ps1for Windowsrun.shfor macOS/Linuxdocker-compose.yml- a short package README
After downloading and extracting the package, start Local Share with:
.\run.ps1or:
./run.shGET /opens the browser UI.GET /api/itemslists active shares, includingprotected,previewable, andpreviewKindmetadata.GET /api/items/{id}returns metadata for one active share.POST /api/items/filesaccepts multipart uploads with repeatedfilesfields. Optional form fields:ttlSecondsandpassword.POST /api/items/textaccepts JSON:{ "text": "...", "name": "optional", "ttlSeconds": 300, "password": "optional" }.POST /api/items/{id}/unlockaccepts JSON{ "password": "..." }and returns{ "token": "...", "expiresAt": "..." }for protected shares.GET /api/items/{id}/downloaddownloads a file or text item. Protected items require?token=...orX-Share-Token.GET /api/items/{id}/rawreturns text shares and text/code files astext/plain. Protected items require?token=...orX-Share-Token.GET /api/items/{id}/viewstreams browser-previewable files inline. Protected items require?token=...orX-Share-Token.DELETE /api/items/{id}removes an item.GET /api/eventsstreams Server-Sent Events when the list changes.
- The app is intentionally open to the local network.
- The default lifetime is 5 minutes. The UI allows 1 to 1440 minutes per share.
- Optional passwords hide preview/download/copy until unlocked in the browser. Password hashes and metadata stay in memory only; temporary files are not encrypted on disk.
- Uploads are streamed to temporary files under
/tmp/local-sharein the container. - There is no app-side file size limit; practical limits are browser, network, Docker, and disk space.
- Restarting the container clears all shares.