Most of the graphical user interface of deaddrop can be branded, including colors, logos, text, emails, and the favicon. Branding is managed through the ddadm administration panel and requires the brandadm or sysadm role.
The graphical interface changes between deaddrop releases. New SCSS variables, new text keys, or changes to image dimensions may be introduced, and a custom brand should be tested after each upgrade to ensure nothing is missing or misaligned. Contact sysctl to be notified in advance when a release will affect branding files.
It is not possible to brand the behavior of deaddrop. If behavioral changes are required, contact sysctl with a feature request.
Brands are managed in the Branding section of the ddadm sysadm panel. Users logged in as a branding administrator are directed to the Branding section automatically. The following operations are available:
| Operation | Description |
|---|---|
| New brand | Creates a new brand from the default template. |
| Upload | Installs a brand from a zip package (see Brand packages). |
| Edit | Opens the multi-tab brand editor for a brand. |
| Info | Edit the brand description. |
| Activate | Makes a brand live on the deaddrop site. No service restart is needed. |
| Download | Exports the brand as a zip package for backup or transfer. |
| Delete | Removes a brand. The active brand and the default brand cannot be deleted. |
Brand names may contain letters, numbers, hyphens, and underscores. The name default is reserved.
To revert to the standard deaddrop look, activate the default brand.
All brand files are stored under /opt/sysctl/deaddrop/branding/<brand-name>/.
| File | Required | Purpose | How it appears |
|---|---|---|---|
brand.conf |
Yes | Identity metadata (display name, version, author). | Created by ddadm. |
variables.json |
Yes | SCSS variable overrides — primary CSS customization. | Created by ddadm (empty overrides). |
palette.json |
No | Custom named colors referenced in variables.json. |
Created when palette colors are first saved. |
deaddrop.json |
No | Login and logout page text. | Pre-populated from defaults on new brand. 1 |
language.json |
No | Main application text. | Pre-populated from defaults on new brand. 1 |
mail_language.json |
No | Email notification text. | Pre-populated from defaults on new brand. 1 |
mail_style.json |
No | Email colors and logo configuration. | Created when first saved in the mail editor. |
sms.json |
No | SMS notification text (password delivery). | Pre-populated from defaults on new brand. 1 |
favicon.json |
No | Pointer to the favicon asset. | Created when favicon is configured in the editor. |
assets/ |
No | Image files (logos, favicon, mail logo). | Created when the first asset is uploaded. |
All optional files fall back to the corresponding file in the default brand at runtime if absent.
zip package only contain what was explicitly included — absent language files fall back to defaults at runtime but are not copied into the brand directory on install.
A key=value metadata file. The ddadm UI reads the following keys:
| Key | Description |
|---|---|
display_name |
Human-readable name shown in the ddadm brand list. |
version |
Version string (e.g. 1.0). |
author |
Author or contact address. |
description |
Free-text description. |
Example:
[brand]
name = acme
display_name = Acme Corp
version = 1.0
author = branding@acme.com
description = Acme corporate brand
A flat JSON object where each key is a SCSS variable name (written with underscores, e.g.
button_background) and each value is a CSS literal or a palette color reference.
This file is the source of truth for all CSS customization. main.css is compiled from it
automatically — do not edit main.css directly.
Values can be:
#3a6ea5, rgb(58, 110, 165)), sizes (14px, 1.2rem),
or image URLs (url("/images/assets/my-logo.svg")).$color-name value (e.g. $brand-blue) that resolves to a
color defined in the brand’s palette (see palette.json).An empty object ({}) is valid and means all variables use their defaults.
The variable editor in ddadm groups variables into categories and provides color pickers, size inputs, and image selectors. Changes can be previewed before saving.
| Category | Variables |
|---|---|
logos |
Login logo, login symbol, header logo, waiting-screen logo — path, width, height. |
buttons |
Button colors, backgrounds, hover states. |
login |
Login, logout, and waiting screen colors and backgrounds. |
overlays |
Modals, progress bars, status indicators. |
navigation |
Header, navigation, category, profile, and language selector appearance. |
forms |
Form fields, inputs, icons, and time display variables. |
brand |
Body, titles, subtitles, links, borders, and general catch-all variables. |
The full list of available variables and their defaults is defined in
/opt/sysctl/deaddrop/branding/default/scss/config/_variables.scss.
An optional JSON object that defines custom named colors for the brand. These names can then be
referenced as $color-name in variables.json, making it easy to apply a consistent color scheme
across many variables by changing a single palette entry.
Default colors from _colors.scss are always available as palette references without being listed
in palette.json. Custom palette entries extend — not replace — those defaults.
Color names must be alphanumeric with hyphens or underscores. Values must be CSS color literals.
Example:
{
"brand-blue": "#2c5f8a",
"brand-accent": "#f16064"
}
CSS is customized entirely through the variable editor — there is no direct CSS editing.
The brand editor’s Variables tab provides a live preview workflow:
variables.json permanently.If the brand is currently active, saving immediately pushes the compiled CSS to the live site.
toggles for each sign-out variant (SAML, x509, password, timeout).
Text is customized through JSON language files. Each file covers a different surface:
| File | Surface |
|---|---|
deaddrop.json |
Login page, logout page, and download page. |
language.json |
Main application (logged-in pages). |
mail_language.json |
Email notification messages. |
sms.json |
SMS one-time password messages. |
Language files are edited in the Language tab of the brand editor, which shows each key alongside its default or customized value. Changes can be previewed before saving.
New brands are pre-populated with complete copies of all language files. Keys absent from a brand’s file fall back to the default and cannot be modified through the editor.
Notable keys:
| Key | Description |
|---|---|
title |
Browser page title on the login page. |
header |
Main heading on the login page. |
para1–para4 |
Information panel paragraphs on the right side of the login page. HTML is allowed. |
signin, saml_signin, x509_signin |
Button labels for each login method. |
copyright_header |
Copyright text shown at the bottom. |
company |
Organization name used in various places. |
The default values are in /opt/sysctl/deaddrop/branding/default/deaddrop.json.
Covers all text shown to logged-in users. The default values are in
/opt/sysctl/deaddrop/branding/default/language.json.
Covers the subject lines and body text of all email notifications. The default values are in
/opt/sysctl/deaddrop/branding/default/mail_language.json.
Covers the text sent in SMS password-delivery messages. The default values are in
/opt/sysctl/deaddrop/branding/default/sms.json.
Email appearance is configured through mail_style.json and an optional mail logo image.
A JSON object with color and logo size settings. Available keys:
| Key | Description |
|---|---|
color_background |
Background color of the email header area. |
color_box |
Background color of the main content box. |
color_text |
Body text color. |
color_title |
Title text color. |
color_highlight_text |
Highlighted/accent text color. |
color_commercial |
Color for footer/commercial text. |
color_commercial_link |
Color for footer links. |
color_automail |
Color for automated message text. |
color_vertical_line |
Color of the vertical separator line. |
logo_width |
Width of the mail logo (e.g. 103px). |
logo_height |
Height of the mail logo (e.g. 32px). |
logo_path |
Filename of the logo asset to use (e.g. mail_logo.png). Defaults to mail_logo.png. |
The default values are in /opt/sysctl/deaddrop/branding/default/mail_style.json.
Upload a logo image via the Mail tab in the brand editor. The logo is stored in the brand’s
assets/ directory. Set logo_path in mail_style.json to the filename to use it, or place a
file named mail_logo.png in assets/ and it will be picked up automatically.
Recommended dimensions: 103×32 px.
The favicon is configured via favicon.json, which points to an image file in the brand’s
assets/ directory:
{ "path": "favicon.ico" }
Upload a favicon image and configure it through the Favicon tab in the brand editor. If no
favicon.json is present, assets/favicon.png is used as a fallback.
Images (logos, favicon, mail logo) are uploaded through the Assets tab in the brand editor.
Uploaded files are stored in the brand’s assets/ subdirectory and served through the branding API.
An asset that is currently referenced by variables.json, favicon.json, or mail_style.json
is protected and cannot be deleted until the reference is removed.
Image URLs in variables.json use the production path /images/assets/<filename>. The preview
system rewrites these automatically to serve through the branding API during preview.
A brand package is a zip file containing all brand files, suitable for backup, version control, or transferring a brand between installations.
The zip must contain exactly one top-level folder named after the brand:
acme.zip
└── acme/
├── brand.conf (required)
├── variables.json (required)
├── palette.json (optional)
├── deaddrop.json (optional)
├── language.json (optional)
├── mail_language.json (optional)
├── mail_style.json (optional)
├── sms.json (optional)
├── favicon.json (optional)
└── assets/ (optional)
├── logo.svg
└── mail_logo.png
main.css is excluded from downloaded packages and regenerated automatically on import.
When a package is uploaded, ddadm:
brand.conf and variables.json are present.$palette-ref values in variables.json resolve to a known color.If any step fails, the upload is rejected with an error message and nothing is installed.
If a brand with the same name already exists, the upload form provides an Overwrite option. When overwriting, the existing brand directory and theme file are backed up with a timestamp suffix before the new package is installed.
Brands created before the current branding system (i.e. brands that lack brand.conf and
variables.json) are displayed with a legacy badge in the brand list. They can still be
activated, and their language files and mail_style.json work as before.
To migrate a legacy brand to the new system, create a new brand via ddadm and use the variable
editor to reproduce the CSS customizations from the old brand’s hand-edited main.css.
© Copyright sysctl Aktiebolag 2013-2026. All rights reserved