Signaturmonster β€” Documentation

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

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

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.

Linux & macOS

Open a terminal and run the following command:

bash
curl -fsSL https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.sh | bash

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:

powershell
iex (irm https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.ps1)
✨
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.

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

  1. Log in to the Proxmox web interface and select the desired node
  2. Click Create CT in the top right
  3. General: Assign a CT ID (e.g. 200) and a descriptive hostname (e.g. signaturmonster)
  4. 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.
  5. Disk: At least 8 GB β€” 8 GB is easily sufficient for Docker images and Signaturmonster data, 16 GB gives more headroom
  6. CPU: At least 1 core, recommended 2 cores
  7. Memory: At least 512 MB, recommended 1024 MB (1 GB) β€” gives the Docker stack comfortable room
  8. 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.
  9. Click Finish β€” do not start the container yet
ParameterMinimumRecommended
CPU Cores12
RAM512 MB1024 MB
Disk8 GB16 GB
OS TemplateDebian 12 or Ubuntu 22.04 LTS
NetworkFixed 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.

  1. Select the newly created container in the Proxmox web interface
  2. Go to Options
  3. Double-click on Features
  4. Check the Nesting checkbox
  5. Optional but recommended: also enable FUSE
  6. 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:
/etc/pve/lxc/200.conf
lxc.apparmor.profile: unconfined
features: nesting=1,fuse=1

Step 3 β€” Start container and install Docker

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.

Step 4 β€” Install Signaturmonster

With Docker running, the Signaturmonster installer can be executed directly inside the container:

bash
curl -fsSL https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.sh | bash

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

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.

  1. Open the web UI and navigate to Configuration β†’ SMTP Accounts
  2. Click Add Account
  3. Enter a username (e.g. the employee's first name or email address) and a password
  4. 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).

SettingValue
Server addressIP of the device running Signaturmonster
Port2587 (default, can be changed during installation)
Connection securitySTARTTLS
Authentication methodNormal password
UsernameThe 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.

  1. Give the signature a name (e.g. "Default Signature")
  2. 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)
  3. Configure each block in the right-hand sidebar
  4. Use the live preview to see the result
  5. 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:

html
{{vorname}} {{nachname}}
{{titel}} Β· {{abteilung}}
{{firma}}

Tel: {{telefon}}
Mobile: {{mobil}}
{{webseite}}

Available variables:

VariableMeaning
{{vorname}}First name of the sender
{{nachname}}Last name of the sender
{{titel}}Title / academic degree
{{abteilung}}Department
{{firma}}Company name
{{telefon}}Phone number
{{mobil}}Mobile number
{{email}}Email address of the sender
{{webseite}}Website URL
{{linkedin}}LinkedIn profile URL
{{strasse}}Street address
{{ort}}City with postal code

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.

  1. Navigate to Corporate Identity β†’ New CI Profile
  2. Upload the company logo (PNG/SVG, max. 2 MB)
  3. Choose primary color, accent color and background color
  4. Choose the font (Google Fonts are supported)
  5. Enable the Mail Beautifier for this profile
  6. 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.

  1. Navigate to Rules β†’ New Rule
  2. Enter a sender email address (or a wildcard pattern, e.g. *@example.com)
  3. Choose the signature to apply
  4. Optional: select a CI profile
  5. Optional: enable disclaimer
  6. Set priority (lower number = higher priority)
  7. 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.

  1. Navigate to Disclaimer β†’ New Disclaimer
  2. Enter the HTML text (formatting like <b>, <a> is allowed)
  3. Enter the plaintext variant
  4. 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>

Advanced

Users & Roles

Signaturmonster supports multiple users with different roles. Users are managed in the web UI under Settings β†’ Users.

Roles

RolePermissions
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:

.env
# Enable automatic updates (true/false)
AUTO_UPDATE=true

# Check interval in minutes (default: 60)
UPDATE_INTERVAL=60
⚠️
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):

  1. Set the cryptographic signature in your email client before the email is sent to the proxy
  2. 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:

StatusMeaning
pendingWaiting for processing or retry
sentSuccessfully delivered
failedAll 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:

AttemptWait time
1st failure1 minute
2nd failure5 minutes
3rd failure30 minutes
4th failure2 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.