Skip to content

Privacy & Compliance

SeeSee is self-hosted — your email data stays on your server. This page covers what data is stored, how to control it, and how SeeSee supports GDPR compliance.

What SeeSee stores

SeeSee logs metadata and content of sent emails. For each email:

DataStoredNotes
Recipient addresses (to, cc, bcc)YesStored as JSON arrays
Sender addressYes
Subject lineYesIndexed for full-text search
Email body (HTML and/or text)ConfigurableDepends on body storage mode
Body preview (first 500 chars)YesAlways generated
Email statusYessent, failed, queued, bounced, etc.
Provider nameYese.g., resend, sendgrid, smtp
Provider message IDYesFor cross-referencing with provider
Error messagesYesFor failed deliveries
Custom metadataYesArbitrary key-value pairs
TagsYesUser-defined categorization
TimestampsYesWhen logged and when created
Ingest methodYesapi or smtp

What SeeSee does NOT store

  • Attachments — MIME attachments are not stored (SMTP ingest skips them)
  • Original raw email — only parsed fields are stored
  • Recipient inbox data — SeeSee is log-only, it doesn’t access inboxes
  • Tracking data — no open tracking, click tracking, or analytics
  • User accounts — there’s one admin account, no multi-user data

Body storage modes

Each app can be configured with a body storage mode that controls how much email content is retained:

ModeWhat’s storedTypical sizeUse case
fullComplete HTML + text body10–100 KB/emailFull audit trail, debug HTML rendering
text_onlyText body only, no HTML1–5 KB/emailReduced storage, text content sufficient
previewFirst 500 characters only<1 KB/emailMinimal storage, just enough to identify emails

Set the mode per app:

Terminal window
# On creation
curl -X POST http://localhost:8080/api/v1/apps \
-u admin:password \
-H "Content-Type: application/json" \
-d '{"name": "Sensitive App", "body_storage_mode": "preview"}'
# Update existing app
curl -X PATCH http://localhost:8080/api/v1/apps/1 \
-u admin:password \
-H "Content-Type: application/json" \
-d '{"body_storage_mode": "text_only"}'

Retention policies

SeeSee automatically deletes old data based on configurable retention rules:

RuleVariableDefaultScope
Max countSEESEE_RETENTION_MAX_COUNT1000 per appPer-app
Max ageSEESEE_RETENTION_MAX_AGE_DAYS90 daysPer-app
Storage capSEESEE_RETENTION_MAX_STORAGE_MB500 MBGlobal
  • The most restrictive rule wins — if an email exceeds any limit, it’s deleted
  • Deletion is oldest-first
  • The cleanup scheduler runs every 60 minutes by default (configurable via SEESEE_RETENTION_CLEANUP_INTERVAL_MINUTES)
  • Per-app overrides can set stricter limits than the global defaults

Data location

All data is stored locally on your server:

  • Database: Single SQLite file at the configured SEESEE_DB_PATH (default /data/seesee.db)
  • No cloud services — SeeSee makes no outbound connections
  • No telemetry — no usage data is sent anywhere
  • Minimal external requests — the Web UI loads Tailwind CSS and Alpine.js from CDN for client-side rendering. No other external requests are made

GDPR considerations

Since SeeSee is self-hosted, you are the data controller. Here’s how SeeSee supports GDPR compliance:

Storage limitation (Article 5(1)(e))

  • Configurable retention policies automatically delete old data
  • Per-app storage modes let you minimize data for sensitive applications
  • Set aggressive retention for apps that process personal data

Data minimization (Article 5(1)(c))

  • Use text_only or preview body storage modes to reduce stored data
  • Only log the fields you need — all fields except to, from, and subject are optional

Right to erasure (Article 17)

  • DELETE /api/v1/emails — bulk delete emails matching search criteria (by app, status, provider, date range, or full-text query)
  • DELETE /api/v1/emails/{id} — delete individual emails
  • Automatic retention policies continuously delete old data

Right of access / Data portability (Articles 15 & 20)

  • GET /api/v1/export?recipient=user@example.com — export all emails associated with a recipient address
  • Searches across to, cc, and bcc fields (case-insensitive)
  • Supports JSON and CSV output formats
  • Includes email metadata and body content

Security (Article 32)

  • Admin credentials required for all access
  • API keys are hashed with bcrypt (plaintext never stored)
  • Session cookies are cryptographically signed
  • Database is a local file — standard filesystem security applies
  • Docker image runs as non-root user

Recommendations for production

  1. Set appropriate retention — don’t keep emails longer than necessary
  2. Use text_only or preview for apps handling sensitive content
  3. Secure access — use a strong admin password and HTTPS (via reverse proxy)
  4. Back up the database — and secure backups with the same care as the live data
  5. Document your use — if required by your privacy policy, note that sent email logs are retained
  6. Network isolation — run SeeSee on an internal network if possible; SMTP port 2525 should not be publicly exposed without authentication