Welcome to MailSlick

MailSlick creates, manages and deploys email signatures. This guide covers everything in the app, in the order you are likely to need it.

Who does what

Role What they can do
Owner The account created when MailSlick was first set up. Does everything an admin can, and also invites people, resets passwords and decides who else is an admin.
Admin Manages the organisation's signatures: the template everyone shares, groups, individual changes, and the Microsoft 365 connection.
Staff Signs in and designs their own personal signatures. Staff cannot change the organisation's signatures or anyone else's.

In most organisations only IT or the owner needs an account. Staff whose signatures are managed centrally do not need to sign in at all.

Two sides of the app

Finding this guide again

Open your account menu (top right, "Signed in as …") and choose Help & documentation. The guide opens in a new tab, so you can keep it beside the app.

Getting started

The first sign-in

On a brand-new installation the first visit shows Create the owner account. Choose your own name, email and a password of at least 10 characters. Any signatures already on the server (from before accounts existed) become yours.

After that, every visit shows Sign in. There is no public sign-up: new people are invited by the owner (see Accounts and admins).

The editor at a glance

+----------------------------------------------------------------------+
| MailSlick  [My signature v] [name]  * Saved   New  Duplicate  Copy & install  (You) |
+--------+-------------------------------+-----------------------------+
| Details|  Editing panel for the        |  Live preview               |
| Images |  selected tab                 |  Desktop / Phone            |
| Social |                               |  Light / Dark / Inverted    |
| Blocks |                               |                             |
| Design |                               |  The email as recipients    |
| Layouts|                               |  will see it                |
+--------+-------------------------------+-----------------------------+

Building your first signature, in order

  1. Details: your name, job title, company, phone numbers, email, website and address. Anything you leave empty is simply left out of the signature.
  2. Images: a photo (cropped to a circle, rounded square or square) and a company logo.
  3. Social: the networks you want shown as icons.
  4. Blocks: the sign-off above the signature ("Best regards," with an optional handwritten name) and anything below it: a button, a banner, a row of badges, a quote, a disclaimer.
  5. Design: font, colours, size and spacing, dividers.
  6. Layouts: pick one of eight arrangements. Switching keeps everything you have entered.
  7. Copy & install: copy the finished signature and paste it into your mail app. See Installing a signature.

Your library

Theme

The account menu has a Theme switch: Dark, Light or System. It is remembered in your browser. The email preview always keeps mail-app colours, whatever the editor's theme.

Designing a signature

Each tab of the editor, and what every control does.

Details

Person: full name, job title, department, company.

Contact: office phone, mobile, fax, website, email, address.

Custom fields: your own label and value, for things like office hours, a licence number or a booking link. Reorder with the arrows.

Images

Photo: upload a PNG, JPEG or GIF, or drop a file on the box. Choose the shape (circle, rounded, square), size, and an optional link. The shape is cut into the image itself, because classic Outlook cannot round corners.

Logo: upload the company logo and set its width. A PNG with a transparent background looks best, in dark mode too. With both a photo and a logo, most layouts put the logo under the details.

Uploads are scaled down before they are stored: a signature never shows an image wider than 600 px, so larger files are wasted on every email sent.

Social

Your profiles: add a network from the grid, paste the address, reorder or remove. Thirty networks are available, including Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Threads, Bluesky, Mastodon, GitHub, WhatsApp, Telegram, Spotify, Calendly and Google reviews.

Icon style: shape (plain, circle, rounded, square), colour (each network's brand colour, your accent colour, grey or black), size and spacing. Icons are drawn as sharp images so they look the same in every mail app.

Blocks

Sign-off: the closing line above the signature.

Below the signature: add any of these, reorder them with the arrows, and slide each one right with Move right.

Block What it does
Button A call-to-action such as "Book a call". Shape: Rounded and Pill are sent as a picture so the corners survive classic Outlook (with images blocked, the reader sees the text as a link); Square stays live text. An optional note sits beside it.
Banner A wide promotional image, up to 600 px, with a link and a description shown when images are blocked.
Badges A row of awards or certifications, each with its own link.
Quote A quotation and its author. Type it with or without quote marks; one clean pair is shown.
Disclaimer Small-print confidentiality text.
Text A free line of text.
Divider A thin horizontal line.

Design

Layouts

Eight arrangements, each shown as a live thumbnail of your own signature:

Classic (image left, divider, details right) · Classic, image right · Stacked · Centred · Logo on top · Accent bar · Single row · Compact reply (text only, for replies and forwards).

Switching layout keeps all your content.

The preview

Installing a signature

Click Copy & install at the top of the editor. The dialog has a tab for each mail app with the exact steps, and two buttons:

Outlook (classic, for Windows)

  1. Click Copy signature.
  2. In Outlook, open File → Options → Mail → Signatures…
  3. Click New, give it a name, click in the edit box and press Ctrl+V.
  4. Under Choose default signature, pick it for new messages and for replies/forwards, then click OK.

To update later: select the signature in the same dialog, click in the box, press Ctrl+A then Ctrl+V, and click OK.

New Outlook and Outlook on the web

  1. Click Copy signature.
  2. Open Settings (the gear) and find Signatures. It is under Account; in some versions under Mail → Compose and reply.
  3. Choose New signature, name it, click in the box and press Ctrl+V.
  4. Set it as the default for new messages and replies, then Save.

Gmail

  1. Click Copy signature.
  2. In Gmail, open Settings (the gear) → See all settings → General.
  3. Scroll to Signature, click Create new, name it, then paste into the box with Ctrl+V.
  4. Pick it under Signature defaults, then click Save Changes at the bottom of the page.

Gmail refuses signatures over 10,000 characters; the editor's preview shows the count.

Apple Mail

  1. Click Copy signature.
  2. In Mail, open Mail → Settings → Signatures, pick the account and click +.
  3. Untick Always match my default message font.
  4. Click in the right-hand box, select its placeholder text and press ⌘V.

HTML file

For Thunderbird, or to place a file directly in classic Outlook's signatures folder (%APPDATA%\Microsoft\Signatures): Download .htm, or Copy HTML source.

Things that catch people out

Blank lines disappear in Outlook. Outlook's signature editor removes blank lines inside a signature when it saves. Do not add spacing by pressing Enter; use the Space above the signature and Space between the closing line and the name sliders on the Blocks tab, which are kept.

Rounded corners. Classic Outlook ignores rounded corners in HTML. MailSlick draws rounded buttons and round photos as images, so they look right everywhere.

Images are hosted, not embedded. Every image in the signature (photo, logo, icons, handwritten name) is loaded from the MailSlick server each time an email is opened. That is deliberate: embedding images makes Outlook turn them into attachments and Gmail refuse them. It means the server must be reachable from the internet (see For the server owner), and that a recipient whose mail app blocks images sees the text and links but not the pictures. Each image carries a description shown in that case.

Changing a signature later. A pasted signature is a copy. After you change it in MailSlick, copy and paste it again (Ctrl+A, Ctrl+V in the mail app's signature box). Organisation-wide deployment that keeps signatures current without pasting is being built; see Organisation.

Accounts, organisations and plans

Organisations

Every account belongs to an organisation. Creating an account from the public page (Get started free) makes you the owner of a new organisation; people you invite join it. Organisations are separate from one another: each has its own people, signatures, directory connection, template, add-in and activity log, and none can see another's.

Plans

Premium is switched on by whoever runs this MailSlick (the site owner), from Organisations and plans… in their account menu, where they see each organisation's name, owner, number of people, directory and last activity, and can set a plan, an end date, the tier and its people limit, and a private note. When a directory has more people than the plan covers, everyone still syncs and the Directory dialog says so, so the organisation can move to the next size. They never see an organisation's signatures or directory. The change is written to the organisation's own activity log. Until then, the Organisation switch shows what Premium includes and how to ask for it.

Accounts and admins

Open your account menu (top right) and choose Accounts and admins… (owner only).

Inviting someone

  1. Enter their email and, optionally, their name, and click Invite.
  2. MailSlick emails them the invite (when the server sends email; see below) and shows the same invite link to you, in case they don't see the email or you'd rather send it another way.
  3. The link works once and expires after 7 days. The person opens it, chooses a password, and is signed in.

Until they do, the list shows Invite pending; afterwards, Joined. New invite link makes a fresh link if the old one expired.

Forgotten passwords

On the sign-in screen, Email me a reset link sends a one-time link (valid 7 days) to the address typed in, if it has an account; the answer is the same either way, so the form can't be used to find out who has one. The owner can also click Reset link beside the person in Accounts and admins…, which emails the same kind of link and shows it.

If this MailSlick doesn't send email, the sign-in screen says to ask the owner, and the owner sends the link by hand.

If the owner forgets their password, whoever runs the server can make a reset link from the command line; see For the server owner.

Admins

Tick Admin beside someone who has joined. Admins see the Organisation switch at the top of the editor and can manage the organisation's signatures, groups, people and the Microsoft 365 connection. Untick it to take that away. The owner is always an admin.

Admins cannot invite people, reset passwords or make other admins; only the owner can.

Removing someone

The bin icon removes a person and their personal signatures after asking. Images in emails they already sent keep working.

Your own email and password

Change email… in the account menu asks for the new address and your password. It becomes your sign-in address and where invites, reset links and notices reach you. Change password… asks for your current password and a new one of at least 10 characters; changing it signs out every other browser where you were signed in. People who sign in with a work account have neither: their address and password are their Microsoft's or Google's.

Two-factor sign-in

Anyone can add a second step to their own sign-in: a 6-digit code from an authenticator app (Microsoft Authenticator, Google Authenticator, 1Password and others) asked for after the password. Someone who learns your password still cannot sign in.

Turning it on

  1. Open your account menu and choose Two-factor sign-in…, then Set up.
  2. In your authenticator app choose add an account and scan the QR code MailSlick shows. If you cannot scan, type the key shown beside it.
  3. Enter the 6-digit code the app now shows and click Turn on.
  4. MailSlick shows eight recovery codes. Copy or download them and keep them somewhere safe; they are not shown again. Each one signs you in once if you ever lose your phone.

From then on, signing in asks for your password, then a code. Codes change every 30 seconds; if yours is refused, check the time on your phone is set automatically.

Recovery codes: used instead of the app's code when the phone is lost. Each works once. New recovery codes in the same dialog makes a fresh set and cancels the old one.

Turning it off needs your password and a current code, so an open session on another device cannot do it alone.

Lost phone and no recovery codes: the owner can remove your two-factor from Accounts and admins… (the remove link beside Two-factor on). You then sign in with your password alone and can set it up again. If the owner is the one locked out, see For the server owner.

Six wrong codes lock that sign-in for 15 minutes.

Sign-in protection

Five wrong passwords for an account from one address lock sign-in from there for 15 minutes. Twenty wrong attempts from one address across any accounts do the same.

What staff can and cannot do

Staff design their own personal signatures and nothing else. They cannot see or change the organisation's template, groups or other people's signatures, and they cannot change their own managed signature: any such change goes through an admin.

Connecting Microsoft 365

Connecting lets MailSlick fill in everyone's name, title, department, phone numbers, address and photo from your Microsoft 365 directory, and keep them up to date. It reads the directory only. It never has access to anyone's email, and your email never passes through MailSlick.

Before you start

Step 1: create the app registration in Microsoft

This gives MailSlick an identity in your Microsoft 365 and tells Microsoft what it may read.

  1. Sign in to the Microsoft Entra admin center at https://entra.microsoft.com as a Global Administrator.

  2. In the left menu go to Entra ID → App registrations and click New registration. (In older menus the path is Identity → Applications → App registrations.)

  3. Fill in the form:

    • Name: MailSlick
    • Supported account types: Single tenant only (older wording: Accounts in this organizational directory only).
    • Redirect URI: leave empty.
    • Click Register.
  4. You land on the app's Overview page. Two values here go into MailSlick; copy them somewhere safe:

    • Application (client) ID, a value like aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
    • Directory (tenant) ID, the same shape
  5. In the left menu of the app, open API permissions, click Add a permission, choose Microsoft Graph, then Application permissions (not Delegated). In the search box find and tick:

    • User.Read.All: reads people's profiles and photos.
    • GroupMember.Read.All: reads which security groups people are in. Needed only for groups based on security groups; harmless otherwise.
    • Optionally Organization.Read.All, which lets MailSlick show your organisation's name. Not required.

    Click Add permissions.

  6. Still on API permissions, click Grant admin consent for (your organisation) and confirm. The Status column should show a green tick and Granted for … on each permission. Without this step MailSlick is refused.

  7. Open Certificates & secrets, then Client secrets → New client secret. Give it a description such as MailSlick and an expiry. Microsoft recommends 12 months or less; 24 months is the maximum. Click Add.

  8. Copy the secret's Value immediately. It is shown only once. Do not copy the Secret ID beside it; that is a different thing and will not work.

Step 2: enter the details in MailSlick

  1. In MailSlick, open your account menu and choose Microsoft 365 directory… (or, in the Organisation area, the Microsoft 365 directory line at the bottom left).
  2. Paste the three values:
    • Directory (tenant) ID → from the Overview page
    • Application (client) ID → from the Overview page
    • Client secret → the Value from step 8
  3. Click Save and test.

MailSlick stores the secret encrypted and never shows it again. The form checks the two IDs look right before sending anything, then signs in to Microsoft and reads one person to prove the permissions work.

If the light turns green ("Test passed"), the first sync starts automatically. If it turns red, the message says what is wrong in plain words; see the table below, fix it, and the form stays open for corrections.

What syncing does

Every sync, test and connection change is written to the Activity list at the bottom of the dialog, with who did it.

Keeping it working

Messages and what to do

Message Cause What to do
This should look like 00000000-0000-… An ID was pasted incompletely or with extra text. Copy the ID again from the app's Overview page.
Enter the client secret (the Value from Certificates & secrets) The secret box was empty on a first save. Paste the secret's Value.
Microsoft rejected MailSlick's app secret. It may have expired. Wrong secret, the Secret ID instead of the Value, or an expired secret. Make a new client secret and paste its Value.
MailSlick's app isn't known in this organisation. Check the Application (client) ID, and that an administrator has granted consent. The client ID is wrong, or the registration is in a different tenant. Check the Application (client) ID and the Directory (tenant) ID come from the same app's Overview page.
Microsoft doesn't recognise this organisation (tenant). Check the Directory (tenant) ID. The tenant ID is wrong. Copy the Directory (tenant) ID from the Overview page.
MailSlick isn't allowed to read the directory. An administrator needs to grant consent. Permissions were added but Grant admin consent was not clicked, or Delegated permissions were chosen instead of Application. On API permissions, check the type says Application and click Grant admin consent.
Security groups couldn't be read (the GroupMember.Read.All permission isn't granted)… Only User.Read.All was granted. People and photos still sync. Add GroupMember.Read.All, grant consent, Sync now. Only matters for groups based on security groups.
Group membership couldn't be read for N people and was left as it was. Microsoft throttled or had a passing error. Nothing; the next sync retries. Known groups were kept.
N photo(s) couldn't be read and were left as they were. A passing error, or a mailbox on an on-premises server. Nothing; the next sync retries.
A stored secret couldn't be read with this server's key (the server may have been restored or moved). Enter the client secret again. The server's encryption key changed, usually after a restore onto a new server. Click Change details, paste the client secret's Value again, Save and test.
This server can't store a client secret: it couldn't create or read its encryption key. The server's data folder is not writable. Whoever runs the server should check the data folder's permissions.
The directory couldn't be reached: … A network problem between the server and Microsoft. Try Test again in a few minutes.

Organisation

The Organisation switch at the top of the editor (admins only) manages signatures for everyone from one place.

How a person's signature is worked out

Signatures are built in layers. Each layer changes only what differs from the one above it; everything else is inherited.

  1. Organisation template: the base everyone shares. Layout, colours, fonts, logo, social links, sign-off, disclaimer and other blocks.
  2. Group changes: for people matched by a rule (department, position or security group). For example a badges row for one role, or a different button for one department.
  3. The person's own details from Microsoft 365: name, title, phones, photo and so on, wherever the template says they come from the directory.
  4. Individual changes: anything set just for that one person, such as their own photo instead of the directory one.

Change the logo in the template and everyone gets it, except people whose group or own settings deliberately use another. That is the point of the layers.

Organisation template

The first visit asks you to create the template, starting from one of your own signatures or from the example. From the start, name, title, department, phones, fax, email, address and photo are set to come from each person's Microsoft 365 profile; the company name is shared, because directories often leave it blank.

Beside each detail on the Details tab is a Microsoft 365 switch:

On the Images tab, Use each person's Microsoft 365 photo does the same for the photo. When the name comes from the directory, so does the handwritten sign-off.

Preview as above the preview shows the template filled in for a real person. Switch between people to check it works for someone with every detail and someone with few.

Groups

Who is in a group comes from the directory, not from a list you keep by hand:

Rule Matches people whose…
By department department in Microsoft 365 is exactly this.
By position job title contains this word, e.g. Attorney matches Senior Attorney.
By security group security groups (including nested ones) include this one. Needs the GroupMember.Read.All permission.

The values offered as you type come from the people already synced. Give the group a name, or it takes the value's name.

Priority. Groups are listed highest priority first. Someone who matches two groups gets the higher one only; group changes do not stack. Use the arrows to reorder.

Editing a group opens the normal editor, with two differences:

Preview as lists the group's members. Delete removes the group; its people go back to the organisation template.

People

Everyone from the directory, with their photo, title, which group they fall under, and whether they have own changes. Use the search box to find someone.

Open a person to see their real signature and make changes just for them: their own photo, a different mobile number, an extra badge. The same Changed here box shows what is theirs, and Remove all of (name)'s own changes at the top right returns them entirely to the inherited signature. A person's own values override the directory's.

Activity

Every change is recorded with who made it and what changed, for example Group "Litigation" changed: blocks or Organisation template changed: logo. The list is in the Microsoft 365 directory dialog.

Saving

Changes in the Organisation area save automatically a moment after you make them, and before you move to another group or person. The line at the bottom left says All changes saved, Saving…, or shows a red message if the server refused a change (it retries by itself).

Built on the server

Every person's signature is built on the server after any change: a template or group edit, someone's own change, or a directory sync that brings a new title or a new starter. Nobody's browser needs to be open; the scheduled sync at night rebuilds what changed by itself. The line under the search box in People shows how far it has got:

The built signatures are what the Outlook add-in and the mail-flow rule send, so a change here reaches the next email with nobody pasting anything. Images in built signatures (logo, photo, icons, drawn buttons) are loaded from the server's public address; if the amber note says the address is not set, whoever runs the server should set SIGSTUDIO_PUBLIC_URL (see For the server owner).

What is not here yet

Delivering the built signatures into people's mailboxes automatically (an Outlook add-in deployed once by IT, so each new email carries the current signature with nothing to paste; Gmail signatures set directly) is the next stage of MailSlick and is not available yet. Until then, a person's current signature can be copied from their page and installed as any personal signature is.

Troubleshooting

Messages the app can show outside the Microsoft 365 dialog (those are listed under Connecting Microsoft 365), and common puzzles.

Signing in

Message or symptom What it means What to do
That email and password don't match Wrong email or password. The message is the same for both on purpose. Try again, or ask the owner for a reset link.
Too many failed attempts. Try again in 15 minutes. Five wrong passwords for this account, or twenty from your address. Wait 15 minutes.
This link has expired or was already used. Ask for a new one. Invite and reset links work once and last 7 days. Ask the owner for a new link.
Use at least 10 characters The password is too short. Choose a longer one.
That code isn't right. Codes change every 30 seconds; check the time on your phone. A wrong or stale authenticator code, or the phone's clock is off. Wait for the next code; set the phone's time to automatic. A recovery code also works.
That sign-in has expired. Start again from your password. More than 5 minutes passed between the password and the code. Sign in again.
Two-factor sign-in is already on. Set-up was started while it was already in force. Turn it off first, then set up again.
The two passwords don't match. The two boxes differ. Retype them.

The editor

Message or symptom What it means What to do
Not saved: retrying (red light) The server refused or could not be reached. The app retries every few seconds. Check your connection. Your edits are kept in the page meanwhile.
The server could not be reached. Is it running? The app loaded but its server did not answer. Reload. If it persists, whoever runs the server should check it.
An image could not be prepared: … An uploaded picture could not be read, or the upload was refused. Use a PNG, JPEG or GIF under 5 MB.
Only PNG, JPEG and GIF images can be used in email Other formats (SVG, WebP, HEIC) are not supported by mail apps. Convert the image first.
Image is over 5 MB The file is too large. Resize or compress it; a signature never shows an image wider than 600 px.
Could not reach the API Same as above. As above.
A control I changed does not show in the preview Some controls only apply in some layouts: the Compact reply layout drops images and most blocks, and a button or banner needs a link or image before it shows. Check the layout, and that the block is complete.
The phone preview looks small It shows the email shrunk to fit a phone, as iPhone Mail and Gmail do. Reduce the logo width, shorten the disclaimer, or use the Stacked layout.
The character count is red Gmail's limit is 10,000 characters. Shorten the disclaimer or remove a block.

In the mail app

Symptom What it means What to do
Blank lines I added in Outlook vanish Outlook removes blank lines inside a signature when saving. Use the spacing sliders on the Blocks tab instead.
Rounded buttons show square Classic Outlook ignores rounded corners. Choose Rounded or Pill for the button; those are sent as pictures.
Images show as broken boxes or are missing for recipients Their mail app blocks images, or the MailSlick server is not reachable from the internet. Blocked images are normal and recipients can show them; the server address is the server owner's to check.
Images arrive as attachments The signature was pasted with images embedded, or Outlook converted them. Paste the signature copied from MailSlick, which uses hosted images, rather than one edited in Outlook.
The website wraps onto two lines in Outlook's signature box Outlook's editing box is narrow. Sent emails show it on one line; check with a test email.
Gmail says the signature is too long Over 10,000 characters. Shorten it in MailSlick and copy again.

Organisation area

Symptom What it means What to do
No Organisation switch Your account is not an admin. Ask the owner to tick Admin beside your name.
No people yet No directory is connected, or it has not synced. Connect Microsoft 365 and click Sync now.
A group matches nobody The rule's value does not match anyone's directory data; security-group rules also need the GroupMember.Read.All permission. Check the value against the People list, or the permission in the Microsoft 365 dialog's status message.
A field in the group editor cannot be edited It comes from Microsoft 365, set in the organisation template. Change it per person on their page, or switch it off in the template.
Someone's own changes are gone They left the directory (or were disabled), so their layer was removed; the activity log says so. Nothing; if they return, set the changes again.

For the server owner

How MailSlick runs, what it stores, and the few things only the person running the server can do.

What runs where

MailSlick is one container: a Python API that also serves the editor and the public page, plus a small Node render worker the API starts when it builds everyone's signature on the server (the same code the editor uses, so what the admin sees is what is built). It sits behind a reverse proxy (Traefik in the reference deployment) that provides HTTPS. The deployment files are in deploy/:

File Purpose
Dockerfile Builds the editor and the API into one image.
docker-compose.yaml Runs the container behind the proxy. Settings come from .env.
.env.example The settings to copy to .env: the public domain, the proxy network and certificate resolver.
deploy.ps1 Deploys the committed code from a Windows machine over SSH.
backup.sh, restore-test.sh Daily backup and a restore check.

Settings

Variable Meaning
SIGSTUDIO_PUBLIC_URL The public address of the server, e.g. https://mailslick.example.com. Required for real use: every image in every signature is loaded from this address by recipients' mail apps, so it must be reachable from the internet. Set from DOMAIN in .env.
SIGSTUDIO_DATA The data folder (inside the container, /data).
SIGSTUDIO_SECRET_KEY Optional. MailSlick makes its own encryption key on first start; set this only to manage the key yourself.
SIGSTUDIO_SYNC_MINUTES How often connected directories are re-read. Default 60.
SIGSTUDIO_RESEND_API_KEY A sending key from Resend (resend.com) for the site's domain. With it, invites, password resets, early-access confirmations and plan changes are emailed; without it nothing is emailed and links are copied by hand. Set from RESEND_API_KEY in .env.
SIGSTUDIO_MAIL_FROM The sender, default MailSlick <no-reply@<the site's host>>.
SIGSTUDIO_MAIL_REPLY_TO Where replies go, optional.
SIGSTUDIO_SIGNUP closed (default): only people the site owner invites get accounts; the public page collects early-access requests. open: anyone can create an account and an organisation from the public page. Set from SIGNUP in .env.
SIGSTUDIO_DEMO_DIRECTORY Set to 1 to offer a fictional demo directory in the Microsoft 365 dialog, for trying the Organisation area without a real connection. Off by default.

The data folder

Everything MailSlick stores is in the data folder (deploy/data on the host):

Item What it is
signatures.db The database: accounts, signatures, the directory copy, organisation layers, the built signatures, the activity log.
assets/ Every image, named by its content. Images are never deleted, because emails already sent still point at them, and they are served with a one-year cache header so a CDN in front of the server (Cloudflare, say) carries recipients' traffic instead of the server.
secret.key The app's encryption key for stored secrets (the Microsoft client secret). Made on first start, readable only by the app.

Deploying

deploy.ps1 packages the last commit, uploads it, and on the server builds the new version beside the running one, starts it in a throwaway container and checks it answers before switching over. If the new version is unhealthy after the switch, it rolls back to the previous image. It refuses to deploy while anyone is using the site (any request in the last two minutes); -Force overrides that. It runs in its own window and closes itself after a successful deploy.

The first deploy with -WithData copies a laptop's data folder to the server, but only if the server has no data yet; it never overwrites.

Backups

The site owner

The account made on the setup screen of a fresh installation is the site owner: the owner of its own organisation like anyone else, plus Organisations and plans… and the early-access requests in the account menu. An installation from before organisations existed is adopted on first start: its people become one Premium organisation and its owner becomes the site owner.

Owner commands

Run inside the container with docker exec mailslick python -m app.admin …:

Command What it does
people Lists every account, marking the owner and pending invites.
reset-link EMAIL Prints a one-time link, valid 24 hours, that lets that account set a new password. This is how a locked-out owner gets back in.
remove-2fa EMAIL Turns off two-factor sign-in for that account, for an owner who lost their phone and their recovery codes.

Updating the Microsoft client secret

Nothing to do on the server. Admins paste a new secret in the app (see Connecting Microsoft 365); it is stored encrypted with the app's key.

Health

The container has a health check (/api/auth/state every 30 seconds). docker ps shows healthy. Logs: docker logs mailslick.

Outlook add-in

The add-in puts each person's current signature into every new message, reply and forward as they start writing. An administrator deploys it once from the Microsoft 365 admin center; nobody installs or pastes anything, and a template change in MailSlick reaches the next email within a minute.

It works in Outlook on the web, new Outlook for Windows, classic Outlook for Windows (Microsoft 365 builds on Windows 10 1903 or later), Outlook for Mac, and Outlook on iOS and Android.

How it identifies people

When Outlook starts a message, the add-in asks Outlook for a Microsoft sign-in token for the person using it, issued against your organisation's app registration (the one from Connecting Microsoft 365). MailSlick checks that token against Microsoft's signing keys and that it is for your registration and your tenant, then looks the person up by their Microsoft id in the synced directory. Nothing self-declared is trusted, and the add-in reads nothing from the email itself.

Before you start

Step 1: let the add-in sign people in (Entra, once)

In the Microsoft Entra admin center, open App registrations and the MailSlick registration you made for the directory connection.

  1. Authentication → Add a platform → Single-page application. Redirect URI: brk-multihub:// followed by the server's host, e.g. brk-multihub://mailslick.example.com (no https://, no path). Save. This tells Microsoft that Outlook may obtain tokens on the add-in's behalf.
  2. API permissions → Add a permission → Microsoft Graph → Delegated permissions, tick User.Read (the sign-in permission), Add permissions, then Grant admin consent for (your organisation). Without consent, people would be asked to consent one by one on first use. The Application permissions already there stay as they are.

Step 2: deploy the add-in (Microsoft 365 admin center, once)

  1. In MailSlick, open Microsoft 365 directory… and click Download manifest in the Outlook add-in box. It saves mailslick-outlook.xml.
  2. In the Microsoft 365 admin center go to Settings → Integrated apps → Upload custom apps.
  3. Choose Office Add-in, Upload manifest file, and pick the downloaded file. Click Next.
  4. Choose who gets it: a pilot group first (Specific users/groups), then everyone. Click Next, accept, Finish deployment.

The add-in appears in Outlook within a few hours (Microsoft's figure is up to 24; a restart of Outlook helps). Deploying again with the same manifest updates it rather than adding a second copy.

What people see

Nothing, mostly: the signature is there when they start an email. In the ribbon of a new message there is a MailSlick → My signature button that shows the current signature and inserts it again if it was deleted.

The first time, Outlook on some platforms asks the person to sign in once (a small notice MailSlick needs you to sign in once… with an Open MailSlick link). After that it is silent.

The Outlook add-in box in the Microsoft 365 dialog shows how many times signatures have been fetched and when the add-in was last seen, so you can tell it is working before anyone reports back.

Messages people might see

Message Meaning What to do
MailSlick needs you to sign in once to insert your signature. Outlook could not get a token silently (first use on this platform, or consent was not granted). Click Open MailSlick and Sign in. If everyone sees it, do step 1.2 (admin consent).
You're not in the directory MailSlick syncs yet. The person is not in the synced directory (new starter, guest, or no mailbox). Wait for the hourly sync or press Sync now.
Your signature hasn't been built yet. There is no organisation template, or the rebuild failed. Set up the template; check the People list's status line.
This Microsoft 365 organisation isn't connected to MailSlick. The token is for a different tenant than the connected one. Check the tenant ID in the connection details.
That sign-in token isn't for this organisation's MailSlick. The token was issued to another app registration. Make sure the SPA redirect was added to the same registration whose client ID is saved in MailSlick.

Replies and forwards

Replies and forwards currently get the same signature as new messages. A shorter reply signature per organisation is planned.

Mail-flow rules, for devices without the add-in

Phones with other mail apps, shared mailboxes and anything else that cannot run the add-in can still get signatures from Exchange itself: a mail-flow rule per person that appends their signature to every message they send. Microsoft offers no API for these rules, so MailSlick writes the PowerShell and an Exchange administrator runs it.

  1. In the Outlook add-in box of the Microsoft 365 dialog, click Mail-flow script. It saves mailslick-mail-flow.ps1 with everyone's current signature in it.
  2. On a machine with PowerShell, once: Install-Module ExchangeOnlineManagement.
  3. Run the script as an Exchange administrator. It signs in, then creates or updates one rule per person, named MailSlick signature: (email). Run it again after signature changes; it replaces the rules in place.

What to know before choosing this:

Emails already sent keep pointing at the images they were sent with. So that an old email shows the current logo, built signatures load the logo from a fixed address (/logo/<organisation>.png) that always serves whatever the organisation template's logo is now. Changing the logo in the template changes it in every email, old and new, the next time it is opened.

Connecting Google Workspace

Connecting lets MailSlick fill in everyone's name, title, department, phone numbers, address and photo from your Google Workspace directory, keep them up to date, and write each person's signature straight into their Gmail settings. Nothing to install and nothing to paste: Gmail is the one platform where that is possible. MailSlick never reads anyone's mail.

What MailSlick is allowed to do

Access is a service account you create in your own Google Cloud project, which a Workspace super admin authorises once for exactly three scopes:

Scope What it allows Read or write
admin.directory.user.readonly People, their details and photos read
admin.directory.group.readonly Which groups people are in (for groups based on Google Groups). Optional. read
gmail.settings.basic Mail settings. MailSlick touches one setting: the signature. write

No scope that reads, sends or alters mail is requested, and the authorisation screen lists only these three.

Before you start

Step 1: make a project and turn on the two APIs

  1. Open the Google Cloud console and create a new project (the project picker at the top → New project), named for example MailSlick.
  2. With that project selected, go to APIs & Services → Library. Search for and Enable:
    • Admin SDK API (reads the directory)
    • Gmail API (sets signatures)

Step 2: create the service account and its key

  1. Go to APIs & Services → Credentials → Create credentials → Service account. Name it MailSlick, click Create and continue, skip the optional role and user steps, Done.
  2. Open the new service account, then its Keys tab → Add key → Create new key → JSON → Create. A .json file downloads. Keep it safe; it is the account's password. You will upload it to MailSlick in step 4, and MailSlick stores it encrypted.
  3. On the service account's Details tab, copy the Unique ID (a long number). It is also the client_id inside the JSON file.

Step 3: authorise it for your Workspace (super admin)

  1. Open the Google Admin console (admin.google.com) → Security → Access and data control → API controls → Manage Domain Wide Delegation.

  2. Add new. Paste the Unique ID from step 2.3 as the Client ID, and these three scopes, comma-separated, in the OAuth scopes box:

    https://www.googleapis.com/auth/admin.directory.user.readonly,
    https://www.googleapis.com/auth/admin.directory.group.readonly,
    https://www.googleapis.com/auth/gmail.settings.basic
    
  3. Authorize. Changes can take a few minutes to apply.

Step 4: enter the details in MailSlick

  1. In MailSlick, open your account menu and choose Directory…, then Google Workspace.
  2. Enter the super admin's email address (MailSlick reads the directory as this person) and upload the JSON key file from step 2.2.
  3. Click Save and test.

If the light turns green ("Test passed"), the first sync starts. If red, the message says what is wrong; see the table below.

What happens after that

Messages and what to do

Message Cause What to do
This isn't the JSON key file… Something other than the downloaded key was uploaded. Upload the .json file from the service account's Keys tab.
The key file is missing … A key in another format. Create a new key, choosing JSON.
Google refused: domain-wide delegation isn't set up… Step 3 was skipped, used the wrong Client ID, or missed a scope. Check the Unique ID and that all three scopes are listed, exactly. Wait a few minutes after authorising.
Google doesn't know (address)… The admin email is wrong or not in this Workspace. Enter a super admin's address in the connected domain.
Google says MailSlick isn't allowed to read the directory… The admin isn't a super admin, or the user scope isn't delegated. Use a super admin's address; check the scopes.
Gmail refused: the gmail.settings.basic scope isn't delegated… The directory scopes were authorised but not the Gmail one. Add the third scope in step 3 and press Rebuild.
(domain) is already connected to another organisation… Someone else on this MailSlick connected the same Workspace. One Workspace belongs to one organisation; ask whoever runs this MailSlick.
Google refused the service account's key… The key was deleted in the Cloud console. Create a new key and upload it with Change details.

Sign in with a work account

People in a connected directory can sign in to MailSlick with their Microsoft 365 or Google Workspace account instead of a MailSlick password: on the sign-in screen, Use your work account, then their work email. They land on their own page: My signature (the organisation signature built for them, with Copy) and their personal signatures. They never become admins by signing in; the owner grants that in Accounts and admins… as for anyone else.

Staff don't need this to receive signatures: the Outlook add-in and Gmail delivery identify people through Microsoft and Google directly. It is for people who want to see their signature or design personal ones.

How it works

MailSlick finds the organisation from the email's domain and sends the browser to that organisation's identity provider. The token that comes back is checked against the provider's signing keys, the organisation's registration, and the sign-in's own nonce; the person is the directory entry with that provider id. Two-factor for these accounts is the provider's (Microsoft's or Google's) and MailSlick's own two-factor doesn't apply to them.

Microsoft 365: one step in the app registration

Open the organisation's MailSlick app registration in the Entra admin center (the one from Connecting Microsoft 365):

  1. Authentication → Add a platform → Web. Redirect URI: the server's address followed by /api/auth/microsoft/callback, for example https://mailslick.example.com/api/auth/microsoft/callback. Save.
  2. Nothing else. Sign-in uses the openid, profile and email scopes, which every registration has, and the client secret already saved in MailSlick. If you granted admin consent for User.Read when deploying the add-in, people see no consent prompt; otherwise each sees a one-time "permissions requested" screen listing only sign-in and profile.

Google Workspace: one OAuth client for the server (site owner)

Google sign-in uses one OAuth client for the whole MailSlick, made by whoever runs the server, because Google ties sign-in to the Cloud project it was created in. Workspace organisations then need nothing of their own: MailSlick checks that the signed-in account's domain is the connected one.

  1. In the Google Cloud console (any project you own), APIs & Services → OAuth consent screen: External, app name MailSlick, your support email, and the server's domain under authorised domains. Publish it (or keep it in testing with your own accounts while trying it).
  2. Credentials → Create credentials → OAuth client ID → Web application. Authorised redirect URI: the server's address followed by /api/auth/google/callback. Create, and copy the Client ID and Client secret.
  3. On the server, put them in .env as GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET and redeploy. The sign-in screen offers Google as soon as a Workspace is connected.

Messages

Message Meaning What to do
No organisation on this MailSlick uses that email domain. No connected directory has people with that domain. Connect and sync the directory first; or sign in with a password.
You signed in, but you're not in the directory MailSlick syncs yet. The account exists at the provider but isn't synced. Wait for the hourly sync or press Sync now.
…token couldn't be verified. The token isn't for this organisation's registration, or the signing keys couldn't be fetched. Check the redirect URI was added to the same registration whose client ID is saved.
That sign-in took too long or was already used. More than 10 minutes passed, or the browser went back. Start again from the sign-in screen.
Sign in with Google isn't set up on this MailSlick yet. The server has no OAuth client. The site owner does the Google steps above.
That email already has an account in another organisation… The same address was invited elsewhere on this MailSlick. One address, one organisation; the owners sort out which.

Billing with Stripe

Premium is paid through Stripe: a customer picks a size tier, pays on Stripe's hosted page (card details never touch MailSlick), and Stripe tells MailSlick to switch the organisation on, renew it, or drop it to Free when a card finally fails or they cancel. The site owner sets it up once in Billing setup…; plans switched by hand in Organisations and plans… keep working alongside.

Setting it up (site owner, about 20 minutes)

Do it first in Stripe's test mode (the toggle at the top of the Stripe dashboard), try a purchase with Stripe's test card 4242 4242 4242 4242, then repeat the steps in live mode with live keys.

  1. Products. In Stripe → Product catalogue → Add product, make one product per tier: MailSlick Team, MailSlick Business, MailSlick Company. For each, one recurring, yearly price (the amounts on the public page). Open each price and copy its Price ID (price_…).

  2. Secret key. Developers → API keys → Secret key (sk_test_… or sk_live_…). Copy it.

  3. In MailSlick: account menu → Billing setup…. Paste the secret key and the three price ids, Save and test. The light turns green and lists the plans as Stripe has them; it stays amber until step 4.

  4. Webhook. Copy the webhook address shown in Billing setup. In Stripe → Developers → Webhooks → Add endpoint, paste it, and select these events:

    • checkout.session.completed
    • customer.subscription.created, customer.subscription.updated, customer.subscription.deleted
    • invoice.payment_failed

    After adding, open the endpoint and copy its Signing secret (whsec_…) into Billing setup, Save and test. Green.

  5. Customer portal (optional but recommended): Stripe → Settings → Billing → Customer portal: allow customers to update payment methods, see invoices and cancel. MailSlick's Billing… menu item opens it.

Keys are stored encrypted on the server and never shown again; Test re-reads the prices at any time. To rotate a key, paste the new one and Save and test.

What customers see

Mixing with plans set by hand

Organisations and plans… still works. An organisation on a hand-set Premium with no end date stays Premium whatever Stripe says (useful for a comped customer or an invoice paid outside Stripe). Rows paid through Stripe show Stripe with the subscription status.

Messages

Message Meaning What to do
Invalid API Key provided Wrong or revoked secret key, or a live key in test mode. Copy the key again from Developers → API keys.
No such price: 'price_…' A price id from the other mode, or a typo. Copy the Price ID from the product in the same mode as the key.
… isn't a yearly subscription price A one-time or monthly price was used. Make the price recurring, yearly.
Prices read fine. Now add the webhook endpoint… Keys and prices work; the webhook secret is missing. Step 4.
Paying online isn't available on this MailSlick yet (customer) Billing isn't set up or its test failed. Site owner: Billing setup.