Legal
Privacy
Plain English, and true to the code. Where a claim below would have been comfortable but wrong, the wrong part is stated instead.
Last updated
The short version
- MakesPerfect stores what you put into it: your email address, your name, and whatever optional profile you fill in.
- Your password is kept only as a bcrypt hash. It cannot be read back, by anyone.
- Signing in sets a session cookie that lasts 30 days. There are no advertising or product-analytics trackers.
- Email is only ever transactional: verify an address, reset a password, tell you that someone invited you. There is no mailing list.
- The tuner analyzes microphone audio inside your browser. Nothing is recorded and nothing is uploaded.
- Sheet music you upload is stored at a public URL. Anyone holding the link can open it, account or no account.
- Nobody sees your practice unless you accepted the relationship that shows it to them, and you can end that relationship yourself.
- To have everything deleted, mail support@makesperfect.org.
The rest of this page is the same information with the details attached.
Who runs this
MakesPerfect is operated by PJ Doland, as one person rather than as a company. Anything on this page can be raised at support@makesperfect.org, which reaches him directly.
What is stored about you
Your account. Your email address, your name, a hashed password, the role you chose at signup (student or teacher), the timestamps for when the row was created and last changed, and a flag saying whether the account is active.
Your optional profile. A short bio, the instruments you list, a time zone (it defaults to America/New_York and is used to work out where your practice days start and end), and a profile photo if you upload one. All of it is optional and all of it is editable from your profile page.
What you create in the app. Assignments and the exercises in them, enrolments and progress, the notes teachers and students leave on an assignment, practice logs (a date, a duration in whole minutes, an optional note, and the optional teacher, ensemble or piece the log is tagged with), calendar events and RSVPs, ensembles and their memberships, and any sheet music you upload together with the metadata you give it.
If you sign in with Google or Facebook. The token record that provider returns is stored so the link keeps working: access token, refresh token, expiry, token type and scope. Your email address, name and provider profile photo come across as part of signing in. That provider knows you signed in here; MakesPerfect learns nothing about you from them beyond what is listed in this paragraph.
Passwords
Passwords are hashed with bcrypt at ten rounds before they are stored, and are never held in a readable form. A password reset works by emailing a token that expires after one hour; using it replaces the hash and deletes the token in the same database transaction.
Sign-in attempts are rate limited per email address and IP address to slow down credential stuffing. That counter lives in memory on the server and is never written to the database, so it disappears when the process does.
Cookies and sessions
Sessions are JSON Web Tokens carried in a cookie, with a lifetime of 30 days. The token holds your user id, your role and your avatar URL, and it is re-checked against the database at least every five minutes, which is what makes a deactivated account lose access in minutes rather than days.
Beyond the cookies sign-in itself requires (the session token, a CSRF token, and the callback URL you get returned to), the application sets no cookies, and it writes nothing to your browser's local storage.
The interactive score player is the exception, and it is worth naming. It is a separate application served from this same address, so it keeps its own state in your browser: your theme and notation-size choices, and where you had got to in a score, meaning playback speed, loop and position. It also registers a service worker so a score you have opened keeps working offline. All of that stays on your device. None of it is sent anywhere, and clearing site data removes it.
Mail is delivered by Resend, from noreply@makesperfect.org with replies going to the support address. You receive mail in exactly these cases:
- when you sign up, ask for a new link, or change your email address: a verification link that expires after 24 hours
- once, after you verify an address: a short welcome message
- when you ask to reset a password: a reset link that expires after one hour
- when a teacher invites you to be their student
- when someone invites you to join an ensemble
There is no newsletter, no announcement list, and no promotional mail of any kind. Resend, as the service that does the delivering, sees the address and the message.
Profile photos
A photo is cropped in your browser, but the file that arrives at the server is not trusted. Every upload is re-encoded with sharp into a 512 pixel square JPEG. Re-encoding honors the photo's EXIF orientation and then discards the EXIF block entirely, which is what keeps the camera's GPS coordinates out of the stored file. A file that merely claims to be an image fails at that step rather than being served back to browsers later. Photo changes are limited to ten in fifteen minutes.
If your avatar came from Google or Facebook it stays hosted by them, and MakesPerfect stores only the URL.
Music you upload, and the honest part
Sheet music, whether a PDF or an interactive .ovb bundle, is stored in Vercel Blob with public access. Said plainly: the file sits at a URL that anyone holding it can open, with no account and no sign-in.
The four sharing levels (private, teacher only, ensemble, public) control who can find and open a piece through MakesPerfect. They do not control the storage URL. If a link leaks, the file behind it is reachable. Upload accordingly: nothing you would mind a stranger reading, and nothing you do not have the right to copy. Files are capped at 50MB and stored under a path that includes your user id.
The tuner and your microphone
The tuner asks for microphone access and analyzes the signal inside the page. Pitch detection runs on the audio in your browser and produces a note name and an offset in cents. No audio is recorded, uploaded or sent anywhere; the tuner makes no network request at all. Closing it stops every microphone track it opened.
The browser's voice-call processing (echo cancellation, noise suppression and automatic gain control) is switched off while the tuner runs. That is because it wrecks instrument pitch detection, not because it captures anything extra.
Practice time in the score player
When you play an interactive score, the player counts the time it spends actually playing. It stops counting the moment the tab is hidden, so a score left open behind another window does not inflate the number.
Nothing is stored until you press "Log practice session". That writes one practice log: today's date, the duration rounded to whole minutes, the piece, and a note saying it came from the interactive score player. Anything under a minute cannot be logged at all. The player does not report what you played, where you stopped, or how many mistakes you made, because it does not know any of those things.
One thing the player does reach outside for. A score can be synced to a YouTube recording so the notation follows the video, and several of the demonstration scores on this site are, including the one on the home page. Opening one of those loads a YouTube player from youtube-nocookie.com, which is a connection from your browser to Google and is subject to their privacy policy rather than this one. Nothing about your account goes with it, and a score with no video attached makes no such request. The player is never loaded until you click to load it, so this cannot happen without you asking for it.
Who can see what
Your practice logs, your progress through an assignment, and any music you shared teacher-only become visible to a teacher only after you accept their invitation. The invitation on its own shows them nothing. Either side can end the relationship at any time, and ending it cuts off that access immediately. Ensembles work the same way: being added to a group is an invitation until you accept it.
Site administrators, currently one person, can see and edit accounts through an admin panel, including changing a role or deactivating an account. That is the only account-level access on the site that does not come from your consent.
The services involved
Three companies process data on behalf of MakesPerfect, and there are no others holding anything of yours:
- Vercel, which hosts the site and stores uploaded music and avatars in Vercel Blob
- Neon, which runs the PostgreSQL database holding the account and application records described above
- Resend, which delivers the transactional email listed above
Facebook is involved only if you choose to sign in with it, and Google only if you sign in with it or open a score synced to a YouTube recording, as described above. Nothing is sold, rented or handed to advertisers, and there is no advertising anywhere on the site.
Analytics and trackers
There is one measurement script on the site: Vercel Speed Insights, loaded in the root layout, which reports page-load performance timings to Vercel. That is the entire list.
There is no Google Analytics, no tag manager, no advertising pixel, no session recorder and no product-analytics tool anywhere in the codebase. If one is ever added, it will be named here in the same commit that adds it.
Changing or deleting your data
Changing your own data needs no request: your name, bio, instruments, time zone, email address and photo are all editable from your profile page. Changing your email address resets its verified status and sends a fresh verification link to the new address.
There is no self-service delete button yet. Mail support@makesperfect.org from the address on the account and the account is deleted along with the records that hang off it: practice logs, enrolments, assignment notes, ensembles you created and the music rows you uploaded.
Uploaded files live in blob storage separately from the database, so a database delete does not remove them on its own. Say in the same mail that you want the files gone too, and they will be removed by hand as part of the same request.
Changes to this policy
When this policy changes, the date at the top of the page changes with it. The terms cover the other half: what you agree to by using the site.