Themes
Themes
A theme bundles up the look-and-feel decisions of a deck: the color palette, the fonts, the cover style, and the footer defaults for each layout. Instead of setting a dozen properties one by one, a theme gives you a coherent design in a single, reusable file.
The default theme
Every deck starts from the built-in default theme β a light background with the Tachyonn orange (#FF5F1F) as its primary color. You don't have to do anything to get it; it's applied automatically.
(That orange is borrowed from the BrasΓlia sky at dusk β see Where the orange comes from.)
The default theme is itself a plain theme file, default.tt, shipped with Tachyonn. It lists every variable and setting a theme can have, each one commented. That makes it the best starting point for your own theme: copy it and change what you want.
Built-in presets
Besides default, two presets ship inside Tachyonn. Ask for one by name β no file, no path:
===
theme: dark
===| Name | What it is |
|---|---|
default | The light theme with the Tachyonn orange. Applied when you say nothing |
dark | The same design on a dark blue-grey surface (#12121a), with a slightly lighter orange for contrast and toned-down surfaces for code and panels |
physics | A sober deep-blue academic palette plus a TeX macro pack: \R \C \N \Z \Q, \ket \bra \braket \expval, \vb \uv \op \grad \divg \curl \lap, \dd \dv \pdv \order, \abs \norm \unit \qty \ee \ii \kB \degree. Write +[\pdv{f}{x}] or +[\ket{\psi}] with no preamble |
Presets are ordinary theme files compiled into the binary: they declare only what differs from default, so everything else (typography, layout variants, footer rules) is inherited. Your deck frontmatter still overrides them key by key, and your own texMacro: lines win over the physics pack on a name clash.
A typo in the name isn't silent: an unknown theme falls back to default and reports a warning in the preview's diagnostics overlay and in the terminal.
Theme files (.tt)
A .tt file ("Tachyonn Theme") holds all your design choices in one place. Put it in the same folder as your .tac file:
my-talk.tac
my-theme.ttβ¦and point to it from the frontmatter:
===
theme: ./my-theme.tt
===Anything your file leaves out simply keeps the value from the default theme. So a theme can be as short as a couple of lines β you only override what you want to change.
A minimal example
// my-theme.tt
name: My Theme
accent: #003087
background: #ffffff
headingColor: #003087That's a complete, valid theme: it changes the accent, background, and heading color, and inherits everything else (fonts, footer behavior, etc.) from the default.
The full picture
The default.tt file is the complete reference β copy it to see every option with comments. Here's the shape of it:
// my-theme.tt
name: My Theme
// ββ Colors ββββββββββββββββββββββββββββββ
accent: #38bdf8 // primary: titles, links, accents
background: #0f172a // slide background
color: #e2e8f0 // body text
headingColor: #7dd3fc // slide titles
mutedColor: #64748b // captions, footer, subtitles
borderColor: #1e293b // dividers, table rows
// ββ Typography ββββββββββββββββββββββββββ
font: Inter, sans-serif // any installed font works; the bundled ones are Atkinson Hyperlegible / Momo Trust Display / JetBrains Mono
fontMono: JetBrains Mono, monospace
// ββ Advanced: raw CSS variables βββββββββ
// Any key starting with -- is passed straight through as a CSS variable.
--tac-code-bg: #1e1e1e
--tac-footer-size: 13px
// ββ Cover βββββββββββββββββββββββββββββββ
coverLayout: title
// ββ Footer visibility per layout ββββββββ
footer.title: false
footer.section: false
footer.standard: true
footer.two-column: true
// ... one line per layoutKey reference
This page covers the keys you reach for most often. The complete list β every
key, every synonym, every default β is in the
Property Reference.
Identity and typography
| Key | Default | Description |
|---|---|---|
name | default | A display name for the theme (optional). |
font / fontSans | Atkinson Hyperlegible, sans-serif | Body font family. |
headingFont / titleFont | Momo Trust Display, sans-serif | Titles and headings. |
fontMono / fontCode | JetBrains Mono, monospace | Code font family. |
Fonts and offline
Atkinson Hyperlegible (body), Momo Trust Display (headings) and JetBrains Mono (code) ship bundled with Tachyonn β self-hosted, never fetched from the internet β so they render identically on every machine, offline. You can name any other font, but it will only appear if the viewer has it installed; otherwise it falls back to a system font.
Colors (friendly names β the same ones you can use in the frontmatter)
| Key | CSS variable it sets | Default |
|---|---|---|
accent | --tac-accent | #FF5F1F |
background / bg | the slide background | #ffffff |
color / textColor | --tac-text | #1c1c28 |
headingColor / titleColor | --tac-heading | #FF5F1F |
mutedColor | --tac-text-muted | #6b7280 |
borderColor | --tac-border | #e5e7eb |
Raw CSS variables β any key beginning with -- is written through verbatim, for the finer details that have no friendly alias (--tac-code-bg, --tac-footer-height, --tac-progress-color, β¦).
Cover
| Key | Values | Default |
|---|---|---|
coverLayout / coverVariant | centered Β· image-bg Β· image-title Β· split Β· stacked Β· minimal | centered |
sectionVariant | centered Β· toc Β· toc-side Β· number Β· backdrop Β· color-block Β· bigtype | centered |
tocHeading | section Β· deck Β· none | section |
Footer visibility, one key per layout (names are kebab-case and match the slide layout):
footer.title: false // cover slide
footer.section: false // section dividers (#)
footer.media: false // media slides
footer.big-number: false // big-number slides
footer.quote: true // quote slides
footer.standard: true // standard slides
footer.two-column: true // two-column
footer.three-column: true // three-column
footer.grid: true // grid
footer.code-window: true // code-window
footer.image-and-text: true // image-and-textComments are welcome
Inside a .tt file you can write comments with // or #, either on their own line or right after a value (accent: #003087 // brand blue). They're stripped when the theme loads.
How settings stack up
Configuration is applied in cascading layers, from the most general to the most specific. Each layer overrides the one before it:
default.tt (built-in)
β overridden by
Your .tt theme file
β overridden by
Deck frontmatter
β overridden by
Per-slide frontmatterThat's what makes themes flexible. You can use a .tt for the overall design and still tweak a single color in one deck's frontmatter:
===
theme: ./my-theme.tt
accent: #ff6b6b
===