Deploy Papermark (No SaaS Keys)
Open-source DocSend: share PDFs with page-by-page analytics, no SaaS keys
Redis
Just deployed
Just deployed
papermark
Just deployed
redis-http
Just deployed
papermark-files
Bucket
Just deployed
Deploy and Host Papermark on Railway
Papermark is an open-source alternative to DocSend. Upload a PDF, share it as a link, and see who opened it and how long they spent on every page. This template runs the whole thing on Railway: no Vercel, Trigger.dev, Tinybird or Upstash accounts, and no API keys to collect before your first deploy.
About Hosting Papermark
Upstream Papermark is built for Vercel plus five hosted services: Trigger.dev for background jobs, Tinybird for analytics, Upstash for Redis and queues, and Vercel Blob or S3 for files. This template builds Papermark from source with small patches so all of that runs inside your Railway project:
- Background jobs (rendering PDF pages, notifications, exports) run inside the Papermark service.
- Page analytics are stored in the same Postgres database.
- Redis sits behind serverless-redis-http, the REST proxy Upstash publishes for plain Redis.
- Documents go to a private Railway bucket and are served through short-lived signed URLs.
You sign in with an admin email and a generated password, so the app works before you configure any email provider.
Common Use Cases
- Send a pitch deck to investors and see which slides they read and for how long
- Share sales proposals and contracts with a tracked link instead of an email attachment
- Publish a PDF behind a link you can turn off at any time
Dependencies for Papermark Hosting
- Postgres (app data and page analytics)
- Redis plus serverless-redis-http (rate limits, viewer sessions, upload locks)
- A Railway bucket (uploaded documents and rendered pages)
Deployment Dependencies
- Upstream source: https://github.com/papermark/papermark
- Image source and patches: https://github.com/hmseeb/papermark-railway
- Optional: a Resend API key and a verified sender domain for email sign-in links, viewer verification and view notifications
Implementation Details
First sign-in. The deploy form asks for ADMIN_EMAIL. After the deploy finishes, open the Papermark service's public URL, type that email, and type the value of ADMIN_PASSWORD. Copy it from the papermark service's Variables tab; it is generated per deploy. Your team is created on first sign-in.
Sharing a document. Upload a PDF on the Documents page. Pages are rendered in the background, and the upload bar shows the progress. Then create a link and send it. Each visit records time spent per page, and the document page shows the results.
Email (optional). Set RESEND_API_KEY and EMAIL_FROM (for example Papermark , on a domain you verified in Resend), then redeploy. That turns on email sign-in links for other users, viewer email verification and notifications. Anyone with an email address can then sign up, so leave email unset if only you should have access. Delete ADMIN_PASSWORD to turn password sign-in off once email works.
Google sign-in (optional). Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET, with the redirect URI https:///api/auth/callback/google.
Custom domain. Add it under the papermark service's Settings, set APP_HOST to the bare hostname (for example docs.example.com), and redeploy. Links you create afterwards use the new domain. Share links from a domain you own rather than the default *.up.railway.app address.
Limits you should know about:
- This is Papermark's free plan, as upstream ships it for self-hosting: 50 documents, 50 links and 1 user per team. Uploads accept PDFs, spreadsheets and images. Data rooms, Office files, custom domains on links and team members are paid features that upstream gates by plan, and this template leaves those gates alone.
- The image is pinned to upstream commit
bb93cfd(April 2026), the newest commit that builds from the public repository. Later upstream commits import modules that were never published. - Background jobs run in memory. A job still waiting when the service restarts (for example a delayed notification) is dropped. The daily cleanup of expired exports does not run.
- Bulk ZIP downloads and AI features need AWS Lambda and OpenAI and are not wired up.
Troubleshooting
- Boot log says a
NEXT_PRIVATE_UPLOAD_*variable is empty: Railway occasionally fails to resolve bucket references on a template's first deploy. Open the papermark service's Variables, re-save eachNEXT_PRIVATE_UPLOAD_*andNEXT_PRIVATE_ARCHIVE_BUCKETvariable unchanged, then redeploy. - "Wrong email or password": the email must equal
ADMIN_EMAIL(case does not matter) and the password must equalADMIN_PASSWORDexactly. - Upload bar stays on "Converting document": check the papermark logs for
[trigger-shim]lines. Each page is logged as it renders.
Upgrading. Change the papermark service's image tag when a new ghcr.io/hmseeb/papermark-railway tag is published. Migrations run on boot.
Why Deploy Papermark on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying Papermark on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
Template Content
Redis
redis:8.2.1ADMIN_EMAIL
Your email address. You sign in with it and ADMIN_PASSWORD.
redis-http
hiett/serverless-redis-http:0.0.10papermark-files
Bucket
