Skip to main content

A streaming markdown renderer for modern terminals with syntax highlighting

Project description


The streaming markdown renderer for the terminal that rocks

Streamdown works with simonw's llm along with any other streaming markdown. You even get full readline and keyboard navigation support.

$ pip install streamdown

Streamdown is Amazing

Provides clean copyable code for long code lines

Some inferior renderers inject line breaks when copying code that wraps around. We're better and now you are too! Handle That Mandle Tip: You can make things prettier if you don't mind if this guarantee is broken. See the PrettyBroken flag below!

Supports images

Here's kitty and alacritty. Try to do that in glow... doggie

Supports hyperlinks (OSC 8) and clipboard (OSC 52)

links.webm

Supports tables

table

As well as everything else... dunder

Colors are highly (and quickly) configurable for people who care a lot, or just a little.

configurable

Has a Plugin system to extend the parser and renderer.

For instance, here is the latex plugin doing math inside a table: calc

TOML Configuration

It's located at ~/.config/streamdown/config.toml (following the XDG Base Directory Specification). If this file does not exist upon first run, it will be created with default values.

Here are the sections:

[style]

Defines the base Hue (H), Saturation (S), and Value (V) from which all other palette colors are derived. The defaults are at the beginning of the source.

  • HSV: [ 0.0 - 1.0, 0.0 - 1.0, 0.0 - 1.0 ]
  • Dark: Multipliers for background elements, code blocks.
  • Grey: Multipliers for blockquote and thinkblock.
  • Mid: Multipliers for inline code backgrounds, table headers.
  • Symbol: Multipliers for list bullets, horizontal rules, links.
  • Head: Multipliers for level 3 headers.
  • Bright: Multipliers for level 2 headers.
  • Margin (integer, default: 2): The left and right indent for the output.
  • Width (integer, default: 0): Along with the Margin, Width specifies the base width of the content, which when set to 0, means use the terminal width. See #6 for more details
  • PrettyPad (boolean, default: false): Uses a unicode vertical pad trick to add a half height background to code blocks. This makes copy/paste have artifacts. See #2. I like it on. But that's just me
  • PrettyBroken (boolean, default: false): This will break the copy/paste assurance above. The output is much prettier, but it's also broken. So it's pretty broken. Works nicely with PrettyPad.
  • ListIndent (integer, default: 2): This is the recursive indent for the list styles.
  • Syntax (string, default monokai): This is the syntax highlighting theme which come via pygments.

Example:

[style]
PrettyPad = true
PrettyBroken = true
HSV = [0.7, 0.5, 0.5]
Dark = { H = 1.0, S = 1.2, V = 0.25 } # Make dark elements less saturated and darker
Symbol = { H = 1.0, S = 1.8, V = 1.8 } # Make symbols more vibrant

[features]

Controls optional features:

  • CodeSpaces (boolean, default: true): Enables detection of code blocks indented with 4 spaces. Set to false to disable this detection method (triple-backtick blocks still work).
  • Clipboard (boolean, default: true): Enables copying the last code block encountered to the system clipboard using OSC 52 escape sequences upon exit. Set to false to disable.
  • Logging (boolean, default: false): Enables logging to tmpdir (/tmp/sd) of the raw markdown for debugging and bug reporting. The logging uses an emoji as a record separator so the actual streaming delays can be simulated and replayed. If you use the filename based invocation, that is to say, sd <filename>, this type of logging is always off.
  • Savebrace (boolean, default: true): Saves the code blocks of a conversation to the append file /tmp/sd/savebrace so you can fzf or whatever you want through it. See how it's used in my llmehelp scripts, specifically screen-query and sd-picker.

Example:

[features]
CodeSpaces = false
Clipboard = false

Command Line

The most exciting feature here is --exec with it you can do full readline support like this:

 $ sd --exec "llm chat"

And now you have all your readline stuff. It's pretty great.

Streamdown - A markdown renderer for modern terminals

positional arguments:
  filenameList          Input file to process (also takes stdin)

options:
  -h, --help            show this help message and exit
  -l LOGLEVEL, --loglevel LOGLEVEL
                        Set the logging level
  -c COLOR, --color COLOR
                        Set the hsv base: h,s,v
  -w WIDTH, --width WIDTH
                        Set the width
  -e EXEC, --exec EXEC  Wrap a program for more 'proper' i/o handling

Demo

Do this

$ ./streamdown/sd.py tests/*md

Install from source

After the git clone least one of these should work, hopefully. it's using the modern uv pip tool but is also backwards compatible to the pip3 install -r requirements.txt flow.

$ pipx install -e .
$ pip install -e .
$ uv pip install -e . 

Future work

Glow styles

I'm going to try to be compatible with other popular markdown styles to help for a smoother transition. Glow compatible json sheets is on my radar. There's also mdless and frogmouth. Might be others

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

streamdown-0.17.0.tar.gz (2.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

streamdown-0.17.0-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file streamdown-0.17.0.tar.gz.

File metadata

  • Download URL: streamdown-0.17.0.tar.gz
  • Upload date:
  • Size: 2.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for streamdown-0.17.0.tar.gz
Algorithm Hash digest
SHA256 701a75235900b569b4946968189c35f4172e14a3ded1de2fb3df888f3145e096
MD5 586893b89f92bbeaaba037d72a861c93
BLAKE2b-256 599da8e6870a88ea9a72cfe15361de541763a48907eaf841ee17a40518e98909

See more details on using hashes here.

File details

Details for the file streamdown-0.17.0-py3-none-any.whl.

File metadata

  • Download URL: streamdown-0.17.0-py3-none-any.whl
  • Upload date:
  • Size: 18.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for streamdown-0.17.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e9a5caa40d2b2824318e106a49bce3786f7cec3961c24e49fe23b7e56c7d2e8a
MD5 c9d6af500b2d4ab26c1fffbffacc01fd
BLAKE2b-256 ed536762562ac522dd96d1003f553438c1354a72d70344c388c3960b8f848f3e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page