Privacy Policy — EUC Logger
Effective July 26, 2026
In short
EUC Logger reads telemetry from your electric unicycle over Bluetooth, shows it on a dashboard, sounds alerts and writes every ride into a CSV file on your iPhone. It is free, and it is written and run by one person — Pavel Demyanov, acting in a private capacity. There is no company behind it and no data business.
What that means for your data, stated plainly:
- Your rides stay on your phone. CSV recordings, their summaries and all settings live on the device and are never uploaded in the background. The app has no server and no sync of its own. It does not, however, hide its folders from your iPhone's own backup: if you keep iCloud Backup or encrypted computer backups switched on, your recordings are copied there along with the rest of the phone, and they come back when you restore.
- The app does use your location, and it takes exactly one thing from it: your current speed. Coordinates are never read, never written to the CSV and never sent anywhere. There is no GPS switch inside the app — the only way to stop it is to deny the permission in the iPhone's settings.
- Exactly one feature in the whole app sends anything outward: a button that sends a raw Bluetooth dump to me so I can work out a wheel's protocol. It fires only if you switched Raw data capture on yourself (it is off by default) and then tapped Send. Nothing is ever sent automatically.
- A dump you send carries hardware identifiers — the wheel's Bluetooth name always, and on InMotion wheels possibly the wheel's serial number — together with your phone model, your iOS version and the app version. Your CSV ride files and your coordinates are never part of it — though the raw telemetry from the minutes you captured is.
- No accounts, no registration, no ads, no analytics, no third-party SDKs, no advertising identifier, no purchases and no subscriptions.
What is stored on your phone
Everything the app produces during normal use is written to its own storage on your iPhone and stays there.
- Ride recordings. One CSV file per session in the app's Documents/EUC Logs folder, named to the pattern EUC_yyyy-MM-dd_HH-mm-ss.csv, each with a small .stats.json sidecar holding the session summary. The file has 42 columns: the first is the date and time of the line down to the millisecond, one more is GPS Speed, and the other 40 are wheel telemetry — speed, voltage, currents, PWM, temperatures, battery and BMS data, lean angles, mileage and so on. There are no latitude, longitude or track columns in the format at all.
- Raw dumps. These appear only if you switch on Raw data capture yourself: hex files in the app's Documents/EUC Raw folder. It is one file per wheel — reconnects to the same wheel are appended to the same file, so one ride does not scatter into a pile of files. A new file is started when you switch the toggle on, when the app launches with the toggle already on, and when you connect to a device with a different name. The file is named after the wheel and the moment capture started, and a file that caught nothing is deleted rather than kept. Each line holds a timestamp down to the millisecond, the direction of the packet (to the wheel or from it), the Bluetooth characteristic and the packet bytes.
- Settings. Alert thresholds, tile layout, polling mode, GPS mode, the per-wheel profiles, the list of known devices, the chosen interface language and the id of the last connected wheel — in the app's standard iOS preferences store.
One detail about that list of known wheels: the "My wheels" list you see on screen shows only devices that actually sent telemetry, but technically the identifier and name of any device you connect to are written into the local known-devices list in the app's settings. That list never leaves the phone and it disappears together with the app.
All of this sits inside the app's own sandbox. I cannot see it, and neither can anyone else, unless you send a file somewhere yourself.
Location
The app uses location services. This is the section worth reading in full.
What is taken. One number: the instantaneous speed the system reports, multiplied by 3.6 to give km/h. That is the only field of a location fix the code touches. Latitude, longitude, altitude and course are never read, never stored, never written to the CSV and never transmitted. The app keeps no points, builds no track and shows no map.
Where that number goes. Into the GPS tile on the dashboard and into one CSV column, GPS Speed. That is speed, not place — a route cannot be reconstructed from it. A fix older than three seconds is treated as stale and the cell is left empty.
Which permission is asked for. "While Using the App". The app never asks for "Always" — that key does not exist in it.
Why it works in the background. The app declares the location background mode and enables background location updates. Without that, recording a ride would break every time you put the phone in your pocket and the screen went dark. While a wheel is connected, iOS shows its location indicator; that is expected, and it does mean your position is being sampled while the app is not on screen.
You cannot switch GPS off inside the app. While a wheel is connected and live, location is on; on the scan screen it is turned off so it does not drain the battery. Demo mode counts as a live wheel here — the virtual wheel runs through the same pipeline, so location starts there too, even though its value is not used in demo. There is no GPS off switch in the settings. The only way to stop location being used is the system one: Settings → Privacy & Security → Location Services → EUC Logger. Deny or revoke it and everything else keeps working — the GPS tile and the GPS Speed column simply stay empty.
The GPS modes change accuracy, not what is collected. Standard is best accuracy with a 5 m distance filter; Turbo is navigation accuracy with no filter; Smart switches to turbo when the wheel is moving faster than 2 km/h and drops back to standard after ten seconds at a standstill. The mode is set per wheel and changes accuracy only. In every mode it is speed, and only speed.
Bluetooth and background modes
Bluetooth is what the app is for: finding your unicycle, connecting to it and reading its telemetry. It is never used to work out where you are.
About the scan list, honestly. The scan is unfiltered — the app asks iOS for every Bluetooth device advertising nearby, because some wheel firmwares do not put their service into the advertisement. So the app really does see all the BLE devices around you: headphones, tags, watches, whatever else is there. Rows that look like wheels are marked as such, and everything else is shown in a separate "Other devices nearby" section — but that split is a hint, not a filter: you can tap any row in either section and the app will genuinely connect to that device, because the protocol is recognized only after connecting. And a wheel that has just disconnected but is still shown in the list gets short probe connections, to check whether it is still powered on. The scan list itself lives on screen only — apart from the known-devices entry described above, it is not stored and it is never sent anywhere.
What is written to the wheel. InMotion wheels answer only when asked, so the app sends them telemetry requests, including the request for the wheel's info frame. Begode-compatible and Veteran-compatible wheels broadcast on their own and receive nothing at all. InMotion wheels also get an authentication handshake when they connect — the official app does the same. Beyond that handshake and those read requests the app sends nothing, and it never changes a wheel's setting.
Three background modes are declared, and here is why each exists:
- bluetooth — so telemetry keeps arriving and recording continues with the screen off;
- audio — so the PWM, speed, lean and link-loss alerts can still be heard with the phone in your pocket (alert sounds duck your music rather than stopping it);
- location — so GPS speed keeps being sampled during a background ride, as described above.
There are no push notifications, no iCloud sync and no storage shared with other apps.
Sending a protocol dump to me
This is the only part of the app that sends anything anywhere. Here it is in full.
How it is triggered. Nothing happens automatically. Two things must both be true: you switched on the Raw data capture toggle behind the gear on the scan screen (it is off by default, and it survives restarts because it is meant to be used out in the field), and you then filled in the send form and tapped the button. One tap on Send uploads every dump not yet sent — the form lists them right above the button, including captures from other wheels. Nothing is ever sent without that tap. There is no scheduled upload, no background retry, no silent transmission — not at launch, not on a timer, not on Wi-Fi. Files you have already sent are not offered again. While capture is on, the app subscribes to every notify characteristic the device exposes, including unknown ones — the whole point is to catch the entire stream.
Where it goes. A single POST request to my server at euclogger.vercel.app/api/dump. That is the only network request the app can make; there is no other code in it that opens a connection.
Everything that goes with it:
- a random id generated for the upload;
- the app version and build number;
- your phone's hardware model identifier as the system reports it (for example iPhone17,1);
- your iOS version;
- the wheel's Bluetooth advertised name (on InMotion this looks like P6-E0049407 and is unique to that wheel);
- the wheel model and nominal pack voltage you typed into the form, and the id of the protocol the app recognized;
- the dump's file name (which is built from the wheel's Bluetooth name), the number of packets caught, the file size and a flag saying whether it was trimmed;
- the free-text comment you wrote;
- the dump itself — the hex log of the Bluetooth exchange, compressed and base64-encoded. A long dump is trimmed to keep the upload under about 3.5 MB and marked as truncated.
What does not go with it. Your CSV ride recordings and their summaries are never sent: the uploader reads files only from the EUC Raw folder, and sessions live in a separate folder that the network code never touches. Your coordinates are never sent, because they are never read in the first place. Your other settings — alert thresholds, dashboard layout, the list of known devices, the GPS and polling modes — are not sent either: the only two settings that leave the phone are the wheel model and the nominal pack voltage you typed into the form yourself. Nothing else on the phone is sent.
What a dump actually contains. It is the raw frame stream from your wheel — the same telemetry as a ride log, only unprocessed: speed, voltage, currents, PWM, temperatures, odometer and whatever else your wheel reports during the minutes you recorded. If you rode while capture was running, that ride is in there.
It contains hardware identifiers. The wheel's Bluetooth name always. On InMotion wheels the dump may also contain the wheel's serial number: the decoder asks the wheel for its info frame, that frame carries the serial, and the capture logger writes every incoming frame to disk. The app itself never displays the serial and never puts it into a CSV or into your settings — a raw dump is the one place on disk where it can end up, and if you send that dump, the serial goes with it.
Why this exists at all. Dumps are how a wheel's protocol gets worked out and how support for new models is added; there is no other way to check a wheel I do not have in my hands. I am the only person who looks at them.
If that is more than you want to share, do not send the dump. You can share the file yourself instead, keep it, or delete it — the app works exactly the same either way.
What the receiving server records
Three things end up stored alongside a dump that the app itself does not send, and you should know about them:
- a country code, which the hosting platform derives from the IP address the request came from — two letters, not a city, not an address and not the IP itself;
- the User-Agent string of the request (a technical line about the client and the system);
- the time the upload was received, by the server's clock.
The same server record also holds what already came from the app: the size of the dump compressed, its size decompressed, the number of lines in it, and a link to the stored file. That is the whole of the server-side record — there are no other fields in it.
My own code never stores your IP address. It is, however, visible to the hosting platform the server runs on and lands in that platform's own service logs — exactly as it does when you open any website.
I use all this only to make sense of incoming dumps: which wheels are in use where, and whether an upload came from a real device or from a script. I pass none of it to third parties.
Where uploaded dumps are kept
An uploaded dump and the JSON with the metadata listed above are stored in a cloud blob store, and I would rather describe its protection accurately than flatteringly: the store is public, and the only thing standing between a file and the open internet is a long random component in its address. There is no private mode, no password on the file and no expiring link. The address cannot realistically be guessed and I do not publish it — but the address is the lock, and anyone who gets that link can open the file. Calling this storage private would be untrue. The list of uploaded dumps is a separate page behind a password, and only I can see it.
There is no scheduled deletion. Dumps stay while they are still useful for protocol work, and they exist for exactly one purpose: adding and fixing support for wheel models. They are not sold, not shared with advertisers and not fed into any analytics product. The only other party that physically touches the files is the hosting platform the server and the store run on. When a dump helps document a protocol publicly, what gets published is the decoded field layout, never your file.
If you would rather a dump you sent be deleted, see "Deleting your data" below.
What the app does not do
- No accounts. No registration, no login, no email address, no name, no phone number, no profile. The app never asks who you are. You give me an email address only if you decide to write to me.
- No purchases and no subscriptions. The app is free and there is nothing to buy inside it.
- No ads, no analytics, no tracking SDKs. No Firebase, Crashlytics, Sentry, Amplitude, AppsFlyer, Mixpanel or anything comparable in the code, no advertising identifier (IDFA) and no App Tracking Transparency prompt, because there is nothing to track you with. The app does not follow you across other apps and websites.
- No third-party dependencies at all. No Swift packages, no CocoaPods, no Carthage — the app is built against Apple's own frameworks only.
- No usage telemetry of my own either. The app counts nothing, reports no events and phones home about nothing. The manual dump upload described above is the only network traffic it can generate.
One thing outside the app is worth naming, so it does not come as a surprise. Apple always shows me App Store download numbers — those are store figures and they do not depend on any setting of yours. Anonymized crash reports and usage statistics reach me only if you have "Share With App Developers" enabled in your iPhone's privacy settings. Both happen on Apple's side, past the app's code, and neither contains any of your wheel telemetry.
Getting your data out
Recordings leave your phone only when you send them somewhere yourself, through the standard iOS share sheet — AirDrop, mail, a messenger, Files, whatever you pick. A session CSV is shared by swiping its row or from the button in the recording card; raw dumps are shared the same way. Sharing an active session hands over an instant snapshot while the original keeps recording. After that, the file is wherever you sent it: the app does not report that anywhere and keeps no copy of the transfer.
The app's folder is not visible in the iOS Files app. The keys that would expose it are not set in the project, so you cannot browse to a recording or copy it out through Files — sharing from inside the app is the only way to get one out.
And the part that is easy to overlook: the app itself never copies anything anywhere — no sync of its own, no server-side backup, no export that happens by itself. The one copy that may exist is the one iOS makes: the app's folders are included in the standard iPhone backup, so with iCloud Backup on they are saved and restored with the rest of the phone. If that backup is off and you delete the app or lose the phone, years of accumulated rides go with it. If a ride matters to you, share it out to yourself while it is still there.
The app has no access to your photos, camera, microphone, contacts, calendar or your own files, and asks for no such permissions: the only two prompts it can ever show are Bluetooth and Location. It has no import feature either, so it never reads files you did not create with it.
Deleting your data
On the phone. Delete a ride by swiping its session row in the Analytics tab: the swipe reveals a Delete button, and that button acts at once, with no confirmation dialog. A full swipe deliberately does not delete — ride telemetry cannot be recovered, so it takes a separate tap. Raw dumps are deleted with the Delete captures button on the scan screen, and it removes every captured file at once. Deleting the app takes everything with it: recordings, dumps and settings. What survives elsewhere is only what your iPhone backup captured: if iCloud Backup was on, the recordings are in it and will return when you restore the app onto a phone. If it was off, there is nowhere to restore them from.
You can also simply not create the data in the first place: leave Raw data capture off (it is off by default), or switch it back off — no new dumps will be written. And without your tap on Send, nothing ever leaves the app.
A dump you already sent me. Write to me and I will delete it, together with its server-side record. It helps if you say which wheel it was (the Bluetooth name shown in the app), roughly when you sent it, or what you wrote in the comment field, so I can find the right file.
Why this policy changed
What the previous version got wrong. The version effective July 22, 2026 said three things about your data: that the app does not use location, and that it sends no data to any server, mine or anyone else's. The location claim was already false when it was published — location was in the shipped builds, version 1.1 (5) among them, asking for the "While Using" permission and running in the background. The server claim was true at the time and stopped being true later, when the manual protocol dump upload was added. The same version also said recordings could be reached in the Files app; they never could. All three are corrected in this text.
This version replaces the old one in full and describes what the app actually does today. What is written here applies to versions that have the Raw data capture section on the scan screen.
If the app changes again in a way that touches any of this, this page gets rewritten and the effective date at the top moves.
Contact
EUC Logger is made by one person — Pavel Demyanov, acting in a private capacity, with no company behind it.
Questions about privacy, requests to delete a dump you sent, or remarks about this text: greypax@gmail.com. I read everything and normally reply within a couple of days.
And if the app ever behaves differently from what is written here, please write — that matters more than anything else on this page.
Политика конфиденциальности — EUC Logger
Действует с 26 июля 2026
Коротко
EUC Logger читает по Bluetooth телеметрию вашего моноколеса, показывает её на дашборде, озвучивает оповещения и пишет каждую поездку в CSV-файл на вашем iPhone. Приложение бесплатное, его пишет и ведёт один человек — Павел Демьянов, частное лицо. Компании за ним нет, и бизнеса на данных тоже.
Что это значит для ваших данных, прямым текстом:
- Ваши поездки остаются на телефоне. CSV-записи, их сводки и все настройки лежат в памяти устройства и никуда не выгружаются в фоне. Своего сервера и своей синхронизации у приложения нет. Но от системной резервной копии iPhone оно свои папки не прячет: если у вас включён бэкап в iCloud или зашифрованная копия на компьютер, записи уезжают туда вместе со всем содержимым телефона и оттуда же вернутся при восстановлении.
- Приложение действительно использует геолокацию и берёт из неё ровно одно — вашу текущую скорость. Координаты не читаются, в CSV не пишутся и никуда не отправляются. Выключателя GPS внутри приложения нет — остановить это можно только запретом геолокации в настройках iPhone.
- Наружу данные уходят ровно в одном месте: кнопкой, которая отправляет мне сырой Bluetooth-дамп, чтобы я мог разобрать протокол колеса. Она срабатывает, только если вы сами включили «Сбор сырых данных» (по умолчанию он выключен) и нажали «Отправить». Автоматически не отправляется ничего и никогда.
- В отправленном дампе есть идентификаторы железа — имя колеса в Bluetooth-эфире всегда, а у колёс InMotion, возможно, и серийный номер колеса, — а вместе с ним уходят модель вашего телефона, версия iOS и версия приложения. CSV-записи поездок и координаты в дамп не попадают — но сырая телеметрия за те минуты, что шёл захват, в нём есть.
- Ни аккаунтов, ни регистрации, ни рекламы, ни аналитики, ни сторонних SDK, ни рекламного идентификатора, ни покупок, ни подписок.
Что остаётся на телефоне
Всё, что приложение создаёт при обычной работе, пишется в его собственное хранилище на iPhone и там и остаётся.
- Записи поездок. По одному CSV-файлу на сессию в папке приложения Documents/EUC Logs, имя вида EUC_yyyy-MM-dd_HH-mm-ss.csv (год-месяц-день_часы-минуты-секунды); рядом с каждым — маленький файл сводки сессии (.stats.json). В файле 42 колонки: первая — дата и время строки с точностью до миллисекунды, ещё одна — GPS Speed, остальные 40 — телеметрия колеса: скорость, напряжение, токи, ШИМ, температуры, данные батарей и BMS, углы наклона, пробег и так далее. Колонок с широтой, долготой или треком в формате нет вообще.
- Сырые дампы. Появляются, только если вы сами включили «Сбор сырых данных»: hex-файлы в папке приложения Documents/EUC Raw. Файл заводится на колесо — переподключения к тому же колесу дописываются в тот же файл, чтобы одна поездка не рассыпалась на пачку файлов. Новый файл начинается, когда вы включаете тумблер, когда приложение запускается с уже включённым тумблером и когда вы подключаетесь к устройству с другим именем. Файл называется по колесу и по моменту начала записи, а файл, который ничего не поймал, удаляется, а не хранится. В каждой строке — время с точностью до миллисекунды, направление пакета (в колесо или из колеса), идентификатор Bluetooth-характеристики и байты пакета.
- Настройки. Пороги оповещений, раскладка плиток, режим опроса, режим GPS, профили отдельных колёс, список известных устройств, выбранный язык интерфейса и идентификатор последнего подключённого колеса — в обычном локальном хранилище настроек приложения.
Про список известных устройств скажу отдельно, потому что это неочевидно: в разделе «Мои колёса» показываются только те устройства, от которых реально приходила телеметрия, но технически идентификатор и имя любого устройства, к которому вы подключились, попадают в этот локальный список в настройках приложения. Список никуда не отправляется и удаляется вместе с приложением.
Всё перечисленное лежит в песочнице приложения. Ни я, ни кто-либо ещё этого не видит — пока вы сами куда-нибудь не отправите файл.
Геолокация
Да, приложение использует геолокацию. Этот раздел стоит прочитать целиком.
Что берётся. Одно число: мгновенная скорость, которую отдаёт система, умноженная на 3,6 и превращённая в км/ч. Больше ни одного поля из данных о местоположении код не трогает. Широта, долгота, высота и курс не читаются, не сохраняются, в CSV не пишутся и никуда не передаются. Приложение не хранит ни одной точки, не строит трек и не показывает карту.
Куда эта скорость попадает. В плитку «GPS» на дашборде и в одну колонку CSV — «GPS Speed». Это скорость, а не место: восстановить по ней маршрут нельзя. Отсчёт старше трёх секунд считается устаревшим — в этой строке ячейка остаётся пустой.
Какое разрешение запрашивается. «При использовании приложения» (When In Use). Разрешение «Всегда» приложение не просит — соответствующего ключа в нём просто нет.
Почему это работает в фоне. Приложение объявляет фоновый режим геопозиции и включает фоновые обновления местоположения. Иначе запись поездки прерывалась бы каждый раз, когда вы кладёте телефон в карман и гасите экран. Пока колесо на связи, iOS показывает индикатор использования геолокации; это нормально и ожидаемо и означает, что ваша позиция действительно опрашивается, пока приложение не на экране.
Выключить GPS внутри приложения нельзя. Пока колесо на связи, геолокация включена; на экране поиска она выключается, чтобы не тратить батарею. Демо-режим здесь считается живым колесом: виртуальное колесо идёт по тому же конвейеру, поэтому геолокация запускается и в нём, хотя её значение в демо не используется. Отдельного тумблера «выключить GPS» в настройках не существует. Полностью запретить геолокацию можно только системно: «Настройки» → «Конфиденциальность и безопасность» → «Службы геолокации» → EUC Logger. Если запретить или отозвать разрешение, всё остальное продолжит работать, а плитка «GPS» и колонка «GPS Speed» просто останутся пустыми.
Режимы GPS меняют точность, а не состав данных. «Стандартный» — лучшая точность с фильтром 5 м; «Турбо» — навигационная точность без фильтра; «Умный» переходит в турбо, когда колесо едет быстрее 2 км/ч, и возвращается в стандартный после десяти секунд стояния. Режим настраивается для каждого колеса отдельно и влияет только на точность. В любом режиме берётся скорость и только скорость.
Bluetooth и работа в фоне
Bluetooth — это то, ради чего приложение и существует: найти колесо, подключиться к нему и читать телеметрию. Для определения вашего местоположения он не используется никогда.
О списке поиска — честно. Скан идёт без фильтра: приложение просит у iOS все Bluetooth-устройства, которые вещают поблизости, потому что прошивки некоторых колёс не кладут свой сервис в рекламный пакет. То есть приложение действительно видит все BLE-устройства вокруг вас: наушники, метки, часы, что угодно ещё. Строки, похожие на колёса, помечаются как колёса, а всё остальное показывается в отдельном разделе «Другие устройства рядом» — но это подсказка, а не фильтр: нажать можно на любую строку в любом из разделов, и приложение по-настоящему подключится к этому устройству, потому что протокол опознаётся только после подключения. А колесо, которое только что отключилось, но ещё показано в списке, приложение коротко подключает заново — проверить, не выключено ли оно. Сам список живёт только на экране: кроме записи в списке известных устройств, описанной выше, он нигде не сохраняется и никуда не отправляется.
Что приложение пишет в колесо. Колёса InMotion отвечают только когда их спрашивают, поэтому им уходят запросы телеметрии, в том числе запрос информационного кадра колеса. Begode- и Veteran-совместимые колёса вещают сами и не получают вообще ничего. Колёсам InMotion при подключении уходит ещё и рукопожатие — официальное приложение делает то же самое. Кроме этого рукопожатия и запросов на чтение приложение не посылает ничего и настройки колеса не меняет никогда.
Заявлены три фоновых режима, и вот зачем каждый:
- Bluetooth — чтобы телеметрия продолжала приходить, а запись — идти с погашенным экраном;
- звук — чтобы оповещения по ШИМ, скорости, наклону и потере связи были слышны, когда телефон в кармане (сигнал приглушает вашу музыку, а не останавливает её);
- геопозиция — чтобы скорость по GPS продолжала считаться в фоновой поездке, как описано выше.
Пуш-уведомлений, синхронизации с iCloud и общих с другими приложениями хранилищ в приложении нет.
Отправка дампа протокола мне
Это единственное место во всём приложении, откуда данные уходят в интернет. Разбираем его целиком.
Как это запускается. Само по себе не происходит ничего. Должны совпасть два условия: вы сами включили тумблер «Сбор сырых данных» за шестерёнкой на экране поиска (по умолчанию он выключен и переживает перезапуск, потому что рассчитан на работу в поле), а потом заполнили форму отправки и нажали кнопку. Одно нажатие «Отправить» отправляет разом все ещё не отправленные дампы — их список показан в форме прямо над кнопкой, включая записи с других колёс. Без этого нажатия не уходит ничего. Ни отправки по расписанию, ни фоновых повторов, ни тихой передачи: ни при запуске, ни по таймеру, ни при подключении к Wi-Fi. Уже отправленные файлы приложение к отправке больше не предлагает. Пока идёт захват, приложение подписывается на все уведомляющие характеристики устройства, включая незнакомые, — весь смысл в том, чтобы поймать поток целиком.
Куда уходит. Один POST-запрос на мой сервер по адресу euclogger.vercel.app/api/dump. Это единственный сетевой запрос, который приложение может сделать: другого кода, открывающего соединение, в нём нет.
Что уходит вместе с ним — полный список:
- случайный идентификатор посылки;
- версия приложения и номер сборки;
- код модели вашего телефона в том виде, в каком его отдаёт система (например, iPhone17,1);
- версия iOS;
- имя колеса в Bluetooth-эфире (у InMotion оно выглядит как P6-E0049407 и уникально для конкретного колеса);
- модель колеса и номинал батареи, которые вы вписали в форму, и идентификатор опознанного протокола;
- имя файла дампа (оно построено из имени колеса в эфире), число пойманных пакетов, размер файла и отметка о том, обрезан ли он;
- ваш текстовый комментарий из формы;
- сам дамп — hex-лог обмена по Bluetooth, сжатый и закодированный в base64. Длинный дамп обрезается, чтобы посылка осталась в пределах примерно 3,5 МБ, и помечается как обрезанная.
Что вместе с ним не уходит. Ваши CSV-записи поездок и их сводки не отправляются никогда: отправитель читает файлы только из папки EUC Raw, а сессии лежат в отдельной папке, которой сетевой код не касается вообще. Координаты не отправляются, потому что они и не читаются. Остальные настройки — пороги оповещений, раскладка дашборда, список известных устройств, режимы GPS и опроса — не отправляются: наружу уходят только те два поля, модель и номинальное напряжение батареи, которые вы сами вписали в форму. Больше ничего из телефона не отправляется.
Что лежит внутри самого дампа. Это сырой поток кадров вашего колеса — та же телеметрия, что и в логе поездки, только необработанная: скорость, напряжение, токи, ШИМ, температуры, пробег и всё остальное, что колесо сообщает за те минуты, что шла запись. Если вы ехали, пока шла запись, эта поездка в дампе есть.
В нём есть идентификаторы железа. Имя колеса в Bluetooth-эфире — всегда. У колёс InMotion в дампе может оказаться и серийный номер колеса: декодер запрашивает у колеса информационный кадр, в этом кадре лежит серийник, а логгер захвата пишет на диск каждый входящий кадр. Само приложение серийный номер нигде не показывает и не пишет ни в CSV, ни в настройки — сырой дамп и есть единственное место на диске, где он может оказаться, и если вы этот дамп отправите, серийник уйдёт вместе с ним.
Зачем это вообще нужно. По дампам разбираются протоколы колёс и добавляется поддержка новых моделей: проверить колесо, которого у меня нет в руках, больше нечем. Смотрю дампы я один.
Если это больше, чем вы готовы отдать, — не отправляйте дамп. Файлом можно поделиться самому, можно оставить его себе, можно удалить: на работу приложения это не влияет никак.
Что записывает сервер при получении
Вместе с дампом на приёме сохраняются три вещи, которых приложение не отправляет, и о них честнее сказать сразу:
- код страны, который хостинг определяет по IP-адресу запроса, — две буквы, а не город, не адрес и не сам IP;
- строка User-Agent запроса (техническая строка о клиенте и системе);
- время получения по часам сервера.
В той же серверной записи лежит то, что и так пришло из приложения: размер дампа в сжатом виде, размер в распакованном, число строк в нём и ссылка на сохранённый файл. Это весь состав серверной записи — других полей в ней нет.
Сам IP-адрес мой код не сохраняет. Но площадке, на которой работает сервер, он виден и попадает в её собственные служебные логи — ровно так же, как при заходе на любой сайт.
Всё это нужно мне только чтобы разбираться с входящими дампами: какие колёса где используются и пришла ли посылка с живого устройства или из чьего-то скрипта. Третьим лицам я эти данные не передаю.
Где лежат отправленные дампы
Отправленный дамп и JSON с перечисленными выше метаданными кладутся в облачное файловое хранилище, и его защиту я лучше опишу точно, чем красиво: хранилище публичное, и единственное, что стоит между файлом и открытым интернетом, — длинный случайный кусок в его адресе. Ни приватного режима, ни пароля на самом файле, ни срока годности у ссылки нет. Угадать адрес практически невозможно, и я его нигде не публикую, — но замком служит именно адрес, и у любого, кто получит эту ссылку, файл откроется. Называть такое хранилище приватным было бы неправдой. Список загруженных дампов — отдельная страница под паролем, и вижу её только я.
Удаления по расписанию нет. Дампы лежат, пока полезны для разбора протокола, и существуют ровно для одного: добавить или починить поддержку моделей колёс. Их не продают, не отдают рекламодателям и не скармливают никакой аналитике. Единственная сторона, кроме меня, которая физически прикасается к файлам, — хостинг, на котором работают сервер и хранилище. Если дамп помог описать протокол публично, публикуется разобранная раскладка полей, а не ваш файл.
Если хотите, чтобы отправленный вами дамп удалили, — см. раздел «Удаление данных» ниже.
Чего в приложении нет
- Нет аккаунтов. Ни регистрации, ни входа, ни почты, ни имени, ни телефона, ни профиля. Приложение вообще не спрашивает, кто вы. Почту вы сообщаете, только если сами решите мне написать.
- Нет покупок и подписок. Приложение бесплатное, и внутри него нечего покупать.
- Нет рекламы, аналитики и трекинговых SDK. В коде нет ни Firebase, ни Crashlytics, ни Sentry, ни Amplitude, ни AppsFlyer, ни Mixpanel и ничего похожего, нет рекламного идентификатора (IDFA) и нет запроса App Tracking Transparency — потому что следить за вами попросту нечем. Приложение не ходит за вами по другим приложениям и сайтам.
- Нет вообще никаких сторонних зависимостей. Ни Swift-пакетов, ни CocoaPods, ни Carthage — приложение собрано только на системных фреймворках Apple.
- Нет и моей собственной телеметрии. Приложение ничего не считает, не отправляет никаких событий и никуда не «звонит домой». Ручная отправка дампа, описанная выше, — единственный сетевой трафик, который оно может создать.
Одну вещь за пределами приложения стоит назвать, чтобы она не стала сюрпризом. Цифры загрузок из App Store Apple показывает мне всегда — это статистика магазина, и она не зависит ни от каких ваших настроек. А обезличенные отчёты о сбоях и статистика использования доходят до меня, только если у вас включено «Делиться с разработчиками» в настройках конфиденциальности iPhone. И то и другое происходит на стороне Apple, мимо кода приложения, и телеметрии вашего колеса там нет.
Как забрать свои данные
Записи уходят с телефона, только когда вы сами их куда-нибудь отправляете, через стандартное меню iOS «Поделиться» — AirDrop, почта, мессенджер, «Файлы», что выберете. CSV сессии отдаётся свайпом по её строке или кнопкой в карточке записи; сырые дампы — точно так же. Если поделиться активной записью, отдаётся мгновенный снимок файла, а оригинал продолжает писаться. Дальше файл лежит там, куда вы его отправили: приложение об этом никуда не сообщает и копию передачи себе не оставляет.
Папка приложения не видна в системном приложении «Файлы». Ключи, которые открыли бы её, в проекте не выставлены, поэтому дойти до записи через «Файлы» и скопировать её оттуда нельзя — «Поделиться» изнутри приложения и есть единственный путь наружу.
И то, что легко упустить: само приложение никуда ничего не копирует — ни своей синхронизации, ни резервных копий на сервере, ни выгрузки, которая случалась бы сама. Единственная копия, которая может существовать, — та, что делает сама iOS: папки приложения входят в обычную резервную копию iPhone, так что при включённом бэкапе в iCloud они сохраняются и восстанавливаются вместе с телефоном. Если бэкап выключен, а приложение удалено или телефон потерян — вместе с ним ушли и накопленные за годы поездки. Если поездка вам дорога, выгрузите её себе, пока она есть.
Доступа к вашим фотографиям, камере, микрофону, контактам, календарю и вашим файлам у приложения нет, и таких разрешений оно не запрашивает: единственные два запроса, которые оно вообще может показать, — Bluetooth и геопозиция. Импорта в нём тоже нет, так что оно никогда не читает файлы, которые создало не само.
Удаление данных
На телефоне. Отдельная поездка удаляется так: свайп по строке сессии во вкладке «Аналитика» открывает кнопку «Удалить», и она срабатывает сразу, без диалога подтверждения. Полным свайпом запись не удалить — это отключено намеренно, потому что телеметрию поездки не восстановить. Сырые дампы удаляются кнопкой «Удалить дампы» на экране поиска, и она стирает все накопленные файлы разом. Удаление приложения забирает всё сразу: записи, дампы и настройки. В других местах остаётся только то, что попало в резервную копию iPhone: если бэкап в iCloud был включён, записи лежат в нём и вернутся при восстановлении. Если был выключен — восстанавливать неоткуда.
Данные можно и вовсе не создавать: оставьте «Сбор сырых данных» выключенным (по умолчанию он и выключен) или выключите обратно — новые дампы писаться не будут. А без вашего нажатия на «Отправить» из приложения не уходит ничего.
Дамп, который вы уже отправили. Напишите мне, и я удалю его вместе с серверной записью. Найти нужный файл помогут имя колеса (то, что показано в приложении), примерное время отправки или текст комментария, который вы оставили в форме.
Почему политика изменилась
Что было не так в прошлой версии. В версии, действовавшей с 22 июля 2026 года, про ваши данные было написано три вещи: что приложение не использует геолокацию и что оно не отправляет данные ни на какие серверы — ни мне, ни кому-либо ещё. Про геолокацию это было неправдой уже в момент публикации: геолокация была в выпущенных сборках, в том числе в версии 1.1 (5), — с разрешением «при использовании» и работой в фоне. Про серверы фраза тогда была верна и перестала быть верной позже, когда появилась ручная отправка дампов протокола. Там же говорилось, что записи можно найти в приложении «Файлы», — их там не было никогда. Все три места исправлены в этом тексте.
Эта версия заменяет прошлую целиком и описывает то, что приложение делает сегодня. Написанное здесь относится к версиям, где на экране поиска есть раздел «Сбор сырых данных».
Если приложение снова изменится так, что это затронет что-то из перечисленного, я перепишу эту страницу и подвину дату вступления в силу наверху.
Контакты
EUC Logger делает один человек — Павел Демьянов, частное лицо. Компании за ним нет.
Вопросы по конфиденциальности, просьбы удалить отправленный дамп, замечания к этому тексту — на почту greypax@gmail.com. Читаю всё, обычно отвечаю в течение пары дней.
И если приложение вдруг поведёт себя не так, как здесь написано, — напишите. Это важнее всего остального на этой странице.