Privacy
Your reading stays yours. Here is everything that leaves.
Sluka reads pages on your own computer. The dictionary sits in your browser, your vocabulary sits in your browser, and there is no account, no login and no server holding either. Some features do send things off the machine — a translation, a voice, a word check, a sync with your phone. Each one is below, with what it sends, when it sends it, who receives it, and how to switch it off.
Last updated 15 October 2026. Covers the Sluka browser extension, the Android app, and the website at sluka.app.
- What this covers, and who is behind it
- What stays on your computer
- Your name and email are inside your licence key
- Google Translate, which is on by default
- The AI check, with your own key
- Cloud voices, with your own key
- Dictionary and pronunciation downloads
- The scoreboard, if you join it
- Sync with your phone, and the network scan it does
- Counting what you listen to on the computer
- The Android app, and notification access
- Videos and subtitles
- Saved articles and dictionary links
- Bringing in the words you already know
- No analytics, no telemetry, no crash reporter
- The website
- Buying a licence
- Deleting your data
- Limited use of data
- Legal basis, your rights, and how to complain
Scope
What this covers, and who is behind it
Sluka is a browser extension that marks the words you do not know on whatever page you are reading, and an Android app that does the same thing with a browser wrapped around it. This policy covers both, the website at sluka.app, and what happens when you buy a licence.
It is made and sold by one person, a sole trader in Mölndal, Sweden, who is the data controller for everything described here. There is no company, no team with access, and nobody it reports to. The trader's name and address are on the terms page.
The Android app runs the same reading engine and keeps the same data on the phone. Everything below applies to it, with two differences: it contains a browser, so it fetches the pages you ask it to open, the way any browser does; and it counts listening minutes in other apps, which needs an Android permission of its own. That has a section of its own.
There is no account. Nothing asks you to register, there is no password to lose, and no profile of you exists anywhere because there is nowhere to keep one.
On your machine
What stays on your computer
The reader takes the text already on the page, splits it into words, and looks each one up in a dictionary held inside your browser. That lookup never touches the network. No page address and no browsing history is transmitted to the developer or to anyone else. Text from a page leaves the machine only through the features further down this page, and only the piece each one needs: a word, a sentence, a subtitle line.
Chrome will tell you, when you install it, that Sluka can read and change your data on all websites. That is accurate and unavoidable: an extension that marks the unknown words on whatever you are reading has to be allowed onto whatever you are reading. What it does with that access is read the text already in the page, match it against the dictionary in your browser, and colour the words. It has no code that collects page addresses or keeps page content.
Everything the product knows about you lives in your browser's own
storage: chrome.storage.local, and IndexedDB.
| What | Where it lives |
|---|---|
| Page text | Nowhere. It is matched against the dictionary in memory and then it is gone. |
| Words | Known and learning words, per language, with the meanings you saved, in chrome.storage.local |
| Statistics | Words read, listening minutes, reading history, same store |
| Settings | Same store, including any API keys you paste in for the AI check or a cloud voice |
| Dictionaries | IndexedDB, database reading-help |
| Books | The EPUB and PDF files you import, and articles you save, IndexedDB, database reading-help-books |
| Your own dictionaries | Dictionary files you add yourself, IndexedDB, database sluka-own-dicts. Not synced and not in backups |
| Video sound | For Karaoke mode and Anki clips: a copy of the sound YouTube's player has already loaded, held in memory (at most about ten minutes) and gone when the tab closes. A picked word's clip and picture wait in IndexedDB, database sluka-anki-media, until they are on their Anki card |
| Speech models | The ones Karaoke mode has downloaded, in their own IndexedDB store |
| Caches | Short Google Translate answers and translated subtitle lines (kept 30 days), pronunciation clips and cloud-voice audio, so the same thing is not fetched twice |
| Licence key | chrome.storage.local |
None of it is uploaded anywhere by default. There are two kinds of
backup file, and both are written to your own disk and stop there.
Export writes a file without your licence and without your API
keys, so it is safe to send to someone. Automatic backup
(Settings → Sync & backup) keeps a file up to date in a
folder you choose, or in Downloads/Sluka. That one
carries your licence, because it is what lets one purchase activate
your other devices, and your API keys only if you set a backup
passphrase, and then locked with it (AES-GCM, under a key stretched
from the passphrase), because a backup folder is the thing in this
product most likely to end up in cloud storage. Since the licence
carries your name and email address, as the next section explains,
treat an automatic backup the way you would treat the key itself.
Licence
Your name and email are inside your licence key
The licence is checked on your own device and nowhere else. It is a
short signed string; the extension verifies an ECDSA P-256 signature
against a public key compiled into it, in
extension/lib/licence.js. There is no activation call,
no periodic re-check, and nothing to phone home to. It works on a
plane, and it will keep working if the developer disappears.
The thing worth saying plainly: the licence payload contains the name and email address of whoever bought it. It is base64url, not encryption, so anyone holding your key can read those two fields. This is deliberate. A licence that gets passed around is traceable to the person who bought it, and that is the only enforcement the product has.
The licence leaves your device in exactly two cases, both of them things you do: syncing with your own phone, which copies it across so the phone is licensed too; and claiming a name on the scoreboard, which sends it once to prove the purchase. Otherwise nothing reads those two fields back and nothing reports them. But if you paste your key into a public forum, you are pasting your name and email address into a public forum. The same goes for an automatic backup file, which carries the licence inside it.
Google Translate
Google Translate, which is on by default
The bundled dictionaries do not know every word, and they know no sentences at all. For those, Sluka asks Google Translate. Of everything on this page this is the one that sends text you are reading without a separate press of a button, so it comes first.
- Words and selections
When you open a word the dictionary has no meaning for, or select a phrase or a sentence, the panel shows Google's translation straight away. That sends the word, phrase or sentence — up to 300 characters — and the codes of the two languages. Switch it off under Settings → Reading → Translate words the dictionary doesn't have, and it waits for the Translate button instead.
- Subtitle lines
When a video's site offers no translation of its subtitles, Google fills the translation line under them. That sends the subtitle lines in batches, a few minutes ahead of where you are in the video. Switch it off under Settings → SlukaCC → Subtitles → Translate with Google when the video has no translation.
- Sentences on Anki cards
Off unless you switch it on. With Settings → Anki → Sentence translation on, the sentence on each new card that has no translation of its own (a SlukaCC subtitle line brings one) is sent to Google when the card is made.
- Hearing a translation
The speaker button next to a translation sends that text to Google's text-to-speech, in pieces of up to 200 characters. Only when you press it.
All of these go to Google's public translation endpoint,
translate.googleapis.com. There is no key,
no account and no cookie in the request, so Google is not told who
you are beyond the IP address that asked. It does receive the text.
What Google does with it is covered by
Google's
privacy policy. Short answers and translated subtitle lines are
kept on your device for 30 days so the same text is not sent twice.
AI check
The AI check, with your own key
New coinages, slang and journalese are missing from every dictionary, and for those there is an optional check that asks an AI model whether the string is genuinely a word, and what it means. It is off until you switch it on and paste in an API key, and then it runs only when you press Ask AI (or its key).
You pick who answers: Google (Gemini), Anthropic (Claude), OpenAI or
DeepSeek. One request goes to the one you picked —
generativelanguage.googleapis.com,
api.anthropic.com, api.openai.com or
api.deepseek.com — and what in it comes from you is the
word you selected, up to 400 characters of the sentence it appeared
in, the name of the language you are reading, and the language the
answer should be written in. Not the page address, not the page, not
your vocabulary, not your licence. The rest is fixed text that is the
same for everybody: the model name and the instructions for how to
answer. Switch off Include the surrounding sentence under
Settings → AI check to send the word alone.
The request is authenticated with an API key you supply yourself. No key ships in the product, the developer never sees yours, and the usage is billed to your own account with that provider, whose own privacy policy covers what they do with the text: Google, Anthropic, OpenAI, DeepSeek.
Voices
Cloud voices, with your own key
Sluka speaks with your device's own voices out of the box, and those run locally. If you want better ones, you can set up a cloud voice under Settings → Voice: Google (Gemini or Cloud Text-to-Speech), Microsoft Azure, ElevenLabs or OpenAI, each with an API key you paste in. Until you do, none of them is contacted.
Once one is set up, the text to be spoken goes to that provider, up to 1,200 characters a request: the word you pressed the speaker on, its sentence, or the page itself when you use read aloud. The audio comes back and is kept on your device so the same line is not paid for twice. Setting a voice up also fetches that provider's list of voices and, for ElevenLabs, your plan's remaining allowance.
One request goes without a press. When a word panel opens and a cloud voice is set up, an empty request — no text and no key — goes to the provider's address first, so that the connection is already open if you press the speaker.
Downloads
Dictionary and pronunciation downloads
English definitions ship inside the app, so a fresh install never
needs the network to show a meaning. Definitions in other languages,
and recorded pronunciations, are files on a static host,
data.sluka.app, downloaded once and then kept locally.
What goes there: a short list of what exists (packs.json)
when the dashboard opens, and when the browser starts or you switch
language while your meanings are in a language other than English, so
a newer definitions file is noticed; an index of pronunciation clips
(tts.json) when Sluka checks whether any are available;
the definitions file itself once you pick a language for meanings
other than English, and again when a newer one comes out; and the
pronunciation clips once you accept their download. All plain GETs,
with no authentication, no cookie, no identifier and no user data in
them. The files are served from Cloudflare R2. Cloudflare, as the
host, sees the IP address that made the request, the way every web
server does.
Karaoke mode, which lights up each subtitle word as it is said, needs
a speech model for the video's language: 30 to 90 MB, from the same
host (data.sluka.app/v1/vosk/). It is downloaded the
first time you switch Karaoke mode on in that language, and kept.
Off by default. The model works inside your browser: it is given the
video's sound and the subtitle line, and says when each word starts.
Neither the sound nor the subtitles leave your computer for it.
Scoreboard
The scoreboard, if you join it
Progress → Scoreboard ranks licence holders who have chosen to be
on it by how much they read and listen. It is off until you pick a
name and switch sharing on, and it talks to one address,
scoreboard.sluka.app.
- Claiming a name
Sends your licence and the display name you picked, once per device (a second device gets the same name back). The server checks the licence with the same verifier the app uses, then drops it: only its 8-character serial is written down, next to your display name. Your name and email from the licence are not stored. From then on that device proves who it is with a pass the server issues instead of the licence. One name per licence, and it cannot be changed.
- Sharing
While sharing is on, the extension sends every 30 minutes (the phone app when you press Update), per language and per day: words read, seconds listened, and how many words you marked known and learning, in both ways of counting them; plus, per language, the same numbers all time (shown when someone clicks your name) and the time of your latest grade. Counts and times, nothing else. Not the words, not the pages, not the videos. Those numbers appear publicly next to your display name on sluka.app/scoreboard and in the app.
- Leaving
Switching sharing off takes your numbers off the board. To have the record deleted outright, write to [email protected].
The server keeps no IP addresses, no user agents and no log of who looked at what. Reading the board, in the app or on the website, sends nothing about you.
Sync
Sync with your phone, and the network scan it does
Sluka can copy your vocabulary and your books between your computer and your own phone, directly, over your own wifi. There is no cloud in the middle, which means there is also no address book: the computer has to go and find the phone.
The search starts when you open Settings → Sync & backup on a computer that is not yet paired, and pairing happens when the code shown there is entered on the phone. That search is a scan of your local network, and it is worth describing exactly, because software that sweeps your network is software you should be suspicious of.
- How many addresses
Sluka first asks the browser for this computer's own address on the local network, through WebRTC with no outside server involved, and tries the 254 addresses beside it. If the browser will not say, Sluka guesses: eight common private ranges, up to 254 addresses in each, roughly 2,000 in the worst case, stopping at the first answer. While the card stays open and nothing has answered, the sweep repeats every 20 seconds. Once paired, if the phone cannot be reached, the computer sweeps the 254 addresses of whatever network it is on at the time, at most once every two minutes, until the phone answers again.
- What it sends while looking
A connection attempt to port 8788 on each address. Where something is there, Sluka asks it over HTTP whether it is your phone, sending the pairing code, a random identifier for this install, and a name for this computer (“Windows computer” and the like, unless you renamed it), so the phone can show which computer is connected. Anything listening on that port receives that request; only a Sluka holding the same code answers it. No vocabulary, book or setting goes to an address until it has answered as your phone.
- What transfers, once paired
Your words and the meanings you saved, statistics, reading positions, listening history, goals, books and saved articles, your settings — including your API keys and your backup passphrase — and your licence. Straight from one device to the other, every 30 seconds while both are running. None of it passes through any server, and none of it leaves the local network.
The traffic is plain HTTP. It is authenticated by the pairing code, which is what stops anything else on the wifi from reading your vocabulary, but it is not encrypted. Treat it the way you would treat a printer on the same network: fine at home. Because a paired computer goes looking for the phone on any network it joins, there is no switch that pauses it: on hotel or café wifi, either accept that, or use Forget this phone under Settings → Sync & backup and pair again at home.
Listening
Counting what you listen to on the computer
Off by default. If you switch on Smart tracking under Settings → Watch & Listen, Sluka counts the minutes you spend listening in a browser tab in the language you are learning. To do that it looks at whichever tab is playing sound and reads what that page tells the browser about it: the title, artist and album, and the site's domain name (not the page address). Those are kept in your listening history, on your device and on a paired phone, so you can see what was counted. When it cannot tell which language something is in, it asks you with a notification. None of it is sent anywhere else.
Android
The Android app, and notification access
The app counts the minutes you spend listening in the language you are learning, so a podcast counts towards the same hours as a page. To do that it has to know what is playing, and Android will not tell an app what is playing unless that app holds notification access. There is no in-app prompt for it. It is off until you grant it by hand in Android's settings, it can be revoked there just as quietly, and the counting stops the moment it is.
Notification access lets an app read every notification on the phone,
which makes it the most invasive permission Sluka asks for and worth
being exact about. Sluka reads no notifications. The listener it
registers, SlukaNotificationListener, is an empty class
with no code in it to read one. It exists because Android's
MediaSessionManager will not hand the active media
sessions to an app that is not already trusted with the notification
shade, so the permission is the gate and the media session is what is
actually read: the package name of the app that is playing, the track
title, artist and album, and whether it is playing or paused.
Those go into the same local store as everything else on this page, so the Listening tab can show what was counted and against which language. None of it is uploaded.
The app keeps a notification of its own while it counts. Android requires a foreground service to say so, and the same service hosts the sync server. It is started again after a reboot, because a service that dies overnight counts nothing the next day and says nothing about it.
Video
Videos and subtitles
Sluka marks words in subtitles as well as in text, and can show its own subtitles over a video. To do that it needs the subtitle text, and every request for it goes to the site you are watching, or to the servers that site already uses for its own subtitles. Nothing about any of it is sent to the developer.
- YouTube
A small script inside YouTube's own page keeps a copy of the caption text the player has already downloaded and hands it to the extension. When there is no copy to hand, Sluka fetches the caption track itself from YouTube, at the address YouTube's player made for the video you opened, with your YouTube cookies the way the player itself would. For automatic captions it may also ask YouTube's own servers for the video's caption list the way YouTube's phone app does, with no cookies.
The same kind of script keeps a short copy of the sound the player has already loaded (about a minute, or about twelve once Karaoke mode or Anki clips are in use), for Karaoke mode and for a picked word's audio clip. It is held in your browser's memory and fetches nothing of its own.
- Word counts on YouTube pages
Sluka can show, on thumbnails and beside the video you are watching, how many of a video's words you know. Off by default; switch them on under Settings → Watch & Listen (Word counts on YouTube thumbnails and Word counts beside the like button). To count, it asks YouTube's own servers for the captions of the videos on the page, by video and playlist ID, identifying itself the way YouTube's phone app does and with no cookies, so the requests are not tied to your YouTube account.
- Netflix
The same copying of the subtitle files the player downloads, and where needed a direct fetch of those files from Netflix's own servers, with no cookies.
- Every other site
Subtitle files the page itself references, fetched with cookies only when they are on the page's own site. A public page cannot use this to reach addresses on your private network.
Nothing downloads video. There is no download path for media
in the code. The only media file Sluka ever makes is for an Anki
card, when you pick a word from SlukaCC's subtitles on YouTube: the
sound of that subtitle line (at most 30 seconds) and one still of the
picture, made in your browser from what the player already loaded,
and handed to the Anki on your computer
(127.0.0.1:8765). From there it goes wherever Anki
sends it, AnkiWeb included if you sync Anki. Copy-protected video
(Netflix, Disney+) gives neither. The extension does declare Chrome's
downloads permission, and it is used for exactly one
thing: writing your own backup into Downloads/Sluka.
Two small things
Saved articles and dictionary links
An article you save to read later keeps its text on your device, but its pictures stay where they were: opening it loads them from the original site, as the original page would.
The word panel has links to outside dictionaries — Wiktionary, WordReference, MDBG, Jisho, Naver and others, plus any you add yourself. Clicking one opens that site in a new window with the word in its address. Nothing is sent until you click.
Imports
Bringing in the words you already know
A word list you import from a file is read on your device and kept there. Nothing in it is sent anywhere.
On a computer you can also bring in your known words from a language-learning site you are signed in to. Only when you press that button, Sluka opens the site in a tab, or uses one you have open, and reads your own list of known words there, with the same kind of request the site's own pages make and under your own sign-in. Sluka never sees your password or your sign-in. The list is kept on your device and sent to no one, us included. If the site refuses, Sluka stops there and asks nothing more.
No telemetry
No analytics, no telemetry, no crash reporter
There is no usage tracking of any kind. No Google Analytics, no tag
manager, no Sentry or other crash reporter, no Mixpanel, no PostHog,
no sendBeacon, no ping-on-install, no version check, no
experiment framework, no advertising identifier. A search of the
extension source for every one of those names returns nothing.
The sections above are the whole list. Every remote address in the
extension belongs to one of them: Google Translate, YouTube's and
Netflix's servers, the four AI providers, the five voice providers, data.sluka.app,
scoreboard.sluka.app, and the sites whose
subtitles you are reading. There is no setting to opt out of data
collection because there is no data collection to opt out of; what
there is, is a switch for each feature above.
The website
The website
sluka.app is a static site on Cloudflare Pages. It sets no cookies of its own, runs no analytics, and loads no third-party fonts, and no third-party script until you open the demo's Video tab. Cloudflare serves the files and sees the IP address of each request, as any web host does.
Two third parties can be contacted. The Video tab of the demo plays
a YouTube video, so opening it loads YouTube's player from
youtube-nocookie.com and YouTube's own script, under
Google's
privacy policy. And the demo on the
front page shows a real news article, it loads when the page does, and
the photographs in it come straight from the news site's own image host
— rainews.it or bbci.co.uk — rather than
being copied through sluka.app. That host sees the IP address that
asked for the picture. The request carries no referrer, because the
demo sets referrerPolicy="no-referrer", so it is not told
which page the picture was shown on.
The front page runs the real reader on a real news article, and that
needs one server-side endpoint, /api/article. A browser
will not let a page fetch another site's article, so a small worker
does it instead: it requests today's article from a fixed RSS feed and
returns the text as JSON. If you paste an address into the demo, that
address is sent to the endpoint, which fetches that page and returns
its text the same way. Results are cached at the edge for ten minutes.
Nothing is stored, and no record of who asked for what is kept. The
scoreboard page reads the public board from
scoreboard.sluka.app and sends nothing about you.
The demo keeps the words you grade while playing with it in your own
browser's localStorage, under the key
sluka-demo, so that a reload does not throw them away.
Clearing site data for sluka.app removes it.
Purchases
Buying a licence
Polar Software, Inc. is the merchant of record. They take the payment, handle VAT, and receive your name, email address and payment details. Their handling of that is covered by Polar's privacy policy. Card details never reach the developer and never touch any system described on this page.
What does reach the developer is your name and email address, because they are what the licence is made out to. A Cloudflare Worker mints the key from the sale, signs it, and shows it to you on screen. It stores nothing: no database, no bucket, no log of buyers. Every licence is a pure function of the sale, so “I have lost my key” is answered by asking Polar who bought what and doing the arithmetic again, rather than by looking it up.
The “lost your key” link on the front page takes you off
sluka.app to the licence worker at
sluka-licence.o-oster01.workers.dev, which is where the
form lives. You give it the address you bought with; that address goes
to Polar to find the purchase, the key is emailed to it, and it is not
kept afterwards. The answer on screen is the same whether or not that
address ever bought anything, so the form cannot be used to ask whether
somebody is a customer.
[email protected] is the address to write to, and a person reads it. Mail for the domain is hosted by Migadu, who see what any mail host sees: the message, the addresses on it, and when it arrived. Support correspondence is kept for as long as it is useful to keep, which for a refund or a bug report means until the matter is closed and a reasonable while after.
Licence emails are sent from [email protected] through
Resend, which sees the recipient address and the message. That address
only sends. Replies to it arrive nowhere, which is why the emails
themselves say to write to [email protected] instead.
Deletion
Deleting your data
There is no server holding your reading data.
- Everything the extension knows. Remove the extension from Chrome. Its local storage and all its IndexedDB databases go with it. Backup files you made, exported or automatic, are ordinary files on your disk and stay until you delete them. Export a backup first if you want to keep your words.
- Settings only. Settings → Your data → Reset settings, in the dashboard. Your words and statistics are untouched.
- The Android app. Uninstall it, or clear its app data. A paired phone holds its own copy of what was synced, so do both if you want both gone.
- The scoreboard. Switch sharing off to leave the board, and write to [email protected] to have the record deleted.
- The demo on the website. Clear site data for sluka.app.
- What you sent to an AI or voice provider. It went to your own account there, under your own key, so delete it there.
- What you sent to Google Translate. It was sent without an account, so there is nothing of yours to delete on Sluka's side; Google's privacy policy covers what they keep.
- The purchase record. That one is not in your hands: it is held by Polar as merchant of record, and there are accounting rules about how long a sale has to be kept. Write to [email protected] and it will be passed on, or take it to Polar directly.
Uninstalling also ends any sync, since the pairing code was only ever on the two devices.
Chrome Web Store
Limited use of data
Sluka's use of information received from Google APIs and from the browser adheres to the Chrome Web Store User Data Policy, including the Limited Use requirements. Data handled by Sluka is used only to provide the reading features you have switched on. It is not sold, not transferred to third parties for any unrelated purpose, not used for advertising or credit assessment, and not used to build any profile of you.
Each third party named on this page receives something for one stated job, and only the job you used: Google translates and, with your key, checks a word or speaks it; Anthropic, OpenAI and DeepSeek check a word with your key; Microsoft, ElevenLabs and OpenAI speak with your key; YouTube and Netflix serve the subtitles of what you are watching; Cloudflare hosts files; Polar takes a payment. Migadu and Resend carry email, and the news site's image host serves a photograph to the demo; those belong to the website, not the extension.
Legal
Legal basis, your rights, and how to complain
The controller is Oskar Öster, a sole trader established in Mölndal, Sweden, so the GDPR applies. The personal data the developer actually processes is short: your name and email address from a purchase, which are needed to issue the licence; whatever you choose to put in an email; and, if you join the scoreboard, its record of your licence serial, display name and daily counts. The first is processed to perform the contract you entered into by buying; the second on the legitimate interest of answering people who write in; the third on your consent, which you withdraw by switching sharing off.
Everything else described on this page is processed on your own device, by software you are running, or sent by it straight to a service you chose, and never reaches the developer at all.
You have the usual rights over the data that is held: to see it, to have it corrected, to have it erased where the law does not require it to be kept, and to have a copy. Write to [email protected]. If the answer is unsatisfactory, you can complain to the Swedish data protection authority, Integritetsskyddsmyndigheten (IMY).
There is no data warehouse and no international transfer arrangement of the developer's own. The services named above each operate under their own terms, and each is linked or named so you can go and read them.
If this policy changes, the date at the top of the page changes with it. A change that affects what leaves your machine will also be in the release notes, because a privacy policy nobody is told about is not a disclosure.