Projects

Signet — PDF Editor

2026·6 min read

Next.js
TypeScript
pdf-lib
react-pdf
Tailwind CSS
LinkGitHub

A privacy-first PDF editor that runs entirely in your browser — no uploads, no servers, no account required.

A privacy-first PDF editor that runs entirely in your browser — no uploads, no servers, no account required.

🚀 Try Signet live →

No sign-up. No upload. Free forever — no trial, paywall, or watermark.

Signet demo — open a PDF, add text, type a signature, drag it into place, and export

Open a PDF, add text, draw or type a signature, and export the edited document — all processed locally on your device. Your files never leave your browser.

Signet is a free, open-source alternative to online PDF tools like Adobe Acrobat Fill & Sign, DocuSign, Smallpdf, and iLovePDF — with one key difference: there is no server. Edit and sign PDFs online without uploading them anywhere.

⭐ If Signet is useful to you, please star the repo — it helps others find it.

✨ Features

Editing

  • ✍️ Text annotations — place text anywhere with customizable font, size, and color
  • ✒️ Signatures, three ways:
    • Draw — sign with mouse or touchscreen
    • Type — pick from four elegant handwriting fonts (Caveat, Dancing Script, Great Vibes, Sacramento) with live preview
    • Upload — use an existing signature image (PNG, JPG, …)
  • 🖱️ Drag, touch & resize — move and resize text and signatures with mouse, touch, or keyboard nudging
  • 🔍 Zoom, fit-to-width & page navigation — page thumbnails and smooth zoom for multi-page documents
  • ↩️ Undo / redo with a 50-step history
  • 💾 Pixel-accurate export — download a PDF with all annotations permanently embedded; the original is never modified
  • ⌨️ Command palette & shortcuts — quick actions (⌘K) plus tool shortcuts

Experience

  • 🔁 Resume where you left off — the open PDF is cached in your browser (IndexedDB), so it’s restored automatically after a reload or a sign-in/sign-out round-trip. The bytes never leave your device.
  • 🎬 Animated, polished UI — tasteful Motion animations throughout (animated hero, scroll reveals, dialog/toast transitions) with full prefers-reduced-motion support
  • 📱 Fully responsive — adapts from phone to desktop, including the editor chrome
  • 🌗 Light & dark themes
  • 🔒 100% private — all PDF processing runs client-side; no file ever touches a server

Accounts (optional)

Sign-in is never required — the editor and export work fully anonymously. When the optional auth env vars are configured, signed-in users get extras (and PDF bytes still never leave the browser):

  • 🖋️ Saved signatures — save signatures to your account, then set a default, rename, or delete them and reuse anywhere
  • 🗂️ Recent documents — your annotation drafts sync to your account so you can pick up a document again (only the annotations + name sync; the PDF file itself stays on your device)
  • ⚙️ Synced preferences — theme, default text font, and default zoom follow your account across devices
  • 👤 Profile & settings page (/account) — one place to manage signatures, recent documents, and preferences
  • 🔑 Email/password or Google sign-in (Google optional)

👉 See the full feature list and the quick start guide.

🛠️ Tech Stack

Layer Technology
Framework Next.js 16 (App Router) + React 19
Language TypeScript 5
Styling Tailwind CSS 4
Animation Motion
PDF Export pdf-lib — annotation embedding
PDF Render react-pdf + PDF.js
Signatures react-signature-canvas
Local storage IndexedDB — caches the open PDF + annotation drafts on-device
Auth (opt.) Better Auth
Database (opt.) Drizzle ORM + Neon Postgres
Forms React Hook Form + Zod
Icons Lucide React

📖 Usage

Open a PDF

Drag and drop a PDF into the upload area on /editor, or click to browse.

Add Text

  1. Choose the Text tool
  2. Click anywhere on the PDF to place text
  3. Edit the text and adjust size and color in the properties panel
  4. Switch to the Select tool to drag, reposition, or resize

Add a Signature

  1. Open the Signature tool
  2. Draw, Type, or Upload your signature
  3. Insert it, then drag and resize it into position with the Select tool

Export

Click Export / Download — your edited document downloads with all annotations embedded. The original file is never modified.

Accounts (optional)

If the deployment has auth configured, sign up at /signup (email/password or Google) to unlock:

  • Save signatures — in the signature dialog, use Save to my account, then manage them under the Saved tab or on the Profile & settings page (/account): star a default, rename, or delete.
  • Recent documents — your annotation drafts auto-save to your account. Reopen one from /account or the editor’s start screen; if the PDF isn’t cached on the current device, you’ll be prompted to re-select the file and your edits are reapplied.
  • Preferences — set theme, default text font, and default zoom from /account; they follow your account.

Reach your account via the avatar menu in the top bar → Profile & settings.

⚙️ Environment Variables

Signet runs with zero configuration — no env vars are required for the core editor and export.

Required for a production deployment:

Variable Description
NEXT_PUBLIC_SITE_URL Public canonical site URL used for SEO metadata and the sitemap (e.g. https://your-domain.com)

Optional — enables account-saved signatures. Leave these unset and the site works fully with no accounts; auth is gated behind these vars and never required.

Variable Description
DATABASE_URL Postgres connection string (e.g. Neon)
BETTER_AUTH_SECRET Random secret (openssl rand -base64 32)
BETTER_AUTH_URL Auth base URL (e.g. http://localhost:3000)
NEXT_PUBLIC_APP_URL Public app URL used by the auth client
GOOGLE_CLIENT_ID (optional) Google OAuth client ID — adds "Continue with Google"
GOOGLE_CLIENT_SECRET (optional) Google OAuth client secret

Auth is enabled only when both DATABASE_URL and BETTER_AUTH_SECRET are present.

🐳 Self-host with Docker

docker build -t signet .
docker run -p 3000:3000 signet

That's it — the core editor needs zero configuration. To enable optional accounts, pass the auth env vars (see below) with -e.

▲ Deploy to Vercel

  1. Push the repo to GitHub and import it into Vercel.
  2. Set NEXT_PUBLIC_SITE_URL to your production domain.
  3. (Optional) Add the auth env vars above to enable account-saved signatures.
  4. Deploy — Vercel detects Next.js automatically.

Deploy with Vercel

🔒 Privacy

All PDF processing happens locally in your browser:

  • ✅ No file uploads — documents never leave your device
  • ✅ No server-side storage of your PDFs — the open file is cached only in your own browser (IndexedDB) so it can be restored after a reload
  • ✅ No account required to edit and export

With an optional account, the privacy model is unchanged for your files: only your annotation drafts (the placed text/signature data + document name), saved signatures, and preferences are stored — the PDF bytes are never uploaded.

🙌 Credits

Built by Mohamed Gado.