Overview
Pulse is developed by Ivan Shakhorski ("we," "us"), who is the data controller for the personal data described in this policy. Pulse is a habit tracker: you create daily or weekly activities, log completions, add notes, and optionally invite friends — by QR code or link — to track shared activities together, where everyone in the group can see each other's progress.
Because that shared-progress feature is central to how Pulse works, this policy pays particular attention to what becomes visible to other people, not just to us.
Information we collect
Account information
When you sign in with Sign in with Apple or Sign in with Google, we receive your name, email address, a unique account identifier, and — if your provider supplies one — a link to your profile picture, via Firebase Authentication. If you choose Apple's private email relay, we only ever see the relay address, not your real one.
If your provider gives us no name, Pulse asks you for a display name at the moment one is about to become visible to someone else — when you send an invite, or join someone else's activity — rather than at sign-in. Until then, no name is stored for you. You can change your display name at any time in Settings.
Your account record is kept in two parts. Your display name is the public half, because other members of a shared activity have to be able to read it. Your email address, your profile picture link and your push notification tokens are the private half: only your own signed-in account is permitted to read them, and that restriction is enforced by the database itself rather than by the app, so it holds even against a request that never goes through Pulse. Nobody you share an activity with can read your email address, and neither can any other Pulse user.
Activity & habit data
The content you create in Pulse: activity names, schedule type (daily or weekly), completion history, streaks, and any notes you attach to a completed day.
Shared activity data
If you create or join a shared activity, your completions, streaks, and notes for that activity are visible in real time to every other member of that activity — that's the point of sharing. Leaving a shared activity stops future updates from being shared, but does not retroactively hide what other members have already seen.
Invite links
An invite is an ordinary web link on our own domain — https://pulse.shakhorski.com/join/… — carrying the activity's identifier and a secret token. On an iPhone with Pulse installed, iOS hands the link straight to the app. Anywhere else it opens a page on our website whose only job is to pass the link to the app and to explain what to do if that does not work. That page runs entirely in your browser, sends the invite nowhere, and is excluded from search engines.
Stored alongside each invite is a preview of the activity — its name, description, schedule, daily goal, and how many people are in it — so whoever receives the link can see what they would be joining before they accept. The preview never contains the token. The token is held separately, readable only by people already in the activity, so knowing an activity's identifier is not by itself enough to join or to rebuild a working link. Neither the preview nor the token exposes the activity's history, your other activities, or your account details.
Links stop working 30 days after they are created. Any member can mint a fresh link at any time, which invalidates every copy of the previous one the moment it is made — including links already sent and QR codes already printed. When someone accepts an invite we record that their account presented a valid token, which is what a replaced link no longer matches.
Diagnostic data
Pulse contains no analytics, advertising, attribution, or tracking SDK. We do not record which screens you open or how often you use the app. What exists is the ordinary operational logging every hosted service produces: Firebase records requests to authentication, the database, and push delivery, including the originating IP address and timestamps, and our server-side functions log the outcome of operations such as an account deletion cascade. We use these to keep the service running and to investigate faults, not to profile you.
Crash reports
Pulse includes Firebase Crashlytics, which sends us a report when the app crashes, and when certain operations fail in ways the app deliberately does not interrupt you about — a push token that would not register, a profile update that did not save. A report contains the state of the app at the moment it went wrong: the stack of code being executed, your device model, its iOS version, how much memory and storage were free, and an installation identifier that distinguishes one install from another.
It does not contain your account identifier, your name, your email address, your activities, or anything you typed. We do not call the API that would attach your account to a report, so a crash tells us that an install hit a fault, never which person it belonged to. Nothing about a report is used for advertising or profiling, and there is no in-app toggle for it: crash reporting is either part of the build or it is not, and it is, because an app that cannot tell when it is broken stays broken.
Push notification token
If you enable notifications, your device registers a token with Apple's push notification service, which we store against your account so we can reach that device. It is used only for Pulse's own notifications — telling the other members of a shared activity that someone completed it, joined, or left, which means the notification carries your display name and the activity's name to their devices. Notes you attach to a day are never included. If you complete the same activity more than once in a day, the others are told once, not once per completion. Notifications only ever travel between members of an activity you joined; nothing reaches your device from a group you are not in. We don't see the content of other apps' notifications. Signing out removes that device's token from your account before the session ends, so a device you have handed on cannot keep receiving your notifications, and deleting your account removes every token it holds.
Reminders you set for yourself
You can ask Pulse to remind you about an activity at up to three times of day. What we store is the setting — the times, as minutes past midnight, and whether the reminder should be skipped once you have met the day's goal — kept in the private half of your account record so that your reminders survive a reinstall and follow you to a second device.
The reminder itself never involves us. It is scheduled and delivered by your own iPhone, from your own device's calendar, using iOS's local notifications. Nothing is sent from our servers when a reminder fires, our server-side code does not read this setting at all, and we have no way to know whether a reminder was delivered, seen, or acted on. A reminder is also personal: setting one on a shared activity puts nothing on anybody else's phone.
Your notification settings
Two of these settings are stored alongside your reminders. A per-activity mute records that you do not want the other members' updates for one activity, and a single master switch records that you want no notifications from Pulse at all. Both are stored in the private half of your account record, so which members of a shared activity have muted it is visible to nobody but themselves.
The master switch and the per-activity mute are read by our server when it decides who a notification goes to — a preference the sender cannot read would not be a mute, because the notification would still arrive. Turning the master switch off also stops your device scheduling the reminders described above. Your reminder times and per-activity settings are kept while it is off, and take effect again when you turn it back on.
How we use it
- Operate core features: authenticate you, sync your activities across devices, and keep shared activities up to date for every member.
- Send the notifications you've enabled — telling the members of a shared activity when one of them completes it, joins, or leaves, at most once per person, per activity, per day for completions.
- Sync the notification settings you choose — your reminder times, your per-activity mutes, and the master switch — so they follow your account rather than one phone.
- Keep the service running, diagnose faults — including from the crash reports described below — and protect it from abuse.
- Respond to support requests sent to our contact email.
We do not sell your personal data, and we do not use it for third-party advertising.
Legal basis for processing
Under the GDPR, we need a legal basis for each way we use your data. Here's ours:
| Data | Legal basis |
|---|---|
| Account & activity data | Contract — needed to provide the Pulse service you signed up for |
| Shared activity data | Contract — needed to run the shared-activity feature you chose to use |
| Diagnostic & operational logs | Legitimate interest — keeping the service running, secure, and debuggable, balanced against your privacy |
| Push notifications | Consent — you opt in, and can withdraw at any time with the single Notifications switch in Settings |
| Notification settings (reminder times, mutes) | Contract — storing the choices you made so they apply on every device you sign in on. Reminders themselves are scheduled by your device and involve no processing by us |
| Crash reports | Legitimate interest — finding and fixing faults in the app, balanced against your privacy by the report carrying no account identifier |
Service providers
Pulse runs on Google Firebase, which provides authentication, database storage, server-side functions, push delivery, and crash reporting on our behalf. Firebase processes data under Google's own terms and security practices; see Google's Privacy Policy for how they handle it. Sign in with Apple additionally involves Apple as the identity provider, and Apple's push notification service delivers the notifications you opt into. We use no advertising, attribution, or analytics SDKs, and there are no other processors.
Storage & security
Your data is stored on Firebase's infrastructure and encrypted in transit between your device and our servers. Access to production data is limited to what's needed to operate and support the app. No system is perfectly secure, but we don't collect more than Pulse needs to function.
Which account may read or write which record is decided by Firestore security rules — conditions evaluated by Google's servers on every single request, independently of the app. The separations described in this policy are written there rather than only in the app, so an outdated, modified, or entirely hand-written client cannot read what the rules do not allow. Those rules are covered by an automated test suite that is run against them before they are deployed, including tests that deliberately loosen a rule to confirm the suite notices.
Retention
We keep your account and activity data for as long as your account is active. Deleting your account, from Settings inside the app, removes your data as follows:
- Your profile — your name, email, profile picture link, and push tokens are deleted from our database, both halves of the account record together, and your sign-in account is deleted from Firebase Authentication.
- Activities you own — deleted outright, along with their complete history for everyone in them, including other members' completions and notes, and their invite links. The app tells you this before you confirm. If you would rather a shared activity survive you, hand it over to another member first: an owner can pass ownership on from the members list, and an activity you no longer own is treated below as one you joined.
- Activities you joined — the activity itself continues for its other members, and you are removed from it. Completions and notes you already contributed to that activity stay part of the group's shared history, because removing them would rewrite a record other people rely on. They remain stored against your former account identifier, which no longer resolves to a name or to a live account.
Invite links expire 30 days after they are created, and the record of a redeemed token is deleted together with the activity it belongs to. Backups and operational logs may retain deleted data for a short period before they age out.
Your rights
Built into the app, available any time:
- Delete your account — in Settings, under Advanced. Your provider will ask you to sign in again to confirm it is you; nothing is deleted unless that succeeds, and cancelling leaves everything untouched. What is removed is described under Retention.
- Change your display name — in Settings. The new name replaces the old one everywhere it is shown to other members.
- Leave a shared activity — stops future syncing of your progress to that group.
- Replace an invite link — minting a fresh link for an activity immediately invalidates every copy of the old one.
- Turn off notifications — one switch in Pulse's Settings turns off every notification the app can produce, both the updates our server sends and the reminders your device schedules, without discarding the settings underneath it. You can also silence a single activity from that activity's own notification screen, or withdraw the permission entirely in your device's system settings.
If you're in the EU/EEA or UK, the GDPR also gives you these rights over your personal data — and we honor them for every Pulse user, wherever you are:
- Access — request a copy of the personal data we hold about you.
- Rectification — correct data that's inaccurate or incomplete.
- Erasure — delete your account and personal data. You can do this yourself in Settings ▸ Advanced, without asking us; email ivanwanwas@icloud.com if you would rather we did it, or if you want data removed that in-app deletion leaves behind.
- Restriction — ask us to limit how we use your data while a request is being resolved.
- Portability — receive your data in a structured, machine-readable format.
- Objection — object to processing based on legitimate interest, such as our operational logging.
To exercise any of these, email ivanwanwas@icloud.com — we'll respond within a reasonable time. If you're not satisfied with our response, you have the right to lodge a complaint with your local data protection supervisory authority. If you're outside the EU/EEA — for example under the CCPA — similar rights to access, delete, and correct your data apply; contact us and we'll help.
Children
Pulse is not directed at children, and we don't knowingly collect information from anyone under 16 — or the digital consent age set by your country's law, which in some EU member states is as low as 13. If you believe a child has created an account, contact us and we'll remove it.
International data transfers
Pulse runs on Google Firebase, which may process and store data in the United States or other countries outside the EU/EEA and UK. When we transfer personal data out of the EU/EEA, UK, or Switzerland, we rely on safeguards recognized under the GDPR — such as the European Commission's Standard Contractual Clauses, which Google implements for its Firebase and Google Cloud services.
Changes to this policy
If we make material changes, we'll update the effective date above and, where appropriate, notify you in the app. Continued use of Pulse after a change means you accept the updated policy.
What changed on August 31, 2026
Notifications grew a second kind and a switch over both. Nothing here widens what anyone else can see.
| Area | Change |
|---|---|
| Reminders | New setting, no new data leaving your device. You can set times to be reminded about an activity. The times are stored on your account so they follow you between devices; the reminder is scheduled and delivered by your own iPhone, and our servers take no part in it. See Reminders you set for yourself |
| Notifications | A single switch in Settings now turns off everything Pulse can send you — the updates from shared activities and the reminders on your device — while keeping the settings underneath it. See Your notification settings |
| Notifications | Joining and leaving a shared activity now notifies its members, on the same terms as a completion: display name and activity name, to members only |
What changed on August 28, 2026
Every item below describes a change to the app or its database, not a change of wording. Each one narrows what other people can reach.
| Area | Change |
|---|---|
| Account data | Your email address, profile picture link and push tokens moved into a private part of your account record that only your own signed-in account may read, enforced by database rules rather than by the app |
| Invite links | Invites became ordinary links on pulse.shakhorski.com, and an invite's secret token now lives apart from its preview, so only existing members can read it |
| Membership | Nobody can be written into an activity they did not join by accepting an invite |
| Notifications | Completing the same activity repeatedly in one day now notifies the other members once, rather than once per completion |
| Crash reports | New data leaving your device. Firebase Crashlytics was added, so a crash or a silently-failed operation now sends a diagnostic report — device model, iOS version, and the code that failed, with no account identifier attached. See Crash reports |
| Invite links | The secret token moved from the query string into the URL fragment, which browsers never send to a server — so opening an invite on the web no longer writes a working token into our hosting logs |
Earlier revisions
First published August 26, 2026, and revised on August 27 and August 28, 2026.
Contact
Ivan Shakhorski
Developer of Pulse: Track Your Momentum