Standalone Go CLI accelerated uploader for idoud.
curl -fsSL https://raw.githubusercontent.com/mydearniko/idoud/main/install.sh | shirm https://raw.githubusercontent.com/mydearniko/idoud/main/install.ps1 | iexBuild from source:
go build -o idoud .- Upload a single file:
idoud archive.zip
- Upload from stdin:
cat archive.zip | idoud --stdin --name archive.zip
- Full chunked upload flow:
- sends
PUTrequests withContent-Range - uses
X-Upload-Keyacross all chunks - retries retryable chunk failures (409/429/5xx/network)
- waits for finalization via
/v1/files/{id}readiness checks (with short server-side wait hints when supported)
- sends
- Optional upload password and download limit headers.
cd cli
go build -o idoud .idoud [flags] <file>
idoud --stdin [--name <filename> | <filename>] [flags]idoud archive.zip
cat archive.zip | idoud --stdin archive.zip
idoud --server https://idoud.cc --parallel 16 archive.zip
idoud --password "secret" --download-limit 3 archive.zip--serverserver origin, or comma-separated origins for per-chunk round-robin (defaulthttps://idoud.cc)--stdinread payload from stdin instead of a path argument--stdin-sizeknown stdin size hint for stdin uploads--nameupload filename override (recommended with--stdin)--chunk-sizechunk size forContent-Rangeuploads (must be exactly3145728bytes / 3 MiB)--parallelparallel non-final chunk uploads (default32)--subdomainsforce numbered upload subdomains0..N-1onidoud.ccorigin--ipsforce chunk upload destination IPs (comma-separated), round-robin by chunk index--no-ipv6disable IPv6 and force IPv4-only connections--no-subdomainsdisable numbered subdomain upload routing (alias:--nosub)--speedtestbenchmark ingest path with server-side sink mode (no persisted file output)--retriesretries per chunk (default6)--hedge-delayspeculative duplicate delay for slow non-final chunks (default0s, disabled)--debugprint live chunk concurrency, retries, throughput, and 7-sample moving average speed to stderr--request-timeouttimeout for non-final chunk requests (default45s)--final-request-timeouttimeout for final chunk request (default95s)--finalize-recovery-timeoutreadiness wait after uncertain final chunk responses (default95s)--finalize-poll-intervalreadiness poll interval (default1.2s)--finalize-timeoutmax wait for server finalization (default20m)--outputstdout mode:url(default),json,none--jsonshorthand for--output json--passwordsetsX-Upload-Password--download-limitsetsX-Upload-Download-Limit--insecureskip TLS verification--verboseenable retry/finalization logs to stderr
- Stdin uploads are streamed with bounded RAM using a chunk buffer pool.
- For unknown stdin size, the CLI still uploads in parallel using chunked
Content-Range: bytes .../*requests and marks only the last chunk withX-Upload-Final: 1. --output urlprints exactly one final URL to stdout on success.--output jsonprints exactly one JSON document to stdout for success,--help, and CLI errors.--output noneprints nothing to stdout on success (i don't know why)--verboseand--debugnever write to stdout; they only write diagnostics to stderr.
For successful uploads, stdout contains exactly one line:
https://idoud.cc/AbC123/file.bin
Errors stay on stderr.
For successful uploads, stdout is empty. Useful when the caller only cares about the exit code.
Stdout contains exactly one JSON object and nothing else. This applies to:
- successful uploads
--help- CLI usage/argument errors
- input/open errors
- upload/runtime errors
Top-level fields:
schema_versioninteger schema version, currently1okboolean success flagtypeone ofresult,help,errorexit_codeprocess exit coderesultpresent only whentype=resulthelppresent only whentype=helperrorpresent only whentype=error
result fields:
urlfinal public URLnameupload filename after CLI sanitizationsourcefileorstdinknown_sizewhether the CLI knew the full input size before upload completionsizetotal size in bytes when known
error fields:
codestable machine code:usage_errorinput_errorupload_failed
messagehuman-readable error stringhintoptional human-readable recovery hint, currently used for usage errors
Success:
{
"schema_version": 1,
"ok": true,
"type": "result",
"exit_code": 0,
"result": {
"url": "https://idoud.cc/AbC123",
"name": "archive.zip",
"source": "file",
"known_size": true,
"size": 123456
}
}Usage error:
{
"schema_version": 1,
"ok": false,
"type": "error",
"exit_code": 2,
"error": {
"code": "usage_error",
"message": "missing input: pass a file path or use --stdin",
"hint": "pass a file path (idoud <file>) or use stdin mode (cat <file> | idoud --stdin --name <filename>)"
}
}Help:
{
"schema_version": 1,
"ok": true,
"type": "help",
"exit_code": 0,
"help": {
"text": "IDOUD CLI\n..."
}
}