Install
Latest release v0.1.10 — published 2026-09-09.
Homebrew
macOS or Linux, and the way to get updates automatically.
brew install aminulbd/tap/dsDirect downloads
Real filenames from the v0.1.10 release, verified against SHA256SUMS.
macOS
Apple silicon is arm64; Intel Macs are x86_64.
- ds-v0.1.10-aarch64-apple-darwin.dmgarm64 · 2.9 MB
- ds-v0.1.10-aarch64-apple-darwin.tar.gzarm64 · 2.4 MB
- ds-v0.1.10-x86_64-apple-darwin.dmgx86_64 · 3.1 MB
- ds-v0.1.10-x86_64-apple-darwin.tar.gzx86_64 · 2.5 MB
Windows
The .msi needs the Visual C++ Redistributable — see below.
- ds-v0.1.10-aarch64-pc-windows-msvc.msiarm64 · 2.8 MB
- ds-v0.1.10-aarch64-pc-windows-msvc.ziparm64 · 2.6 MB
- ds-v0.1.10-i686-pc-windows-msvc.msix86 (32-bit) · 2.5 MB
- ds-v0.1.10-i686-pc-windows-msvc.zipx86 (32-bit) · 2.3 MB
- ds-v0.1.10-x86_64-pc-windows-msvc.msix86_64 · 2.9 MB
- ds-v0.1.10-x86_64-pc-windows-msvc.zipx86_64 · 2.8 MB
Debian, Ubuntu
Static musl build, so it depends on nothing.
- ds_0.1.10-1_amd64.debx86_64 · 2.1 MB
- ds_0.1.10-1_arm64.debarm64 · 1.8 MB
- ds_0.1.10-1_i386.debx86 (32-bit) · 1.9 MB
Fedora, RHEL, openSUSE
Static musl build, so it depends on nothing.
- ds-0.1.10-1.aarch64.rpmarm64 · 2.1 MB
- ds-0.1.10-1.i686.rpmx86 (32-bit) · 2.1 MB
- ds-0.1.10-1.x86_64.rpmx86_64 · 2.2 MB
Linux
Plain archives. Prefer musl unless you need the gnu build.
- ds-v0.1.10-aarch64-unknown-linux-gnu.tar.gzarm64 · gnu · 2.5 MB
- ds-v0.1.10-aarch64-unknown-linux-musl.tar.gzarm64 · musl · 2.6 MB
- ds-v0.1.10-i686-unknown-linux-musl.tar.gzx86 (32-bit) · musl · 2.6 MB
- ds-v0.1.10-x86_64-unknown-linux-gnu.tar.gzx86_64 · gnu · 2.6 MB
- ds-v0.1.10-x86_64-unknown-linux-musl.tar.gzx86_64 · musl · 2.7 MB
Notes
On macOS or Linux with Homebrew:
brew install aminulbd/tap/ds
That is the one to take if you have it — upgrades come with brew upgrade.
Without Homebrew, this installs the latest release into ~/.local/bin, needing
no root and nothing preinstalled but curl and tar:
curl -fsSL https://raw.githubusercontent.com/aminulbd/ds/main/packaging/install.sh | sh
It creates the directories it needs, and says so if they turn out not to be on
your PATH or on the manual search path. Set BIN_DIR to install elsewhere,
or run it as root to install system-wide. It is worth reading before you pipe
it to a shell — drop the | sh and it just prints.
Every release also ships installers and plain archives for Linux, macOS and Windows on x86_64, arm64 and 32-bit x86. Grab one from the releases page:
| Platform | File | Install |
|---|---|---|
| Debian, Ubuntu | ds_<version>_amd64.deb (also arm64, i386) |
sudo dpkg -i ds_*.deb |
| Fedora, RHEL, openSUSE | ds-<version>.x86_64.rpm (also aarch64, i686) |
sudo rpm -i ds-*.rpm |
| macOS | ds-<version>-aarch64-apple-darwin.dmg (also x86_64) |
mount it, run install.sh |
| Windows | ds-<version>-x86_64-pc-windows-msvc.msi (also aarch64, i686) |
double-click, then open a new terminal — see Windows |
| Anything else | .tar.gz / .zip |
unpack and copy ds onto your PATH |
The .deb and .rpm carry the binary, the man page and the licence, and are
built from static musl binaries — they depend on nothing.
Windows
Take x86_64 unless the machine is an Arm one — a Snapdragon laptop or a
Surface Pro X — which wants aarch64. i686 is there for 32-bit Windows only.
ds.exe is built against the Microsoft C runtime, so it needs the Visual C++
Redistributable — most machines already have it, and the giveaway when they do
not is VCRUNTIME140.dll was not found on the first run. Install the one that
matches the build you took:
| Build | Download |
|---|---|
x86_64 |
vc_redist.x64.exe |
aarch64 |
vc_redist.arm64.exe |
i686 |
vc_redist.x86.exe |
Those are Microsoft’s permanent links to the current release; the page behind them is Latest supported Visual C++ Redistributable downloads.
The .msi installs either for everyone or for you alone. Left alone it takes
the first route when it can: Windows asks for administrator rights and ds.exe
lands in C:\Program Files\ds\bin. Advanced on the first screen offers the
choice — installing for the current user only wants no administrator and goes to
%LOCALAPPDATA%\Apps\ds\bin instead. Either way the folder is appended to
PATH, the system one or yours, and a terminal that was already open keeps its
old PATH, so open a new one before typing ds.
The installer is not code signed, so SmartScreen greets it with “Windows
protected your PC”. More info then Run anyway gets past it; if you would
rather check first, every release ships a SHA256SUMS file:
Get-FileHash .\ds-<version>-x86_64-pc-windows-msvc.msi -Algorithm SHA256
Uninstalling is the usual Settings → Apps route, and both halves can be done without the UI:
msiexec /i ds-<version>-x86_64-pc-windows-msvc.msi /qn # silent
msiexec /i ds-<version>-x86_64-pc-windows-msvc.msi /qn ALLUSERS=1 # everyone
msiexec /i ds-<version>-x86_64-pc-windows-msvc.msi /qn ALLUSERS="" # just me
msiexec /x ds-<version>-x86_64-pc-windows-msvc.msi /qn # remove
Without ALLUSERS it installs for everyone from an elevated prompt and for the
current user from an ordinary one.
Without administrator rights, take the .zip instead: unpack it and put
ds.exe wherever you like — the binary needs nothing beside it.
Colours work in Windows Terminal, PowerShell and cmd.exe from Windows 10 1809
onwards. An older console gets plain text rather than escape codes, and
--no-color or NO_COLOR turns them off anywhere.
Docker
Every release publishes a multi-architecture image — amd64 and arm64 — to the GitHub container registry:
docker run --rm ghcr.io/aminulbd/ds:latest apple --tld com
:latest follows the newest release; ghcr.io/aminulbd/ds:0.1.8 pins one, and
a prerelease never moves :latest. The image is Alpine with a static binary
and nothing else in it, around 22 MB.
Its default command is the HTTP API, so with no arguments it serves rather than checking a name:
docker run --rm -p 8080:8080 ghcr.io/aminulbd/ds:latest
curl -s 'http://127.0.0.1:8080/v1/check?name=apple&tld=com'
That default passes --host 0.0.0.0, which on the command line would print a
warning and deserves one: loopback inside a container is reachable by nobody,
so what keeps the server to yourself is the container’s network and whether you
publish the port. Publish it only where you would have been willing to bind
0.0.0.0 directly, and read Running one
before you do. Every server option still works — append them and they replace
the default command:
docker run --rm -p 8080:8080 ghcr.io/aminulbd/ds:latest \
--serve --host 0.0.0.0 --rate-limit 0 --cors 'https://example.com'
The IANA bootstrap is cached under /home/ds/.cache, so a volume there saves a
restarted container refetching it:
docker run --rm -p 8080:8080 -v ds-cache:/home/ds/.cache ghcr.io/aminulbd/ds:latest
Building the image yourself is docker build -t ds . from a checkout — the
Dockerfile at the repository root is the one the release workflow uses.
Or build it yourself:
cargo build --release
install -m755 target/release/ds ~/.local/bin/ds
install -m644 ds.1 ~/.local/share/man/man1/ds.1 # then: man ds
whois.json, pricing.json, private-tlds.json and eligibility.json are
embedded at compile
time, so the binary runs from anywhere. tld-facts.json and
tld-categories.json — the A–Z of every TLD, what kind it is, what it is for
and who runs it — ship beside them but are not embedded; see
The A–Z of TLDs.