DocSign.WTF Docs
DocSign.WTF is an open-source, on-chain document signing platform built on the DecOperations ecosystem. It provides cryptographic document signing with on-chain verification, permanent IPFS/Arweave storage, and deep integration with BucketDrive.WTF, Safe, OtoCo, and Privy.
Unlike traditional e-signature platforms (DocuSign, HelloSign, Adobe Sign), DocSign.WTF stores documents in WORM-enabled S3-compatible buckets and anchors signature proofs on-chain — making every signed document independently verifiable by anyone, forever.
vs Competitors
Most e-signature platforms are centralized SaaS products that:
- Store documents on private servers you cannot audit
- Require you to trust their server-side signature verification
- Lock you in with proprietary certificate formats
- Charge per-signature or per-envelope subscription fees
- Have no concept of wallet identities or on-chain entities
DocSign.WTF solves this: signatures are cryptographic proofs tied to wallet addresses, stored documents are hashed and immutable, and all proofs are independently verifiable on-chain. See the full comparison table on the homepage.
Architecture
DocSign.WTF is a pnpm Turborepo monorepo with the following packages:
docsign-wtf/
├── apps/
│ └── web/ # Next.js 15 app (landing + docs + dashboard)
└── packages/
├── types/ # @docsign/types — shared TypeScript types
├── sdk/ # @docsign/sdk — server-side TypeScript SDK
└── react/ # @docsign/react — React hooks + componentsDocument Lifecycle
- Document uploaded → SHA-256 hash computed
- File written to S3WORM bucket (immutable)
- Optionally pinned to IPFS via Filebase gateway
- Signing requests sent via Resend emails
- Signers sign EIP-712 payload containing document hash
- Signatures verified server-side + stored
- On completion: anchor tx submitted to selected chain
Storage Layout (S3WORM)
# Personal account
users/{userId}/documents/{docId}/original.pdf
users/{userId}/documents/{docId}/metadata.json
# Organization
orgs/{orgId}/documents/{docId}/original.pdf
orgs/{orgId}/documents/{docId}/metadata.jsonQuickstart
The fastest way to get started is the web app at docsign.wtf/app. Connect with Privy (wallet or email) and your personal storage folder is created automatically.
For developers
npm install @docsign/sdk # or pnpm add @docsign/sdk
import { DocSignClient } from "@docsign/sdk";
const client = new DocSignClient({
apiKey: process.env.DOCSIGN_API_KEY,
});
// Prepare a document for signing
const result = await client.documents.prepare({
title: "Service Agreement",
file: fs.readFileSync("./agreement.pdf"),
signers: [
{ identity: "alice.eth", identityType: "wallet" },
{ identity: "bob@company.com", identityType: "email" },
],
storageBackend: "s3+ipfs",
});
// Send email invites
await client.documents.sendInvites(result.data.id);SDK Reference
| Method | Description |
|---|---|
| client.documents.list(params?) | List documents for user or org |
| client.documents.get(id) | Get a document by ID |
| client.documents.prepare(request) | Upload + hash + prepare for signing |
| client.documents.sendInvites(id) | Send Resend email invites to signers |
| client.documents.cancel(id) | Cancel a document |
| client.signatures.getSigningPayload(docId, chain) | Get EIP-712 payload to sign |
| client.signatures.submit(docId, params) | Submit a completed signature |
| client.signatures.verify(docId, sigId) | Verify a signature |
| client.signatures.anchorOnchain(docId, chain) | Anchor doc proof on-chain |
| client.storage.getDownloadUrl(docId) | Get presigned download URL |
| client.storage.pinToIpfs(docId) | Pin document to IPFS |
| client.storage.archiveToArweave(docId) | Archive to Arweave |
| client.storage.verifyIntegrity(docId, file) | Verify file against stored hash |
React SDK
@docsign/react provides hooks and components to embed signing flows in any React or Next.js app. BucketDrive.WTF uses this to add "Request Signatures" from the file browser.
import { DocSignProvider, DocumentSigner } from "@docsign/react";
// Wrap your app or signing section
<DocSignProvider apiKey={process.env.NEXT_PUBLIC_DOCSIGN_KEY}>
<DocumentSigner
documentId="doc_abc123"
walletAddress="0x1234…"
chain="ethereum"
onComplete={() => alert("Signed!")}
/>
</DocSignProvider>Available Hooks
| Hook | Description |
|---|---|
| useDocument(documentId) | Fetch and subscribe to a single document |
| useDocuments(params?) | List documents for user or org |
| useSign(documentId) | Sign a document with connected wallet |
BucketDrive.WTF Interop
BucketDrive.WTF can send signing requests via Resend for files stored in your connected buckets. When a user requests signatures from BucketDrive:
- BucketDrive calls
@docsign/sdkto prepare the document - The file is read from the bucket and submitted to DocSign API
- Resend email invites are sent to specified signers
- Signers sign at
docsign.wtf/sign/[id] - On completion, signed metadata is written back to the original bucket path
- On-chain anchor record is shared between both apps via the document hash