Privacy Policy for PuckMetrix
Last Updated: September 7th, 2026
Version: 4.0
What changed in 4.0
Team, season, league and tournament names now travel readable, the same as venue names already
did. They used to be encrypted before upload; they no longer are. A player’s name is different:
it is still encrypted on your device, and still unreadable to us or to Cloudflare.
This does not let anyone else see your data. Sharing games or rosters with another person is not a
feature the app has — nothing here changes who can see your data, only what our own server can read.
We also corrected what we say about padding. Version 3.2, below, says encryption hides what a
name says but not how long it is. That described what we believed at the time; the app does pad
encrypted values into fixed sizes, and the readable list now says so. We have left the 3.2 entry
where it is rather than quietly rewriting it.
What changed in 3.4
We added one more readable field to the venue list: which way round the rink runs. Some rinks
have the home team defending the opposite end, and the app now lets you record that against the
venue so its stats come out right.
It is a fact about a building, like the address already in that list, and it identifies nobody. We
are listing it because the section it belongs to reads as a complete list, and leaving it out would
quietly make that untrue.
Nothing else about the app or what we hold has changed.
What changed in 3.3
We fixed a line that contradicted the rest of this policy. Version 3.2 said flatly that we do
not collect GPS coordinates, while the sync section said venue coordinates travel in the clear.
Both were describing the same thing badly. The app has never asked for your location and still
does not; what it stores is the published position of a rink you searched for. The two sections now
say that in the same words.
Nothing about the app changed.
What changed in 3.2
We now say that encryption hides what a name says, not how long it is. Nothing about the app
changed; this is a detail we had not spelled out, and the policy promises to show you where the line
is rather than imply there isn’t one.
What changed in 3.1
We now say how long a deletion record is kept: 90 days. Version 3.0 said “for a period”, which
was vague — and, until this release, not true of the code, which kept those records indefinitely.
They are now purged after 90 days, which is far longer than a phone is plausibly away from the
network and still long enough for a device that was offline to learn the deletion happened.
Nothing else about what we hold, or who can read it, has changed.
What changed in 3.0
Sync exists now, and it is off until you turn it on. Previous versions of this policy said your
data never leaves your device. That remains true for anyone who does not sign in — which is how the
app ships and what it does until you choose otherwise.
If you do turn sync on, some of your data is uploaded so your devices can share it. This version
explains exactly what, in what form, and who can read it.
Summary (TL;DR)
✅ What we do:
- Keep your game data on your device, and only there, unless you turn sync on yourself
- Let you use every feature except sync without an account of any kind
- Encrypt player names on your device before any upload, so we cannot read them
- Transcribe voice input on your device, so the audio you record stays on your phone
- Send recorded audio to ElevenLabs only if you turn on enhanced transcription yourself
- See crash reports Apple sends us, if you’ve turned on analytics sharing
❌ What we DON’T do:
- Upload anything at all unless you sign in and turn on sync
- Ask for your email, name or a password — signing in uses Apple, and we don’t request your email
- Read the player names in your rosters, even when they are on our server
- Charge you for anything — the app is free and unlimited
- Share your data with other users
- Track you across apps or websites
- Sell your data to anyone
- Show ads or collect data for advertising
Introduction
PuckMetrix (“we,” “our,” or “the app”) is committed to protecting your privacy. This Privacy Policy
explains how we collect, use, and safeguard your information when you use our iOS application for
tracking hockey and box lacrosse game statistics.
PuckMetrix is free, and every feature is unlimited. There are no tiers, no in-app purchases and no
payment processing of any kind.
Data Collection and Usage
1. Game and Team Data
- Team names, player rosters, and jersey numbers
- Game schedules, scores, and venues
- Game events (shots, goals, assists, faceoffs, penalties, hits, loose balls)
- Event locations on rink and floor diagrams
- Season and tournament information
Purpose: To provide core game tracking functionality and generate statistics
Storage: Stored on your device, using Apple’s SwiftData framework
Transmitted only if you turn on sync: With sync off — the default — this data is never uploaded
to us or anyone else, and we have no copy of it. With sync on, it is uploaded so your other devices
can have it, in the form described under “Sync” below.
1a. Sync (off by default)
Sync is opt-in. Until you sign in and turn it on, nothing in this section happens and the app
behaves exactly as it always has.
Signing in. Sync uses Sign in with Apple. We receive the anonymous identifier Apple gives us for
you, and nothing else — we do not request your email address or your name. There is no password,
no profile, and no other way to sign in.
What is encrypted before it leaves your device. A player’s name is the sensitive part of a
youth-sports roster, so it is encrypted on your device with a key we never receive. One other value
is encrypted, for a different reason:
- Player names
- The calendar link you paste in to import a team’s schedule. It is not a name, but a link like
that often has a private access key buried in it, so we treat it as a secret
What travels readable. The app cannot work without these, and none of them identify a child:
- Jersey numbers, event locations on the rink, outcomes, scores, periods, dates and times
- Team, season, league and tournament names
- The nickname you can give a team so voice input recognises it when you say it out loud
- Venue names, addresses, coordinates, and which end of the rink the home team defends first —
rinks are public places, and a shared rink catalogue is something the app may build on later
- The identifiers that link rows together, and their ordering
- Roughly how long an encrypted name is. Before a name is encrypted we pad it to a fixed
size — 64 bytes, or 256, or 1024 — so two names of different lengths inside the same size
look identical on our server. Essentially every name fits the smallest one. What remains
visible is only which of the three sizes a value fell into, and we record each row’s overall
size to count your storage against your allowance.
What this means in practice. If our server were fully compromised, an attacker would get game
events, jersey numbers, rink locations, and team, season, league and tournament names — plus
which size bucket a player’s name padded to — and no child’s name. We think that is the right
place to draw the line, and we would rather tell you where it is than imply there is no line.
What never syncs, at all:
- Voice recognition records (
VoiceAnalyticsEvent) and voice usage counts — uploading these would
contradict this policy
- Statistics caches, which are recalculated from your events anyway
- App settings and device state
Where it goes: Cloudflare Workers and D1 — see “Third-Party Services” below.
Your recovery phrase. When you turn sync on we show you a recovery phrase once. If you lose every
device and do not use iCloud Keychain, that phrase is the only way to read your own encrypted data
again. We cannot recover it for you, because we never had it.
Two devices, two sets of games. If you already tracked games on another device before turning
sync on there, you may end up with duplicates. Nothing merges them automatically, and the app warns
you about this before you sign in.
Voice input is push-to-talk: audio is recorded only while you hold the microphone button.
- Where it goes: By default, transcription happens on your device using iOS speech recognition,
and no audio is sent anywhere
- Enhanced transcription (ElevenLabs): More accurate, and off unless you turn it on in
Settings → Voice Input. With it on, the audio you record is sent to ElevenLabs to be
transcribed
- Allowance: 5 minutes of enhanced transcription a calendar month, counted on the device you are
using. Past that, on-device recognition is used for the rest of the month, and the app tells you
when that happens
- What is sent: Only the audio you recorded. No team names, player names or game data accompany
it
- Storage: Audio is held in memory for the length of the request and then discarded. PuckMetrix
never writes your audio to disk and never keeps it
- No account involved: There is no sign-in and nothing to sign in to. Turning enhanced
transcription on or off in Settings never asks for an identity
- Control: Voice input is used only when you press the microphone button. You can also decline
microphone access, in which case voice input is unavailable and nothing is recorded
- If on-device recognition is unavailable: Say you decline the Speech Recognition permission.
With enhanced transcription off, transcription then fails and tells you so — your audio is not
sent to ElevenLabs as a substitute
3. Voice Recognition Quality Data
When you use voice input, the app records how well recognition performed so the feature can be
improved:
Basic data — the “Voice analytics” setting, on by default, can be turned off:
- Command types recognized (shot, goal, penalty, etc.)
- Confidence scores and whether commands were auto-executed or required manual entry
- Jersey numbers mentioned (not player names)
- Home/away team designation (not team names)
- Word count and a hash of the transcript, for deduplication
Full transcripts — the “Keep full transcripts” setting, off by default, opt-in only:
- The actual text of your voice commands
- May include player names you speak aloud
Purpose: To let us diagnose recognition failures and improve accuracy
Storage: Stored only on your device, alongside your game data
Not transmitted: These records are never uploaded — not to us, not to anyone. Nothing is shared.
They stay on your device until you delete your data or delete the app
Control: Settings → Account Preferences → Voice analytics. Turn it off at any time; turning it
off also turns off “Keep full transcripts”
4. Crash and Diagnostic Data
PuckMetrix has no crash-reporting SDK of its own. Nothing in the app uploads crash data
anywhere. Two separate things happen instead, both run by Apple:
- On your device: iOS collects crash, hang and performance diagnostics via MetricKit. The app
writes them to the local system log and nothing else — they stay on your device
- To us, if you allow it: If you have “Share With App Developers” turned on (iOS Settings →
Privacy & Security → Analytics & Improvements → Share With App Developers — turning off the
parent “Share iPhone Analytics” toggle disables this too), Apple sends us crash and performance
reports through Apple’s own systems. With it off, we receive nothing
Purpose: To find and fix crashes and performance problems
What crash reports contain: Device model, OS version, app version and stack traces
What they do not contain: Your game data (player names, scores, event locations) or your voice
transcripts
Control: Apple’s analytics can be disabled via iOS Settings → Privacy & Security → Analytics &
Improvements
- We never ask for your device’s location. The app requests no location permission and cannot
read where you are. The one place coordinates appear is a rink you searched for and saved —
a public building’s published latitude and longitude, which travels with your venue list if you
turn sync on. That is a place you chose, not a place we found you
- We do not track your browsing history or activities outside the app
- We do not collect device identifiers for advertising purposes
- We do not use cookies or similar tracking technologies
- We do not collect sensitive personal information (health data, financial data, etc.)
- We do not collect payment information, because there is nothing to pay for
Third-Party Services
Cloudflare (only if you turn on sync)
Sync runs on Cloudflare Workers, with data stored in Cloudflare D1. If you never turn sync on,
nothing of yours ever reaches them.
- Purpose: Storing your synced rows so your other devices can fetch them, and checking your
Sign in with Apple token
- When: Only while you are signed in with sync on
- Data Shared: Your game rows, with player names encrypted on your device beforehand; the anonymous
Apple identifier for your account; and the ordinary technical details of a network request, such
as your IP address
- Not Shared: Your email address or name — we never ask Apple for them; your voice recordings;
your voice recognition records
- What Cloudflare can see: The encrypted rows as ciphertext, plus the readable fields listed
above (jersey numbers, locations, scores, dates, venues, team, season, league and tournament
names). Neither Cloudflare nor we can read your players’ names, because the key never leaves
your devices
- Retention: Your rows stay until you delete them, erase your data, or delete your account.
Records of deleted rows are kept for 90 days afterwards so your other devices can learn that
the deletion happened, then purged
- Cloudflare’s Privacy Policy: https://www.cloudflare.com/privacypolicy/
- Avoiding it: Don’t turn sync on. That is how the app ships
Apple (Sign in with Apple)
Used only to sign you in for sync.
- What we ask Apple for: Nothing beyond the anonymous identifier that identifies you to us.
We do not request your email address or your name
- What we store: That identifier, and a session for your device
- Apple’s Privacy Policy: https://www.apple.com/legal/privacy/
ElevenLabs
We use ElevenLabs to transcribe voice input, but only for people who turn on enhanced transcription.
It is off until you turn it on, and while it is off no audio reaches ElevenLabs at all.
- Purpose: Converting the audio you record into text so it can be parsed into a game event
- When: Only while “Enhanced transcription (ElevenLabs)” is on in Settings → Voice Input, and
only for the first 5 minutes of enhanced transcription in a calendar month
- Data Shared: The recorded audio clip only
- Not Shared: Your name, email, team names, player names or game data
- Retention: We do not keep the audio. ElevenLabs’ own handling of submitted audio is governed by
their privacy policy
- ElevenLabs’ Privacy Policy: https://elevenlabs.io/privacy
- Avoiding it: Leave enhanced transcription off, which is how the app ships, and nothing is ever
sent to them. Declining microphone access, or simply not using the microphone button, means no
audio is recorded in the first place
iOS Speech Recognition
The default transcription engine — what you get unless you turn on enhanced transcription:
- Processing: Speech is processed on your device by iOS
- No Recording: Nothing is transmitted when this engine is used
- Apple’s Control: Speech processing respects your iOS privacy settings
Data Storage and Security
With sync off — how the app ships
- On your device: All of your game data lives on your device, in Apple’s SwiftData framework
- No cloud copy: There is no server-side copy of your games. We could not produce your data if we
were asked to, because we don’t have it
- Nothing carries to a second device: Every install starts empty
- Fully offline: The app works entirely offline. Network access is used only for optional
calendar schedule import and enhanced voice transcription if you have turned it on
With sync on
- On your device, and on our server: Your rows are uploaded so your other devices can fetch them
- Player names are encrypted before upload, with a key that never reaches us. We hold
ciphertext for that field and cannot turn it back into a name
- The app still works offline. Events are recorded locally and sent when there is a connection.
Recording a goal never waits on the network and never fails because sync failed
The Trade-Off You Should Know About
With sync off, your data is only as safe as your device. If you lose your phone, reset it, or
delete the app, your games are gone. Use iCloud or iTunes device backups to protect them, and export
PDF reports for anything you want to keep permanently.
With sync on, you gain a second copy and take on a second exposure. Your games survive a lost
phone, and some of your data now sits on a server. We have tried to make that exposure as small as
the feature allows — see what is encrypted, above — but it is not zero, and you should choose with
that in mind.
One thing sync is not: a backup you can restore from selectively. Deleting a game on one device
deletes it everywhere. If that matters to you, export PDF reports.
Data Security
- Local data is protected by iOS file-system encryption and your device passcode
- Synced data travels over an encrypted (HTTPS) connection, and player names are separately
encrypted on your device before they are sent
- Your encryption key is held in the iOS Keychain and, if you use iCloud Keychain, shared to your
other devices by Apple. We never receive it
- Audio sent for enhanced transcription travels to ElevenLabs over an encrypted (HTTPS) connection
Data Isolation
- Your synced data belongs to your account alone. There is no sharing between users, and no shared
or public data in PuckMetrix
- With sync off, your data never leaves your device at all
Your Rights and Controls
Access and Control
You have complete control over your data:
- View Your Data: All data is accessible within the app (Games, Stats, History)
- Export Your Data: Generate PDF reports of your game statistics
- Delete Specific Data: Delete individual games, teams, or players
- Delete Everything: Use “Erase All Data” in Settings
Erasing Your Data
To erase your data:
- Open the app and go to Settings
- Tap “Erase All Data”
- Confirm
This removes all app data on your device — teams, players, games, events, statistics, venues,
tournaments and voice recognition records — and returns the app to its first-run state.
If sync is on, it erases the server copy too, and tells you about both halves — for example,
“Deleted 4 teams, 38 games and 1,204 events from this device and from sync.” If either half fails,
the app says which one, rather than reporting success, and you can tap “Erase All Data” again to
retry.
Deletion cannot be undone — export anything you want to keep first.
Deleting Your Account
If you have signed in, Settings → Sync → Delete Account removes your account entirely: the server
copy of your data, the record linking you to Apple, and your sessions. Your games stay on the device
you are holding unless you also erase them.
There is no waiting period and nothing to email us about.
Revoking Permissions
You can revoke permissions at any time:
- Sync (stops any further upload): Settings → Sync → Sign out. This also ends your session on
our server — including sessions on devices you no longer have, which is what makes signing out
useful if a phone is lost or stolen. Your games stay on the device you are holding. To remove what
has already been uploaded, use Delete Account or Erase All Data
- Microphone Access: iOS Settings → PuckMetrix → Microphone → Off
- Speech Recognition: iOS Settings → PuckMetrix → Speech Recognition → Off
- Enhanced transcription (stops any audio reaching ElevenLabs): Settings → Voice Input →
Enhanced transcription → Off
- Analytics: iOS Settings → Privacy & Security → Analytics & Improvements → Share With App
Developers (toggle off — or turn off the parent Share iPhone Analytics, which disables it too)
- Voice recognition quality data: Settings → Account Preferences → Voice analytics → Off
Children’s Privacy
PuckMetrix is designed for hockey and box lacrosse coaches, parents, and enthusiasts of all ages. We
do not knowingly collect personal information from children under 13 without parental consent. If you
believe a child has provided us with personal information without parental consent, please contact us
so we can delete it.
Note: Player names and jersey numbers entered in the app are provided by the user (typically a
coach or parent) and are not collected directly from children.
With sync on, a child’s name does leave the device — encrypted. It is uploaded so your other
devices can show it, and it is encrypted on your device first, with a key we never receive. We
cannot read it, and neither can Cloudflare. The jersey number, the team they play for, and the
events attached to it travel readable. If you would rather nothing about a roster left the device
at all, leave sync off, which is how the app ships.
One thing to be aware of: if you turn on enhanced transcription and then speak a child’s name
aloud while using voice input, that audio is sent to ElevenLabs. Leave enhanced transcription off —
the setting the app ships with — and the audio never leaves the device. If you would rather nothing
were recorded at all, don’t use the microphone button.
Data Retention
- Game data, sync off: Kept on your device until you delete it. We never receive it, so we
cannot retain it
- Game data, sync on: Kept on our server until you delete it, erase your data, or delete your
account
- Deleted games: Removed from your device immediately. With sync on, the deletion is sent to the
server, and a record that the row was deleted is kept for 90 days afterwards so your other
devices learn about it rather than silently restoring the game. After that the record itself is
deleted. A device that stays offline longer than 90 days may therefore restore a game deleted
elsewhere — the alternative is keeping a record of every deletion forever
- If you sign out: What was already uploaded stays until you delete your account or erase your
data. Signing out stops further uploads; it is not a deletion
- Voice recognition records: Kept on your device until you delete your data or delete the app
- Crash reports: If you have Share With App Developers on (or Share iPhone Analytics, its
parent toggle), Apple delivers reports to us through Apple’s own systems, retained on Apple’s own
schedule — we keep no separate copy of our own. With it off, we receive none
- App uninstall: All local data is removed with the app. If you never turned sync on, nothing
remains anywhere. If you did, your account and its data stay on the server until you delete them —
uninstalling does not delete them, so use Delete Account first if that is what you want
Changes to This Privacy Policy
We may update this Privacy Policy from time to time. We will notify you of any changes by:
- Updating the “Last Updated” date at the top of this policy
- Posting a notice in the app when significant changes occur
Your continued use of the app after changes indicates your acceptance of the updated policy.
International Users
PuckMetrix is available worldwide. With sync off, your game data stays in one place: your device.
With sync on, your data is stored by Cloudflare, which operates a global network and may store and
process it in regions outside your own. Crash diagnostics are handled entirely within Apple’s own
systems, and if you turn on enhanced transcription your voice audio is transcribed by ElevenLabs;
either may also process data outside your region.
California Privacy Rights (CCPA)
If you are a California resident, you have the right to:
- Know: What personal information we collect (see “Information We Collect” above)
- Delete: Request deletion of your personal information (use “Erase All Data” in Settings)
- Opt-Out: We do not sell personal information, so there’s nothing to opt out of
- Non-Discrimination: We do not discriminate based on privacy choices
European Privacy Rights (GDPR)
If you are in the European Economic Area, you have the right to:
- Access: View all your data within the app. With sync off you hold the only copy; with sync on
the server’s copy is the same data, with player names held as ciphertext we cannot read
- Rectification: Edit your information in the app; edits sync to your other devices
- Erasure: Settings → Erase All Data removes both halves. Settings → Sync → Delete Account
removes the account itself
- Data Portability: Export your game data as PDF reports
- Withdraw Consent: Sign out at any time, which stops further uploads, and revoke permissions at
any time
Legal Basis for Processing:
- Synced game data: Consent (when you sign in and turn sync on). Withdraw it by signing out, and
delete what was uploaded with Erase All Data or Delete Account
- Your Apple identifier: Consent, and necessary to perform the sync you asked for — without an
account there is nothing to attach your rows to
- Audio sent for enhanced transcription: Consent (when you turn it on, and again each time you press
the microphone button)
- Crash diagnostics: Legitimate interest (app stability)
- Game data with sync off: Not applicable — it is not processed by us, only by the app on your device
If you have questions about this Privacy Policy or your data:
Developer: Steve Tannock
Email: [email protected]
Bluesky: @tannock.net
Response Time: We aim to respond within 7 business days
Transparency Commitment
We believe in radical transparency:
- No Advertising Trackers: We don’t use advertising SDKs or cross-app trackers. Crash and
performance diagnostics come from Apple’s own reporting, disclosed above — we run no third-party
diagnostics SDK
- Your Data, Your Choice: Your games are yours. They stay on your phone unless you decide
otherwise, and turning sync on is a decision you make, not a default we picked for you
- Clear Language: This policy is written in plain English, not legal jargon
- We Tell You The Downsides Too: Sync off means no backup; sync on means a copy of some of your
data sits on a server. Both are downsides and both are stated — see “The Trade-Off You Should Know
About”
- We Tell You Where The Line Is: We encrypt player names and not team names, jersey numbers or
rink locations. That is a judgement, not a guarantee of anonymity, and we would rather show you
the line than imply there isn’t one
Your privacy is not negotiable. If you have concerns, please contact us.