Privacy Policy

Joshi · version 1.5.1 · last updated October 14, 2026

Joshi is an app for practicing Japanese particles. All of the learning — levels, practice and progress — happens on your device and works offline. The optional “Sentences” tab uses AI help. Version 1.5.1 adds voluntary anonymous usage statistics, off by default. This policy describes the app in version 1.5.1.

No account and no advertising. AI help sends the sentence you type and the answer language; the server does not store its text. Anonymous usage statistics send only categories, number ranges and flags, after your consent. Sentence lists, results and full progress stay on your device.

Your account

There is none. The app does not ask for an email address, does not create a profile, and does not sign you in anywhere. Installing and using it requires no personal details.

Where your study data goes

Your progress, answer history, day streak and settings are stored on your device only. Your full history and progress records are not sent to the server; with your consent, we send only the anonymous summaries described below. If you export a backup (Settings → Data → Export progress), the resulting file is yours — it is written wherever you choose to save it, and the app does not upload it.

What you type in the “Sentences” tab, and the answer that comes back, do not feed your progress or your reviews. The app keeps your sentences and their latest results in that tab, separately for each of the two modes — on your device only, in a separate file that it never sends anywhere and that is not part of the progress export. You delete them in the “Sentences” tab, one at a time or all at once; they also go when you delete the app. “Reset all progress” in Settings does not touch these lists — the two are separate things.

You can add a sentence from a result as an example to a particle role — it then appears under “Your examples” on that role's page. These examples also stay on your device only, in a separate file that is not part of the progress export and is deleted neither by “Reset all progress” nor by deleting sentences from the list. You remove them on the role's page.

You can also scan a sentence from a photo (with the camera or from your photo library) — from a page, subtitles or a speech bubble, for example. The text is recognized on the phone; the photo is never saved or sent anywhere — only the text you pick and correct goes into the field, and it reaches the server only when you tap Explain the particles or Check my particles. The app asks for camera access the first time you take a photo; the photo library opens through the system picker, which gives the app only the photo you choose.

Data shared with the developer's other apps

Joshi belongs to a family of Japanese-learning apps. If you have more than one of them installed, the home screen shows a Your Japanese section with one row per app.

Here is how that works: Joshi writes a small card file on your device, in an area shared by the apps in this family. The card carries five things about your studying: how much of the material you have mastered, how many days your streak runs, how many sessions you have done, one sentence about your weakest spot (in Polish and in English), and whether today's goal is already met. The field for your next reviews is always left empty by Joshi, because it does not schedule reviews by date. Plus three technical ones: which app wrote the file, in what format, and when. Nothing else. There is no answer history, no list of the roles you practiced and nothing you type in the “Sentences” tab, and your progress cannot be reconstructed from this file.

The file never leaves your device, and it is read only by the other apps in this family that you have installed on that same device. Nothing syncs between devices.

Two things worth saying plainly. First, the shared area survives uninstalling a single app — the file goes only once you remove every app in the family from the device. Second, “Reset all progress” deletes this file too, along with the rest of your progress.

Reminders

The evening reminder about today's goal is optional, off by default and entirely local. If you turn it on, iOS schedules the notification on the device; nothing is sent anywhere and no server is involved. With consent to statistics, only a flag indicating enabled reminders is sent. If you decline the notification permission, the rest of the app works exactly the same.

Tracking and advertising

None. There is no third-party analytics SDK, no advertising SDK, no crash reporter and no advertising identifier (IDFA) in the app. It does not track you across other apps or websites, and it does not sell data. Usage statistics are processed on our own server; data for AI help is passed on as described below.

Network connections

The app connects to our server for AI help and, with consent, usage statistics. Traffic for purchases and restoring purchases is handled by iOS and the App Store. For AI help, the app connects only at these moments: when you open the “Sentences” tab, a sentence (new or from the list), the subscription screen or Settings (to show how many requests are left); when you tap Explain the particles or Check my particles, and straight afterwards, to refresh that number; when you tap Try again; and after you buy the subscription or restore purchases (so the server learns about the subscription). AI help connections do not run in the background or on a timer. With consent, statistics may send batches and retry failed uploads when the app enters the foreground or background. The text of a sentence is sent only when you tap Explain the particles or Check my particles — or Try again after a failed attempt. A sentence that already has a result in the same mode is not sent a second time: the app shows the saved result.

On a device that does not support Apple's App Attest, there is no “Sentences” tab and the app does not use online AI help. Voluntary usage statistics do not require App Attest.

Voluntary anonymous usage statistics

Measurement helps us find out whether studying is useful and where learners stop practicing. It is off by default and is not required to use the app. Only after your consent do we record events and send them to our server at api.jd-japanese.pl. Consent to statistics is separate from using AI help.

Events also include the cohort week (the week of first consent), day since its start, interface language, app version and experiment variant at consent and currently, and a general entry category: fresh installation, restored progress or later consent. There is no installation, device or person identifier. Each event has its own random UUID solely to avoid counting it twice when delivery is retried. We collect no texts, answer history, content or role identifiers, email address, location, device model or iOS version. Statistical events contain no account token, App Attest identifiers, purchase identifiers or the purchase-attempt UUID described below. Statistics use no cookies and are not linked to AI help data on the server. An attempt is associated with a purchase only locally to confirm its origin; the purchase event sent still includes only its kind.

An IP address is necessary for the connection, but we do not record it in events or access logs. A separate abuse protection counter uses a keyed hash of the address; it is periodically removed after 24 hours of inactivity and is not linked to events. Offline, events wait on the device for at most 30 days, up to 500 events. The queue is excluded from backups and progress exports. Acknowledged events are removed from the queue. Raw events stay on the server for 400 days, then are replaced by anonymous daily sums without UUIDs. We do not use statistics for advertising, profiling or tracking across apps.

You can withdraw consent at any time in Settings → Privacy, using Send anonymous usage statistics. Turning it off cancels delivery, deletes the local queue and the current session record used for measurement, as well as local purchase-attempt records; it stops collection and future uploads. It does not remove a token already stored in an Apple transaction. Events already received may remain until retention ends: without an installation identifier we cannot locate a particular person's events and delete them on request. Declining consent, a lack of internet or a server outage does not change learning, progress or access to purchased features.

The “Sentences” tab — optional AI help

The “Sentences” tab is optional. Without it the app teaches and tracks progress exactly the same way. It has two modes: “Explain” — someone else's sentence, from a manga, subtitles or a photo for example, comes back with the role of each particle, named after a role from this app — and “Check mine” — your own sentence comes back with each particle marked right, wrong, or “works, but…”, with a short why and the particle to use.

When you tap Explain the particles or Check my particles, we send two things to our server at api.jd-japanese.pl: the sentence you typed (at most 120 characters) and the language the answer should come back in (Polish or English, following the interface language). The server passes them to a language model from OpenAI, and the answer comes back to the app. The AI request content does not include your progress, answer history or photo. Technical identifiers needed for this feature are described below; statistics do not use them.

We do not store the text of your sentence — it goes into no database and no log; nor do we store the model's answer. The database has no column that could hold either, and adding one breaks an automated test on the server. Our request to OpenAI asks it not to retain the response. The only exception is short-lived and never touches disk: a finished answer stays in the server's memory for two minutes, so that tapping the button twice on the same sentence does not count as two requests.

What we do keep, because the feature cannot work without it:

For a shorter time we keep technical billing and maintenance data: Apple transaction identifiers and request metrics (request number, feature name, model, status, token count, response time) — for 90 days. We do not store your IP address; for abuse protection the server keeps only a keyed hash of it, for 24 hours.

When it connects, the app also attaches a one-time DeviceCheck token issued by iOS. For Joshi the server does not use it and does not store it: the free sample here is not protected against reinstalls, so the token has nothing to guard.

None of this is linked to your name, email address or an account — because the app does not know them. We do not use any of it for tracking, profiling or advertising. There is no account to delete; if you want these records gone, write to me — the transaction identifier from your App Store purchase history is enough to locate them.

Purchases

The one-off Premium purchase and the AI Help subscription are handled entirely by Apple. Joshi never sees your payment details, card number or billing information. The app reads the state of your purchases from iOS. While the AI Help subscription is active, the app passes our server the full Apple-signed proof of that transaction (JWS), so the server can check the signature itself and grant the subscription's requests. If the transaction contains the purchase-attempt UUID described below, that UUID also reaches the server as part of the proof. Proof of the Premium transaction is not sent to the server. An anonymous purchase event includes only its kind, without a purchase-attempt UUID or transaction identifier.

Only while consent to statistics is enabled, the app creates a separate random UUID for each local purchase attempt and passes it to Apple as appAccountToken. Despite the field's name, it is not an account, person or installation identifier and is not shared across different attempts. The app keeps a local association to confirm that a received transaction originated from that purchase attempt. The UUID is not included in statistical events. Apple stores it in the transaction; it may also remain in subscription renewal transactions. Withdrawing consent deletes the local record and stops future measurement, but does not delete or change an Apple transaction or the token stored in it.

How Apple processes data is described in Apple's privacy policy.

Reporting a problem

The Suggest a feature and Report a problem buttons in Settings prepare an email you can read and edit before sending. Nothing is sent until you tap “Send” yourself. A problem report comes pre-filled with the app version, the build number, the iOS version and the device model identifier (e.g. iPhone16,1) — a name shared by millions of units, never a device identifier. You can delete those lines before sending. If you write, I will see your email address and your message; they are used only to reply.

Crash reports

The app collects no crash reports of its own. If you have Apple analytics sharing turned on in iOS settings, the system may pass an anonymous report to the developer — that happens outside the app and is governed by Apple's privacy settings.

Children

The app collects no data that could identify anyone, of any age: there is no account and it does not ask for a name, age or address. For the “Sentences” tab we keep the technical identifiers and counters described above; anonymous usage statistics are collected only with consent.

Changes

If this policy changes, the date at the top changes with it. The address of this page carries the app's version number, so older releases always point to the document that actually described them — releases before 1.5, which connect to no server at all, are described by the document at the address without a version number.

Contact

Privacy questions: joshi@jd-japanese.pl