sgo.to

Overview

Typograms (typographic diagrams) is a lightweight image format (text/typogram) useful for defining simple diagrams in technical documentation.

Like markdown, typograms is heavily inspired by pre-existing conventions found in ASCII diagrams. A small set of primitives and rules to connect them is defined, which you can use to build larger diagrams.

Typograms optimizes for editability and portability (e.g. plain text is easy to maintain, change, store and transmit), at the cost of expressivity (e.g. SVG is more expressive) and ergonomics (e.g. higher level tools produce diagrams faster).

A comparison with related work is available below.

A polyfill is available that allows you use to use it in browsers.

Installation

To get started, the easiest way to use typograms is to link from our CDN:
      
<body>
  <script src="https://code.sgo.to/typograms/typograms.js"></script>
  <script type="text/typogram">
+----+
|    |---> My first diagram!
+----+
  </script>
</body>
      
    
From there, you can download the library directly to serve yourself.

Primitives

Typograms are composed of primitives and connectors that combine them.

Pipes:

Dots and Arrows:

Connectors:

By putting them together, you can form a lot of different diagrams.

Pipes

Dots

Arrows

Text

Examples

Protocols

Mocks

Architecture

Components

Layers

Tables

Flow charts

Trees

Shapes

Big Shapes

Small Shapes

Overlaps and intersections

Grids

Big grids

Small grids

Dot grids

Time series

Chips

Circuits

Mindmaps

Scribbles

Lines with decorations

Line ends

Graph with small nodes

Graphic diagrams

Work in Progress

This is a list of constructions that are currently looking into supporting.

UT8 Diagram Characters Are Off

Triangles connected without + aren't pointy

Diagonals don't join with underscores

Text detection gets confused

Small curved steps

Parenthesis and spheres

Diagonal Side-way Arrows

Related Work

The closest work to typograms is svgbob: it renders diagrams from ASCII and works in browsers (through a webassembly port which spits out SVGs). It supports a similar set of features (with the notable exception of its support for circle drawing) and picks a similar set of typographic conventions (with the notable exception of text rendering). It is well-specified. I ran into enough challenges with (a) the text rendering and (b) running in the browser through the webassembly port that motivated me to rewrite it in JS (svgbob is written in rust), but is otherwise a perfectly valid (more mature) alternative.

From there, there is a series of projects that rendered images from ASCII diagrams but weren't either (a) particularly good to be used in isolation (i.e. just diagrams) or (b) on webpages (i.e. running natively in browsers): asciitosvg, ditaa and markdeep (and the go port GoAT) most notably.

Unlike libraries like mermaid, typograms are defined typographically (WYSWYG), rather than semantically (a transformation from a high level description to graphics), which picks a different trade-off: it gives you more control over the rendering (expressivity) at the cost of making you type more (productivity).

Specification