See what your apps sent. Lightweight, self-hosted sent email log aggregator with search UI.
SeeSee receives email log entries from your applications via REST API or SMTP, stores them with configurable retention in SQLite, and provides a clean web UI to search and inspect them. Think Dozzle (Docker log viewer) but for outbound email.
One instance, all your apps. Search across every application's sent emails in one view.
docker run -d \
--name seesee \
-p 8080:8080 \
-p 2525:2525 \
-v seesee-data:/data \
-e SEESEE_ADMIN_PASSWORD=changeme \
ghcr.io/brandonjp/seesee-email:latestOpen http://localhost:8080 and log in with admin / changeme.
services:
seesee:
image: ghcr.io/brandonjp/seesee-email:latest
restart: unless-stopped
ports:
- "8080:8080"
- "2525:2525"
volumes:
- seesee-data:/data
environment:
SEESEE_ADMIN_PASSWORD: "${SEESEE_ADMIN_PASSWORD:-changeme}"
volumes:
seesee-data:- Your apps send email through their normal provider (Resend, SendGrid, SES, SMTP, etc.)
- After sending, they log the email to SeeSee via a simple HTTP POST or SMTP ingest
- SeeSee stores the metadata and body in SQLite with full-text search
- You search and inspect sent emails through the web UI
Your App → sends email via provider → logs to SeeSee → search & inspect in browser
curl -X POST http://localhost:8080/api/v1/log \
-H "Authorization: Bearer ss_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": ["user@example.com"],
"from": "app@example.com",
"subject": "Welcome!",
"body_text": "Thanks for signing up.",
"status": "sent",
"provider": "resend"
}'See examples/ for PHP/WordPress, Python, Node.js, and cURL integration snippets.
- REST API —
POST /api/v1/logfrom any language - SMTP Ingest — Point your app's SMTP at SeeSee on port 2525
- Full-Text Search — SQLite FTS5 across subject, body, addresses
- Multi-App — One instance serves all your applications
- Web UI — Dashboard, email list, detail view with HTML preview
- Configurable Retention — Max count, max age, storage cap per app
- Body Storage Modes — Full, text-only, or preview-only per app
- Dark/Light Mode — System preference with manual toggle
- Single Container — Docker, no external dependencies
Full documentation at seesee.email — getting started, API reference, deployment guides, integrations, and more.
Auto-generated OpenAPI docs also available at /docs on your running instance.
- Storage: All dates stored in UTC. Do not change this.
- Admin display: Controlled by
SEESEE_DISPLAY_TIMEZONEenv var (default:UTC). IANA timezone string (e.g.America/Chicago). Used in admin views viaseesee.timezonehelpers and thedisplay_dtJinja2 filter. - User display: Dates are displayed in the browser's local timezone via client-side JavaScript (
Intl.DateTimeFormat). Tooltips show both local and UTC times. - API responses: Always UTC ISO 8601.
Python 3.12+ / FastAPI / SQLite FTS5 / Jinja2 + Tailwind CSS + Alpine.js / Docker
python -m venv .venv
source .venv/bin/activate # bash / zsh
# source .venv/bin/activate.fish # fish
pip install -e ".[dev]"
pytestSee CONTRIBUTING.md for development setup and guidelines.