gmtales-docs Help

Customization

Every campaign can have its own look. The Creator picks a preset theme and can set variables of their own, down to the picture behind the page and the two in its bottom corners. Each member can choose a different preset for their own view, though the Creator's variables still apply over it. Uploaded icons put imagery on article types and map pins.

A campaign's look is separate from its layout. Colour, picture and lettering are the Creator's. Where the navigation, the sidebar and the article sit is the app's, and is the same in every campaign.

Preset Themes

Seven presets ship with the app. Each dresses the whole page: the ground it sits on, the art behind it, the top bar, the sidebar, the canvas, the type it is set in, and the blocks inside an article.

Preset

Colors

Modes

Headings set in

Astronomer

#8bb4d4 #2a1f5c #0f0a28

light, dark

Alegreya SC

Forest

#1a3d2b #4a7c59 #d4edd0

light

Quattrocento

Parchment

#5c3d0e #c8a96e #f5e6c8

light

Cinzel

Night

#8bb4d4 #2d2d4a #1a1a2e

light, dark

Oswald

Minimal

#111111 #888888 #f8f8f8

light, dark

your own system's

Arcane

#c084fc #5b2d8a #1e0a3c

dark

Uncial Antiqua

Blood

#ff6b6b #8b0000 #1c0505

dark

Pirata One

Astronomer is the app's own look, and the only preset that uses the starfield, the sun, the moon and the astronomer. Every other preset states its own backdrop, so choosing one replaces that look instead of sitting on top of it. A campaign that picks no preset is shown Astronomer, following each reader's own light or dark setting.

A preset with one mode holds your view in that mode, so the light and dark toggle stops applying while you read.

Applying a Theme

  • Campaign theme (the Creator's choice, applies to everyone): under Theme in campaign Settings.

  • Personal theme (each member's own view): under Personal theme, behind your username in the top navigation.

Priority

Where two sources set the same variable, the higher priority wins:

Priority

Source

Notes

1

Campaign custom CSS

Applied last. The Creator's raw overrides, for branding and anything the presets don't cover.

2

Your personal theme

Overrides the campaign preset for you alone, e.g. a consistent high-contrast look across every campaign you play in.

3

Campaign theme

The Creator's chosen preset, the default for everyone.

Assets

Left alone, every campaign renders its article types and its map markers identically: a character article and a location article look the same in lists, and every pin on a map is the same generic dot. Icons give each type and each pin its own image, and a built-in starter set works before you upload anything.

Uploading assets

Upload icons from campaign Settings → Assets, choosing the Icon category. Each one needs a name, which is its stable identity within the campaign and the word you use in the mappings below. Names are unique within their scope.

SVG, PNG, JPEG and WebP files are accepted. SVGs are sanitized on upload: scripts and external references are stripped automatically.

Type icons

Map an icon to an article type under Settings → Assets → Manage assets: give the type name you use in your articles' type directive and pick the icon.

For a campaign tracking Greymarch lore, you might map:

Type

Icon

character

warden-portrait

location

wayfinder-star

artifact

oathblade-glyph

The icon then appears beside every article of that type, in list and index views.

Marker icons

A marker wears the icon mapped to the type of the article that placed it, so every pin dropped from a location article looks alike with nothing extra to write.

Override one pin with an icon argument:

<!-- marker: 62,48; icon=highcairn-sigil -->
<!-- start: marker; 31,72; icon=greenhearth-icon --> A pleasant house, and the finest in the neighbourhood. <!-- end: marker -->

An icon name that resolves to nothing is a validation error: upload the asset first, or write its exact name.

Scope and resolution

Icons live at campaign scope or world scope. When a campaign belongs to a World, both registries are available to it.

A name is resolved in this order:

  1. Campaign-level assets

  2. World-level assets

A campaign icon shadows a world icon of the same name, which is how a campaign diverges from its world's visual defaults. A starter icon needs no upload but does need its prefix: only a builtin: name reaches the set that ships with the app.

To force one scope regardless of what the campaign holds, use a prefix:

Prefix

Resolves to

(none)

Campaign → world

world:name

World-level only

builtin:name

Built-in only

A prefix works anywhere you name an icon, in type mappings and in a marker's icon argument alike.

Icons are decoration, not content: anyone who can read a campaign or a world can see its icons. An icon reveals nothing about the article wearing it, so there is nothing to restrict. Scope still holds: a campaign's icons belong to that campaign, and no other campaign or world can reach them, whatever URL is asked for.

Background and Corners

Three pictures sit behind a campaign: one tiled across the whole page, and one in each bottom corner. The app's own are a starfield, a sun that becomes a moon after dark, and an astronomer — the Astronomer preset, which is what a campaign that has chosen nothing is shown.

Each is a variable, so each is the Creator's to replace:

Slot

Variable

Tiled behind the page

--gm-backdrop-image

Bottom left

--gm-corner-left-image

Bottom right

--gm-corner-right-image

Name an uploaded asset with url(asset:name), or write none for an empty slot:

--gm-backdrop-image: none; --gm-corner-left-image: url(asset:guild-seal); --gm-corner-right-image: none;

Because there are two boxes, one per mode, a slot can hold a different picture by day and by night. That is how the app's own sun becomes a moon.

The corners stay in their corners. A picture is drawn to its own proportions, though, so each slot has a width and an offset to place it by — --gm-corner-left-width, --gm-corner-left-offset-x and --gm-corner-left-offset-y, and the same three for the right. A seal that sits too low or too large is these three, not the image file.

Only an asset name or a path within GMTales is accepted. A picture fetched from somewhere else could tell that site who is reading the campaign and when, so an outside address is a validation error.

Advanced: Custom CSS Variables

The Creator can go beyond presets in Settings → Advanced: custom CSS variables. There are two boxes, one for light mode and one for dark, and each applies only to its own mode. A variable set in one box does nothing while the other mode is showing. Assignments take effect last and can extend or override any preset.

Each box takes a list of assignments and nothing else. A selector, a rule or a name that is not one of the variables below is a validation error naming the offender.

The page and the pictures behind it

Variable

What it controls

--gm-page-bg

The colour the whole page sits on

--gm-backdrop-image

Picture tiled behind the page

--gm-backdrop-repeat

How that picture tiles (repeat, no-repeat, repeat-x…)

--gm-backdrop-size

How large it is drawn (auto, cover, a length)

--gm-backdrop-opacity

How strongly it shows through (0–1)

--gm-corner-left-image

Picture in the bottom-left corner

--gm-corner-right-image

Picture in the bottom-right corner

--gm-corner-opacity

How strongly both corner pictures show (0–1)

--gm-corner-left-width

Width of the left corner picture

--gm-corner-right-width

Width of the right corner picture

--gm-corner-left-offset-x

Left picture, nudged sideways

--gm-corner-left-offset-y

Left picture, nudged up or down

--gm-corner-right-offset-x

Right picture, nudged sideways

--gm-corner-right-offset-y

Right picture, nudged up or down

The campaign's furniture

Variable

What it controls

--gm-panel-bg

Top bar, sidebar and canvas together, where the three below are unset

--gm-topbar-bg

Top bar background

--gm-topbar-color

Top bar text

--gm-topbar-border

Top bar edge

--gm-brand-title-color

The campaign's name in the top bar

--gm-subnav-bg

Navigation strip background

--gm-subnav-link-color

Navigation link

--gm-subnav-active-bg

The pill on the page being read

--gm-subnav-active-color

Lettering on that pill

--gm-sidebar-bg

Sidebar background

--gm-sidebar-border

Sidebar edge

--gm-sidebar-title-color

A sidebar group's heading

--gm-canvas-bg

Background behind an article

--gm-canvas-border

Edge around an article

--gm-accent-bg

Buttons, tabs and anything else the campaign highlights

--gm-accent-color

Lettering on those

--gm-accent-border

Their edge, where it should differ from the fill

--gm-type-badge-bg

The badge naming an article's type

--gm-type-badge-color

Lettering on that badge

Blocks and type inside an article

Variable

What it controls

--gm-secret-bg

Secret block background

--gm-secret-border-color

Secret block border

--gm-secret-title-color

"SECRET" label

--gm-secret-divider-color

Dashed separator above the Known-by list

--gm-secret-label-color

"Known by" label

--gm-secret-knower-bg

Known-by pill background

--gm-secret-knower-border

Known-by pill border

--gm-secret-knower-color

Known-by pill text

--gm-box-row-border

Info-box row separator

--gm-box-row-bg

Info-box background

--gm-box-title-bg

Info-box title background

--gm-box-title-color

Info-box title text

--gm-quote-bg

Quote block background

--gm-quote-border

Quote block border

--gm-quote-mark-color

Quote mark accent

--gm-time-rule

Rule down the side of a dated passage

--gm-font-heading

Font family for headings (h1–h6) in campaign content

--gm-font-body

Font family for body text in campaign content

--card-grain-opacity

Opacity of the paper-grain texture on cards (0–1)

Variables reach the campaign's own pages and no others. Nothing written here shows in another campaign or on the pages outside one.

14 September 2026