SHUTTERPARTY
Last updated: 2026-08-24
This document describes what the SHUTTERPARTY Twitch Extension actually does, checked against the source. Every retention figure below is a constant in src/ebs/src/lib.js.
Published by Noriaki Tabuchi, Japan.
Contact: tabuchin.room@gmail.com
When you press the button, the extension sends Twitch's signed token for your session, and — if the press was paid — the receipt Twitch issued for that purchase. It also sends whether you have asked to stay anonymous, and — with a receipt, never on its own — the display name that receipt gave it. From these we read:
| What | Where it comes from | Why |
|---|---|---|
opaque_user_id | Twitch's signed token | Rate limiting, and "one free credit per minute" |
channel_id | Twitch's signed token | Which channel the press belongs to |
Bits amount and transactionId | Twitch's signed receipt | To move the goal bar, and to refuse the same receipt twice |
| Display name | The receipt Twitch issues for a Bits purchase, which carries it. A press that came with no receipt carries no name, whatever it claims | To caption the photograph that was bought — the only kind that is ever captioned — and, when that purchase is the one that fills the bar, to say who started the SHUTTER PARTY. Truncated to 25 characters, and not used at all if you have asked to stay anonymous |
We do not read your real Twitch user id. The opaque_user_id is a pseudonymous identifier issued by Twitch; it differs per channel and per viewer, and nothing in this service can reverse it.
We do not receive: your email address, your Twitch login, your IP address as stored data, your chat messages, or anything you type.
State lives in a Cloudflare Durable Object, one per channel, currently pinned to the Asia-Pacific region. Per channel:
| Stored | Retention |
|---|---|
opaque_user_id → the times of your recent presses | 30 seconds, then dropped |
opaque_user_id → when you last advanced the bar for free, and how many free photographs you have taken this broadcast | 60 seconds for the first, until the broadcast ends for the second |
opaque_user_id → that you asked for your name not to appear | Until you turn it off and press again, which clears it. Only stored for viewers who ask for it, and all it can say is that they asked |
Bits transactionId → when it was honoured | 24 hours, after which no receipt bearing it can still be presented. This is what stops a receipt being spent twice |
| Display name of a buyer whose paid photo has not been drawn yet, or whose purchase has filled the bar | Until that photograph is taken, or that SHUTTER PARTY is announced — normally under a second, and never past the end of the broadcast it was bought in |
| The channel's bar total, goal, and settings | For as long as the channel uses the extension |
Nothing here is a profile, nothing is used for advertising, and nothing is sold or shared with any third party.
Three of these outlive the minute, each for its own reason. A receipt identifier is kept for 24 hours because that is how long a receipt can still be presented, and forgetting it sooner would let the same purchase be spent twice. The count of free photographs is kept until the broadcast ends, because that is what a per-broadcast allowance means. And choosing to keep your name off a photograph is a decision you made — it would be worth little if it forgot itself when you closed the tab, so it is kept until you change it back. Changing it back deletes the record rather than storing a "no". Everything else in the table is bookkeeping that stops meaning anything within a minute.
A buyer's name has an outer limit, and not only a typical one. It is held because a purchase that has not been photographed yet still has a photograph owed to it — the broadcaster's OBS may be restarting, or several purchases may be queued ahead of it. That is a matter of seconds while a broadcast is running. But a broadcast can also simply end with one still waiting, and a name kept "until the photograph is taken" would then be kept for as long as the channel existed. So when a channel comes back after a gap long enough to be a different broadcast, the waiting photographs are let go of, and the names with them. The Bits are not affected: they reached the goal bar when the button was pressed, and the bar is still there.
A broadcaster running SHUTTERPARTY may choose a folder on their own computer for the photographs to be saved into. That is off unless they turn it on, and those files are theirs: they live on their machine, we cannot read them, and we cannot delete them.
The photographs appear on a public Twitch broadcast, which means anyone watching can see and record them. That is what the extension is for. A broadcaster controls what can be photographed by choosing a capture scene and by choosing which scenes the button works in.
The viewer-facing extension sets no cookies and stores nothing in your browser.
The extension is not directed at children. Twitch's own Terms of Service require account holders to be 13 or older.
Under the GDPR and similar laws you may ask what we hold about you, ask for it to be corrected or deleted, and object to processing.
Practically, there is a limit worth stating plainly: we cannot identify you. The only identifier we hold is Twitch's per-channel opaque id, and we have no way to connect it to a person or an account. If you want a specific record removed, you would need to tell us the opaque id yourself — the extension's own frame is the only place it appears. In almost every case the answer is simpler: everything tied to a viewer is deleted automatically within 60 seconds, with three exceptions: a receipt identifier, which is deleted 24 hours after the purchase; the count of free photographs you have taken, which is cleared when the broadcast ends; and a request to keep your name off photographs, which your next press clears once you have turned it off. Until then it is doing the one thing it was stored for — keeping your name off — and it cannot say anything about you beyond that you asked.
Requests: tabuchin.room@gmail.com
| Twitch (Amazon) | Hosts the extension, issues the tokens, processes Bits |
|---|---|
| Cloudflare | Runs the backend service and stores the per-channel state described above |
If this policy changes materially, the extension version notes will say so. The date at the top always reflects the current text.