Sluka

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.

  1. What this covers, and who is behind it
  2. What stays on your computer
  3. Your name and email are inside your licence key
  4. Google Translate, which is on by default
  5. The AI check, with your own key
  6. Cloud voices, with your own key
  7. Dictionary and pronunciation downloads
  8. The scoreboard, if you join it
  9. Sync with your phone, and the network scan it does
  10. Counting what you listen to on the computer
  11. The Android app, and notification access
  12. Videos and subtitles
  13. Saved articles and dictionary links
  14. Bringing in the words you already know
  15. No analytics, no telemetry, no crash reporter
  16. The website
  17. Buying a licence
  18. Email
  19. Deleting your data
  20. Limited use of data
  21. 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.

WhatWhere it lives
Page textNowhere. It is matched against the dictionary in memory and then it is gone.
WordsKnown and learning words, per language, with the meanings you saved, in chrome.storage.local
StatisticsWords read, listening minutes, reading history, same store
SettingsSame store, including any API keys you paste in for the AI check or a cloud voice
DictionariesIndexedDB, database reading-help
BooksThe EPUB and PDF files you import, and articles you save, IndexedDB, database reading-help-books
Your own dictionariesDictionary files you add yourself, IndexedDB, database sluka-own-dicts. Not synced and not in backups
Video soundFor 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 modelsThe ones Karaoke mode has downloaded, in their own IndexedDB store
CachesShort 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 keychrome.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

Email

[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.