- Go 99.7%
- Makefile 0.3%
| internal | ||
| themes | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| CLAUDE.md | ||
| demo.md | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| Makefile | ||
| README.md | ||
| renovate.json | ||
clides
A terminal-based Markdown slide deck presenter with multi-terminal sync support.
Features
- Renders Markdown slides full-screen in the terminal using tcell
- Supports headings, bold, italic, inline code, fenced code blocks with syntax highlighting, bullet lists, blockquotes, and images
- Slides separated by
---horizontal rules - Navigate with keyboard or a USB slide presenter (Logitech R400 and compatible)
- Blank-screen toggle for the presenter's black-out button
- Multi-terminal sync — a follower window mirrors the host in real time, navigation works from either side
- Theming via TOML — colors, margins, line spacing, bullet character, heading decorations
- Bundled themes: dark (default), light, dracula, nord, solarized-dark
- Image rendering: native resolution on Kitty-protocol terminals (WezTerm, kitty), half-block fallback everywhere else
Installation
Requires Go 1.21+.
git clone https://github.com/okautz/clides
cd clides
make
The clides binary is placed in the current directory. Copy it to somewhere on your $PATH if desired.
Usage
# Present a deck (shorthand)
clides deck.md
# Present a deck with a custom theme
clides --theme themes/dracula.toml deck.md
# Open a second terminal and follow the running presentation
clides follow
Multi-terminal sync
Start the host in one terminal:
clides deck.md
Open a second terminal (e.g. on a projector or a secondary screen) and run:
clides follow
If multiple presentations are running, clides lists them and lets you choose. Navigation works from either terminal — advancing on one immediately updates the other.
Slide format
Slides are standard Markdown separated by ---:
# First Slide
Some *italic* and **bold** text.
> A blockquote stands out with a colored bar on the left.
---
## Code with Syntax Highlighting
Annotate the opening fence with a language name:
```go
func greet(name string) string {
return "Hello, " + name
}
```
---
## Slide with an Image

Supported block elements:
| Syntax | Result |
|---|---|
# / ## / ### |
Headings (H1 centered, H2 centered, H3 centered) |
- item or * item |
Unordered bullet list |
```lang … ``` |
Fenced code block; add a language name for syntax highlighting |
> text |
Blockquote with a colored vertical bar |
 |
Image (on its own line) |
Supported inline elements: **bold**, *italic*, `code`.
Syntax highlighting
Add a language identifier to the opening fence:
```python
words = ["hello", "world"]
print(" ".join(words))
```
clides uses chroma and supports the same language identifiers (e.g. go, python, rust, bash, yaml, json, …). If the language is unknown or omitted, the block renders in the plain code style without highlighting.
Token colors are controlled by the five syn_* keys in the theme (see Theming).
Blockquotes
> This is a blockquote.
> It can span multiple lines.
Each line starting with > is rendered with a colored │ bar on the left and the text in an italic quote color. Inline formatting (**bold**, italic, `code`) works inside blockquotes.
Images
Place an image on its own line using standard Markdown syntax:

Paths are relative to the deck file. PNG and JPEG are supported.
Rendering quality depends on the terminal:
| Terminal | Rendering |
|---|---|
| WezTerm, kitty, iTerm2 | Native resolution via Kitty graphics protocol |
| All other terminals | Unicode half-block characters with true color |
Images are pre-encoded in the background at startup so navigating to an image slide is instant.
Navigation
| Action | Keys |
|---|---|
| Next slide | → Space Page Down n |
| Previous slide | ← Backspace Page Up p |
| Jump to slide N | type N then Enter |
| Blank screen | b . (. is sent by the Logitech R400 black-out button) |
| Quit | q Esc |
Theming
clides looks for a theme file at ~/.config/clides/theme.toml automatically. Pass a different file with --theme.
A theme file is TOML and all fields are optional — omitted keys fall back to the built-in dark defaults.
[colors]
background = "black" # W3C color name or #rrggbb hex
foreground = "white"
h1 = "aqua"
h2 = "teal"
h3 = "silver"
bold = "white"
italic = "white"
code_fg = "lime"
code_bg = "#111118" # keep this close to background for a subtle code box
bullet = "yellow"
counter = "gray"
# Syntax highlighting — token category colors inside language-tagged code blocks
syn_keyword = "#ff79c6"
syn_string = "#f1fa8c"
syn_comment = "#6272a4"
syn_literal = "#bd93f9" # numbers, booleans, other literals
syn_type = "#8be9fd" # types, function names, builtins
# Blockquote colors
quote_fg = "#8be9fd" # quote text color (rendered italic)
quote_bar = "#bd93f9" # the │ bar on the left
[layout]
margin = 0.15 # horizontal margin as a fraction of terminal width (0.0–0.5)
line_spacing = 0 # extra blank rows inserted after each content line
[bullets]
char = "•" # any character or emoji
[headings]
h1_uppercase = false # render H1 text in uppercase
h1_underline = false # draw a ─── rule beneath H1
h2_underline = false
Bundled themes
| File | Style |
|---|---|
themes/dark.toml |
Dark (matches built-in defaults) |
themes/light.toml |
Light — black text on white |
themes/dracula.toml |
Dracula |
themes/nord.toml |
Nord |
themes/solarized-dark.toml |
Solarized Dark |
Use any of them as a starting point for your own theme:
cp themes/dracula.toml ~/.config/clides/theme.toml
License
MIT