One profile, every provider
A single ConnectionProfile shape works for SFTP, FTPS, S3, Azure Blob, GCS, WebDAV, HTTP, and
every major cloud drive. Switch backends without rewriting code.
One profile, every provider
A single ConnectionProfile shape works for SFTP, FTPS, S3, Azure Blob, GCS, WebDAV, HTTP, and
every major cloud drive. Switch backends without rewriting code.
Type-safe & tree-shakeable
First-class TypeScript: every option, callback, and error is typed. Scoped packages
(@zero-transfer/sftp, @zero-transfer/s3, …) let you pull in only the providers you actually
use.
Production-grade transfers
Streaming, resume, multipart, server-side copy, checksum verification, and structured progress events on the providers that support them - discoverable through the capability matrix.
MFT-grade orchestration
Compose transfers into routes, schedules, approvals, and audit logs. Plan syncs without moving bytes; apply atomic deploys with rollback.
Secrets stay secret
Every credential field accepts a SecretSource (env, file, callback). Profiles are
auto-redacted before any log line is emitted.
Built for Node 20+
Modern engine target, native fetch, AbortSignal everywhere, ESM-first with CJS interop, and tested against real Dockerized servers.
npm install @zero-transfer/sdkOr pull in just the provider you need:
npm install @zero-transfer/sftpnpm install @zero-transfer/s3npm install @zero-transfer/ftpsimport { createTransferClient, uploadFile } from "@zero-transfer/sdk";
const client = createTransferClient();const session = await client.connect({ host: "sftp.example.com", provider: "sftp", username: "deploy", ssh: { privateKey: { path: "./keys/id_ed25519" }, pinnedHostKeySha256: "SHA256:abc123…", },});
await uploadFile({ client, localPath: "./dist/app.tar.gz", destination: { path: "/releases/2026.04.28/app.tar.gz", profile: session.profile, }, onProgress: (e) => console.log(`${e.bytesTransferred}/${e.totalBytes ?? "?"}`),});
await session.disconnect();Keep going → Getting started.