Privacy Policy
- Application: Waycairn
- Document version: 1.0.0-draft
- Effective from: TO BE SET AT PUBLICATION
- Controller: HENRIQUE FARIA RIBEIRO DESENVOLVIMENTO DE SOFTWARE LTDA
- Trade name: HEFARI TI
- Company registration (CNPJ): 60.550.989/0001-39
- Data protection officer and contact: [email protected]
- Website: https://waycairn.com
This is a courtesy translation. The Portuguese version is authoritative; if the two disagree, the Portuguese text governs.
Summary
This app has no sign-up, no login and no server of ours that stores your data. Everything it records about your studying is stored on your own device.
The one exception is on our website, and only if you choose it: joining the launch list or the beta list stores the email address (and, for the beta, the devices and optional study goal) you type there, for that purpose only, and it is deleted after use. See Launch and beta lists.
The only thing that leaves the device is anonymous crash reports and usage counts —
for example, "a roadmap import failed with code json_syntax" — so we can find and fix
problems. They never include your roadmaps' content, topic names, quiz text, study
resources or the instruction you wrote, and they carry nothing that identifies you or your
device. You can switch them off at any time under Settings › Usage & crash reports,
and nothing is sent before the app has shown you that notice. The full detail is in
Anonymous diagnostics and usage statistics.
No advertising, no trackers, no third-party cookies, and nothing for us to sell or share.
That summary is not a substitute for the rest of the document. The four sections worth your attention are What the app stores on your device, Anonymous diagnostics and usage statistics, Third parties you can reach from the app (particularly AI assistants, where you are the one sending the text), and How to delete your data, which sets out exactly what each button does and what it does not.
What the app stores on your device
The app stores the following locally in order to work. None of it is transmitted; what does leave the device is described, in full, under Anonymous diagnostics and usage statistics.
About your study progress
- your per-topic self-assessment (a 0–10 rating you choose yourself);
- knowledge check results (how many questions you got right, out of how many) and the date of the last passing attempt;
- which topics you marked as "I already know this";
- how many hours you typed in as time spent on each topic;
- how many hours per week you said you have available;
- which questions you have already been shown, so they are not repeated.
About your study habit
- study time measured by the timer, grouped by calendar day;
- your study streak: the current count, your record, the list of credited days and the list of days covered by a "freeze";
- the timer session currently running, if any, including the time it started.
Those last two categories amount in practice to a record of which days you studied and for how long. It exists to draw the activity calendar and work out the streak, and it stays on your device.
About your preferences
- theme (light, dark, system), interface language, preferred start screen, whether you have seen the introduction;
- preferred study material formats (reading, video, practice, and so on);
- timer and sound settings;
- your streak rule and daily goal.
About your roadmaps
- the roadmaps you created or imported, in full: title, topics, descriptions, questions and resource links;
- the free-text instruction you wrote in Prompt Studio, when a roadmap was generated from it. That field stores literally what you typed — if you wrote something about yourself there, it is saved alongside the roadmap, on your device;
- the format preferences that roadmap's prompt asked for.
About the anonymous reports
- whether the anonymous reports are on or off;
- whether the notice about them has been shown to you;
- the day the app was installed (
installedOn) — recorded only for installations made from this version on; earlier installations are not given a backdated one; - which of the return milestones (first open, day 1, day 7, day 30) this device has already sent, so that each is sent only once.
The install day is never sent: it only lets the device itself tell whether one of those milestones is due.
An installation identifier
The first time the app opens, it generates a random identifier (a UUID) for that installation. It is random on purpose — not derived from anything about you or your hardware, precisely so that it cannot act as a fingerprint. It is not sent to anyone, not even in the anonymous reports. It exists because future device-to-device sync will need to tell one installation from another.
What the app does not store: name, email, phone number, address, date of birth, any government ID, payment details, contacts, location, photos, microphone, camera, calendar, the list of apps you have installed, or any advertising identifier.
Where that data lives
It depends on how you use the app:
| How you use it | Where the data lives |
|---|---|
| Browser (desktop or mobile) | The browser's local storage (localStorage), tied to the site |
| Desktop app (Windows, macOS, Linux) | JSON files in the app's data folder on your computer |
| Android app | The app's preferences store (SharedPreferences) |
| iOS app | The app's preferences store (NSUserDefaults) |
Two consequences we would rather state than leave out:
- On Android and iOS, app data is included in system backups. If you have device backup switched on (iCloud, Google), your progress is copied there along with the rest of the device. That backup is made by the operating system, under Apple's or Google's privacy policy, and we have neither access to it nor control over it.
- In a browser, this storage can be cleared by the browser itself. Mobile browsers discard site storage under disk pressure, and clearing your browsing data also clears your progress. Use the export described below if your data matters to you.
Anonymous diagnostics and usage statistics
To know whether the app works — whether it crashes on some device, where roadmap generation fails, whether people come back to it — it sends anonymous reports. This section lists everything they can contain. What is not here is not sent: the list below is the same list the app's code uses to discard anything else, and it is applied again before any data goes further.
Usage events
Each event is a name and, at most, the properties shown. Every property is a value from a closed list, a yes/no, or nothing — there is no free-text field.
| Event | When | Properties |
|---|---|---|
session_started |
once each time the app is opened | none |
first_open |
once only, on the install day | none |
retention_milestone |
once each, on the first open on or after day 1, day 7 and day 30 after installation | milestone: d1, d7 or d30 |
studio_viewed |
Prompt Studio was opened | none |
studio_prompt_copied |
the prompt was copied or downloaded | method: clipboard or download; ok: whether it worked |
studio_paste_submitted |
a reply was pasted back | outcome: empty, no_json, json_syntax or parsed; had_prompt: whether a prompt left the Studio first (never what it said) |
studio_fixup_copied |
the fix-up request was copied | code: the failure code; ok: whether it worked |
roadmap_import_declined |
you declined to import a roadmap | source: paste or file |
roadmap_import_failed |
an import failed | source; code: the failure code |
roadmap_import_succeeded |
an import worked | source; saved: whether it was saved; had_prompt |
onboarding_viewed |
the introduction was opened | replay: whether it was replayed from Settings |
onboarding_finished |
the introduction was finished | outcome: make_own, use_example or dismiss; replay |
The failure code is always an item from a fixed list written into the app itself —
one code per roadmap validation rule (for example, a topic with no title), plus
json_syntax, no_json, storage and unexpected. It says which rule failed, never
the content that made it fail.
Crash reports
When the app hits an error, the report contains only:
- the error's type, from a fixed list (for example,
TypeError); anything else becomesError; - a stable code, where there is one, from the same fixed list of codes (including failures to write to the device's storage);
- up to 20 positions in the app's own code — file, line, column and function name, from
the app's own
js/files only, with no full address or parameters; - where the error was caught (
window_error,unhandled_rejection,startuporcaught) and whether it was handled.
The error message is never sent. It is not filtered: it is simply never read, because error messages can quote text you pasted or the name of a topic. At most 25 reports are sent per app launch.
What travels with each report
- the platform:
web,desktop,androidorios; - the app version (for example,
1.4.2); - a random per-launch identifier, generated in memory when the app opens, never stored, and discarded when it closes. It only groups the events of one launch, and our relay (below) turns it into a different value for each vendor, so one vendor's data cannot be matched against the other's.
The first_open and retention_milestone events carry less still: only the platform
and the major version number (the 1 in 1.4.2), without the per-launch identifier, and
each one is given its own random identifier. So a return milestone cannot be linked to
anything else the app has sent.
To work out the share of launches without a crash, the start of each launch is also reported to the crash-reporting service, with the same platform and version.
What is never sent
Roadmap content, titles, topic names or ids, question and answer text, resources and links, the subject and the instruction you typed, error messages, your ratings, hours, streak or calendar, the installation identifier, the install day, language, time zone, device model, location and any advertising identifier.
Switching it on and off
The reports are on by default, and you are told so before anything is sent:
- on a new installation, the notice is part of the introduction, with a Turn off button;
- people who already used the app see a notice at the top of the screen, once, with Turn off and OK.
Nothing is sent before that notice has been shown — not even crash reports; a crash that happens before then is discarded. The notice only appears, and reports are only sent, when you use the installed app or the app on our website; a copy served from any other address sends nothing.
At any time, under Settings › Usage & crash reports, you can switch them on or off. Switching off takes effect straight away: nothing more is sent, and whatever had not been sent yet is discarded. Restoring a backup never switches the reports back on.
Where they go, and your IP address
The reports do not go straight to the vendors. They are sent to our own address (the
Website named at the top of this document, under the path /t/), hosted on Cloudflare,
which already acts as our processor for the access data described under When you use the
app through our website. There, a small
function of ours:
- applies the list above again and discards anything outside it;
- removes the IP address, the browser type, the referring page and every other piece of request information;
- rounds the time to the day (to the week, for return milestones);
- only then passes the report on to the matching vendor.
Neither vendor receives your IP address. Like any internet connection, sending a report exposes the IP to our address on Cloudflare for a moment, so that the reply can come back; we do not keep it or pass it on. That momentary processing rests on legitimate interest (LGPD art. 7, IX; GDPR art. 6(1)(f), for people in the European Union): our interest in finding and fixing failures and in knowing which steps work, met with as little data as possible and with the option to switch it off at any time.
Who receives the reports (processors)
| Vendor | What it receives | Region |
|---|---|---|
| Functional Software, Inc. (Sentry) | crash reports and the start of each launch | European Union (Frankfurt) |
| PostHog, Inc. | usage events | European Union (Frankfurt) |
Both act as processors, handling the data only for us and for the purpose above, under their data processing agreements (DPA). The data is kept for at most 90 days and then deleted. Each vendor uses sub-processors of its own, according to the lists it publishes.
International transfer
The reports are processed in the European Union. The transfer from Brazil to the European Union is covered by the ANPD's recognition of the European Union's adequacy (Resolução CD/ANPD nº 32/2026), and the European Union recognises Brazil's adequacy in Implementing Decision (EU) 2026/179. If a sub-processor of either vendor processes data outside the European Union, that follows the lists and agreements that vendor publishes.
Network connections the app makes
The app makes no requests to any third-party server. The requests it does make are:
- for files shipped inside it: the default roadmap (
roadmap.json) and the instruction document used to assemble the prompt (ROADMAP_GENERATOR_PROMPT.md); - to our own address (the Website named at the top of this document), only for the anonymous reports described above, and only while they are switched on.
This is not only a promise: the app enforces a Content Security Policy whose connect-src
allows only the app's own origin and that address of ours, which prevents its own code from
opening a connection to any other origin — the vendors' included. There are also no fonts,
images or scripts loaded from elsewhere.
Third parties you can reach from the app
Beyond the anonymous reports described above, the app sends no data to third parties, but it opens doors for you to go to them. The distinction matters, and it is this:
AI assistants (Prompt Studio)
Roadmap generation works like this:
- you describe the subject you want to study and, optionally, write a free-text instruction;
- the app assembles the prompt text on your device and hands it to you, in one of two ways: copied to the clipboard, or downloaded as a file;
- you open an AI assistant — via the shortcuts we offer, or any other route — and paste or attach that text there;
- you bring the reply back and paste it into the app, which validates it and saves it locally.
At step 3 you are the one transmitting the text, in your own name, to a service you chose. The app does not talk to any AI provider, holds no API key, does not act as an intermediary, and has no way of knowing what you pasted or what came back. What happens to that text is governed by the terms and privacy policy of that provider — including whether they may use the content to train models, which varies between services and between plans.
This is worth attention because the prompt contains the subject you want to study and the instruction you wrote. If that is sensitive for you, read the assistant's policy first.
The shortcuts currently offered lead to ChatGPT, Claude, Gemini and Microsoft Copilot. It is a short list of general-purpose assistants, not a recommendation or an endorsement; we have no commercial relationship with any of them and you can use any other.
Study resource links
A roadmap's topics carry links to books, videos, documentation and exercises. Those links are written by whoever generated or imported the roadmap — often an AI — and may point anywhere. We do not control them, do not vet them, and are not responsible for their content.
Two protections we do apply: every external link opens with rel="noopener noreferrer",
which stops the destination site learning which page you came from and stops it
interfering with the app's window; and the link's real host is displayed next to the
link text, so a label cannot hide where it goes.
App stores
If you installed the app from the App Store or Google Play, those stores collect their own data about the download and your device, under Apple's and Google's policies. That happens outside the app and we have no access to it.
Notifications
If you start a timer session, the app may ask permission to send notifications, used only by the study timer: on Android and iOS, a notification showing the session while it runs, and an announcement at each switch between focus and break. Permission is requested at that moment, not on first launch, and declining does not prevent you using the timer. Notifications are generated on the device itself; there is no push server and no notification originates from us.
The app also plays a short tone at a phase boundary, generated on the device.
When you use the app through our website
The website and the web version of the app are hosted on Cloudflare Pages, operated by Cloudflare, Inc. The same address receives the anonymous reports from every platform — web, desktop and mobile — as described under Anonymous diagnostics and usage statistics.
When you reach the app through a browser, via our website, the hosting provider automatically records technical access data — IP address, date and time, the page requested, browser type — in server logs. This is inherent to how the internet works and serves security, abuse prevention and fault diagnosis, on the basis of legitimate interest (LGPD art. 7, IX).
Those logs stay with Cloudflare, which acts as a processor for this purpose, under its data processing agreement. We have no access to individual visitors' IP addresses and receive no report that identifies a person.
Those logs are not used to build a profile, are not combined with your study progress — which stays on your device, inaccessible to the server — and are not shared for commercial purposes.
International transfer. Cloudflare runs a global network: your request is served by the server nearest you, which may be outside Brazil, and the access log is processed wherever the request was served. There is therefore an international transfer of that technical access data, covered by the contractual clauses and data processing agreement Cloudflare publishes (LGPD arts. 33–36). Beyond that access data, the anonymous reports and, only if you join one, the launch or beta list, nothing is transferred: your study progress never leaves your device.
If you download the desktop or mobile apps, the app connects to our address only to send the anonymous reports, which you can switch off.
Launch and beta lists
Our website has two optional forms. Nothing is collected unless you fill one in, tick the consent box and send it.
- Launch list: your email address, used for one purpose: a single message when the app becomes available.
- Beta list: your email address, the devices you would test on (Android, iPhone or iPad, Windows, macOS, Linux) and, only if you write one, what you would study first (up to 280 characters). Used to invite you to test pre-release versions and to talk to you about that test; the study goal helps us test roadmaps on real goals.
With either, we also record the page's language and the time you agreed. If you reached
our website through a link we shared that carries a short label (for example
waycairn.com/?ref=linkedin), we also record that label, so we know which places
people find us through. It describes the link, not you, and nothing is stored in your
browser to carry it. We do not record your IP address, your browser or device details,
or any cookie with the form.
Legal basis: your consent (LGPD art. 7, I), given by ticking the box. You can withdraw it at any time by writing to the contact address at the top of this document, and your entry is deleted.
Where it is kept: in a database in our Cloudflare account (Cloudflare D1), reachable only by us. Cloudflare acts as a processor under the same data processing agreement and international-transfer safeguards described in When you use the app through our website. The lists are not shared, sold or used for advertising, and are never combined with anything from the app, which has nothing of yours to combine them with.
Sending the launch message: we may use an email-sending service for that one message. If we do, it receives only the addresses on the launch list, only for that send, and the list is deleted there afterwards as well.
How long: the launch list is deleted once the launch message has been sent; the beta list is deleted when the beta ends. Signing up twice with the same address updates your entry instead of adding a second one.
Children
The app is intended for personal study and is not directed at children. Because it has no sign-up and the anonymous reports identify no one, there is no children's data we could associate with a person. If you are responsible for a minor who uses the app, all of the content stays on their device and can be deleted by you at any time, as described below, and the anonymous reports can be switched off under Settings › Usage & crash reports.
Your rights
Brazil's General Data Protection Law (Lei nº 13.709/2018, art. 18) gives you rights over your personal data: confirmation that processing exists, access, correction, anonymisation, blocking, deletion, portability, information about sharing, and withdrawal of consent.
The honest answer for most of them today is that there is nothing to exercise against us, because we do not have your data. We do not receive it, do not store it and cannot access anything the app records. We cannot send you a copy of your data because we do not hold it; we cannot delete it from our side because it was never there.
The anonymous reports we do receive cannot be matched to a person, by design: they carry no persistent identifier, no IP address and none of your content. That is why we cannot find, hand over or delete "your" reports — there is no way to tell which ones they are. What you can do is switch them off, which stops any future sending.
What you have instead is direct control:
- Access and portability: export everything to a file at any time — see below. The file is readable JSON, yours to keep or move to another device.
- Correction: every value is editable in the interface itself.
- Deletion: see How to delete your data.
- Objecting to the anonymous reports: switch them off under Settings › Usage & crash reports.
If you have any question about this policy, or want to exercise a right you believe applies, write to the address given under Contact at the end of this document. We will reply even where the reply is "we do not hold that data".
How to export your data
Under Settings › Your data › Export my data, the app downloads a JSON file containing your global document (preferences, streak, study days, installation identifier, your choice about the anonymous reports, whether the notice has been shown, the install day and which return milestones have been sent), the progress for all of your roadmaps, and the definitions of roadmaps you created or imported. The roadmap that ships with the app is left out, purely to avoid padding the backup with content that is not yours.
The same file can be imported again under Import my data.
How to delete your data
To erase everything: use Settings › Your data › Delete everything on this device. It removes every roadmap and its progress, your streak, your study time history, your preferences (including your choice about the anonymous reports), the installation identifier, the install day, the record of which return milestones were sent, the record that the notice was shown and the older-format records described at the end of this section — and returns the app to a freshly installed state, which includes showing the notice about the reports again. It asks for two confirmations and cannot be undone. If there is anything you might want back, export first.
There are also three narrower controls, for when you want to clear only part of it. They do exactly what their names say and nothing more:
| Control | What it deletes | What it does not delete |
|---|---|---|
| Your data › Reset this roadmap's progress | The self-assessment, check results and hours for every topic in the roadmap currently open, and its hours-per-week | Your streak, your study days, your preferences, and the progress of other roadmaps |
| Streak › Reset streak | The count, the record, credited days and freezes | The per-day study time log, which is separate data |
| Roadmaps › Delete roadmap | The selected roadmap and its progress | Any other roadmap; and it is unavailable for the roadmap that ships with the app |
If you would rather erase it from outside the app, the result is the same:
- Android or iOS app: uninstall the app, or use "Clear app data" in the system settings. That removes all local storage. Remember that a copy may exist in your device backup (iCloud or Google), which has to be deleted there.
- Desktop app: uninstall it and delete its data folder.
- Browser: clear site data (browsers call this "site data", "local storage" or "cookies and site data") for the app's address.
Deleting locally is deleting completely. Anonymous reports already sent cannot be linked to you or to this device, so there is no copy of "yours" on our side to ask us to erase; the vendors delete them within 90 days. Switching the reports off stops sending from that moment on.
One technical point we would rather declare: installations created before a change to the storage format may still contain a set of keys in the older format, holding self-assessments, check results and hours from that period. They were kept deliberately, as a way back if the format change caused problems. The three narrower controls in the table above do not remove them — "Delete everything on this device" and the outside-the-app steps do.
How long data is kept
As long as you want: the data is yours and stays on your device until you delete it.
Two exceptions, which exist so the record does not grow forever:
- the streak day history keeps the most recent 400 days; days older than that are discarded;
- the per-day study time history also keeps the most recent 400 days.
That discarding happens when the app writes the record, not on a clock — an app left unopened for two years still holds the old days until the next time it is used. And your streak record is a number that remains even after the days that produced it have been discarded.
The anonymous reports are kept by the vendors for at most 90 days.
The launch and beta lists are deleted after use: the launch list once the launch message has been sent, the beta list when the beta ends. See Launch and beta lists.
Security
Your study data does not travel, so there is no transmission of it to intercept. It is protected by your device's own mechanisms: on Android and iOS the app's storage is isolated from other apps by the operating system; in a browser, by origin separation. Anyone with unlocked access to your device or your browser profile has access to the data, so your screen lock and your computer password are part of the protection.
The anonymous reports always travel over HTTPS, with no cookies and no referring page, to our address, and from there to the vendors over HTTPS as well.
The app treats every imported or pasted roadmap as untrusted content: it asks for your
confirmation before accepting one, builds the screen without interpreting markup that came
from the content, accepts only http and https addresses in links, and shows each
link's real host next to its text.
We cannot promise absolute security for a device we do not administer.
Changes to this policy
This policy carries a version number. When it changes:
- wording fixes that do not change the meaning increment the patch version and are recorded in the repository history;
- material changes — in particular if a future version of the app begins transmitting, to us or to a third party, any data beyond what this policy describes — increment the major version, get a new effective date, and will be surfaced inside the app rather than only published here.
This policy describes the app as it works today: no account, no server of ours that stores your data, no sync, and the anonymous reports described above, plus, on the website and only if you sign up, the launch and beta lists. Features planned for the future (roadmap generation on our servers, encrypted sync between devices, a subscription) change what this policy has to say, and none of them will ship without it being revised first.
Contact
Questions about this policy or about privacy in the app: [email protected]