Skip to content

6 August 2026

The chart format, and why it's plain text

A Chordisplay chart is a text file. Not text-in-a-database, not a document format with a text mode — a body of plain text with four kinds of line in it, and nothing else to learn.

The four lines

A line wrapped in square brackets is a chord line:

[Am      C        D        F]
There is a house in New Orleans

A line wrapped in braces is a section title:

{Verse 1}

A line wrapped in ampersands is a callout — a note to yourself or to whoever else is reading:

&6/8 feel — arpeggiate throughout&

Anything else is a lyric line. That’s the format. There is no header block to fill in, nothing is required, and a chart that is only chord lines is a perfectly good chart.

Two details are worth knowing because they’ll bite once and then never again. The brackets and braces are stripped before the line is drawn, and the opening bracket sits at the very start of the line — so the first character inside the brackets lands over the first character of the lyric underneath. Count columns from there and the chords land where you meant them. And because a line’s kind is decided by those characters, they’re reserved: a lyric with a stray [ in it renders as a chord line.

Spaces are the layout

Charts render in a monospace face with the whitespace preserved exactly. That is not a stylistic choice about looking like a typewriter; it’s what makes the format work. The gap you type between two chords is the gap the band sees, on a phone, on a tablet, on a laptop, and in the file when you export it. Nudging a chord half an inch to the left is pressing space, and the result is stable, because nothing downstream is reflowing anything.

It also means you can write a chart in any editor you like and paste it in.

Why plain text

It exports cleanly. A whole library comes out as a zip of Markdown files, one per chart: a small frontmatter block with the title, artist, key, tempo and categories, then the body verbatim, byte for byte as you typed it. There is no lossy conversion step on the way out, because the body that comes out is the body that went in.

It still opens in ten years. The files are readable in any text editor, on any machine, with no software from us and no account. That is a low bar for a file format and a surprisingly high one for a music app.

It diffs. Two versions of a chart can be compared line by line by every ordinary tool that exists. Put a library in version control if you want; the history is legible.

It makes import honest. This one matters more than it sounds. Chordisplay reads ChordPro, which puts chords inline with the words:

Swing [D]low, sweet [G]chari[D]ot

Converting that means genuinely doing the work: each chord gets lifted out of the lyric and placed at the column of the syllable it was attached to, on its own line above. When two chords would land on top of each other — Bm7 over a one-letter syllable, which is common — the second moves one column right rather than overwriting its neighbour, because losing a chord entirely is much worse than a chord sitting a character off. There’s no way to fake that step and no way to hide it. You can see the result immediately, in the preview, before anything is written.

Round-tripping is the same argument from the other end: export a chart, import it again, and you get the chart back. That’s covered by a test rather than by a promise, and it’s the reason the export is worth having.

What it doesn’t do

The format holds chords, words, sections and notes. It doesn’t hold rhythm notation, tab, staves, or annotations drawn on top of a page. There’s no PDF import and no PDF display — if your charts are scanned pages, this isn’t the tool.

Transposing sits on top of the format without changing it: the steppers move a chart a semitone at a time, respelling the chords to suit where you land rather than dragging the old spelling along, and the columns hold so nothing shifts off the words. Nothing is saved. That’s how you’re reading the chart, not what’s stored, so one player can drop a song a tone for their range without touching it for anyone else.

The format has no version number and isn’t going to get one. The file you export today is the file the app reads.