Privacy
Last updated 17 October 2026
The short version. Your sheets and chord library are saved in your own browser, and nothing you type in them is sent anywhere. Keyriff has no server holding your work and no account system. Anonymous usage statistics are collected, including the names of chords you play, so it’s possible to see which features actually get used.
What stays on your device
Everything you create lives in your browser’s local storage, under these names:
- piano-practice-sheet: your practice sheets, their sections, chords, tempos, repeats and any key you set
- piano-saved-chords: your saved chord library, including any nicknames you gave them
- piano-theme, piano-show-octaves, piano-show-chord-diagrams, piano-library-keyboards, piano-show-bindings, piano-show-tones, piano-show-meaning, piano-show-names, piano-tray-open, piano-loop, piano-count-in, piano-chord-style, piano-midi. Interface preferences: the theme, which keyboard diagrams and labels are shown on the sheet and in the library, whether held keys are labelled with their role in the chord, whether the readout shows what a chord’s name means and its other names, whether the chord library is open, whether a sheet loops when it plays, whether it counts in first, whether its chords play together, rolled or as arpeggios, and whether a MIDI keyboard is switched on. The theme is stored only when you pick the one your device isn’t set to, and removed when you switch back, so the app follows your device again
- piano-hint-dismissed, piano-privacy-notice-dismissed: whether you’ve already seen the first-visit hint and the analytics notice
None of it is uploaded and none of it is readable by us. It also isn’t backed up. Clearing your browsing data deletes it permanently. Export anything you want to keep.
After your first visit, the app also keeps a copy of itself in your browser’s Cache Storage, so it can open without a connection. There are two caches: keyriff-shell- followed by a code for the version, holding the app’s own files, and keyriff-samples-1, holding the 15 recorded piano sounds. Neither holds anything you made or anything about you, and analytics requests are never stored. A new version replaces the old copy, and clearing site data removes both.
Files you export and import
There are three kinds, and all three are produced by your browser and written straight to your device.
- A sheet file,
.keyriff.json, holding one sheet, its sections and the library chords it uses, nicknames included - A backup file, the same extension, holding every sheet you have and your whole chord library, including chords no sheet currently uses
- A PDF, for printing rather than for opening again
Both file kinds are plain text you can read, and both keep a key you set for a sheet. Opening one reads it in your browser and nowhere else. Restoring a backup replaces what’s already here, so the app asks before it does. Where a file came from and who you send one to is entirely your decision, and a file you share carries whatever you named things.
Copy link to this sheet puts one sheet into the link itself, after #s=, with its name, section names, chord nicknames and any key you set. Browsers never send that part of a link to a server and the app removes it before analytics load, but anyone you give the link to can read the sheet, names included.
What is collected
Product analytics, from PostHog
Anonymous usage events are sent to PostHog, hosted in the European Union at eu.i.posthog.com. They record what kind of thing happened, such as a chord being saved, a sheet played, a tempo changed or a section renamed, usually with a count beside it, like how many chords the sheet held or how long playback ran.
Anything you type is never sent. The names you give sheets and sections, and the nicknames you give chords, stay on your device. Where an event has to record that you renamed something, it records only that you did, and for a section whether you started from its menu or its title, never the words you chose.
One thing is sent deliberately: the chord itself. When a chord is detected or saved, its musical name travels with the event along with the notes that produced it: “Cmaj7”, and C, E, G, B. That pair is kept for one reason: it’s the only way to catch the app naming a chord wrongly, and it can’t be reconstructed after the fact. It’s worked out by the app from the keys you pressed rather than typed by you, and it says nothing about who you are. Detected chords are recorded once each per visit, up to a limit, rather than every time a key goes down.
There’s no name, no email address, no login, and no attempt to work out who you are. PostHog assigns a random identifier so that repeat visits from the same browser can be counted once, stored in local storage and a cookie beginning ph_, with a few values for the open tab in session storage, which go when the tab closes. Automatic capture of clicks and errors, session replay, surveys and heatmaps are all switched off in the configuration. Besides the app’s own named events, described above, PostHog counts each time the app is opened, and when you leave it, how long it was open and how far down it was scrolled. If your browser sends a Do Not Track or Global Privacy Control signal, the app loads neither PostHog nor Vercel Analytics.
This website
This website counts the pages you open, including the ones you reach by a link on the site. When you leave a page or open the next one, it records how long that page was open and how far down it was scrolled. When a link into the app is clicked it records the name of that link’s place on the site, such as “footer” or “progression-sheet”, and nothing else about the link, neither its address nor its text. They go to the same PostHog project as the app’s events. If your browser sends a Do Not Track or Global Privacy Control signal, analytics don’t load here at all.
Analytics here store nothing on your device: no cookie, no local storage, nothing. PostHog’s random identifier is held only in the open tab’s memory. Pages you move between by following links here share it, so they count as one visit, and it’s gone when the page reloads or the tab closes. There’s no way to connect one visit to another, or to tell that two of them were you. Visits and page views can be counted; visitors can’t, and aren’t.
The website itself keeps one thing in your browser’s local storage: keyriff-site-theme, holding “light” or “dark”. It’s set only when you use the switch at the top of every page to pick the theme your device isn’t set to, and it’s removed when you switch back, so the site follows your device again. It never leaves your device. The app’s theme is a separate setting, piano-theme above, because your browser keeps each site’s storage apart.
Page views, from Vercel Analytics
The app additionally uses Vercel Analytics for page views, which doesn’t use cookies and doesn’t build a profile across sites.
Third parties that see your IP address
Any file your browser downloads from another company reveals your IP address to them, because that’s how the internet delivers it. For Keyriff that list is short and deliberate:
- Vercel hosts this website and the app, so it handles every request.
- PostHog (EU) receives the anonymous events described above, from both this website and the app.
- tonejs.github.io hosts the recorded piano samples. The app downloads them the first time you open it and plays them from its own copy after that. This website plays the same recordings from its keyboards and Play buttons. It asks for them only once you press a key, Hear it or Play, and then only the ones that keyboard or progression needs.
Fonts are served from this site itself rather than from Google Fonts, specifically so that loading a page doesn’t hand your IP address to a third party. There are no advertising networks, no tracking pixels, no embedded videos and no social widgets anywhere on this site or in the app.
Cookies
The website you’re reading sets no cookies at all. The app sets one, from PostHog, holding the random identifier described above. There’s nothing else: no advertising cookies and no third-party cookies.
How to remove everything
Clearing site data for Keyriff in your browser settings removes all of it in one step: your sheets, your saved chords, your preferences, the analytics identifier and the stored copy of the app and its piano sounds. A content blocker can stop analytics from loading, and the app carries on working normally.
Children
Keyriff isn’t directed at children and collects no personal data from anyone, of any age.
Your rights over your data
Data protection law gives you rights to see, correct, export and delete personal data held about you. In this case they’re unusually simple to exercise: the data is already on your device, under your control, and there’s no personal data on our side to request.
Changes
If what the app collects changes, this page changes with it and the date at the top moves.
Contact
There’s no contact address yet.
See also the terms of use.