Skip to content
CAI
Software that uses CAICheck a score

mfontanini/presenterm

62.7

Adequate · 29 September 2026

22.2k

lines of production code

Rust

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a terminal-based presentation engine that renders slideshows from Markdown files with rich formatting and syntax highlighting. It supports dynamic code snippet execution, image display via multiple terminal protocols, and exports to PDF and self-contained HTML. The tool features a modular architecture for configuration, theming, and rendering, enabling live reloads, speaker notes, and various visual transitions within a terminal environment.

How it got here

2023 — Initial project scaffolding and core engine development

7 changes.

This period established the foundational structure of the presenterm project, including repository configuration, licensing, and Nix-based build systems. It focused on developing the core presentation engine, featuring a modular markdown parser, a new rendering subsystem with layout validation, and a comprehensive YAML-based configuration system. Additionally, automation scripts were introduced to manage configuration schemas, changelogs, and upstream syntax highlighting assets.

2025 — Terminal rendering and UI expansion

12 changes.

This period focused on significantly expanding the application's terminal capabilities by introducing a modular image rendering system with support for multiple graphics protocols and ANSI parsing. Concurrently, the project enhanced the user interface with customizable footers, modals, and transition animations, while adding features for code snippet execution and HTML export.

Features

Add HTML export with mobile support and self-contained output

Users can now export presentations to HTML in addition to PDF. The generated HTML is self-contained, respects font sizes, and includes JavaScript to handle slide navigation via keyboard arrows, touch swipes, and clicks, while automatically scaling to fit the browser window width for mobile device support. The export process also retains the slide position in the URL hash.

src/export · high confidence

Added presentation diffing and async content polling

The presentation module now includes a \PresentationDiffer\ that detects changes between presentations by comparing slide content and structure, enabling features like automatic navigation to modifications. Additionally, a background \Poller\ has been introduced to handle asynchronous content rendering, allowing dynamic elements to refresh slides or display errors without blocking the main UI thread.

src/presentation · high confidence

Automated bat asset update and verification process

The system now includes scripts to automatically fetch and verify the latest syntax highlighting and theme assets from the upstream bat repository. The update script pulls the specified bat version, extracts the compiled syntaxes and themes binaries, and records the source git hash, while a separate verification script ensures local assets match the upstream source by comparing SHA-256 hashes. This ensures that syntax highlighting and theming capabilities remain up-to-date with the latest bat releases without manual intervention.

bat · high confidence

Initial repository scaffolding and configuration

This change establishes the foundational structure for the presenterm project by adding essential configuration and metadata files. It introduces a \.editorconfig\ to enforce consistent indentation for shell scripts, a \LICENSE\ file under the BSD 2-Clause license, and a \README.md\ detailing the tool's features and installation methods. The project's build system is configured via \flake.nix\ and \flake.lock\ for Nix-based development, while \build.rs\ is added to embed theme assets at compile time. Additionally, \config.sample.yaml\ provides a reference for user configuration, \config-file-schema.json\ defines the structure for validation, and \executors.yaml\ specifies the default command-line tools for executing code snippets in various programming languages.

(repo-wide) · high confidence

Introduce presenterm configuration and presentation engine

This change introduces the core configuration system and presentation engine for the terminal slideshow tool. Users can now define global defaults (such as theme, image protocol, and overflow validation) and specific settings for third-party rendering (Mermaid, D2, Typst) and code snippets via a YAML config file. The application now supports a new 'presenter' mode for running slideshows, handles file watching for live reloads, and manages resources like themes and images with caching. It also adds CLI options for exporting to PDF and HTML, listing themes, and configuring custom keybindings.

src · high confidence

New UI module with customizable footers, centered modals, and separators

The presentation UI has been reorganized into a dedicated \src/ui\ module, introducing three key visual capabilities. First, the footer is now fully customizable via a template system that supports text variables (such as slide count, author, and title), escaped braces, and images positioned on the left, center, or right, alongside a legacy progress bar mode. Second, interactive overlays like the slide index and key bindings help are now rendered as centered modals with configurable styling and background images. Third, a new separator component allows for centered horizontal rules with headings that can either fit the window width or remain fixed.

src/ui · high confidence

New code snippet execution and highlighting engine

The application now supports executing code snippets directly within presentations, allowing users to run code and view output (including images) in real-time. This change introduces a new execution engine that loads language-specific configurations from executors.yaml, supports alternative executors (such as uv for Python), and handles PTY-based execution for interactive commands. Additionally, code highlighting has been significantly expanded to support a wide range of languages (including F\#, Julia, GDScript, D2, and TypeScript React) using bat's syntax definitions, and snippets can now be rendered with line numbers, padding, and selective highlighting of specific code blocks.

src/code · high confidence

New keyboard command system and UDP-based speaker notes

The application now uses a new, configurable keyboard command system (src/commands) that supports custom keybindings for actions like toggling a layout grid and skipping pauses. Additionally, speaker notes communication has been rewritten to use UDP sockets, allowing for non-blocking event publishing and listening across multiple instances.

src/commands · high confidence

New scripts for config schema management and changelog parsing

Added four new shell scripts to the scripts directory: generate-config-file-schema.sh and validate-config-file-schema.sh automate the creation and verification of the config-file-schema.json file using the json-schema feature; parse-changelog.sh extracts release notes for a specific version from CHANGELOG.md; and test-pdf-generation.sh verifies PDF export functionality using presenterm-export 0.2.0.

scripts · high confidence

New slide and fade transition animations for terminal output

The \src/transitions\ module now includes three new animation types: \CollapseHorizontalAnimation\, which shrinks content from the edges inward; \SlideHorizontalAnimation\, which slides content horizontally across the viewport; and \FadeAnimation\, which randomly reveals changed characters one by one. These are implemented via new files (\collapse\_horizontal.rs\, \slide\_horizontal.rs\, \fade.rs\) and registered in \mod.rs\, providing users with visual transition effects when navigating between terminal states.

src/transitions · high confidence

New snippet execution modes: PTY, image output, and validation

The UI execution module now supports three new snippet execution modes alongside the existing standard output mode. Snippets can now run in a pseudo-terminal (PTY) for interactive programs, render their stdout as an image, or be validated against expected success/failure outcomes. The module also introduces a disabled state that displays a message when execution is disabled, and restructures the execution attributes to support these new capabilities.

src/ui/execution · high confidence

New terminal image protocol implementations

The terminal now supports rendering images via multiple protocols: ASCII art (using top/bottom block characters with color blending), iTerm2 inline images (supporting both single and multipart modes, including tmux passthrough), Kitty graphics protocol (supporting static images and animated GIFs via temporary files), Sixel (using the icy\_sixel crate), and a raw protocol for generating inline HTML data URIs. These changes enable image display in a wider range of terminal environments and configurations.

src/terminal/image/protocols · high confidence

New terminal module with ANSI parsing, capability detection, and image protocol support

The \src/terminal\ module has been introduced to handle terminal-specific rendering logic, including a new ANSI parser for processing escape codes (bold, italic, colors) and a capability detection system that queries the terminal for support of Kitty graphics (local/remote), Sixel, and font size protocols. The module also implements image printing via multiple protocols (Iterm2, Kitty, Sixel, ASCII blocks) and manages background colors via OSC 11, with specific handling for tmux environments to avoid display issues.

src/terminal · high confidence

Architecture

Introduce new modular markdown parsing and text styling infrastructure

The markdown processing logic has been restructured into a new modular architecture within the \src/markdown\ directory. This change introduces dedicated modules for elements (\elements.rs\), HTML parsing (\html.rs\), text styling (\text\_style.rs\), and text weighting/layout (\text.rs\), replacing the previous flat structure. The new \MarkdownParser\ leverages \comrak\ with extensions for alerts, wikilinks, footnotes, and superscripts, while the \HtmlParser\ now strictly handles \\<span\>\ and \\<sup\>\ tags with CSS attribute support. Text representation has been refined with \WeightedLine\ and \WeightedText\ to accurately handle Unicode widths and font scaling, and \TextStyle\ now supports granular flags for bold, italics, strikethrough, and superscript, resolving raw colors against a palette.

src/markdown · high confidence

Refactored image rendering architecture with unified printer and scaling logic

The image rendering subsystem has been reorganized into a modular structure under \src/terminal/image\, introducing a unified \ImagePrinter\ that dispatches to specific protocol handlers (Kitty, Iterm2, Sixel, Ascii, Raw) based on the terminal's graphics mode. This change centralizes image registration and caching via a new \ImageRegistry\ and \Image\ struct, which now includes an ASCII cache for performance. Additionally, a dedicated \ImageScaler\ module handles layout constraints, ensuring images fit within window dimensions while preserving aspect ratios, and includes comprehensive tests for various resizing scenarios.

src/terminal/image · high confidence

Behavioural changes

New modular render engine with layout, overflow validation, and ASCII scaling

The rendering subsystem has been restructured into a modular engine (\src/render/engine.rs\) that manages terminal drawing via a \TerminalIo\ interface, introducing a \Layout\ module for precise text positioning (left, right, center with margins) and a \Validate\ module to detect horizontal or vertical content overflow before display. A new \AsciiScaler\ pre-scales ASCII images in the background to improve transition performance, while \WindowSize\ now supports pixel-aware shrinking to maintain aspect ratios when content is capped. These changes enable more robust handling of terminal dimensions, configurable alignment when content exceeds screen bounds, and safer rendering of complex layouts.

src/render · high confidence

Presentation builder refactored into modular components with improved error reporting

The presentation builder logic has been restructured from a single monolithic file into distinct modules (comment, error, frontmatter, heading, images, list, quote, snippet, table, sources) to improve maintainability. This change introduces a new, structured error handling system that provides richer context for build failures, including source file paths, line/column numbers, and formatted error messages. It also adds support for importing external markdown files via the \include\ comment command, allows configuring the number of newlines between list items, and refactors how snippet execution and validation are handled within the builder pipeline.

src/presentation/builder · high confidence

Theme system refactored with split raw/runtime models and expanded styling options

The theme system has been restructured to separate raw configuration parsing from runtime presentation logic, introducing a \raw\ module for deserialization and a \clean\ module for processed styles. This change enables several new user-facing styling capabilities: slide titles can now include a configurable prefix, support bold/italic/underline modifiers, and use 3-digit hex colors; headings can be styled with bold, italic, or underline; and the \italics\ theme key now accepts \italic\ as an alias. Additionally, the system now supports d2 diagrams, configurable code block line numbers, and a layout grid toggle, while fixing issues with custom theme symlinks and footer error handling.

src/theme · high confidence

Dependencies

Update presenterm to v0.16.1 with major dependency upgrades

The presenterm terminal slideshow tool has been updated to version 0.16.1, accompanied by a significant refresh of its Rust dependencies. Key upgrades include comrak moving from 0.18 to 0.48.0, clap gaining 'string' and 'env' features, and the introduction of new libraries such as icy\_sixel for sixel protocol support, fastrand for random number generation, and directories for config path resolution. The Cargo.lock file has also been migrated from format version 3 to 4, and various underlying crates like anstream, anstyle, and bitflags have been bumped to newer versions to support these changes.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 69 → 63 (-6.5)
  • Rubric changed (rubric-2026.09.9 → rubric-2026.09.17) — scores are not directly comparable.

Lenses

  • Code Health 92 → 92 (+0.0)
  • Architecture 96 → 88 (-8.2)
  • Maturity 67 → 67 (+0.1)
  • Readiness 68 → 51 (-16.8)
  • Security 63 → 70 (+7.4)

Resolved (3)

  • Boundary-crossing change coupling: mod.rs ↔ layout.rs (src/presentation/builder/mod.rs)
  • Documentation: no installation or build instructions (docs/src/install.md)
  • Hotspot: src/presentation/builder/snippet.rs (src/presentation/builder/snippet.rs)

New (14)

  • Documentation: written for insiders (docs/src/features/images.md)
  • Outdated: anyhow
  • Outdated: clap
  • Outdated: fastrand
  • Outdated: flate2
  • Outdated: image
  • Outdated: libc
  • Outdated: once_cell
  • Outdated: serde
  • Outdated: serde_json
  • Outdated: socket2
  • Outdated: tempfile
  • Outdated: thiserror
  • Projects may be oversized for their cohesion

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

mfontanini/presenterm was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 29 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 5f8add11a24af9d257fd18da48c8004dd9c516f8 — the exact code this score is about.
  • Scored under rubric-2026.09.17 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-705631bb727e.