
Sixty containers on one server
One bare-metal box runs dozens to hundreds of Hoody containers. KSM and BTRFS dedup make the marginal cost near zero.
hoody-pipe already serves a web upload form at every path it owns. Drag a file onto the page, the bytes stream through the pipe and into your script's stdin. You wrote zero lines of upload code.
Drop a file or click to upload
any size · any typeno upload code, no S3 bucket, no presigned URLs
hoody-pipe runs a web UI at the path root and a JavaScript-free fallback at /noscript. Both stream multipart bytes straight through to whoever is reading the same path. Your script reads the pipe — that's all the wiring there is.
https://pipe.hoody.com/uploadAny path you haven't reserved becomes a pipe. The URL is the upload page.
GET /upload — auto-served upload formHoody serves the form for you: drop zone, multipart parser, CSP nonce, all included. /noscript exists for restricted browsers.
PUT /api/v1/pipe/upload (multipart/form-data)The first multipart part is unwrapped and streamed to the receiver. No server-side staging, no temp files.
curl …/api/v1/pipe/upload | python process.pyReceiver and sender connect within a 5-minute TTL. The script doesn't know it's behind a webpage — it just reads the bytes.
The pipe is the upload server. Your script is the receiver. There is no third process — no Lambda, no API gateway, no glue function — between the drop zone and your stdin.
Every item below is a normal day's work to build for a one-off uploader. The pipe ships with all of it.
The pipe UI renders a drag-drop area, a click-to-pick fallback, and progress feedback. /noscript serves a pure HTML form for browsers without JS — same path, no extra code.
When the browser POSTs multipart/form-data, the server extracts the first part and streams it. No body buffering, no temp file cleanup, no ten-line multipart library.
The form ships with a fresh CSP nonce. Dangerous content types (text/html, image/svg+xml, application/javascript) are rewritten to text/plain before reaching you. OPTIONS handles cross-origin preflight.
Run your script before anyone uploads, or after — the pipe holds the connection up to a 5-minute TTL until both ends are present. Receiver count (n) is configurable up to 256.
Side by side: the upload pipeline you would have built, versus the URL you point at your script.
You wrote the script. Hoody wrote the upload form.
process.py — read stdin, do the work
while read chunk; do …the page, the form, the parser, the security
GET /upload — auto-servedThe patterns developers reach for when they need a one-off file upload. Each one charges a setup tax — buckets to provision, middleware to install, signing keys to rotate. The pipe is a URL.
Pick a path. Read the pipe. The upload form is already live at that URL.