If you have spent any time with digital chord sheets, you have probably bumped into ChordPro. It is the closest thing the chord-sheet world has to a universal format: readable as plain text, structured enough that apps can render it as a polished sheet, portable enough that your library survives whatever app you happen to be using this year.
This guide answers the questions musicians and developers actually ask about ChordPro. Every example here renders the same way in Fretlist, OnSong, SongbookPro, LinkeSoft Songbook, and pretty much every other tool that claims ChordPro support.
What is ChordPro?
ChordPro is a plain-text format for chord sheets. The core idea is simple: chord names go inline with the lyrics, wrapped in square brackets, at the exact position where the chord should sound.
[G]Hello [D]darkness my [Em]old [C]friend
That one line is the whole format in miniature. Add directives for metadata (title, key, tempo), section markers (verse, chorus), and the occasional custom tag, and you have a complete chord sheet any ChordPro-aware app can render.
The format was created by Martin Leclerc and Mario Dorion in the early 1990s and has been maintained as an open standard ever since, currently by Johan Vromans at chordpro.org. It is not owned by any single company, which is why your ChordPro file from 2005 still opens cleanly today.
ChordPro syntax: what does a file look like?
A minimal ChordPro song looks like this:
{title: Sound of Silence}
{artist: Simon & Garfunkel}
{key: Em}
[Em]Hello [D]darkness my [Em]old [Em]friend
[Em]I've come to [D]talk with you a[Em]gain
Three rules cover most of it:
- Directives wrapped in curly braces carry metadata:
{title:},{artist:},{key:},{capo:},{tempo:},{start_of_chorus},{start_of_verse},{comment:}. Those eight cover almost every real-world song. The full directive reference is on chordpro.org. - Chords wrapped in square brackets sit inline with the lyrics at the character position where the chord change happens.
- Everything else is lyrics. Blank lines separate sections.
That is the whole core. Everything else is convenience.
Why use ChordPro instead of plain text?
Plain text and ChordPro look similar at first glance. The difference is structure. Plain text is what you see; ChordPro is what the app can understand.
The practical wins:
- Transposition works. Because chords are tagged in square brackets, an app can transpose every
[G]to[A]in one click. Plain text cannot do this without guessing. - Capo is respected. A song marked
{capo: 2}can be shown in either the played shape or the sounding key. - Metadata is structured.
{key: Em},{tempo: 86},{time: 4/4}populate the song header the same way in every app. - Sections are explicit. Choruses, verses and bridges can be styled differently because the file says where each one starts and ends.
Plain text gets you a sheet you can read on one device. ChordPro gets you a sheet that travels.
Should chords go inline with the lyrics or on the line above?
Both styles exist in the wild. You need to recognize both, but only one is canonical ChordPro.
Inline (canonical):
[G]Hello [D]darkness my [Em]old [C]friend
Chord-on-line-above (informal but extremely common):
G D Em C
Hello darkness my old friend
Strictly, the second style is not ChordPro. It is plain text with chord lines. In practice it is everywhere, especially in songs scraped from Ultimate Guitar and other tabs sites. A serious ChordPro app should handle both: Fretlist renders both formats natively (inline ChordPro and chord-above-lyrics) without any conversion step. OnSong and SongbookPro do similar. If a tool only handles one of the two styles, you will hit friction sooner or later.
How do you convert Ultimate Guitar tabs or plain-text chord sheets to ChordPro?
Converting chord-above-lyrics sheets to ChordPro by hand is tedious. Doing it in bulk is the difference between a library that grows and a library that stalls.
The rule is simple: take each chord above a lyric line and insert it inline at the character position where it sits. So this:
G D
Hello darkness my old friend
becomes this:
[G]Hello darkness [D]my old friend
A good importer handles this automatically and preserves the rest of the file: metadata, section labels, comments. Fretlist's bulk import handles ChordPro files, ZIPs, OnSong backups, SongbookPro backups, and plain-text dumps in one step. ChordPro files are stored as-is. Plain-text files from tab sites get the boilerplate stripped automatically (nav chrome, credits, chord diagrams, footer junk), so what lands in your library is clean song content. If you are sitting on a library of .txt files from Ultimate Guitar, that is the fastest way out.
Using Fretlist as a free ChordPro converter
Most musicians have hundreds of songs in chord-above-lyrics format from Ultimate Guitar and other tab sites. Converting them to proper ChordPro one by one is tedious work, and dedicated converter tools are either broken, behind a paywall, or require you to install something.
Fretlist's editor has two modes: Chords over Lyrics and ChordPro. Switch between them and the content converts live, in either direction. The practical workflow: paste a song from Ultimate Guitar, open it in Fretlist, click the ChordPro tab, export as .cho. You get a clean, portable ChordPro file. Free, in a browser, no account required for the conversion.
The reverse works just as well. Paste a ChordPro file, switch to Chords over Lyrics to edit it in the familiar tab-site style. Fretlist keeps the original ChordPro stashed in memory so switching back restores it exactly. If your ChordPro uses directives that won't survive the round-trip, Fretlist warns you before you edit.
No other chord-sheet app exposes both views in the same editor with live switching. Most treat ChordPro as an import/export format and hide it. Fretlist treats it as a first-class editing surface.
How do you handle transposition and capo in ChordPro?
The file does not transpose itself. It carries the information that lets an app transpose it.
{key: Em}tells the app the song's written key.{capo: 2}tells the app a capo is on the 2nd fret.
From there, the app does the work. Press the transpose-up button and every [Em] becomes [Fm], every [D] becomes [D#], and so on. The song content and key stored in the database never change. Your transposition preference is saved per song to your account and synced across your devices.
The reason to mark {capo:} rather than transpose the chords on paper is honesty: the song was written in one shape, you are playing it with a capo, and the app can show you either the shape or the sounding key depending on what is useful in that moment. Hard-coding the transposition into the chord names loses that information forever.
Which apps actually support ChordPro?
Most chord-sheet apps claim ChordPro support but depth varies. A non-exhaustive list as of 2026:
- Fretlist - full read and write, live conversion between chord-above-lyrics and ChordPro in the editor, preserves custom directives, exports canonical ChordPro. Web-based and cross-platform.
- OnSong (iOS only) - mature ChordPro support, handles most directives. Paid app.
- SongbookPro (cross-platform) - reads ChordPro reliably and is a common starting point for musicians coming from a notebook workflow.
- LinkeSoft Songbook (iOS / Mac) - split iOS and Mac interfaces, both ChordPro-native.
- BandHelper - supports ChordPro import alongside a wide range of other formats and band-management features.
- chordpro.org's reference tools - the canonical implementation, useful for testing edge cases.
- Plain-text editors (VS Code, Sublime, Obsidian) - ChordPro is plain text, so any editor opens it. Several have syntax-highlighting plug-ins.
For context: Chordify is sometimes listed alongside these, but it solves a different problem. It detects chords from audio rather than managing chord-sheet libraries, and it does not use the ChordPro format.
If a tool claims ChordPro support but mangles round-trips (stripping custom directives, dropping {capo:}, normalizing chord positioning), that is a red flag. Your library should survive a write-read cycle in any compliant tool.
What are the five most common ChordPro mistakes?
The same five errors trip up nearly everyone learning the format.
- Inconsistent colon usage. The spec allows a colon, whitespace, or both as the separator after a directive name. In practice, most apps expect the colon.
{title: Wonderwall}is the safe form; skip the colon and some parsers will stumble. - Mixing inline and line-above chord styles in one song. Pick one and stay consistent. Mixed-style songs render unpredictably.
- Putting chords in parentheses.
[(G)]is not a chord. Drop the parentheses. - Relying on
{image:}for portability. The directive exists in the spec, but app support is inconsistent. Most tools, including Fretlist, skip it silently. If your sheet needs a visual that travels with the file, keep it as a separate file alongside the ChordPro source. - Not setting
{key:}and{capo:}. Without these, transpose features cannot do anything sensible and other apps cannot disambiguate the song.
A sixth one worth a note: chord positions are exact. [G]Hello puts the G above the H of Hello. [G] Hello (with a space) puts the G above the space, which renders one character earlier. Most rendering bugs trace to this.
Why does ChordPro still matter in 2026?
ChordPro's quiet superpower is portability. Your library exists as plain text. You can grep it, version-control it, back it up to a USB stick, edit it in any text editor on any computer, and still expect it to render correctly in whatever chord-sheet app you are using.
That is a rare property in software. Most app-specific formats lock your data inside a single product. ChordPro does not. If your current app dies tomorrow, disappears from the App Store, gets bought, or raises prices, your library is still readable plain text and can move to whatever is next.
It is why, when I built Fretlist, ChordPro was the first thing I supported, not the last. Your music is yours, and Fretlist will never hold it hostage.
Dear John, building Fretlist from Alkmaar, Netherlands