Skip to content
Freefor personal and noncommercial use

Your data. Every cloud.
Provably stored.

DCTL moves and backs up data across cloud providers the way rclone does — with every byte encrypted client-side in a frozen, self-describing format, and no transfer ever reported complete until its bytes are verified at the destination.

Rust · Linux, macOS · KONG GROUP LLC

Terminal showing dctl initialising a vault, copying 96 GiB of footage with every checksum verified at the destination, and streaming a file back.
dctl — zsh
$
Rust crates
8Rust cratesLayered so the crypto core carries zero unsafe code
Peak memory, flat with size
~144 MiBPeak memory, flat with sizeUnchanged from a 256 MiB file to a 4 GiB one, under a 512 MiB cap — measured, not projected
Restorability target
20 yrRestorability targetDecodable from the format spec alone, with no Rust and no network
Hybrid PQ sharing
ML-KEM-768Hybrid PQ sharingX25519 + ML-KEM-768 recipient wrap, shipped

The durability contract

Every transfer is verified at the destination before it is called done.

Most tools report success when the last byte leaves the machine. DCTL reports success when the bytes have been read back and matched at the destination, and the local index has durably committed the fact.

  1. readbounded chunks
  2. hashBLAKE3
  3. encryptXChaCha20-Poly1305
  4. checksumciphertext digest
  5. uploadconstant-memory multipart
  6. verifycompare at destination
  7. commitindex says it exists

A mismatch aborts the run

The staged object is deleted and nothing is committed. There is no partial state to clean up later.

The index is the source of truth

A path exists once its commit is durable. Crash the process mid-transfer and the index still tells the truth.

Plain remotes get it too

The contract is not a feature of encryption. Unencrypted copies are verified on exactly the same terms.

What you get

Built for data you cannot afford to lose

Large media, long horizons and providers that come and go. Every design decision follows from those three facts.

Verified writes, or no write at all

Nothing is reported stored until its bytes are checksum-verified at the destination and durably committed to the local index.

Constant memory, whatever the size

Chunked AEAD and constant-memory multipart keep peak memory flat as the file grows, rather than proportional to it.

Cross-device restore from a password

The backend is authoritative. A fresh machine with only the password rebuilds the entire path map.

A format frozen for twenty years

A dependency-free C99 reference decoder proves the format outlives the tool that wrote it.

Post-quantum where it counts

The at-rest path is entirely symmetric. Sharing uses an X25519 + ML-KEM-768 hybrid.

Ranged reads, ready for a mount

Reading a byte window fetches only the AEAD chunks covering it, so seeking into a huge object is cheap.

Metadata-private encrypted index

Filenames and directory structure never reach the provider in the clear.

Encryption is optional, never accidental

A remote is plain or vault-wrapped, and what a command encrypts depends only on the remote name you typed.

Standing on good work

If you know rclone, you already know DCTL

DCTL is written from scratch in Rust, but its addressing rules, filter syntax and command vocabulary were heavily inspired by the excellent work of the Rclone project. If you know rclone, you already know how to drive DCTL.

Capability comparison between Rclone and DCTL
CapabilityRcloneDCTLNotes
copy / sync / move / ls / catYesYesSame mental model, same filter and addressing rules
Breadth of backends70+Focused setLocal and B2 today; R2, S3, Drive and SFTP on the roadmap
Client-side encryptioncrypt overlayVault with identityA vault has a vault_id, revocable key slots and an encrypted index — two remotes sharing a password are not interchangeable
Verified write before successOptional checksYesNon-negotiable, on both plain and encrypted remotes
Post-quantum sharingNoYesX25519 + ML-KEM-768 hybrid recipient wrap
Metadata-private indexNoYesEncrypted SQLCipher index; filenames never leave in the clear
Format decodable without the toolNoYesDependency-free C99 reference decoder plus Known-Answer Tests
Tamper-evident audit logNoYesHash-chained, order- and integrity-preserving
LicenceMIT, open sourcePolyForm, source-availableFree for personal use and for noncommercial organisations; any business use requires a commercial licence

Where DCTL actually is

An honest completion status

DCTL is pre-1.0 and we would rather tell you that here than have you discover it during an evaluation. This table tracks the real state of the code.

DCTL feature completion status, by area
AreaStatus
Crypto core & frozen v1 formatComplete and committed, no unsafe codeShipped
Encrypted index (SQLCipher)Complete and committedShipped
Local filesystem backendVerified writes, fully exercisedShipped
Hybrid PQ sharing & grantsX25519 + ML-KEM-768, completeShipped
C99 reference decoder + KATsComplete, byte-exact cross-validationShipped
B2 / S3 / R2 backendsImplemented; live end-to-end verification pendingPartial
CLI surfaceHappy path exercised; several verbs partial; copy refuses files over 1 GiBPartial
Streaming past 1 GiB in the CLIWorks in the tree, not yet in a releasePartial
Remote-to-remote transferRefused at connect; only ciphertext replicate works todayPlanned
Ranged vault readsA window fetches only its covering chunks, per-chunk authenticatedShipped
mount (FUSE)Stub — validates flags then errors; needs the VFS layerPlanned
SFTP / FTP / WebDAV backendsThe core plain-storage goal — not startedPlanned
serve (HTTP / WebDAV)No command exists yetPlanned

Verified against the project’s own status document. Read the source of truth.

Free for personal use, and for everyone doing it for the public good.

Under the PolyForm Noncommercial License, personal projects, charities, schools, universities, public research and government bodies get the complete tool at no cost. Business use needs a commercial licence.