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

support.streamline@gmail.com