Skip to content

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:

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.

← Back to home