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 29 August 2026Applies to version 1.0.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 and to three public emote providers, to fetch the emotes for a channel you are already watching.
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. 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 |
| 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 yourself from the extension's Backup tab. Uninstalling the extension deletes it.
Network requests Streamline makes
Streamline talks to five hosts, all of them to fetch public data about a channel you are already viewing. No request carries an identifier for you: no account id, no device id, no cookies. The extension is not signed in to any of these services.
| 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 |
Emote images are then loaded from those providers' CDNs the same way any image on a web page is loaded.
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, your browsing history, or any page outside twitch.tv.
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 only run on twitch.tv.
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. |
activeTab |
Lets a toolbar-button or context-menu action apply to the Twitch tab you triggered it from, without standing access to any other tab. |
tabs |
The background worker needs the tab id and URL to tell a content script the page navigated to a different channel, to deliver the "Hide this streamer" action to the right tab, and to open the guide. |
contextMenus |
Adds the two right-click entries on twitch.tv: "Hide this streamer" and "Streamline help". Both
are scoped to https://www.twitch.tv/*. |
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. |
declarativeNetRequest |
Two static rules, both sub_frame only, that remove the frame-embedding headers from
Twitch's own chat embed and chat popout. Without them Twitch's frame-ancestors and
X-Frame-Options block the chat panel from mounting inside Streamline's own popout and
picture-in-picture windows. No rule touches a page you navigate to, and no rule modifies request
content.
|
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. |
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, no remotely fetched script, and no use of chrome.scripting. The only
remote data fetched is JSON emote metadata from the hosts above, which is parsed as data and never executed.
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.