Eleven entries, and not one of them is a surprise: an account you connected, something a
map needs, the name of a place you sail, a mail you wrote and sent yourself, what iOS
itself already knew about a crash on this phone, a question you asked, and — while this is
a beta — Apple’s own crash reports and one small file the app reads to see whether
your build is still the current one. There is no twelfth.
- intervals.icu — only if you connect it
-
If you paste your own intervals.icu API key into Settings, the app uses it to
download your Garmin activities from intervals.icu so they arrive
without you exporting files by hand. The key is stored in the iOS Keychain, is
never copied into iCloud, and is sent only to intervals.icu, only as the login
header on those requests. The traffic is one-way: CleanJibe reads your activity
list and your original files, and never uploads a session, an analysis or anything
about you. Clear the key in Settings and every request stops. Connect nothing and
none is ever made.
- Strava — only if you connect it
-
Import → Strava, or Settings → Strava, opens Strava's own consent
page: you sign in to Strava there and not to us, and Strava itself tells you
what is being asked for. What is asked for is read access
(
activity:read_all) and nothing else. CleanJibe lists your activities,
and for the ones you pick it downloads their positions, their clock, their elevation
and their heart rate. It never writes — no activity, no description,
no comment — and nothing in the app is a quiet step towards it. The access token it
gets back lives in the iOS Keychain on your phone, is never copied
into iCloud, and is sent only to Strava. Disconnect, on either of
those two screens, deletes it from the phone and also asks Strava to revoke it, the
same as unlinking it yourself at
strava.com/settings/apps;
if your phone is offline when you disconnect, the token is still deleted here, and
that page is where you can check or finish the job. Strava lets a new app connect a
limited number of riders, which the app says out
loud rather than reporting as a failure; if you are told the app is full, tell us. Sessions that arrive this way carry
positions and no measured speed, so their speed records are marked estimated — an
accuracy note rather than a privacy one, and the Import screen makes it before you
tap rather than after.
- The Strava sign-in comes back through cleanjibe.org
-
Strava returns a rider only to an address on the one web domain it has on file for an
app, and refuses custom app links outright. Ours is
cleanjibe.org, so
the last hop of the sign-in loads
cleanjibe.org/strava/callback for about a frame and
that page hands the result straight back to the app. It is a single static file with
no stylesheet, no counter and nothing third-party on it — an authorization code is a
credential for the next few seconds and must not be handed to anybody's script.
GitHub Pages, which serves this site, sees that request the way it sees every other
page load on it: a URL, which in this one case has that single-use code in it, a time
and an IP address. There is no code of ours on that server and nothing is stored. The
code is then exchanged for the token between your phone and Strava directly, and is
worthless afterwards.
- Apple Maps — when a map is on screen
-
The session map, the full-screen map, the replay and the share card's optional map
background are all drawn by Apple's MapKit, which fetches map imagery for the area
you sailed in. Apple therefore sees roughly where the session was, under Apple's
own privacy policy and with no identifier of ours attached. The share card's map
background is off unless you turn it on; the session maps you can
simply not open.
- Apple Maps again — the map this phone draws for a Garmin watch
-
A Garmin cannot be given a real map, so CleanJibe draws it one: a coarse
land/water/road picture of a 3 km box around a spot, one or two kilobytes, which
the watch blits under its breadcrumb. That picture is rendered by the same MapKit,
which means Apple sees the area of that spot even with no map anywhere on
your screen — the part worth saying plainly. It happens when you press
Send map to watch, and by itself at app launch and after an import. Which
spots: the two you have ridden most, unless you tick your own under Settings →
Garmin watch → Map for the watch, which replaces that automatic pair
with your picks. When nothing about the pair has changed since last time, nothing is
rendered and nothing is asked of Apple. The finished picture goes over Bluetooth to
the watch and to nobody else.
- Apple's place-name lookup — one rounded coordinate, once per new spot
-
When the app meets a sailing spot it has not seen before, it asks Apple’s
reverse-geocoding service what that place is called, so your spots read
“Nago-Torbole” instead of “Spot 3”. What is sent is
a single coordinate — the centre of that spot, rounded to about
110 m — and nothing else: no session, no track, no name, no identifier, no
account, and no CleanJibe server anywhere in the path. Once per new spot, never
again for a spot that already has a name, and never at all if you name your spots
yourself. Apple sees roughly where you sail, under Apple’s own privacy policy.
- A feedback mail — written by the app, sent by you
-
Menu → Support & ideas, the quiet Something off, or an idea?
Send feedback at the foot of every page, and Report a problem with this
session… on a session's share sheet all open one thing: a mail
to info@cleanjibe.org in your own Mail app,
with the facts already typed in. Those facts are the build number, your iPhone model,
iOS version and locale, the paired watch and which version of the CleanJibe watch app
it runs, and the shape of your library — how many sessions, and how many came in by
each door. Sent from a session page it also names that session's date, spot, duration
and source, and attaches that session's share card. If iOS has noticed a crash, a
hang or a heavy write to disk on this phone since the last mail, the newest few print
too: roughly when, what iOS called it, and where in the app it happened. iOS keeps
those itself, on this phone, in every channel including the App Store one, and prints
them here because there is nowhere else a rider on that channel could ever read them.
There is no track, no file and no coordinate in it. Every line is editable, and
nothing is sent until you tap Send: it is an ordinary mail, through
your own mail account, to a mailbox. There is no CleanJibe server anywhere in that
path either.
- One session, sent by you, from its Share page
-
Send this session to us on a session’s Share page is in
the public beta. It opens one mail with your notes on it and that
session’s recording attached, as it was imported. The file
holds your track, your heart rate and your times. It is used only to improve the
detection and it is never published. Under your notes it carries the same facts
the feedback mail carries, plus that session’s duration, distance, jibe
tally and wind source. Nothing runs in the background and nothing is sampled: it
happens once, for one session, because you asked for it. You read the whole mail
first, every line is editable, and nothing is sent until you tap
Send. The browser app offers the same thing on a session’s Details
tab, through your own share sheet or a download and a mail. There is no CleanJibe
server in either path.
- TestFlight — crash reports, for as long as this is a beta
-
The iPhone app is installed through Apple's TestFlight, and
TestFlight collects crash reports, plus the feedback you send from inside it, and
passes them to us: the device model, the OS version, and the stack trace of what fell
over. No session, no track, no file, nothing out of your library. That collection is
Apple's, under Apple's TestFlight terms and the sharing choice you
made when you accepted them — we neither add to it nor can switch it off — and it
ends when the app leaves TestFlight for the App Store.
- One small file on this website — is your beta build still the current one?
-
While this is a beta, the app fetches a single file of about three hundred bytes from
cleanjibe.org — at most once a day, and nothing
else about it — which says which TestFlight build is current, so it can tell you
when the one you are holding is older than the one we are answering reports about.
The request carries nothing: no key, no identifier, no session, not
even which build is asking — it is the same static file for everyone, the
comparison happens on your phone, and nothing is ever sent back. If it fails, you are
told nothing and the app simply tries again tomorrow. GitHub Pages, which serves this
site, sees it the way it sees any page load here: a URL, a time and an IP address.
The App Store build does not do this at all.
- Ask CleanJibe — a question you send, in the development build
-
Help and a session's page have a box where you can ask a question. The first time, a
page says what is sent; nothing is sent until you send a question. Then your question,
the app's version and your units go through Cloudflare to Anthropic, whose Claude writes
the answer from our help texts. Asked from a session, that session's numbers go too:
its date and times, speeds, flights and every turn's verdict, but no map, no
positions and no name. We keep the question and the answer for 30 days to improve the
answers, then they are deleted. Apple's App Attest confirms that the question comes
from this app, which counts the daily limit of 20 questions: a key made on your phone
for that alone, deleted on our side after 30 days unused. No account, no cookie.
Anthropic's privacy policy is at
anthropic.com/legal/privacy.
The App Store build and the beta do not have it yet.