Introduction

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 + components

Document Lifecycle

  1. Document uploaded → SHA-256 hash computed
  2. File written to S3WORM bucket (immutable)
  3. Optionally pinned to IPFS via Filebase gateway
  4. Signing requests sent via Resend emails
  5. Signers sign EIP-712 payload containing document hash
  6. Signatures verified server-side + stored
  7. 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.json

Quickstart

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

MethodDescription
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

HookDescription
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:

  1. BucketDrive calls @docsign/sdk to prepare the document
  2. The file is read from the bucket and submitted to DocSign API
  3. Resend email invites are sent to specified signers
  4. Signers sign at docsign.wtf/sign/[id]
  5. On completion, signed metadata is written back to the original bucket path
  6. On-chain anchor record is shared between both apps via the document hash