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 |
| light, dark | Alegreya SC |
Forest |
| light | Quattrocento |
Parchment |
| light | Cinzel |
Night |
| light, dark | Oswald |
Minimal |
| light, dark | your own system's |
Arcane |
| dark | Uncial Antiqua |
Blood |
| 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 |
|---|---|
|
|
|
|
|
|
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:
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:
Campaign-level assets
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-level only |
| 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 |
|
Bottom left |
|
Bottom right |
|
Name an uploaded asset with url(asset:name), or write none for an empty slot:
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 |
|---|---|
| The colour the whole page sits on |
| Picture tiled behind the page |
| How that picture tiles ( |
| How large it is drawn ( |
| How strongly it shows through ( |
| Picture in the bottom-left corner |
| Picture in the bottom-right corner |
| How strongly both corner pictures show ( |
| Width of the left corner picture |
| Width of the right corner picture |
| Left picture, nudged sideways |
| Left picture, nudged up or down |
| Right picture, nudged sideways |
| Right picture, nudged up or down |
The campaign's furniture
Variable | What it controls |
|---|---|
| Top bar, sidebar and canvas together, where the three below are unset |
| Top bar background |
| Top bar text |
| Top bar edge |
| The campaign's name in the top bar |
| Navigation strip background |
| Navigation link |
| The pill on the page being read |
| Lettering on that pill |
| Sidebar background |
| Sidebar edge |
| A sidebar group's heading |
| Background behind an article |
| Edge around an article |
| Buttons, tabs and anything else the campaign highlights |
| Lettering on those |
| Their edge, where it should differ from the fill |
| The badge naming an article's type |
| Lettering on that badge |
Blocks and type inside an article
Variable | What it controls |
|---|---|
| Secret block background |
| Secret block border |
| "SECRET" label |
| Dashed separator above the Known-by list |
| "Known by" label |
| Known-by pill background |
| Known-by pill border |
| Known-by pill text |
| Info-box row separator |
| Info-box background |
| Info-box title background |
| Info-box title text |
| Quote block background |
| Quote block border |
| Quote mark accent |
| Rule down the side of a dated passage |
| Font family for headings (h1–h6) in campaign content |
| Font family for body text in campaign content |
| Opacity of the paper-grain texture on cards ( |
Variables reach the campaign's own pages and no others. Nothing written here shows in another campaign or on the pages outside one.