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.app and static-cdn.jtvnw.net are 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.tv was 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.

support.streamline@gmail.com