Streamline/Privacy
Privacy policy
Streamline changes how twitch.tv looks and behaves for you, in your browser. It has no backend. There is no Streamline server, no account, and no analytics.
Last updated 8 October 2026Applies to version 1.15.0 and later
The short version
Streamline does not collect, transmit, sell, or share your personal information. Everything it stores stays in your own browser profile. The only network requests it makes are to Twitch, to three public emote providers to fetch the emotes for a channel you are already watching, to YouTube and Kick for the chat and streams you asked to see from there, and, in Firefox only, to Mozilla for a translation language you chose to download. Chat translation itself happens on your computer.
What Streamline stores, and where
All of it lives in your browser's own extension storage (chrome.storage.sync and
chrome.storage.local). None of it is ever sent anywhere.
| Data | Why it exists | Where |
|---|---|---|
| Block, filter and favourite lists | Streamers, categories, title keywords, viewer thresholds and temporary hides. They are the feature. | sync + a local backup |
| Settings | Layout, theme, chat overlay position and size, keyboard preferences, which panels are hidden, and the YouTube and Kick rooms you linked to a Twitch channel. So the extension looks the way you left it. | sync + a local backup |
| Grid layouts and saved presets | So your multi-stream setup survives a restart. | sync |
| Watch time and session history | The stats screen, and the optional "take a break" nudge. | local only |
| Voice phrases it learned | When voice was not sure what you meant and you settled it, your words and the command they meant, so the same words run next time. Saying undo right after one runs forgets it. | local only |
| Words voice should know | Words you add in Settings, or correct with Fix words, so voice reads them your way. | sync |
| Translation language models | Firefox only: the files of each language you chose to download for chat translation, kept until you remove them in Settings. In Chrome, Edge, Brave and Opera the browser keeps its own language packs, and Streamline stores none. | local only |
| Rolling backups | A maximum of 10 snapshots, so a failed sync or an accidental "clear all" is recoverable. | local only |
If you have Chrome or Firefox profile sync switched on, the sync half is synchronised between
your own signed-in browsers by your browser vendor, under their privacy policy, not by
Streamline. The local half never leaves the device.
You can see, export and erase all of it except the learned voice phrases yourself from the extension's Backup tab. Uninstalling the extension deletes it.
Network requests Streamline makes
Streamline talks to the hosts below, all of them to fetch public data about a channel you are already viewing. The Twitch and emote requests carry no identifier for you: no account id, no device id, no cookies. The YouTube and Kick requests happen only for rooms you linked or added, for the YouTube or Kick stream you open the chat panel on, and for a YouTube or Kick stream you put in the multiview grid; see the notes in the table.
| Host | What is sent | Why |
|---|---|---|
*.twitch.tv |
Ordinary page and embed requests | Streamline runs on Twitch and mounts Twitch's own player and chat embeds |
irc-ws.chat.twitch.tv |
The channel names you asked to read, over an anonymous connection with a random
justinfan nickname
|
The merged multi-channel chat feed |
api.betterttv.net |
A channel's public Twitch numeric id | That channel's BetterTTV emotes |
7tv.io |
A channel's public Twitch numeric id | That channel's 7TV emotes |
api.ivr.fi |
A channel's public login name | Looks up that channel's public numeric id, only when it is not already known. Used as a fallback so the two lookups above can run |
www.youtube.com |
A linked or added room's handle, then that stream's video id. Your browser attaches the youtube.com cookies it already holds to the page requests, which is what gets past YouTube's consent page; Streamline never reads them. The chat poll itself is sent without cookies | Chat from a YouTube room you linked or added, in the merged feed and as a live chat column, and from a YouTube stream you open the chat panel on. On a past stream the panel shows the chat replay YouTube already plays beside the video, and asks for nothing more. A YouTube stream in the multiview grid uses the same lookup to find the video its cell plays in YouTube's own embedded player, and the channel's name, picture and viewer count for the cell's header |
kick.com |
A linked or added room's public name, the name of the channel whose page you opened the chat panel on, or the name of a Kick stream in the multiview grid, without cookies | Looks up that channel's public chatroom id, once; the answer is kept on your device. For a grid
cell, also the channel's name, picture, whether it is live and its viewer count. The cell plays
Kick's own embeddable player from player.kick.com |
ws-us2.pusher.com |
That public chatroom id, over an anonymous connection | Chat from a Kick room you linked or added, in the merged feed, and from a Kick stream you open the chat panel on |
web.kick.com |
A channel's public numeric id and a point in time in its recording, without cookies | The chat of a Kick recording you open the chat panel on, read from the same history Kick's own player reads, so it plays along with the video |
firefox-settings-attachments.cdn.mozilla.net |
Firefox only: requests for the model files of a language you chose to download, by file name. No chat text, and nothing about you or the page | Chat translation on Firefox, which has no built-in translator an extension can use. Mozilla publishes these models for Firefox's own translator |
Emote images are then loaded from those providers' CDNs the same way any image on a web page is loaded.
Chat translation, when you turn it on, runs on your computer and sends no chat text anywhere. In Chrome, Edge, Brave and Opera it is the browser's own built-in translator: the browser downloads each language pack itself, once, when you press a button asking for it, and Streamline makes no request for it. Firefox has no such translator, so there Streamline runs Bergamot, the engine Firefox's own page translator uses, inside the extension. When you download a language, Streamline fetches its model files from Mozilla, checks each against a fingerprint shipped with the extension, and keeps them on your computer until you remove them in Settings. The first download asks for access to that one host.
What this means in practice: those providers can see that somebody asked for the emotes of a particular channel, from a particular IP address, which is the same thing they see from the millions of requests their own web extensions make. They are not told who you are, because Streamline does not know who you are.
Streamline never reads or transmits your Twitch account, your login, your credentials, your cookies, your messages, your email, or your browsing history, and reads no page outside twitch.tv except the YouTube and Kick pages of rooms you linked or added, and, once you have allowed YouTube or Kick, the page there you are on, only to find the chat that goes with its stream.
Voice commands
Voice commands are off until you turn them on in Settings, and the browser asks you before Streamline can use the microphone. Streamline listens for one request at a time, and only after you press Alt+V.
Your voice is turned into text on your own computer. Streamline tells the browser to do it on the device and to fail rather than send the audio anywhere, and it does not offer the microphone at all where the browser cannot promise that. This is why voice commands need Chrome for now. Working out which command you meant happens on your computer too.
With Answer out loud on, replies are read out by a voice your browser provides. Voices listed as Online send the text being read out to your browser's speech service, under your browser vendor's privacy policy. Automatic never picks one; an Online voice is used only if you choose it.
What Streamline never does
- No analytics, telemetry, crash reporting, or usage statistics.
- No advertising, and no data sold or shared with data brokers.
- No remote code. The extension only runs the JavaScript shipped in its package.
- No tracking across sites. Streamline's content scripts run on twitch.tv, and - only after you grant access - inside the YouTube and Kick chat frames Streamline itself opens and on youtube.com and kick.com pages, where the chat panel reads a page only to find the chat that goes with its stream, and inside the YouTube and Kick players the multiview grid itself opens.
Permissions, and why each one is needed
Every permission in the manifest, with the reason it is there. If a permission is not on this list, Streamline does not ask for it.
Extension permissions
| Permission | Justification |
|---|---|
storage |
Stores your block and filter lists, favourites, layouts and settings, plus the local backup that protects those lists if a sync write is rejected. Nothing is stored anywhere but your own browser profile. |
contextMenus |
Adds three right-click entries. Two on twitch.tv, scoped to https://www.twitch.tv/*:
"Hide this streamer" and "Streamline help". One on YouTube and Kick, scoped to those two sites:
"Open Streamline chat here", which asks the browser for that site and then opens the chat panel
there. The entry needs no access to be shown; nothing of Streamline runs on either site before you
allow it. |
alarms |
One hourly alarm that drops temporary hides whose expiry has passed. A service worker cannot hold a timer across restarts, so this is the only way to schedule it. |
declarativeNetRequestWithHostAccess |
Rules applied only on hosts Streamline already holds. Three are sub_frame only and
remove the frame-embedding headers from Twitch's chat embed and popout and from YouTube's popout
chat. Without them frame-ancestors and X-Frame-Options block a chat from
mounting inside Streamline's own popout and picture-in-picture windows. One sets the
Origin header on Streamline's own requests to YouTube's chat endpoint, which refuses
any other origin; YouTube's own pages are excluded. The YouTube rules do nothing until you grant
youtube.com. No rule touches a page you navigate to, and no rule modifies request content.
|
scripting |
Registers four scripts from the extension's own package - the one that paints your style into a YouTube or Kick chat column, the chat panel on YouTube and Kick pages, and two that run only in a YouTube or Kick player the multiview grid built, so the grid can mute and pause a Kick cell and show either one's picture without the site's own controls - on exactly the hosts you have granted, and removes them when a grant is withdrawn. At the moment you grant a site, the same packaged panel script is put into the tabs already open there, so the panel opens without a reload. Declaring them in the manifest instead would put both sites in the install warning for everyone. |
sidePanel |
Streamline's interface opens either as a popup or in the side panel; you pick which in settings. Dropped from the Opera build, which has no side panel API. |
Host permissions
| Host | Justification |
|---|---|
https://*.twitch.tv/* |
The site the extension exists to modify. Content scripts run here; the background worker opens an
anonymous IRC WebSocket to irc-ws.chat.twitch.tv for the merged chat feed. |
https://api.betterttv.net/* |
Fetches the BetterTTV emote set for the channel being viewed. |
https://7tv.io/* |
Fetches the 7TV emote set for the channel being viewed. |
https://api.ivr.fi/* |
Resolves a channel's public numeric Twitch id from its login name, when that id is not already known. The two lookups above are keyed by numeric id, so without this they cannot run for a channel you have just navigated to. |
Optional host permissions
Never asked for at install. The browser asks you once, when you save a YouTube handle or a Kick name in Linked Rooms, add a YouTube or Kick room from a chat panel, turn on Chat on YouTube and Kick in Chat settings, choose "Open Streamline chat here" on a YouTube or Kick page, or press Allow on a YouTube or Kick cell in the multiview grid. If you never do any of these, Streamline never has access to either site. In Firefox, Mozilla's model host is asked for at your first translation download.
| Host | Justification |
|---|---|
https://www.youtube.com/* |
Finds the stream behind a room's /live page, reads its chat for the merged
feed, and shows its popout chat as a live chat column. Also lets the chat panel open over a
YouTube stream or past stream, and lets a YouTube cell in the multiview grid find and play its
stream. |
https://*.kick.com/* |
Lets the style script enter Kick's popout chat when it is shown as a live chat column, and lets
the chat panel open over a Kick stream or recording. It covers Kick's subdomains so the multiview
grid can mute, set the volume of and pause the player from player.kick.com in a Kick
cell without reloading it. A grant of kick.com from an earlier version still works for chat. |
https://firefox-settings-attachments.cdn.mozilla.net/* |
Firefox build only. Downloads the model files of a language you chose for chat translation, from Mozilla, which publishes them for Firefox's own translator. Asked for at the first download. No chat text is ever sent. |
Hosts deliberately not requested
Worth stating explicitly, because it looks like an omission otherwise.
- Emote and avatar CDNs -
cdn.betterttv.net,cdn.7tv.appandstatic-cdn.jtvnw.netare only ever used as an image source, and image loads do not consult host permissions. They were in the manifest once and did nothing but widen the install warning. - Twitch's GraphQL endpoint -
gql.twitch.tvwas in the manifest with no caller at all. It is gone.
Remote code
None. The extension executes only the JavaScript in its own package. There is no eval, no
new Function, and no remotely fetched script. chrome.scripting only registers a
file already in the package. The remote data fetched - emote metadata, chat from YouTube and
Kick rooms, and in Firefox the translation models - is parsed as data and never executed. The Firefox
build's translator is WebAssembly shipped in the package, which is why its manifest allows
wasm-unsafe-eval for the extension's own pages.
Children
Streamline is not directed at children and collects nothing from anyone, including children.
Changes to this policy
If this policy ever changes, the updated version will be published here and the "last updated" date at the top of this page will change. Because Streamline collects nothing, no change here can retroactively affect data already gathered. There is none.
Contact
Questions, or something on this page that looks wrong? Write to the developer at the address on the extension's store listing.