Signaturmonster is a self-hosted SMTP proxy that sits between your email client
(e.g. Thunderbird) and the outgoing mail server. It intercepts every outgoing email
and automatically enriches it with HTML signatures, corporate identity branding
and animated GIF banners β without any changes to the email client or mail server.
Architecture
Signaturmonster consists of five Docker containers running as a Compose stack:
Architecture
# Incoming from email client
Thunderbird / Outlook
β
βΌ Port 587
SMTP Proxy# Python / aiosmtpd β intercepts mails, injects signature
β
βΌ internal
Backend API# FastAPI + SQLite β signatures, rules, CI profiles
β
ββ Frontend# React + nginx β web UI on port 8080
β
ββ Updater# Checks ghcr.io for new versions
β
βΌ Forwarded
Real mail servers (SMTP, port 465/587)
π‘
No invasive changes needed: In the email client, you only change
the SMTP server to the IP of the device running Docker
(192.168.x.x:587). Authentication, passwords and mail server
configuration remain unchanged β Signaturmonster passes credentials through transparently.
Requirements
Requirements
To run Signaturmonster you need:
Docker β₯ 24 and Docker Compose β₯ 2.20
A device on the local network with at least 512 MB RAM and Docker support
An outgoing SMTP server (e.g. Gmail SMTP, Postfix, Hetzner Mail, your own server)
Port 587 free on the host or configurable
Port 8080 for the web UI reachable on the local network (can be changed)
β¨
Ideal for home server or office network: Signaturmonster is designed
for operation on a local network. Well suited are for example a
Proxmox LXC container, a Raspberry Pi (Pi 4 or later),
a NAS with Docker support (Synology, QNAP, TrueNAS SCALE)
or any other hardware running Docker.
Check Docker version
bash
docker --version
docker compose version
Installation
Installation
Signaturmonster is set up via an installer β no manual cloning,
no editing of configuration files. The installer checks Docker,
asks for your SMTP credentials, downloads all necessary files and starts
the containers automatically.
The installer runs interactively and guides you step by step through the setup.
It works on all common Linux distributions as well as macOS.
For Proxmox LXC, Raspberry Pi or NAS systems, a simple
SSH terminal is sufficient.
Windows
Open PowerShell as Administrator and run the following command:
Prerequisite: Docker Desktop must be installed and running
before you execute the installer.
What the installer sets up
The installer asks for the following values interactively:
Input
Description
Default
Installation directory
Where docker-compose.yml, .env and data are stored
~/signaturmonster
RELAY_HOST
Hostname of your outgoing mail server (e.g. smtp.gmail.com)
β
RELAY_PORT
Mail server port (587 STARTTLS, 465 SSL)
587
RELAY_USER
Username / email address for the mail server
β
RELAY_PASS
Password for the mail server
β
SMTP Port (Proxy)
Port that Thunderbird & co. connect to
2587
Web Dashboard Port
Port for the web UI in the browser
8080
The installer then downloads docker-compose.yml and nginx.conf
directly from GitHub, writes the .env file and starts the stack with
docker compose pull && docker compose up -d.
A random SECRET_KEY is generated automatically.
At the end the installer displays the addresses:
text
β Signaturmonster is running!
Dashboard: http://192.168.1.42:8080
SMTP Port: 192.168.1.42:2587 β enter this in Thunderbird
π‘
On first start the backend container automatically creates the SQLite database
in the data/ directory below the installation folder. Back up this
directory regularly β it contains all signatures, rules and user data.
Default login: monster / monster.
Installation
Proxmox LXC Container Setup
Proxmox VE is a popular home server platform on which Signaturmonster runs
particularly well. An LXC container is more lightweight than a full VM
and shares the kernel of the host β ideal for permanently running services.
This guide walks you step by step from container creation to a running Signaturmonster.
β οΈ
Nesting required: Docker inside LXC requires the
Nesting option (and optionally FUSE). Without this setting,
Docker startup will fail. The required steps are described below.
Step 1 β Create LXC container
Log in to the Proxmox web interface and select the desired node
Click Create CT in the top right
General: Assign a CT ID (e.g. 200) and a descriptive
hostname (e.g. signaturmonster)
Template: Choose a recent template β recommended is
Debian 12 or Ubuntu 22.04 LTS.
Templates can be downloaded in the Proxmox web interface under
Datacenter β Storage β CT Templates.
Disk: At least 8 GB β 8 GB is easily sufficient
for Docker images and Signaturmonster data, 16 GB gives more headroom
CPU: At least 1 core, recommended 2 cores
Memory: At least 512 MB,
recommended 1024 MB (1 GB) β gives the Docker stack comfortable room
Network: Select vmbr0 (or your LAN bridge),
set DHCP or assign a fixed IP from your subnet.
A fixed IP is recommended, since Thunderbird and other clients need a stable address.
Click Finish β do not start the container yet
Parameter
Minimum
Recommended
CPU Cores
1
2
RAM
512 MB
1024 MB
Disk
8 GB
16 GB
OS Template
Debian 12 or Ubuntu 22.04 LTS
Network
Fixed IP recommended (e.g. 192.168.1.50)
Step 2 β Enable Nesting (for Docker)
Before starting the container, the Nesting option must be enabled.
Without it, Docker cannot create its own network namespace.
Select the newly created container in the Proxmox web interface
Go to Options
Double-click on Features
Check the Nesting checkbox
Optional but recommended: also enable FUSE
Click OK
π‘
Alternatively, Nesting can be set directly in the LXC configuration file.
Open /etc/pve/lxc/<CT-ID>.conf on the Proxmox host
and add the following line:
Start the container and open the console via the Proxmox web interface or SSH.
π‘
Choose your OS: Expand the matching script for your
template β Debian 12 or Ubuntu 22.04 LTS.
Both variants install Docker CE including the Compose plugin.
The installer asks interactively for your SMTP credentials and sets everything up.
At the end it displays the addresses where you can reach the dashboard
and what to enter in Thunderbird. Enter the fixed IP address
of the LXC container there (not localhost), so all devices on the
network can reach the proxy.
π‘
Tip: So that Signaturmonster automatically restarts after
a Proxmox host reboot, set Start/Shutdown order β Start at boot
to Yes in the container options.
Docker itself starts automatically (systemd unit), and the containers have
the restart policy unless-stopped.
Configuration
Configuration
Create SMTP Accounts
Before Thunderbird or another email client can use the proxy, at least one
SMTP account must be created. These credentials are independent
of the web UI users and are used exclusively for authentication at the proxy.
Open the web UI and navigate to Configuration β SMTP Accounts
Click Add Account
Enter a username (e.g. the employee's first name or email address) and a password
Save β the account is immediately active
You can create as many accounts as you like β e.g. one per employee or
one shared account for the whole team.
π‘
Under Configuration β SMTP Accounts you will also find the
TLS certificate for download. Since the proxy uses a
self-signed certificate, it must be imported into Thunderbird once
(or Thunderbird will ask automatically on the first connection attempt).
Set up Thunderbird
Change the outgoing mail server in Thunderbird to the Signaturmonster proxy.
You find this setting under
Account Settings β Outgoing Server (SMTP).
Setting
Value
Server address
IP of the device running Signaturmonster
Port
2587 (default, can be changed during installation)
Connection security
STARTTLS
Authentication method
Normal password
Username
The username created in Configuration β SMTP Accounts
β οΈ
The proxy enforces STARTTLS and authentication.
As credentials you enter the username and password created in
Configuration β SMTP Accounts β
not the credentials of your actual mail server.
Create first signature
Open the web UI at http://localhost:8080 and navigate to
Signatures β New Signature.
Give the signature a name (e.g. "Default Signature")
Add blocks via Drag & Drop from the left palette:
Text block β free text, name, title, department
Image block β logo, profile picture
Link block β website, LinkedIn, etc.
Social block β pre-built social media icons
Divider β horizontal line
Banner block β GIF banner (from the banner editor)
Configure each block in the right-hand sidebar
Use the live preview to see the result
Click Save
Using Variables
In text blocks you can use variables that are automatically filled from the
sender database when an email is sent. Variables are wrapped in double curly braces:
Values are stored per sender in Settings β Senders
and automatically substituted when sending.
Create CI Profile
CI profiles define the visual appearance of a brand:
primary color, font, logo, background color for the mail body.
Via the Mail Beautifier, the incoming mail body is cleaned
(foreign signatures removed) and embedded in your CI template.
Navigate to Corporate Identity β New CI Profile
Upload the company logo (PNG/SVG, max. 2 MB)
Choose primary color, accent color and background color
Choose the font (Google Fonts are supported)
Enable the Mail Beautifier for this profile
Save β the profile is now available in the signature rules
Configure Rules
Rules control which signature (and which CI profile) is used for which sender.
Without a matching rule, an email is forwarded unchanged.
Navigate to Rules β New Rule
Enter a sender email address (or a wildcard pattern, e.g. *@example.com)
Choose the signature to apply
Optional: select a CI profile
Optional: enable disclaimer
Set priority (lower number = higher priority)
Save and activate
π‘
Multiple rules can exist for the same sender. The rule with the highest priority
(lowest priority number) always applies. This lets you combine a general domain
rule with a specific sender rule.
Add Disclaimer
Disclaimers are appended to the end of every email. They can be stored as HTML
(with formatting) and as a plaintext variant. Signaturmonster automatically
inserts the correct variant depending on the mail format.
Navigate to Disclaimer β New Disclaimer
Enter the HTML text (formatting like <b>, <a> is allowed)
Enter the plaintext variant
Assign the disclaimer to one or more rules
html β Disclaimer example
<!-- HTML disclaimer -->
<p style="font-size:11px;color:#888">
This email and its attachments are confidential and intended solely
for the addressee. If you have received this email in error, please
inform the sender immediately.
<a href="https://example.com/impressum">Legal Notice</a>
</p>
Banners & Animations
Banners & Animations
Create Banner
The integrated GIF generator creates animated GIF banners directly in the browser,
which are embedded as a block in a signature.
Navigate to Banners β New Banner
Give the banner a name and set the dimensions (recommended: 600Γ120 px)
Add scenes (at least one scene is required)
Configure each scene in the scene editor
Click Generate preview to render the GIF
Save β the banner is now available in the signature designer as a banner block
Scene Editor
Each scene is a frame in the GIF. The scenes play in sequence
and can be reordered via Drag & Drop.
Background types
Type
Description
Solid color
Single-color background, freely selectable color
Gradient
Linear gradient with two colors and direction
Image
Upload a background image (JPG/PNG)
Pattern
Geometric pattern (dots, lines, grid)
Text animations
Animation
Description
Static
Text appears immediately, stays visible for the whole scene
Fade in
Text fades from transparent to visible
Slide in left
Text slides in from the left
Slide in right
Text slides in from the right
Slide in top
Text drops in from above
Scene settings
Duration: How long the scene is displayed (in seconds, e.g. 2.0)
Transition effect: Fade, Cut (hard) or Slide between scenes
Transition time: Duration of the transition in seconds
Texts: Multiple text elements per scene, each with its own rich text editor
β¨
Best practice: Keep Scene 1 clear and informative β
it is used as the static PNG for Outlook clients.
All further scenes can be more animated and attention-grabbing.
Outlook Compatibility
Outlook does not support animated GIFs in emails. Signaturmonster solves this
automatically with MSO Conditional Comments and CID inline embedding:
Both images β the animated GIF and the static PNG fallback from scene 1 β
are embedded as CID inline attachments in the email.
This means:
No external URLs β no tracking, no firewall issues
Images are always displayed, even without an internet connection
No image loading required when opening the email
π‘
CID Embedding: The cid: protocol references
attachments within the same email. Common email clients (Thunderbird, Apple Mail,
Gmail, Outlook) fully support CID references.
Advanced
Advanced
Users & Roles
Signaturmonster supports multiple users with different roles.
Users are managed in the web UI under Settings β Users.
Roles
Role
Permissions
Admin
Full access: create users, all settings, trigger updates
Editor
Edit signatures, banners, CI profiles and rules; no user management
Viewer
Read-only β no changes possible; useful for audits
SMTP users
Each sender (SMTP user) has their own entry under
Settings β Senders. Profile data (for variables)
and SMTP credentials for the real mail server are stored there.
Updates
The updater service regularly checks the GitHub Container Registry
(ghcr.io/choldermann) for new image versions.
When new versions are found, a notification appears in the web UI.
Manual update
bash
# Pull new images
docker compose pull
# Restart stack with new images
docker compose up -d
# Clean up old (unused) images
docker image prune -f
Automatic update
The built-in updater service can be configured to automatically apply updates.
This is controlled via an environment variable:
Warning: Automatic updates require that the updater container
has access to the Docker socket (/var/run/docker.sock).
Be aware of the security implications in production environments.
Security & Cryptography
S/MIME and PGP β Architectural clarification
Signaturmonster is an SMTP proxy that modifies email content (signature, branding, disclaimer).
This is structurally incompatible with end-to-end encryption (S/MIME, PGP),
whose core claim is: "I, the sender, signed exactly this content."
A proxy that modifies content and then signs it cryptographically could not make that claim β
it already changed the content. This is not a bug, but a fundamental conflict that all
content-modifying mail systems share β including commercial cloud providers like Exclaimer or CodeTwo.
π‘
Self-hosted advantage: With cloud services, a third party modifies your emails β
that's a real trust problem. Signaturmonster runs on your own infrastructure.
The modification happens within your controlled network before the email leaves your system β
comparable to an Exchange server that appends signatures server-side.
Workaround for mandatory E2E signing
If you require personal end-to-end signing (e.g. law firms, authorities with QES requirements under eIDAS):
Set the cryptographic signature in your email client before the email is sent to the proxy
Disable all proxy functions for that email using #sm:off
The #sm:off command is written on its own line in the email body β
the proxy then forwards the email unmodified. The command itself is removed before delivery.
β¨
Planned: Gateway signing at the organizational level (organization signature applied after proxy processing)
is planned for a future release. This proves "Organization X sent this email in this exact state" β
not personal E2E, but sufficient for many compliance requirements.
Mail Queue & Storage
Incoming emails are received by the SMTP proxy and first stored in a local SQLite queue
on your server before processing and forwarding begins.
The emails remain entirely within your infrastructure β there is no connection to external services
for email delivery at any point.
Queue overview in the web UI
Under System β Mail Queue, all entries are visible with status, sender, recipient and subject:
Status
Meaning
pending
Waiting for processing or retry
sent
Successfully delivered
failed
All retry attempts exhausted
Downloading emails
Individual emails can be downloaded directly from the queue overview β
useful for debugging, audit purposes or reviewing failed delivery attempts.
Failed entries can also be manually re-queued.
Retry strategy
On delivery failure, the proxy automatically retries with exponential backoff:
Attempt
Wait time
1st failure
1 minute
2nd failure
5 minutes
3rd failure
30 minutes
4th failure
2 hours
5th failure (final)
Status failed + bounce notification to sender
π‘
Privacy note: Queue storage should be considered in your data protection concept,
as email content is held on the server for the duration of processing.
Successfully delivered emails can be manually purged via System β Mail Queue β Clear all sent.
Troubleshooting
Here are the most common problems and their solutions:
SMTP connection fails
Check the logs of the SMTP proxy container:
bash
docker compose logs smtp-proxy
Common causes:
Port 587 is already in use on the host β change PROXY_PORT in .env
SMTP_HOST or SMTP_PORT incorrectly configured
Firewall blocking the outgoing port
Web UI not reachable
bash
# Check status of all containers
docker compose ps
# Show nginx logs
docker compose logs nginx
# Show backend logs
docker compose logs backend
Make sure port 8080 (or your configured port) is not blocked
The frontend container needs a moment to start on first run
Signature is not injected
Check that a rule for the sender exists and is active
Make sure the email was sent via the Signaturmonster proxy (port 587)
Check the logs: docker compose logs smtp-proxy
GIF banner not displayed in Outlook
This is expected behavior β Outlook shows the static PNG fallback
Check that Scene 1 is correct and visually meaningful
Make sure the banner is embedded as CID (default behavior)
Database reset
bash
# Warning: deletes all data!
docker compose down
rm -rf ./data
docker compose up -d
β οΈ
Backup: Create regular backups of the ./data directory.
It contains the entire SQLite database with all signatures, rules and users.