SALDL(1)
β¨ NAME β¨
Okay so this is the SALDL(1) page, and it's about saldl β a lightweight well-featured CLI downloader optimized for speed and early preview. π
Like, literally the whole personality is "fast" and "you see stuff early." Obsessed.
π¦ SYNOPSIS π¦
saldl [OPTIONS] URL
π DESCRIPTION π
Bestie, saldl is a CLI downloader based on libcurl. That's the vibe.
By default, it splits a download into fixed-sized chunks and downloads them in-order with multiple concurrent connections. Multiple connections. At once. The way it just goes. π₯
Many OPTIONS are available to change the default behavior β so if you wanna tweak the vibe, you absolutely can, iykyk.
π FILES AND DIRS π
<filename>.part.salβ the incomplete/partial file that will eventually be renamed to<filename>. It's your download's awkward middle-school phase before the glow-up. π¦<filename>.ctrl.salβ this file contains the minimal information required about the download progress to allow resuming. Think of it as the receipts so future-you can pick up where past-you left off. π<filename>.tmp.sal/β by default,saldluses temporary files to store chunks before they are merged. Those files are created in this dir. The chunk hangout spot, basically. π
π CHUNK PROGRESS STATES π
Every chunk has a state number and honestly it's giving numbered eras. Let's do the vibe check, one by one:
4β chunk already merged in<filename>.part.sal. It's in. It's official. Slay. β¨3β chunk downloaded, but still not merged. This state should be transient. If it's not, your system probably has load problems (CPU/IO/memory). π Like it's stuck backstage and nobody's calling it to the stage.2β chunk download is in progress. It's happening, bestie. Main character energy. π₯1β chunk is queued for download. This is a transient state you shouldn't see. Unless you have serious load/congestion problems in your system. π Not the congestion.0β chunk still not queued for download. Just sitting there. Patiently. Not in its era yet. π
Note β when resuming from a previous session, an incomplete chunk would initially have state 0. That doesn't mean it will be emptied and downloaded from scratch. Sub-chunk resume will work as expected. π«Ά No cap, your progress is safe.
β¨ OPTIONS β¨
π General
-d,--dry-runβ Do not download, only display information. Literally just peek, bestie. π--get-infoβ Do not download, only print specific informational tostdout.- The option can be passed multiple times with different arguments.
- (Valid arguments are
"file-name","file-size", and"effective-url".)
--mirror-urlβ If the mirror is valid, assign half the connections to it.- A mirror URL is considered valid when compared to URL if:
- Both do not have the same effective URL.
- Both have the same content size.
- Both support ranges.
- Both are not FTP.
- Both are not using content encoding. Or both do, but we will not decode/decompress.
- A mirror URL is considered valid when compared to URL if:
--fatal-if-invalid-mirrorβ Fatally fail if the mirror is invalid. Only a warning is displayed by default. So this is the βno vibes, only consequencesβ mode. π--stdoutβ Write/Pipe output tostdout.- Everything else will behave in the same way except:
- The pseudo output filename
"STDOUT"will be used. - Chunks will only be merged (written to
stdout) in order. - Resume is disabled.
- No state is saved in a
<filename>.ctrl.salfile. - If single mode is used, timeouts and other non-fatal response errors will become fatal.
- The pseudo output filename
- If
-m/--memory-buffersare used, saldl will not create or write to any files directly.
- Everything else will behave in the same way except:
-m,--memory-buffersβ Use memory buffers instead of temp files for downloading chunks.- This mode increases memory overhead. And we lose sub-chunk resumability. But it might help performance in some situations, especially when IO is the bottleneck. β¨
--read-onlyβ Donβt create files or write anything to disk. This should be only used to test network performance. No cap, itβs a pure sniff test. π§--no-mmap(default mode only) β Read chunk files into buffers instead of usingmmap().- This option hurts performance and should only be used for debugging. Bestie, itβs giving βtemporary chaos for science.β π¬
π UI Options
-i interval,--status-refresh-interval=intervalβ Minimum refresh interval between status updates in seconds. Increasing the default should help if terminal emulation is slow. (default:0.3)-C,--no-colorβ Disable colors in output.- Pass it twice (
-CC) to disable all other formattings and escape codes (auto-set if not tty).
- Pass it twice (
-V,--verbosityβ Increase verbosity level.- (See Verbosity Levels for details.)
--verbose-libcurlβ Enable libcurlβs verbose output. Regardless of verbosity level. Itβs giving βturn on the lore logs.β π--no-statusβ Disable progress status output. (For debugging purposes only)
π¦ Resume Options
-r,--resumeβ resume download.- (requires a
<filename>.ctrl.salto exist with a matching filesize)
- (requires a
-f,--forceβ If not resuming, and<filename>.part.salexists, truncate the file and start over. Fresh start, clean slate, iconic behavior. π
π Chunk sizes and connections
-S,--singleβ a single chunk single connection mode (wget-like).-s size,--chunk-size=sizeβ Set size for chunks in bytes. A unit suffix can be used. (default:1m)-c num,--connections=numβ number of concurrent connections. (default:6)-l num,--last-chunks-first=numβ the number of last chunks that should be downloaded first. (default:0)-L size,--last-size-first=sizeβ The minimum size that should be downloaded first at the end of the file. A unit suffix can be used.- This should be useful when chunk-size is not known beforehand. e.g. when
-a/--auto-sizeis used. - This option overrides
-l/--last-chunks-first. (default:0)
- This should be useful when chunk-size is not known beforehand. e.g. when
-F,--allow-ftp-segmentsβ Due to a certain limitation in the information provided by libcurl, single mode is force-enabled by default with FTP links. This option overrides that behavior.--random-orderβ Download chunks in random order. Chaos mode, but make it intentional. π²--merge-in-orderβ Only merge chunks in-order.- This works as if we were piping to the output file, which could be useful with some storage devices.
β οΈ Warning 1. It does not make sense to use--merge-in-orderwith--last-chunks-firstor--last-size-first. As merging those chunks will be delayed. Even if they were downloaded early. 2. If memory buffers and--merge-in-orderare both used, completely downloaded chunks could be lost due to delayed merges if the download was interrupted.
-a num,--auto-size=numβ increase chunk size so that chunk progress can fit innumlines.-w,--whole-fileβ work like typical download accelerators (no. of chunks = no. of connections).
π Filename Options
-o filename,--output-filename=filenameβ Use this filename instead of the detected name.-n,--no-pathβ assume path is relative, replace/and:with_.-D dirname,--root-dir=dirnameβ Prepend filename with this path.-g,--filename-from-redirectβ Get filename from redirected URL instead of the original URL.-G,--keep-GET-attrsβ keep GET attributes at the end of a filename. (This option has no effect if-o/--output-filenameis used)-A,--no-attachment-detectionβ Do not useContent-Dispositionattachment filename if present.-t,--auto-truncβ truncate filename if name or path is too long.-T,--smart-truncβ same as-t/--auto-truncbut tries to keep the file extension. (overrides-t/--auto-trunc)
π Network Options
-6,--resolve-ipv6β Only resolve to IPv6 addresses.-4,--resolve-ipv4β Only resolve to IPv4 addresses.
π Note If both-6and-4are passed, whatβs passed last will take precedence.
-R bandwidth,--connection-max-rate=bandwidthβ maximum rate per connection in bytes/s. A unit suffix can be used. (default:0[unlimited])-O,--no-timeoutsβ disable all timeouts. Living dangerously, but make it network-flavored. π«Ά--timeout-connection-periodβ period (in seconds) before a connection timeout is triggered. (default:10)--timeout-low-speed-periodβ period (in seconds) before a low-speed timeout is triggered. (default:10)--timeout-low-speedβ minimum rate per connection in bytes/s. A unit suffix can be used. (default:512B/s)-x proxy,--proxy=proxyβ set proxy.-X proxy,--tunnel-proxy=proxyβ similar to--proxybut tunneling all traffic through it.-N,--no-proxyβ disable all proxies even if set in the environment.--skip-TLS-verificationβ Skip TLS/SSL verification. Use at your own risk. π₯
π Custom Request Options
-E,--auto-refererβ auto set referer in case of a redirect.-e referer,--referer=refererβ set referer.-M local-file,--since-file-mtime=local-fileβ Sets theIf-Modified-Sinceheader with the last modification time of the passed local file.- This option has no effect if
-I/--no-remote-infowas passed.
- This option has no effect if
-Y date-expression,--date-cond=date-expressionβ SetsIf-Modified-Sinceheader according to the date expression passed. Consultcurl_getdate(3)for details.- If the expression starts with
-, thenIf-Unmodified-Sinceis set. - This option overrides
-M/--since-file-mtime. - This option has no effect if
-I/--no-remote-infowas passed.
- If the expression starts with
-z,--compressβ Request a compressed response. Single mode would be forced if the server supports compression. Unless-Z/--no-decompresswas passed.-Z,--no-decompressβ Disable decompression, whether compression was requested or forced by the server.-K cookie-file,--cookie-file=cookie-fileβ File to read cookies from.-k cookies,--inline-cookies=cookiesβ Set cookies.-p post-data,--post=post-dataβ Send post-data in a simple POST request (no multipart).-P raw-post-data,--raw-post=raw-post-dataβ Send raw-post-data as-is including headers (supports multipart).
β οΈ Warning--postand--raw-postwill double-post by default. Unless-I/--no-remote-infois also passed.
-U,--no-user-agentβ Donβt set user agent (disables default agent).-u agent,--user-agent=agentβ set user agent.
The following settings should not be generally used, but might help in rare cases:
-H,--custom-headers=header(s)β Add one or more custom headers to the request. Or suppress an auto one. Those headers would be sent to the remote server. If you need to send them to the proxy, use--proxy-custom-headers.- This option can be passed multiple times.
- If only one header is passed. It must not end with
\r\n. libcurl will add this for us. Multiple headers must be separated by\r\n. And the last on must also not end with an\r\n. - Three Header formats are acceptable:
- Header with info:
Name: info - Header without info:
Name; - Suppress default header:
Name:
- Header with info:
--proxy-custom-headers=header(s)β Works like--custom-headers. But the headers are passed to the proxy instead of the remote server.--use-HEADβ Use HEAD instead of GET to retrieve download information from servers.-I,--no-remote-infoβ Just GET. Donβt do anything else. (-S/--signleis forced,-r/--resumeis disabled)--no-http2β Donβt try HTTP/2 requests.--http2-upgradeβ Try HTTP/2 requests with plain HTTP.--no-tcp-keep-aliveβ Donβt send TCP keep-alive probes.--assume-range-supportβ Donβt use this. The wrong data will probably be downloaded. Seriously, bestie, this one is a trap. π
π ENVIRONMENT
In addition to all environment variables affecting libcurl(3). The following variable(s) can affect saldl:
SALDL_EXTRA_ARGSβ Append these arguments toargv.
π UNIT SUFFIXES
OPTIONS that take an argument representing a byte value can be suffixed with one of the following letters:
Korkβ multiply size by 1024 (KiB).Mormβ multiply size by 1024*1024 (MiB).Gorgβ multiply size by 1024*1024*1024 (GiB).
β¨ VERBOSITY LEVELS β¨
okay so by default saldl is lowkey chill β it only shows you the essentials at the default verbosity level π
. but bestie, if you want more, you just pass -V/--verbosity multiple times and it stacks up. iconic behavior fr fr π
Note β Verbosity levels are incremental. Each level includes all messages from lower levels. so no cap, the higher you go the more you see, and nothing gets hidden on you π
-Vβ show non-fatal errors π (the oops-but-we're-still-going kind)-VVβ show warnings β οΈ (the "hmm bestie maybe watch out" kind)-VVVβ show informational messages β¨ (the "just keeping you posted" kind)
Warning β the following levels are noisy. They should only be used for debugging/tracing purposes π«Ά like, seriously, do not leave these on for a normal download, it's giving chaos π
-VVVVβ show debug messages π-VVVVVβ enable verbose output inlibcurlπ₯
Note β This can be enabled independently with the--verbose-libcurloption π so you don't have to go all the way to-VVVVVfor it.
-VVVVVVβ show debug messages from event loops π (the deepest lore)
πΈ EXIT STATUS πΈ
0β Success π slay, it worked, nothing to see here π1β A fatal error happened π. A helpful message should explain the error β so like, read it, it's literally there for you π«Ά
π¦ WWW π¦
https://saldl.github.io
that's the site, go visit, it's cute π
π BUGS π
https://github.com/saldl/saldl/issues
found something cursed? take it here, no gatekeeping π
π AUTHOR π
Mohammad AlSaleh (MoSal@Github). the main character who made this happen π
β¨
π COPYING π
Copyright (C) 2014-2015 Mohammad AlSaleh. Free use of this software is granted under the terms of the GNU Affero General Public License (AGPL) ππ
and that's the whole page bestie, you ate it π«Άβ¨ this edition is dated 01/01/1980, source and version info living in that lil footer β periπ
dt, go download something huge ππ₯
π¦ where this page comes from
- nixpkgs unstable: saldl 41
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms