Privacy Policy

Pulse: Track Your Momentum

Effective August 31, 2026 Scope EU/EEA & UK (GDPR) App com.ivanshakhorski.pulse Contact ivanwanwas@icloud.com

This policy explains what information Pulse collects when you build habits, share activities with friends, and track your progress — and the choices you have over it. Our beta testing is focused on the EU/EEA and UK first, so this policy is written around the rights the GDPR gives you there; the same protections apply to every Pulse user, wherever you are.

Contents
  1. Overview
  2. Information we collect
  3. How we use it
  4. Legal basis for processing
  5. Sharing with other people
  6. Service providers
  7. Storage & security
  8. Retention
  9. Your rights
  10. Children
  11. International data transfers
  12. Changes
  13. Contact

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:

DataLegal basis
Account & activity dataContract — needed to provide the Pulse service you signed up for
Shared activity dataContract — needed to run the shared-activity feature you chose to use
Diagnostic & operational logsLegitimate interest — keeping the service running, secure, and debuggable, balanced against your privacy
Push notificationsConsent — 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 reportsLegitimate interest — finding and fixing faults in the app, balanced against your privacy by the report carrying no account identifier

Sharing with other people

Pulse is built around shared accountability, so some information is shown to other users by design:

Visible toWhat they see
Members of a shared activityYour display name, and your completions, streaks, and notes for that specific activity — never your email address or sign-in identifier
Anyone with your invite link or QR codeThe name, description, schedule, goal, and member count of that one shared activity — not its completion history, your other activities, or your account details
People outside a shared activityNothing — an activity and its history are readable only by its members, and solo activities are private to your account

We never share your account information (email, sign-in identifier) with other users — only your chosen display name and the activity data described above. This is not merely an app-level convention: those fields sit in the private half of your account record described under Information we collect, which the database refuses to return to anyone but you.

You are never added to an activity without accepting

The only way to become a member of a shared activity is to open its invite and accept it yourself. Nobody — not another member, not the activity's owner — can write your account into a group you did not join. This matters beyond tidiness: membership is what makes an activity appear in your app and what allows its completions to notify your device, so an activity you have not joined can neither show you anything nor send you anything.

Leaving works the same way in reverse, and is yours alone to do. An owner can remove other members from an activity they own; nobody can force you to join one.

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.

AreaChange
RemindersNew 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
NotificationsA 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
NotificationsJoining 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.

AreaChange
Account dataYour 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 linksInvites 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
MembershipNobody can be written into an activity they did not join by accepting an invite
NotificationsCompleting the same activity repeatedly in one day now notifies the other members once, rather than once per completion
Crash reportsNew 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 linksThe 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