Skip to content

Repository files navigation

The Deck logo displays the word "Deck" in a chunky pixel/bitmap font with a tan and beige color on a black background, evoking a retro video game version of a deck.

Deck

Terminal-based presentations from Markdown files using PowerShell.

PowerShell 7.4+ Platform PSGallery License

Quick Start

Install-Module Deck -Scope CurrentUser

Or clone from GitHub:

git clone https://github.com/jakehildreth/Deck.git
Import-Module ./Deck/Deck.psd1

Create a Markdown file:

---
background: Black
foreground: Cyan1
border: Blue
---

# My Presentation

---

## Section Title

---

### Slide Content

Your content here with **bold** and *italic* text.

* Progressive bullets
* Reveal one at a time

Run the presentation:

Show-Deck -Path ./presentation.md

Or load directly from a web URL:

Show-Deck -Path https://exampledeck.jakehildreth.com

Validate content before presenting:

Show-Deck -Path ./presentation.md -Strict

The -Strict parameter validates:

  • Content height doesn't exceed viewport
  • Local image files exist (web image URLs are not validated)
  • Reports all errors before starting

Start from a specific slide:

Show-Deck -Path ./presentation.md -StartSlide 5

Features

Slide Types

  • Title Slides - Single # heading with no body, large centered figlet text
  • Section Slides - Single ## heading with no body, medium centered figlet text
  • Content Slides - #, ##, or ### heading with body content (H1/H2 headings render as figlet above the body), or body with no heading
  • Image Slides - Two-panel layout with content left (60%), image right (40%)
  • Multi-Column Slides - Split content with ||| delimiter (delimiter must be on its own line), with progressive bullet support per column
  • Syntax Highlighting - Fenced code blocks with language-aware highlighting via TextMate

Tables, code blocks, and images can appear within any content, image, or multi-column slide.

Heading Mixing

An H1 or H2 heading followed by body content renders the heading as figlet text above the body:

## H2 With Progressive Bullets

* First point revealed on entry
* Second point revealed on next keypress

A # or ## heading alone (no body) is still a title or section slide.

Image Slides

Create side-by-side layouts with text and images:

### Slide Title

Text content on the left.

* Progressive bullets supported
* Auto-sized images

![Alt Text](image.png){width=80}

Images are auto-detected. Use relative or absolute paths. Optional {width=N} sets max width.

Web images are supported:

![Logo](https://example.com/logo.png)
### About Our Brand
Content appears here

Tables

Markdown tables render as rounded Spectre.Console tables:

### Slide Title

| Name   | Role       | Status |
|-------|----------|-------|
| Alice  | Engineer   | Active |
| Bob    | Designer   | Active |

Tables work on content slides, image slides, and multi-column slides.

Inline markup renders inside table cells: **bold**, _italic_, `code`, ~~strikethrough~~, colors, and links. A leading - or * (marker + space) in a cell renders as a bullet; data like -5% (no space) stays literal. See Examples/Features/TableCellMarkupTest.md.

Syntax Highlighting

Fenced code blocks with a language identifier get automatic syntax highlighting powered by TextMate:

```powershell
Get-Process | Where-Object CPU -gt 100
```

Renders in a rounded panel with language header and full color tokenization. Supports 60+ languages including PowerShell, Python, C#, JavaScript, Rust, Go, SQL, YAML, and more. Falls back to plain monochrome when a language grammar isn't available.

Bullet Points

  • Progressive bullets using * — revealed one at a time with each forward keypress; navigating backward un-reveals one at a time
  • Static bullets using - — all visible immediately on slide entry

Both styles work in content, image, and multi-column slides; each column in a multi-column slide reveals its own bullets.

Inline Formatting

  • **bold** or __bold__
  • *italic* or _italic_
  • `code`
  • ~~strikethrough~~
  • [link text](https://url) — clickable hyperlink
  • <colorname>text</colorname> or <span style="color:colorname">text</span> for colors

Links

Markdown links become clickable hyperlinks in terminals that support OSC 8 (Windows Terminal, iTerm2, Ghostty, WezTerm). Elsewhere they degrade to plain display text. Links work in body text and in table cells.

Strikethrough Support

Spectre.Console exposes no strikethrough capability flag, so Deck detects support heuristically from WT_SESSION / TERM_PROGRAM / TERM and warns once per session when ~~text~~ is used in a terminal not known to support it. Override detection with the DECK_STRIKETHROUGH environment variable (true or false).

Color Examples

This text has <red>red</red>, <blue>blue</blue>, and <green>green</green> colors.

You can use standard HTML: <span style="color:yellow">yellow text</span>

Mix with formatting: **<red>bold red text</red>** or *<blue>italic blue</blue>*

Supports all Spectre.Console color names.

Navigation

  • Forward: Right, Down, Space, Enter, n, Page Down
  • Backward: Left, Up, Backspace, p, Page Up
  • Exit: Esc, Ctrl+C, q
  • Help: ?

The first slide shows a [press ? for help] hint in place of pagination. After the last slide an "End of Deck" screen is shown — press any backward key to return to the last slide, or Esc / q / Ctrl+C to exit.

Customization

Configure in YAML frontmatter:

---
background: black          # Background color
foreground: white          # Text color
border: magenta            # Border color
borderStyle: rounded       # rounded, square, double, heavy, none
pagination: false          # Show slide numbers
paginationStyle: minimal   # minimal, fraction, text, progress, dots
h1: default                # Figlet font for # titles (aliases: titleFont, h1Font)
h2: default                # Figlet font for ## sections (aliases: sectionFont, h2Font)
h3: default                # Figlet font for ### headers (aliases: headerFont, h3Font)
h1Color: null              # Color for # titles (aliases: titleColor, h1FontColor)
h2Color: null              # Color for ## sections (aliases: sectionColor, h2FontColor)
h3Color: null              # Color for ### headers (aliases: headerColor, h3FontColor)
autoAdvance: 0             # Milliseconds per state tick (0 = disabled)
---

paginationStyle options:

Value Example
minimal 5
fraction 5/10
text Slide 5 of 10
progress █████░░░░░
dots ○ ○ ● ○ ○

Figlet font names for h1, h2, and h3 must match one of the 25 bundled fonts. See Examples/Features/FontShowcase.md for a visual preview.

Bundled fonts: 04B_03__ 04B_03B_ 04B_08__ 04B_09__ 04B_11__ 04B_19__ 04B_20__ 04B_21__ 04B_24__ 04B_25__ 5by5 blocco Bytesized-Regular JacquardaBastarda9-Regular lisp-system-tools Micro5-Regular mini negative-quinpix PressStart2P Silkscreen Sixtyfour-Regular-VariableFont_BLED,SCAN small super-mario-brothers-3-all-stars Tiny5 TinyUnicode

Heading Colors

Heading colors can be specified three ways:

  1. Inline HTML tags (highest priority):
# <red>Red Title</red>
## <cyan>Cyan Section</cyan>
### <green>Green Header</green>
  1. Frontmatter settings:
h1Color: red
h2Color: cyan
h3Color: green
  1. Foreground fallback (if neither above is specified)

Both <colorname>text</colorname> and <span style="color:colorname">text</span> syntax are supported.

Per-Slide Overrides

Any slide can override global frontmatter settings with HTML comments in the slide body. Overrides apply only to that slide.

### My Slide
<!-- paginationStyle: dots -->
<!-- border: cyan -->
<!-- h1: PressStart2P -->

Slide content here.

Supported keys: pagination, paginationStyle, h1, h2, h3, h1Color, h2Color, h3Color, border, borderStyle, autoAdvance.

Set <!-- autoAdvance: 0 --> on a slide to disable a global timer for that slide only.

See Examples/Features/OverrideTest.md for examples.

Auto-Advance

Set autoAdvance in frontmatter to advance the presentation automatically on a timer (milliseconds):

---
autoAdvance: 3000
---

Each timer tick fires a Next action: reveals the next progressive bullet if any are hidden, otherwise advances to the next slide. The timer resets after every state change. Manual navigation always works regardless of the timer.

Override per slide:

### Fast Slide
<!-- autoAdvance: 400 -->
Advances after 400ms — useful for fade simulations.

---

### Pause Here
<!-- autoAdvance: 0 -->
Auto-advance disabled. Manual input required.

See Examples/Features/AutoAdvanceTest.md for a working demo.

Intentionally Blank Slides

A slide containing only <!-- intentionally blank --> renders with no heading, content, or pagination:

---

<!-- intentionally blank -->

---

Examples

See Examples/ExampleDeck.md for a comprehensive demo:

Show-Deck -Path ./Examples/ExampleDeck.md

Additional examples in Examples/Features/:

Requirements

  • PowerShell 7.4 or later
  • TextMate (auto-installed if missing; transitively loads PwshSpectreConsole)
  • Windows, Linux, or macOS (Apple Silicon only — x64 Intel macOS is not supported)

License

MIT License w/Commons Clause - see LICENSE file for details.

Built With

Made with 💜 by Jake Hildreth

About

Terminal-based presentations from Markdown files using PowerShell.

Resources

Stars

27 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages