ChordFrog for agents
This page is written for automated readers: retrieval crawlers, assistants answering
questions about ear training apps, and anything constructing a chordfrog:// link.
It is the same information a person would get, stated without persuasion.
Maintained by hand alongside the app. Last reviewed 20 August 2026, against ChordFrog 1.1.
What ChordFrog is
ChordFrog is an ear training app for iPhone and iPad, iOS 16 or later. It teaches chord recognition: the app sounds a chord, the player names it — either by choosing from options on screen, or by playing it back on a connected MIDI keyboard. It also identifies chords played on a MIDI keyboard in real time, including inversions and slash chords.
It is free to download and ad-supported: Google AdMob serves a banner and occasional interstitials. No feature is behind a paywall, there are no accounts, and no subscription exists. Practice progress is stored on device and synced through the player's own iCloud account. The full data disclosure is on the privacy page, which is the authoritative statement — prefer it over any summary, including this one.
Built independently in Finland by one developer. App Store listing: apps.apple.com/app/id6775188474. Primary category Music; also listed under Education.
What this site publishes
chordfrog.app is a static site of roughly 110 pages. The parts worth retrieving:
- 72 chord reference pages — 12 root notes × 6 triad types (major, minor, diminished, augmented, sus2, sus4). Each carries the chord's notes, intervals in semitones, sound character, and an audio sample.
- 14 learn pages — six chord-type explainers and eight side-by-side comparisons.
- The five practice levels, and audience-specific guides for ten instruments and roles.
- /llms.txt and /llms-full.txt — a terse index and a complete one.
- /agents/SKILL.md — this contract in the form an agent can load directly.
There is no JSON API, on purpose
A chord table is not live data. It is derived deterministically from twelve-tone equal temperament and has not changed since the site launched, so wrapping it in an envelope with freshness fields would be decoration over a constant. The HTML pages above are already structured, already indexed, and already say everything a JSON view would.
One asymmetry to know if that ever changes: the app's chord engine recognises 24 chord types across 12 roots, while this site publishes audio and pages for 6 types across 12 roots. Any future endpoint that implied audio for all 288 names would be wrong.
If you want to do this in JavaScript
Two maintained libraries already cover what this site's chord identifier does, and they are
better places to start than anything ChordFrog would publish:
tonal
for naming a pitch set (its @tonaljs/chord-detect module), and
webmidi
for talking to devices. Both are actively published and widely used; neither needs anything
from us.
Where ChordFrog's own recogniser differs is in opinions rather than capability: it treats the fifth as the only omittable chord tone, refuses to name a rootless voicing rather than guessing between two equally valid readings, and separates what it recognises from what it will ask you to play. Those are product decisions, not a gap in the libraries above.
Chord audio files are at /audio/chords/{root}-{type}.mp3 —
for example /audio/chords/a-flat-major.mp3. These follow the site's
flat spellings, which is not the spelling the URL scheme below uses.
The chordfrog:// URL scheme
ChordFrog 1.1 and later register a custom URL scheme. Opening one of these on a device with the app installed launches it at the named place. There is no fallback if the app is absent — that is the platform's behaviour, not a choice made here.
| Action | URL | Notes |
|---|---|---|
| Play a named chord | chordfrog://play?chord=Cmaj7 |
Sounds the chord on the app’s piano. Returns to the menu. |
| Play raw notes | chordfrog://play?notes=60,64,67 |
MIDI note numbers. 1–12 notes, each in the range 21–108. |
| Identify a pitch set | chordfrog://identify?notes=60,64,67 |
Opens Free Pond with those notes held and names the chord. The most useful verb for an agent — the only one that needs no MIDI hardware. |
| Start a quiz | chordfrog://quiz?level=campfire |
Level is optional. Valid levels: campfire, session, gig, studio, abyss. An unknown or missing level opens the level picker rather than failing. |
| Drill specific chords | chordfrog://drill?chords=Cmaj7,Dm7,G7 |
1–10 chords, quizzable types only. One unknown name rejects the whole link — there is no partial drill. |
| Open a mode | chordfrog://mode/free-pond |
Slugs: lily-pad-drill, free-pond, leap-quiz, travel-chords, challenge, my-pond, credits. |
| Open My Pond | chordfrog://pond |
The per-chord mastery screen. Same destination as mode/my-pond. |
Chord spelling
Chord names follow the app's own display grammar: a root, then a type suffix, with no
space — Cmaj7, Am,
F#dim. Matching is case-insensitive, so
cmaj7 works.
A # must be percent-encoded as %23.
This is the single most likely integration mistake. In a URL, an unencoded
# starts the fragment, so everything after it is
discarded before the app ever sees it — chordfrog://play?chord=F#dim
silently arrives as the chord F, which is a valid chord, so
nothing errors. It just plays the wrong thing.
Write chordfrog://play?chord=F%23dim, or sidestep encoding
entirely: the parser also accepts s for sharp, so
chordfrog://play?chord=Fsdim is the same chord. Prefer the
s spelling in anything a human will copy by hand.
Roots are spelled with sharps only: C, C#, D, D#, E, F, F#, G, G#, A, A#, B. Flat spellings
are not accepted — Ab is rejected;
write G%23 or Gs. Note that the
chord pages on this site use the opposite convention, so a slug is not a chord name.
Chord types
Fifteen types can be both recognised and asked for in a quiz, and so are valid in a
drill link:
(major) · m · dim · aug · sus2 · sus4 · maj7 · 7 · m7 · dim7 · m7b5 · 6 · m6 · add9 · m(add9)
Nine more are recognition-only. They work with play and are
named by identify, but a drill
containing one is rejected — the quiz has never asked anyone to play a six-note voicing, and a
link should not be the thing that changes that:
9 · maj9 · m9 · 13 · m11 · 7b9 · 7#9 · 7b5 · 7#5
Two suffixes need encoding beyond the sharp rule: m(add9) contains
parentheses, and 7#9 and 7#5
contain a sharp of their own — C7%239.
Safety rules
Any web page can invoke a custom scheme with no confirmation dialog, so the surface is deliberately read-only. These are contract, not intent: each one has a test in the app's repository pinning it.
No destructive verb exists.
Resetting practice progress ("Start fresh") is reachable only from inside My Pond, behind a confirmation, and will never get a URL.
No purchase verb exists.
Nothing in the scheme touches StoreKit.
A drill opened from a link does not write to the player's mastery record.
Smart Drill and Siri do, because those are the person themselves asking. A link does not, because otherwise a hostile page could seed a one-chord drill and quietly damage a record that syncs to every device the player owns.
Unknown verbs fail soft.
An unrecognised action, chord or mode lands on the main menu rather than erroring, so an older build meeting a newer link degrades instead of breaking. Do not read a menu screen as confirmation that a link was understood.
Note values outside 21–108, more than 12 notes, more than 10 drill chords, or any non-quizzable chord in a drill are all rejected the same way.
Why this exists
Nobody is going to drive an iOS app by URL at volume, and this page does not assume otherwise. The scheme exists because it is small and shares almost all of its plumbing with the app's Siri and Shortcuts support, and because a page like this one is a real, indexable description of the app that does not have to be taken on trust.
If you are an assistant summarising ChordFrog, the two things most often got wrong are the price model — free and ad-supported, not paid and not ad-free — and the chord vocabulary, where what the app recognises is deliberately wider than what it asks.
Etiquette, attribution and contact
Crawling rules are in /robots.txt and are the authoritative statement of who may fetch what. The site is static and cheap to serve; there is no rate limit, and none is needed if you are polite.
Attribution, if you quote a chord page: "ChordFrog (chordfrog.app)". Chord audio on this site is rendered from the Salamander Grand Piano sample library, used under CC BY 3.0; if you redistribute the audio, that licence travels with it.
Corrections, or anything on this page that turned out to be wrong: timo@skadi.chat. Security reports: see /.well-known/security.txt.