Open Format
SongForm Format
A plain-text, human-readable format for documenting songs: chords, structure and lyrics in a single file.
Convert any music link into an SFF setlist
Import a Spotify, Apple Music or YouTube Music link and convert it into a canonical song list. Albums and playlists expand automatically into individual tracks, you can add songs manually, and download them as an SFF setlist ready to import into SongForm and add your own way of playing them.
Open the Streaming Music ConverterWhy SongForm Format?
Musicians need a way to document songs that bridges two worlds:
SFF exists because you shouldn't have to choose. It's a plain-text format designed for musicians, by musicians. It's human-readable (edit it in any text editor), machine-parseable (import and export reliably), and structured enough to preserve the information that matters: what you play, when you play it, and what you sing.
Think of it as "chord charts with metadata". The format guitarists have been scribbling on paper for decades, finally formalized.
Format Overview
SFF combines YAML frontmatter (for metadata) with structured Markdown (for musical content). Every song is a single plain-text file. No proprietary binaries. No lock-in.
[song metadata]
[sections with chords and lyrics] That's it. Simple structure, powerful enough.
Specification
Frontmatter (YAML)
The file begins with a YAML block delimited by ---.
This section holds all metadata and optional chord voicings.
Standard Fields
| Field | Type | Example | Description |
|---|---|---|---|
sff_version | string | "1.0.0" | SFF format version. Ensures compatibility as the format evolves |
title | string | "Bohemian Rhapsody" | Name of the song |
artist | string | "Queen" | Artist or band performing the song |
key | string | "Bb" / "G#m" | Key of the song |
bpm | integer | 120 | Tempo in beats per minute |
time_signature | string | "4/4" / "7/8" | Meter of the song |
tuning | string | "guitar_standard" | Instrument tuning. Needed to interpret fret positions correctly |
key_preference | enum | "sharps" / "flats" | Whether chords are shown with sharps or flats |
tags | array | ["pop", "rock", "70s"] | Labels for filtering and searching |
notes | string | Freeform text | Free-form notes about the arrangement or song |
draft | boolean | true / false | Marks the song as a work in progress. May be hidden from the main library |
song_released | boolean | true / false | Marks whether the song is released and ready for playback/export workflows |
chords | map | See below | Fret positions per chord. Only needed when specific voicing matters |
Chord Voicings (Optional)
If you want to preserve specific chord fingerings or shapes, include a
chords dictionary:
chords:
Am7: 0 0 2 0 1 0
Gmaj7: 3 2 4 4 3 2
Dsus4: x x 0 2 3 3
Format: ChordName: fret1 fret2 fret3 ... where
x means "don't play" and numbers are fret positions
(left-to-right, typically top to bottom on a standard guitar).
Body: Sections and Loops
After the closing ---, the song body contains a sequence
of sections. Each section starts with a Markdown
level-2 header (## SectionName).
An optional Markdown title (# Song Title) can appear at
the top of the file. When present, it should match the
title field in the frontmatter.
Section Types
Standard section names:
Intro,Verse,Pre-Chorus,Chorus,Post-ChorusBridge,Middle 8,Solo,Breakdown,OutroOffset: timing metadata in milliseconds (special section)
The same section type can appear multiple times; order defines the play sequence.
Loops: The Basic Unit
Inside each section, the atomic unit is a loop, a single chord progression. A loop has:
- A duration line:
N: Chord1 Chord2 Chord3 ... - An optional blank line
- Optional lyrics on the following line(s)
Where N is the number of bars (measures) the loop
occupies. The blank line between the chord line and lyrics is required
so that raw markdown renders each as a distinct block. Loops within a
section are separated by blank lines; parsers distinguish lyrics from
new loops because chord lines always start with N:.
## Verse
4: Am7 G
First progression, four bars
4: Am7 G F C
Second progression, also four bars Chord Notation
Chords are written in standard notation:
- Root:
AthroughG, optionally with#orb - Quality:
m,dim,aug,sus2,sus4,add9, etc. - Extension:
7,9,11,maj7,m7b5, etc. - Bass note:
/Noteto indicate inversion
Examples: C, Dm, G#m7,
Fsus4, Cmaj7/E
Complete Example
Below is a real song encoded in SFF.
Wade in the Water of public domain. It
illustrates all the key features: frontmatter with chord voicings,
an Offset for audio sync, sections with varying loop
lengths, lyrics, and a solo section.
---
sff_version: 1.0.0
title: Wade In the Water
artist: Public Domain
key: A minor
bpm: 113
time_signature: 4/4
tuning: guitar_standard
tags: [Singer/Songwriter]
draft: true
chords:
Am: x 0 2 2 1 0
G: 3 5 5 4 3 3
F: 1 3 3 2 1 1
E: 0 2 2 1 0 0
---
## Offset
440
## Intro
2: Am G F E
2: Am G F E
2: Am G F E
2: Am G F E
## Chorus
2: Am G F E
Wade in the water
2: Am G F E
wade in the water children
2: Am G F E
wade in the water oh
2: Am E Am
God's gonna trouble the water
## Verse
2: Am F E
Who's that young girl dressed in red?
2: Am G F E
wade in the water
2: Am F E
Must be the children that Moses led
2: Am E Am
God's gonna trouble the water
## Chorus
2: Am G F E
Wade in the water
2: Am G F E
wade in the water children
2: Am G F E
wade in the water oh
2: Am E Am
God's gonna trouble the water
## Verse
2: Am F E
Who's that young girl dressed in white?
2: Am G F E
wade in the water
2: Am F E
Must be the children of the Israelite
2: Am E Am
Oh God's gonna trouble the water
## Chorus
2: Am G F E
Wade in the water
2: Am G F E
wade in the water children
2: Am G F E
wade in the water oh
3: Am E Am
God's gonna trouble the water
## Solo
15: Am G F E
## Verse
3: Am F E
Who's that young girl dressed in blue?
1: Am G F E
wade in the water
2: Am F E
must be the children that are coming through
2: Am E Am
God's gonna trouble the water
## Chorus
2: Am G F E
Wade in the water
2: Am G F E
wade in the water children
2: Am G F E
wade in the water oh
2: Am E Am
God's gonna trouble the water
## Verse
2: Am F E
You don't believe I've been redeemed
2: Am G F E
Wade in the water
2: Am G F E
Just seen the holy ghost looking for me
2: Am E Am
God's gonna trouble the water
## Chorus
2: Am G F E
Wade in the water
2: Am G F E
wade in the water children
2: Am G F E
wade in the water oh
3: Am E Am
God's gonna trouble the water
## Outro
2: Am G F E
2: Am G F E
2: Am G F E
2: Am G F E
2: Am G F E
2: Am G F E Design Principles
Open any file in Notepad, Vim, or your favorite editor. No proprietary software needed.
Export your SongForm song to SFF, edit it anywhere, import it back, with nothing lost.
If you've ever written out a chord chart on paper, SFF will feel familiar.
Bar counts are explicit. Section order is the play order. No guessing.
Add custom fields to the frontmatter; compliant parsers ignore what they don't recognize.
Comparison: Where SFF Fits
| Format | Human-readable | Editable anywhere | Structured & synced | Portable | Transposable | Metadata & fingering |
|---|---|---|---|---|---|---|
| Guitar Pro | ✗ | ✗ (proprietary) | ✓ | Limited | ✓ | ✓ |
| Ultimate Guitar | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ |
| Paper | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
| SongForm Format | ✓ | ✓ | ✓✓ | ✓ | ✓ | ✓ |
SFF gives you all the data required to play precisely along with your audio, with the accessibility of a plain text file.
Getting Started with SFF
In SongForm, you can:
.sff.md Try it in SongForm
SFF is the native format of SongForm for iOS. Import, export, and edit your songs, all in a single, open file.
Discover SongForm