The Open Source DocuSign Alternative.
Signing documents digitally should be fast and easy and should be the best practice for every document signed worldwide. FreeSign is an open-source signing tool you can self-host and audit end-to-end, so trust in your document signing pipeline isn't outsourced to a black-box vendor.
- TypeScript - Language
- React Router - Framework
- Prisma - ORM
- Tailwind - CSS
- shadcn/ui - Component Library
- react-email - Email Templates
- tRPC - API
- React-PDF - Viewing PDFs
- PDF-Lib - PDF manipulation
- Stripe - Payments
- Node.js (v22 or above)
- Postgres SQL Database
- Docker (optional)
Note: This assumes that you have both docker and docker-compose installed on your machine.
-
Fork this repository to your GitHub account, then clone it locally:
git clone https://github.com/<your-username>/freesign
-
Set up your
.envfile using the recommendations in.env.example. Or just runcp .env.example .envto start with handpicked defaults. -
Run
npm run dxin the root directory to spin up a postgres database and inbucket mailserver in a docker container. -
Run
npm run devin the root directory.Or use the shorthand:
npm run d.
- App - http://localhost:3000
- Incoming Mail Access - http://localhost:9000
- Database - port 54320
- S3 Storage Dashboard - http://localhost:9001
- Fork and clone the repo, as above.
npm icp .env.example .env- Set the required environment variables:
NEXTAUTH_SECRETNEXT_PUBLIC_WEBAPP_URLNEXT_PRIVATE_DATABASE_URLNEXT_PRIVATE_DIRECT_DATABASE_URLNEXT_PRIVATE_SMTP_FROM_NAMENEXT_PRIVATE_SMTP_FROM_ADDRESS
npm run prisma:migrate-devnpm run translate:compilenpm run dev- Register a new user at http://localhost:3000/signup.
Optional:
- Seed the database with
npm run prisma:seed -w @documenso/prismato create a test user and document. - Create your own signing certificate. See SIGNING.md.
- Configure a job provider for document reminders. The default local job provider does not support scheduled jobs. To enable reminders, set
NEXT_PRIVATE_JOBS_PROVIDER=inngestand provideNEXT_PRIVATE_INNGEST_EVENT_KEYin your.env.
A Docker image is published to GitHub Container Registry:
ghcr.io/freesign-io/freesign
Pull and run with your preferred container hosting provider, providing environment variables for the database, mailserver, and so on. See the Docker README for detailed instructions.
git clone https://github.com/FreeSign-io/freesign.git
cd freesign
cp .env.example .envThe following environment variables must be set:
NEXTAUTH_SECRETNEXT_PUBLIC_WEBAPP_URLNEXT_PRIVATE_DATABASE_URLNEXT_PRIVATE_DIRECT_DATABASE_URLNEXT_PRIVATE_SMTP_FROM_NAMENEXT_PRIVATE_SMTP_FROM_ADDRESS
If you run FreeSign behind a reverse proxy, set
NEXT_PUBLIC_WEBAPP_URLto the public URL.
Install and build:
npm i
npm run build
npm run prisma:migrate-deployStart the server:
cd apps/remix
npm run startThis serves on localhost:3000. Pair with a reverse proxy for SSL termination. To run on another port, use next -p <PORT> from apps/remix.
[Unit]
Description=freesign
After=network.target
[Service]
Environment=PATH=/path/to/your/node/binaries
Type=simple
User=www-data
WorkingDirectory=/var/www/freesign/apps/remix
ExecStart=/usr/bin/next start -p 3500
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.targetThe dev quickstart starts an Inbucket server in a docker container that captures all outgoing email locally. Web UI: http://localhost:9000. SMTP port: 2500.
If you are deploying to a cluster that uses only IPv6, pass -H :: to the start command:
docker run -it freesign:latest npm run start -- -H ::For k8s or docker-compose:
containers:
- name: freesign
image: freesign:latest
imagePullPolicy: IfNotPresent
command:
- npm
args:
- run
- start
- --
- -H
- '::'Wrap the script with with:env:
npm run with:env -- npm run myscriptFor npx:
npm run with:env -- npx myscriptThis loads variables from your .env and .env.local.
See the contribution guide.