Seitengenaues Tracking mit Papermark selbst hosten
Dokumente teilen und dabei genau wissen, wer wie liest.
Ein Link in einer E-Mail lässt sich weder tracken noch nachträglich sperren. Genau da setzt Papermark an: Dokumente werden nicht mehr als Anhang verschickt, sondern über einen Link geteilt, der zurückblickt und genau festhält, wer wann welche Seite wie lange betrachtet hat.
Was ist Papermark
Papermark ist eine quelloffene Alternative zu DocSend, die auf Next.js, PostgreSQL, Prisma und NextAuth.js aufbaut und wahlweise mit Vercel Blob oder S3-kompatiblem Objektspeicher betrieben werden kann. Das Projekt richtet sich ursprünglich an Gründer, Vertriebsteams und M&A-Berater, die Pitch-Decks, Verträge oder Due-Diligence-Unterlagen mit granularen Zugriffsrechten, Echtzeit-Analysen und durchgängiger Verschlüsselung teilen wollen. Für Selfhoster ist vor allem interessant, dass der Kern der Anwendung unter der AGPLv3-Lizenz öffentlich einsehbar ist und beliebig angepasst werden darf.
Wichtig für den produktiven Einsatz: Ein Teil der fortgeschrittenen Funktionen liegt im separaten ee-Verzeichnis (Enterprise Edition) des Repositories. Dazu zählen unter anderem granulare Data-Room-Berechtigungen, SAML-SSO, KI-gestützte Q&A-Funktionen, Workflow-Automatisierung und Dataroom-Einladungen. Dieser Code ist zwar im Repository sichtbar und lässt sich zu Entwicklungszwecken ausführen, für den produktiven bzw. kommerziellen Betrieb ist dafür aber eine separate Commercial License erforderlich. Die Kernfunktionen rund um Link-Sharing, Passwortschutz, Wasserzeichen und Seiten-Analytics gehören hingegen zum frei nutzbaren AGPLv3-Teil.

Die Tracking-Funktionen im Detail
Der eigentliche Mehrwert gegenüber einem einfachen Datei-Upload liegt in der Auswertung. Papermark protokolliert nicht nur, ob ein Dokument geöffnet wurde, sondern wie es gelesen wurde.
Seitenbasierte Analytics. Jede einzelne Seite eines PDFs wird separat getrackt. Das Dashboard zeigt, welche Seiten überdurchschnittlich lange betrachtet wurden und wo Betrachter das Dokument vorzeitig verlassen haben - ähnlich wie eine Heatmap für Dokumente. Diese seitengenaue Auswertung gehört zu den zentralen Merkmalen der Plattform und lässt sich über die Papermark-API auch programmatisch als Verweildauer pro Seite abrufen.

Betrachter-Identifikation. Sobald ein Link mit E-Mail-Pflicht oder E-Mail-Verifizierung versehen ist, lässt sich jeder einzelne Zugriff einer echten Person zuordnen, statt nur eine anonyme Zugriffszahl zu sehen. In Kombination mit dem Audit-Log wird bei NDA-gesicherten Links sogar protokolliert, welcher Name, welche E-Mail-Adresse, welcher Zeitstempel und welche Version der Vereinbarung akzeptiert wurde - das macht Zugriffe im Streitfall nachvollziehbar.


Echtzeit-Benachrichtigungen. Wird ein Dokument geöffnet, verschickt Papermark eine sofortige E-Mail-Benachrichtigung, sodass unmittelbar nachverfolgt werden kann, wann ein Empfänger reagiert hat.
Geräte- und Standortdaten. Neben Verweildauer und Downloads werden auch Geräteklasse und grobe geografische Herkunft der Betrachter erfasst, was insbesondere bei mehreren parallel verschickten Links hilft, das tatsächliche Interesse einzuschätzen.
Dynamische Wasserzeichen. Jede Seite kann mit einem Wasserzeichen versehen werden, das die E-Mail-Adresse oder individuelle Betrachterinformationen des jeweiligen Empfängers einblendet. Das wirkt doppelt: rechtlich über die NDA und praktisch, weil eine Weitergabe des Dokuments sofort zur Quelle zurückverfolgbar ist.
Wer bereits mit Rybbit Web-Analytics selbst hostet, wird das Prinzip wiedererkennen - nur dass Papermark nicht den Traffic einer ganzen Website, sondern das Leseverhalten innerhalb eines einzelnen Dokuments auswertet.
Sicherheits- und Zugriffsfunktionen
Neben dem reinen Tracking bringt Papermark mehrere Schutzschichten mit, die sich pro Link unabhängig voneinander aktivieren lassen:
- Passwortschutz für den Zugriff auf den Link
- E-Mail-Verifizierung, bevor ein Dokument angezeigt wird
- Ablaufdaten, nach denen ein Link automatisch ungültig wird
- Allow- und Block-Listen für bestimmte Domains oder E-Mail-Adressen
- Download-Sperre, sodass ein Dokument nur im Browser angesehen, aber nicht heruntergeladen werden kann
- NDA-Gate, das eine Zustimmung vor dem ersten Seitenaufruf erzwingt
Diese Kombination ergibt zusammen mit den Tracking-Funktionen ein Sicherheitsmodell, das deutlich über das hinausgeht, was ein einfacher Cloud-Speicher-Link normalerweise bietet.
Integration in die bestehende Infrastruktur
Papermark fügt sich sauber in das Setup ein, das im Grundlagenartikel zum eigenen Webserver beschrieben wurde: ein Reverse-Proxy im Netz web, dahinter die eigentliche Anwendung, und eine Datenbank im isolierten Netz backend, das nicht direkt aus dem Internet erreichbar ist. Die automatische Aktualisierung der Container läuft dabei über Watchtower, erkennbar am Label com.centurylinklabs.watchtower.enable=true.
Zwei Punkte sind bei der Planung besonders relevant:
Objektspeicher. Papermark benötigt zwingend S3-kompatiblen Speicher für die hochgeladenen Dokumente - ein reines Dateisystem-Volume wird nicht unterstützt. Wer auf einen externen Cloud-Anbieter verzichten möchte, kann stattdessen MinIO im eigenen Netz betreiben und dort über NEXT_PRIVATE_UPLOAD_ENDPOINT einbinden. Damit bleiben alle hochgeladenen Dokumente vollständig innerhalb der eigenen Infrastruktur.
Transaktionale E-Mails. Für Magic-Link-Login, Einladungen und die Betrachter-Benachrichtigungen ist standardmäßig ein Resend-API-Schlüssel vorgesehen. Das ist der einzige Baustein im Stack, der zwingend an einen externen SaaS-Dienst angebunden ist, da die Absenderadresse fest im Code hinterlegt ist und sich nicht ohne Weiteres auf einen eigenen SMTP-Server umstellen lässt, ohne den Quellcode selbst anzupassen. Wer das vermeiden möchte, muss die Datei mit der Mail-Logik im eigenen Fork ändern - für die meisten Selfhosting-Szenarien dürfte es aber genügen, dass ausschließlich Benachrichtigungs-Metadaten (nicht der Dokumentinhalt) über Resend laufen.
Docker-Compose für die eigene Umgebung
Die folgende Konfiguration übernimmt die Netzwerk-Topologie aus dem Grundlagenartikel und korrigiert die Variablennamen auf das tatsächliche Papermark-Schema:
###############################################
#### Papermark #####
###############################################
services:
papermark-web:
image: ghcr.io/mfts/papermark:latest
container_name: papermark-web
restart: unless-stopped
depends_on:
papermark-postgres:
condition: service_healthy
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:DEIN_DB_PASSWORT@papermark-postgres:5432/papermark?schema=public
- NEXTAUTH_SECRET=DEIN_NEXTAUTH_SECRET_HIER
- NEXTAUTH_URL=https://papermark.deine-domain.de
- NEXT_PUBLIC_BASE_URL=https://papermark.deine-domain.de
# Storage: S3-kompatibel, z.B. eigenes MinIO oder AWS S3
- NEXT_PUBLIC_UPLOAD_TRANSPORT=s3
- NEXT_PRIVATE_UPLOAD_BUCKET=papermark-dokumente
- NEXT_PRIVATE_UPLOAD_REGION=eu-central-1
- NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=DEIN_ACCESS_KEY
- NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY=DEIN_SECRET_KEY
- NEXT_PRIVATE_UPLOAD_DISTRIBUTION_HOST=papermark-dokumente.s3.eu-central-1.amazonaws.com
# Optional bei MinIO oder R2:
# - NEXT_PRIVATE_UPLOAD_ENDPOINT=https://minio.deine-domain.de
# Transaktionale E-Mails
- RESEND_API_KEY=re_xxxxxxxxxxxxx
networks:
- web # Für den Reverse-Proxy
- backend # Für die DB-Verbindung
labels:
- "com.centurylinklabs.watchtower.enable=true"
papermark-postgres:
image: postgres:16-alpine
container_name: papermark-postgres
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=DEIN_DB_PASSWORT
- POSTGRES_DB=papermark
volumes:
- ./papermark/postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
- backend # Kein direkter Web-Zugriff
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
web:
external: true
backend:
external: true
Der Redis-Dienst aus der ursprünglichen Planung entfällt hier bewusst: Papermark spricht für sein Rate-Limiting die REST-Schnittstelle von Upstash an, nicht das klassische Redis-Protokoll. Ein selbst gehosteter redis:7-alpine-Container würde von der Anwendung ohne einen zusätzlichen REST-Proxy schlicht nicht angesprochen. Für ein Homelab-Setup mit überschaubarer Nutzerzahl ist das Fehlen dieses Rate-Limitings verschmerzbar; wer darauf nicht verzichten möchte, müsste einen kompatiblen Proxy wie serverless-redis-http zusätzlich betreiben.
Für NEXTAUTH_SECRET bietet sich ein zufälliger, ausreichend langer String an:
# Generiert einen zufälligen NEXTAUTH_SECRET für Papermark
openssl rand -hex 32
Erste Schritte nach dem Start
Nach docker compose up -d wird der Reverse-Proxy - wie im Grundlagenartikel beschrieben - auf den Container papermark-web und Port 3000 verwiesen, inklusive gültigem SSL-Zertifikat. Beim ersten Aufruf der konfigurierten Domain wird ein Account angelegt, über den anschließend Dokumente hochgeladen und Links erzeugt werden können. Für jeden erzeugten Link lassen sich Passwortschutz, E-Mail-Verifizierung, Ablaufdatum und Wasserzeichen einzeln im Link-Editor einstellen, bevor der Link verschickt wird.
Fazit
Papermark verwandelt das simple Teilen einer Datei in einen nachvollziehbaren, absicherbaren Vorgang mit seitengenauer Auswertung, Echtzeit-Benachrichtigungen und Wasserzeichen. Für den Selfhosting-Betrieb müssen lediglich die tatsächlichen Umgebungsvariablen für Objektspeicher beachtet und die Lizenzgrenze zwischen AGPLv3-Kern und kommerziell lizenzierten Enterprise-Funktionen im Blick behalten werden. Wer bereits Reverse-Proxy und S3-kompatiblen Speicher im eigenen Netz betreibt, hat den größten Teil der Arbeit damit bereits erledigt.