DocuSign charges $40/month for a feature set you'll use maybe twice a year. DocuSeal gives you the same core workflow in a Docker container that costs you nothing.

What It Is

DocuSeal is an open source document signing platform. Think DocuSign, but self-hosted, AGPL licensed, and running on a $5 VPS if you want it to. Upload a PDF, drop in signature fields, send a link, get it back signed. That's the loop. No subscription, no per-seat pricing, no data going to someone else's cloud.

It's been around since 2023 and has 11,800+ GitHub stars. This isn't an experiment — 191,000+ businesses and individuals are using it.

Why It's Worth Your Time

The self-hosted document signing space has a graveyard of projects that were hard to run, harder to actually use, or just broke when you needed them. DocuSeal is different in one specific way: the signing UX is genuinely clean. You could send the link to a non-technical person and they'd figure it out without a tutorial.

The feature list is serious: WYSIWYG form builder, 12+ field types (signature, date, checkbox, text, file upload), automated emails via SMTP, S3/GCS/Azure storage support, a REST API, webhooks, conditional fields, bulk send via CSV, SSO/SAML. It's not a toy.

What separates it from the graveyard projects is that the default configuration is actually useful. SQLite out of the box, no separate database to stand up, no dozen ENV vars to figure out before you see a login screen.

Hands On

Getting it running is one command:

docker run --name docuseal -p 3000:3000 -v .:/data docuseal/docuseal

Hit localhost:3000, create your admin account, done. The data directory holds your SQLite database and any uploaded files.

For a production setup with HTTPS and a real domain, pull the compose file:

curl https://raw.githubusercontent.com/docusealco/docuseal/master/docker-compose.yml > docker-compose.yml
sudo HOST=yourdomain.com docker compose up

The compose file bundles Caddy as a reverse proxy. Point your DNS at the server, run that command, and TLS is handled automatically via Let's Encrypt. This is the part that usually takes an afternoon with other self-hosted tools. Here it's two commands.

The form builder is drag-and-drop. Upload your PDF, place fields exactly where you want them, assign submitters, hit send. Each submitter gets a unique signing link — they don't need an account. When they complete it, you get an email and the signed PDF is stored locally.

What works well: the mobile signing experience is actually good. The signature drawing is responsive, field navigation is clear. Signers don't complain. In document-signing land, that's high praise.

What's rough: the template system takes a minute to click. Templates are separate from submission requests, and the distinction isn't obvious at first. The naming could be clearer. The API documentation is solid, but the webhook payload structure isn't immediately obvious — budget some time for that if you're building an integration.

The DATABASE_URL environment variable switches you from SQLite to PostgreSQL or MySQL when you're ready to scale, and the storage backend supports S3-compatible providers if you'd rather not keep files on disk.

Honest Verdict

If you ever need to collect signatures — contracts, NDAs, onboarding forms — DocuSeal earns its place in your self-hosted stack. The setup is fast, the interface doesn't fight you, and the API is good enough to automate the whole flow.

One thing to read before you deploy: the license is AGPLv3 with additional commercial terms (check the LICENSE_ADDITIONAL_TERMS file in the repo). For personal use, internal tooling, or direct document sending this doesn't matter. If you're planning to embed it in a product you sell, read it first.

The only genuine limitation: this is a web application, not a CLI. Everything goes through the browser UI or the API. There's no docuseal sign contract.pdf command. What it is: a clean, capable replacement for a SaaS tool that charges too much for what it does.

Go Try It

Run the single Docker command, upload a PDF, place a signature field, and sign it yourself. The whole loop takes under five minutes. That's the fastest way to know whether it fits your workflow.

GitHub: github.com/docusealco/docuseal