#DHSeaDev — Chrome MV3 — Side Panel Extension
AniDeck
AniDeck is a Chrome side panel for watching anime that blurs spoilers before you read them, shows your AniList watching statistics, and keeps episode context next to the player. It runs entirely in your browser, talks to exactly one server, and never touches playback.
CHROME WEB STORE LISTING IN PREPARATION
Version 1.3.0 is built and packaged. When the listing clears review this becomes an install button. Questions before then: dhseadev@gmail.com
Three tools, one panel
These were picked from a ten-idea shortlist because they are the three things you actually reach for mid-season, and because none of them needs a server.
Spoiler Shield
Blurs posts and comments that give away episodes past where you are. Click to reveal. The default over-blurs on purpose.
AniList stats
Your watching history from a public AniList username, drawn as a shareable card. No sign-in, no OAuth, no token.
Episode companion
Detects the series and episode you are on and puts the discussion thread one click away, without leaving the tab.
Why the Shield over-blurs by default
A spoiler filter has two ways to be wrong, and they do not cost the same. A false positive blurs something harmless: you click once and read it. A false negative shows you the death of a character forty episodes early, and there is no undo. So the default mode is Conservative, which blurs on weak evidence, and the settings let you dial it back rather than up.
When several signals disagree about one post, they resolve in a fixed order rather than by whichever check ran last:
- Per-show override — an explicit Always or Never you set for that series wins outright.
- Episode number — a post that names an episode ahead of you is hidden regardless of wording.
- Weak-alias guard — a short or ambiguous series nickname is not enough on its own to blur an unrelated post.
- Mode — Conservative, Balanced or Permissive decides everything left over.
Revealing a post is remembered by a hash of the post text, not by the show. Revealing one comment about a series used to unblur every comment about that series, which is the same failure as having no filter at all.
Built on measurements, not assumptions
Three findings that changed the build, each one from a live run rather than documentation.
Reddit will not answer an extension. The plan was to fetch the discussion thread as JSON. Reddit returns HTTP 403 with an HTML body to extension-origin requests even with the host permission granted, so a parser that trusted the status code would have tried to parse an error page. The permission and the request were both deleted and the feature became a plain deep link. That took AniDeck down to one network call site and one host permission, which is a better privacy story than the one it replaced.
The share card cannot use your avatar. AniList’s image CDN sends no cross-origin header, so drawing an avatar onto a canvas taints it and the export throws at the last step. Rather than ship a feature that fails on save, the card is drawn with zero external images and a deterministic identicon generated from the username.
A series page has no current episode. On a series landing page the detector fell through to the first thing that looked like an episode and reported episode one with nothing playing, which then poisoned the discussion link. Episode extraction is now gated on actually being on a watch page. This was found by opening a real page, not by a test.
Questions
Does AniDeck need an AniList account or login?
No. It reads a public AniList username over the public API. There is no OAuth flow, no token to store, and no password. If your list is private, AniDeck says so and stops rather than asking you to sign in.
Does AniDeck interfere with video playback?
No. It reads the page to work out which series and episode you are on and does nothing else. It never touches the player, the video stream, or any playback control, on Crunchyroll or anywhere else.
Where is my data stored?
In this browser only, in chrome.storage.local. Nothing syncs to a Google account and nothing is uploaded. Settings can be exported to a file, imported back, or reset from the Settings tab.
Can I turn off the artwork so nothing loads from AniList’s servers?
Yes. Cover art and cast photos load from AniList’s image CDN, which is a second host. That is disclosed in the panel and there is a single toggle that switches it off, after which the only host AniDeck contacts is the AniList API itself.
Privacy
Plain version: one server, one optional image host you can switch off, nothing leaves your machine, and nothing identifies you.
| What | Answer |
|---|---|
| Accounts or sign-in | None. AniList is read by public username over the public API. No OAuth, no token, no password. |
| Analytics or telemetry | None. No events, no page views, no crash reporting, no third-party scripts. |
| Network requests | One host permission: graphql.anilist.co. Cover art and cast photos load from AniList’s image CDN as plain images, which needs no host permission and is disclosed in the panel with a toggle to switch it off. |
| No request is ever made. The discussion link is a plain deep link you click. An earlier build fetched the thread as JSON; that permission and that request were removed. | |
| Crunchyroll | Read-only. AniDeck reads the page to identify the series and episode. It never touches playback, never intercepts the stream, and holds no credentials. |
| Where your data lives | chrome.storage.local — this browser only. Nothing syncs to a Google account or to any server. |
| Browsing history | Never read or stored. |
| Page content | Post text is read in memory to decide whether to blur it, then discarded. The reveal memory keeps a hash of the text, never the text. |
| The decision log | A bounded in-browser buffer recording only why something was blurred. It never stores post text and never stores a page URL. |
| Remote code | None. No eval, no remotely-hosted scripts, no CDN-loaded libraries, no remote fonts. A Content Security Policy is declared in the manifest. |
| Selling or sharing data | There is no data to sell. Nothing is transferred to anyone, for any purpose. |
| Deleting your data | Reset from the Settings tab, clear the extension’s storage from chrome://extensions, or remove the extension. Export first if you want to keep your settings. |
Permissions, and exactly why each one exists
| Permission | Why |
|---|---|
storage | Saves your settings, per-show overrides and theme in this browser. |
sidePanel | The panel itself. |
host: graphql.anilist.co | The only server contacted. Without it, statistics and title lookup do not resolve. |
| Content script on watch and discussion pages | Reads the page to identify the series and episode, and to blur spoiler text in place. No page is modified beyond the blur overlay. |
Removed rather than justified: version 1.0 declared a reddit.com host permission for a JSON fetch. A live run showed Reddit answers extension-origin requests with HTTP 403 no matter what, so both the permission and the request were deleted in 1.1.0 and the feature became a deep link. An unused permission is a liability, not a convenience.
Questions about any of this: dhseadev@gmail.com
Credits
Series data and watching statistics come from the public AniList API. AniDeck is an unofficial tool and is not affiliated with, endorsed by, or sponsored by AniList, Crunchyroll, Reddit, or any rights holder. All series names and artwork belong to their respective owners.
Built by #DHSeaDev — dhseadev@gmail.com
More from DHSeaDev
AniDeck is a side panel for watching. Dota Companion is the same idea pointed at playing: Dota 2 stats, hero counters and matchups, local-first and account-free. The build notes behind this one are in the devlog, and everything else is on the projects page.