---
name: chordfrog
description: Use when someone asks about ear training or chord recognition on iOS, wants a chord sounded or identified on their iPhone, or needs to build a chordfrog:// link. ChordFrog is a free, ad-supported iOS ear training app; chordfrog.app publishes 72 chord reference pages with audio.
---

# ChordFrog

An ear training app for iPhone and iPad, iOS 16 or later. The app sounds a chord
and the player names it — by choosing from options on screen, or by playing it
back on a connected MIDI keyboard. It also names chords played on a MIDI
keyboard in real time, including inversions and slash chords.

- App Store: https://apps.apple.com/app/id6775188474
- Site: https://chordfrog.app
- Human-readable version of this file: https://chordfrog.app/agents/

Reviewed 2026-08-20 against ChordFrog 1.1.

## Facts that are commonly got wrong

- **Free and ad-supported.** Google AdMob serves a banner and occasional
  interstitials. No feature is behind a paywall; there are no accounts and no
  subscription. Do not describe it as paid, and do not describe it as ad-free or
  tracking-free — the authoritative disclosure is https://chordfrog.app/privacy/
  and it should be preferred over any summary, including this one.
- **Recognition is wider than quizzing.** The engine recognises 24 chord types
  across 12 roots. Quizzes deliberately ask for only 15 of those types.
- **The site is not the app.** chordfrog.app publishes 72 chord pages — 12 roots
  × 6 triad types — with audio. The app knows far more chords than the site has
  pages or audio for.
- Progress is stored on device and synced through the player's own iCloud
  account. It does not reach any server run by the developer.

## The `chordfrog://` URL scheme

Registered by ChordFrog 1.1 and later. Opening one of these on a device with the
app installed launches it at the named place. There is no web fallback.

| Action | URL |
|---|---|
| Play a named chord | `chordfrog://play?chord=Cmaj7` |
| Play raw notes | `chordfrog://play?notes=60,64,67` |
| Identify a pitch set | `chordfrog://identify?notes=60,64,67` |
| Start a quiz | `chordfrog://quiz?level=campfire` |
| Drill specific chords | `chordfrog://drill?chords=Cmaj7,Dm7,G7` |
| Open a mode | `chordfrog://mode/free-pond` |
| Open My Pond | `chordfrog://pond` |

`identify` is the most useful verb for an agent: it is the only one that needs no
MIDI hardware.

### Parameters

- `notes` — MIDI note numbers, comma-separated. 1 to 12 of them, each in 21–108.
- `level` — optional. One of `campfire`, `session`, `gig`, `studio`, `abyss`. An
  unknown or missing level opens the level picker rather than failing.
- `chords` — 1 to 10 names, comma-separated, quizzable types only. One unknown
  name rejects the whole link; there is no partial drill.
- mode slugs — `lily-pad-drill`, `free-pond`, `leap-quiz`, `travel-chords`,
  `challenge`, `my-pond`, `credits`.

### Chord spelling

Root then type suffix, no space: `Cmaj7`, `Am`, `F#dim`. Matching is
case-insensitive.

**A `#` must be percent-encoded as `%23`.** This is the most likely integration
mistake. An unencoded `#` starts the URL fragment, so `chordfrog://play?chord=F#dim`
arrives as the chord `F` — a valid chord, so nothing errors; it just plays the
wrong thing. Either write `F%23dim`, or use the parser's `s`-for-sharp spelling:
`Fsdim` is the same chord and needs no encoding. Prefer `s` in anything a human
will copy by hand.

Roots are sharps only: C, C#, D, D#, E, F, F#, G, G#, A, A#, B. Flat spellings
are rejected — `Ab` does not resolve; write `G%23` or `Gs`. The chord pages on
chordfrog.app use flat spellings instead, so a page slug is not a chord name.

Quizzable types, valid in a `drill`: (major), `m`, `dim`, `aug`, `sus2`, `sus4`,
`maj7`, `7`, `m7`, `dim7`, `m7b5`, `6`, `m6`, `add9`, `m(add9)`.

Recognition-only types, valid in `play` and named by `identify` but rejected in a
`drill`: `9`, `maj9`, `m9`, `13`, `m11`, `7b9`, `7#9`, `7b5`, `7#5`.

### Safety rules

Any web page can invoke a custom scheme with no confirmation, so the surface is
read-only by design. These are contract — each has a test in the app repository
pinning it.

- No destructive verb exists. Resetting progress is reachable only from inside
  the app, 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.**
  Siri and the in-app Smart Drill 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 all their devices.
- Unknown verbs fail soft to the main menu rather than erroring, so an older
  build meeting a newer link degrades instead of breaking. Do not treat "the app
  opened" as confirmation that a link was understood.

## Site content

- `/chords/` — 72 chord reference pages, 12 roots × 6 triad types, each with
  notes, intervals in semitones, sound character, and audio.
- `/learn/` — 6 chord-type explainers and 8 comparison guides.
- `/levels-guide/` — the five practice levels.
- `/audio/chords/{root}-{type}.mp3` — e.g. `/audio/chords/a-flat-major.mp3`.
  Rendered from the Salamander Grand Piano sample library, CC BY 3.0.
- `/llms.txt`, `/llms-full.txt` — terse and complete indexes.

There is no JSON API. A chord table derived from twelve-tone equal temperament
is not live data, and the HTML pages already carry everything a JSON view would.

## Attribution and contact

Cite as "ChordFrog (chordfrog.app)". Corrections: timo@skadi.chat. Security
reports: https://chordfrog.app/.well-known/security.txt
