Sno Station
Sno Station is your agents' workstation: open-source software that turns the AI agents you already run into one squad on your own machine. Two heads are better than one, and they get better with every
Turn any MDBList, Trakt, TMDB, or Simkl list into a Stremio/wako catalog row. Self-hosted on your own free Cloudflare account -- your data stays yours.
PluginsJavaScript · PythonGitHub @Br0ck25OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Official My Lists Addon Repository
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Official Website & Live Web App: mylistsaddon.com Source Code: github.com/Br0ck25/My-ListsRead the full README ↗
Official Website & Live Web App: mylistsaddon.com Source Code: github.com/Br0ck25/My-Lists
A powerful, full-featured add-on for Stremio, Wako, Nuvio, and any other app built on the Stremio addon protocol, that transforms your MDBList, Trakt, TMDB, and Simkl lists into dynamic catalog rows on your home screen — featuring a full Custom List Builder, Letterboxd CSV Import, Virtual TV Channels, Airing Next Calendars, Continue Watching & Watch History Sync, Creator Profiles, and an Admin Analytics Dashboard, all running on a single Cloudflare Workers deployment (free plan included, with some limits) or directly at mylistsaddon.com.
There are no servers to manage, no external databases required, and no subscription fees. Your configuration is encoded directly into your install link or securely synchronized via your own private Cloudflare KV storage.
You can use the official hosted instance right now without deploying anything: mylistsaddon.com
Or follow the instructions below to self-host on your own Cloudflare Worker. A free Workers plan runs the add-on for yourself and a few friends; several features need the Paid plan or are effectively off without it. What the free plan can and cannot run says exactly which, and why.
/api/trakt/device/code)./api/bulk-resolve)./api/channel-poster), and quick-add channel presets.series rather than movie. Lenient add-ons (Torrentio-style) and Nuvio cope; strict ones (PenguPlay)
return nothing. Nothing inside the add-on can change what Stremio asks for, so the movie is best opened
from its own page.Simpsons S1E1 -> King of the Hill S1E1 -> Malcolm S1E1 -> Simpsons S1E2. A 90s prime-time block rather than fifty episodes of one show before the next one starts.3/8 episodes, 0/8 for one you have not started,
8/8 (in the accent colour) once it is done -- and updates as you mark episodes, a season, or the whole
show watched.9 PM ET,
9:30 PM ET -- under the date on its page and under the day on its Continue Watching / Airing Next
badge. TMDB has no episode air time at all, so it comes from TVmaze, which
needs no API key and no configuration: the show's regular slot, plus the next episode's own where
TVmaze dates it apart (a premiere running long, a finale moved an hour). It is only looked up for a show
with an episode still to come, and cached for twelve hours. A streaming show with no broadcast slot, or
one TVmaze has never heard of, simply shows the date on its own.migrations/0012_add_airing_next_removals.sql to remember removals across
devices; without it everything else still syncs and a removal holds only in the browser that made it.*/6 * * * *, cursor-paginated so it does not re-sweep every account on every tick) to find newly-aired episodes for caught-up shows and push them to Continue Watching, to record what has arrived on each streaming service for New on Streaming, and to keep the shared provider charts pre-warmed in KV./meta/) served to Stremio/Nuvio. The website updates the moment you tick the box; an existing install link needs a Save/Update.MYL-XXXX-XXXX-XXXX)./admin)ADMIN_KEY).migrations/ the bound D1 database has not had run, and what each one silently breaks until it is applied./sw.js): the page, its stylesheet and its bundle are cached, so the app opens and its interface works with no connection. Catalogs and lists still need the network — offline they show the same error states they would on a failed request. A new deployment is always picked up immediately: the page itself is fetched network-first, and the bundle is content-addressed, so the cache can never hold the app a version behind./app.webmanifest), dark mode UI, clipboard shortcuts, and QR code sharing.worker_entry_combined.js.Short answer: free is fine for a personal install — your own catalogs, your own custom lists, the channel builder, the directory, sharing links. Three things do not fit in the free plan's limits, and one of them is silent, so it is worth knowing which before you build a habit around them.
The limits that matter (Cloudflare's, not this add-on's):
| Workers Free | Workers Paid | |
|---|---|---|
Outbound fetch() per request ("subrequests") | 50 | 10,000 (configurable) |
| CPU time per request | 10 ms | up to 5 min |
| Requests per day | 100,000 | metered |
| KV writes to different keys per day | 1,000 | metered |
| KV reads per day | 100,000 | metered |
| KV operations per invocation | 1,000 | 1,000 |
| KV writes to the same key | 1 per second | 1 per second |
Measured against those, on the free plan:
CRON_SUBREQUEST_BUDGET to 48 (see below) and the tick skips the
pre-warm, logs one line saying why, and completes — which is what gets Continue Watching working. Leave
it unset and Cloudflare terminates the tick outright, so neither half runs. Catalogs still load either way;
without pre-warming they are simply colder and lean harder on the provider rate limits.So: D1 is optional for correctness and close to required for anything shared. Step 4 below is written as optional because the app genuinely works without it — every accessor tries D1 and falls back to KV — but if more than a handful of people will open your deployment, bind it. It is the single change that keeps a free Worker inside its own write budget.
Three paths used to exceed the 50-subrequest cap outright, which meant Cloudflare terminated the invocation and the feature was simply absent on a free Worker. Each of them works to a budget instead, and each budget is an environment variable:
| Variable | Default | What it bounds | Set it on a free Worker? |
|---|---|---|---|
BULK_RESOLVE_SUBREQUEST_BUDGET | 48 | /api/bulk-resolve — the Letterboxd CSV import | No. Already free-safe: 24 titles per invocation, and the client re-posts the rest until the import finishes |
DETAILS_BATCH_SUBREQUEST_BUDGET | 48 | /api/details/batch — rebuilding the Airing Next shelf | No. Already free-safe. Only cold ids are charged, so a warm refresh is one invocation on either plan |
CRON_SUBREQUEST_BUDGET | 10000 | one 6-minute cron tick | Yes — set it to 48. Otherwise the tick is terminated and Continue Watching never runs |
Two of the three default to the free-safe number and one does not, and the difference is what each budget does when it binds. Pacing an import or a shelf refresh costs invocations and nothing else — the work still completes. Pacing the cron below one chart's worth of budget switches chart pre-warming off and drops the Continue Watching sweep to 8% of its throughput. That is a feature going dark rather than a slower path to the same place, so it is sized for a paid Worker by default and a free one steps it down.
Setting a variable when you deploy by pasting into the dashboard: your Worker → Settings → Variables
and Secrets → Add variable, type Text, name CRON_SUBREQUEST_BUDGET, value 48. Deploy. Nothing in
wrangler.toml is read on that path, so this is the only place these can be set.
With CRON_SUBREQUEST_BUDGET = 48 a free Worker gets a tick that completes — Continue Watching sweeping 12
shows every 6 minutes, 2,880 a day — and no chart pre-warming, because no free-plan budget can fit even one
chart. Catalogs still load; they are simply colder.
Nothing is dropped at any budget. Each endpoint reports what it did not reach and the client asks again; the cron resumes from a stored cursor, so a smaller slice costs ticks, not coverage — and there are 240 ticks a day.
The plan limits above were read from Cloudflare's docs on 2026-09-08 and the per-request counts were measured against this code with provider responses stubbed. The consequences on a free plan follow from those two numbers; they have not been observed on a live free deployment.
This section is only needed if you want to run your own dedicated copy instead of using the shared hosted instance at mylistsaddon.com. Most people don't need this section at all.
Self-hosting is expected on Cloudflare Workers. Account creation, restore, key reset, feedback, list preview, and anonymous likes are rate-limited (or identified) using Cloudflare's CF-Connecting-IP header — IPv6 is counted per /64. That header is set by the Cloudflare edge and cannot be spoofed there. If the header is missing, those endpoints reject the request rather than sharing one global bucket. Running this Worker outside Cloudflare therefore has no real per-client rate limit on those paths: they fail closed instead of pretending to throttle everyone together.
worker_entry_combined.js from the repository and paste it into the editor.https://your-worker-name.your-subdomain.workers.dev!The Worker boots and serves the catalog/manifest pages without this, but every stateful feature -- Creator Profiles (cloud sync), short install links, Custom Lists, Channels, Admin analytics, and Feedback storage -- silently no-ops without it rather than erroring, so it's easy to deploy and not notice it's missing:
my-lists-kv and save.CONFIGS (must match exactly in all caps)my-lists-kv namespace created in step 2.D1 is the primary authoritative store for Creator Profiles, lists, full-text search (lists_fts), likes ledgers, feedback, tracking, and telemetry counters. KV acts as a cache, a hot key-value store for addon configs and provider responses, and temporary storage for rate limits and short-lived tokens.
Every step below is doable entirely from the Cloudflare Dashboard -- nothing here needs wrangler, npx, or a terminal of any kind, even though D1's own docs (and this file, in an earlier version) usually show the CLI first. A Wrangler CLI alternative is noted at the end for anyone who prefers it.
1. Create the database
my-lists-db (or anything you like), and create it.2. Run schema.sql against it (once, on a brand-new database only)
schema.sql from this repo, copy its entire contents, paste them into the Console, and click Run / Execute. This creates the creators, creator_lists, and source_groups tables.schema.sql DROPs and recreates every table it touches. Only ever run it once, against a brand-new, empty database. If you need to change the shape of a database that already has real data in it later, use a file under migrations/ instead -- see "Applying a migration" below -- never schema.sql again after this first run.3. Bind it to your Worker
DB (must match exactly in all caps)4. Backfill any existing KV data into it
If you already had Creator Profiles or Custom Lists in KV before adding D1 (i.e. you're enabling this on a site that's already been running), D1 starts out empty and needs a one-time copy. Log into /admin, open Management & Tools → Maintenance, and click Migrate KV → D1. (A brand-new site with no accounts yet can skip this -- there's nothing to copy.) This is safe to click more than once; KV stays the authoritative copy either way.
Applying a migration: files under migrations/ are small, additive changes to an already-live database (unlike schema.sql, they're safe to run with real data present). Open the file on GitHub, copy its ALTER TABLE/CREATE INDEX/etc. statements (skip the -- comment lines), paste them into the same D1 Console used in step 2 above, and click Run. Run one statement at a time, and do skip the comment lines rather than pasting the whole file: a -- comment runs to the end of its line, so if the paste arrives with its line breaks collapsed, the first comment swallows everything after it. A half-eaten CREATE TABLE reports incomplete input: SQLITE_ERROR, and a whole file that has become one comment reports nothing at all and creates nothing -- both look like the migration is broken when it is only the paste. Apply them in filename order (0001_..., 0002_..., and so on) -- each one assumes the ones before it already ran.
Which migrations does my deployment still need? The Admin Dashboard's Database schema panel answers this: it reports every file under migrations/ that has not been run against the bound database, and what each omission silently costs. Nothing records that a migration was applied, and this Worker degrades quietly rather than refusing to start when one is missing -- so after any deploy that shipped a new migration, check that panel. Worth being concrete about why: deploy without 0004_add_creator_tombstones.sql and account deletion still reports success and still refuses the deleted account on a normal request, while a colo whose KV cache predates the deletion will happily authenticate it. Apply migrations first, then deploy the Worker.
Wrangler CLI alternative, if you'd rather use a terminal: npx wrangler d1 create my-lists-db, then npx wrangler d1 execute my-lists-db --file=schema.sql --remote (or --file=migrations/000X_....sql --remote for a specific migration), then bind it the same way as steps 3.2-3.4 above.
The add-on works out-of-the-box with public MDBList and TMDB links. Adding API keys unlocks external accounts, private lists, and richer metadata.
| Variable / Secret | Description & Feature Unlocked | Source / Where to obtain |
|---|---|---|
TMDB_API_KEY | TMDB lists, episode/season data, search, recommendations, artwork, bulk movie resolution | themoviedb.org/settings/api (API Key (v3 auth)) |
TRAKT_CLIENT_ID | Trakt public lists, search, trending/popular charts, recommendations | trakt.tv/oauth/applications |
TRAKT_CLIENT_SECRET | Trakt OAuth account login, Device Code authentication, private lists & watch history export | Same Trakt app as above |
SIMKL_CLIENT_ID | Simkl trending charts (Movies, TV, Anime) and OAuth login | simkl.com/settings/developer |
SIMKL_CLIENT_SECRET | Simkl OAuth token exchange for private lists and history sync | Same Simkl app as above |
MDBLIST_API_KEY | Private MDBList lists, Watchlist quick-add fallback, history sync | mdblist.com/preferences |
MDBLIST_POPULAR_KEY | Dedicated key for MDBList Toplists / Popular Lists browser | Same MDBList preferences as above |
MDBLIST_CLIENT_ID | MDBList OAuth client ID — MDBLIST_CLIENT_SECRET must be set too, or MDBList OAuth fails with "not configured" | mdblist.com/preferences |
MDBLIST_CLIENT_SECRET | MDBList OAuth token exchange (required alongside MDBLIST_CLIENT_ID for MDBList account login) | Same MDBList preferences as above |
If you configure OAuth authentication for Trakt, Simkl, MDBList, or TMDB, set the OAuth callback URLs in their respective developer portals to:
https://your-worker-name.your-subdomain.workers.dev/api/trakt/oauth/callbackhttps://your-worker-name.your-subdomain.workers.dev/api/simkl/oauth/callbackhttps://your-worker-name.your-subdomain.workers.dev/api/mdblist/oauth/callbackhttps://your-worker-name.your-subdomain.workers.dev/api/tmdb/oauth/callbackThe Plex / Jellyfin / Emby webhook endpoint (/api/scrobble) authenticates from the
URL itself — either ?config=<your install id> or ?creator=<name>&key=<your Creator Key>. That is forced by the webhook senders, which cannot attach custom headers, but
it does mean the key travels in a URL and so may be recorded in server logs, proxy
logs, and your media server's own configuration screen.
Practical consequences:
POST /api/creator/reset-key). The old key stops working immediately and any
webhook still using it will simply stop being accepted.?config= form where you can — it points at a stored install config
rather than spelling the Creator Key out in the URL.To access the /admin telemetry and management console:
ADMIN_KEYhttps://your-worker-name.your-subdomain.workers.dev/admin to log in.To automatically pre-warm shared Trakt, TMDB, Simkl, and MDBList charts into Cloudflare KV every 6 minutes (preventing API rate limits for all visitors and ensuring instant < 50ms catalog loads) and check for newly-aired episodes:
*/6 * * * * (every 6 minutes).This same cron run also seeds the public list directory/search index (/lists/public.json, in-app search) the first time it finds one missing -- a fresh deployment, or the index having been lost some other way -- so a self-hoster with the cron trigger enabled never has to think about it. Without a cron trigger configured, the index instead seeds itself lazily on whichever visitor's request happens to find it missing first, which briefly serves a truncated (capped, oldest-first) directory/search result until that finishes. To seed it immediately and synchronously -- e.g. right after a fresh deploy, without waiting on either of those -- log into /admin and POST /admin/api/rebuild-public-index.
A catalog row of what actually arrived on a streaming service, newest first -- and a show goes back to the top the day a new episode airs.
Why it needs a database and a cron trigger, when no other row does. Nothing upstream publishes the date a title landed on a service. TMDB's with_watch_providers answers "is this on Netflix right now" and says nothing about yesterday; Trakt and Simkl do not model provider catalogs at all. The closest thing this add-on had before -- the Stream Releases genre row -- sorts by release date, which is why it shows theatrical-era titles and completely misses a 1998 film being added to Hulu this morning.
So the add-on observes it. Every cron tick walks a slice of each provider's catalog; a title that is not in the streaming_events table already is an arrival, and the moment it was first seen is the date the shelf sorts on. That has three consequences worth knowing before you judge the list:
migrations/0011_add_streaming_events.sql). Unlike everything else in this add-on there is no KV fallback -- these dates are observed over time and cannot be refetched later, so a tick that runs without the table is history not collected, not a cache miss.total_pages, so the sweep learns how deep each service goes and walks exactly that far. This is what lets a 2010 film added to a service today be picked up at all: sorted by release date it is nowhere near page one, so a fixed page horizon would never fetch it.A full pass is roughly 1,000-1,500 pages across the eight services and both types -- the sweep measures the real number and the admin panel reports it -- which at 40 pages a tick is about three hours on the recommended */6 schedule. That is the detection latency for a back-catalog addition and for a removal. It is not how long the shelf takes to look right: the walk is page-major, so the first tick covers page one of every provider and both types, and the hours after that only add depth. A new release is found on the next tick either way, because the walk is sorted newest-first and a new release lands on page one.
Serving it costs nothing. The title, poster and year are denormalised into the row, so rendering the shelf is one indexed D1 read and zero outbound requests -- it is the only catalog here that a provider outage cannot slow down or empty.
It ships dark: NEW_ON_STREAMING_IN_QUICK_ADD in 00_constants.js is false, so there is no Quick Add card and no Discover entry. The catalog itself is live from the moment you deploy, which is the point -- it can be judged against real data first.
Apply migrations/0011_add_streaming_events.sql, deploy, and confirm the cron trigger is set.
Open /admin → Management & Tools → New on Streaming. Use Run a sweep now to pull the first walk in by hand rather than waiting on the cron; it advances the same cursor, so it brings the walk forward instead of duplicating it.
Preview the catalog reads through the same code that serves Stremio, so what you see there is what a client gets.
To try it in Stremio or Nuvio for real while it is still hidden, add a catalog on the main site (Catalogs → + New Catalog) with one of these as the URL:
| URL | Row |
|---|---|
tmdb:new-on-streaming | Everything, across every service |
tmdb:new-on-streaming:netflix | One service |
tmdb:new-on-streaming:netflix+hulu | Any combination, +-separated |
Pick Movies or Shows with the type selector, exactly like any other row.
To turn it on for everyone, set NEW_ON_STREAMING_IN_QUICK_ADD = true and rebuild. That one constant adds the Quick Add card, the Discover shelf, and the /lists/New-on-Streaming pages; nothing else about the feature changes.
https://your-worker-name.your-subdomain.workers.devThe codebase is organized into modular ES modules that compile into a single worker_entry_combined.js file:
.
├── 00_constants.js # Versioning, addon constants, and API key globals
├── 01_icon-asset.js # Embedded Base64 addon icon
├── 02_http-and-creator-utils.js # CORS, JSON helpers, crypto, creator auth & hashing
├── 03_admin.js # Admin counters, telemetry, and API usage stats
├── 04_config-resolution.js # Config decoding (Base64 URL & KV short links)
├── 05_catalog-core.js # Stremio addon protocol manifest generation & catalog logic
├── 06_source-fetchers-mdblist-trakt.js # MDBList & Trakt API data fetching & pagination
├── 07_source-fetchers-tmdb-simkl.js # TMDB & Simkl API fetching, episode cron checker
├── 08_quickadd-chart-data.js # Preconfigured streaming service & chart metadata
├── 09_page-shell.js # Web app HTML shell, header, PWA meta tags & CSS
├── 10_tab-search-add.js # Catalogs tab HTML
├── 11_tab-quick-add.js # Discover & Quick Add tab HTML
├── 12_tab-custom-lists.js # Custom Lists builder tab HTML
├── 13_tab-channels.js # Virtual TV Channels tab HTML
├── 14_tab-presets-backup.js # Presets & Backup tab HTML
├── 15_tab-settings-html.js # Account, API keys, sync, and preferences UI
├── 16_client-row-core.js # Core client runtime, router, state & DOM helpers
├── 17_client-my-lists-and-trakt-oauth.js# Trakt & MDBList account integration & OAuth UI
├── 18_client-copy-and-trakt-export.js # List cloning, deep-linking, and Trakt export
├── 19_client-search-and-likes.js # Discover search, filters, and community likes
├── 20_client-channel-builder.js # Client-side Virtual Channel creator & preview
├── 21_client-custom-list-builder.js # Client-side Custom List builder & Letterboxd import
├── 22_client-creator-profile.js # Client-side Creator Profile management & sync
├── 23_client-list-management.js # Catalog reordering, toggles, and deletion
├── 24_client-backup-restore-presets.js # JSON backup/restore, short link & QR code logic
├── 25_api-catalog-routes.js # HTTP router: manifests, catalogs, search & OAuth
├── 26_api-creator-and-admin-routes.js # HTTP router: creator sync, admin API & worker export
├── build.ps1 # PowerShell script to bundle modules into worker_entry_combined.js
├── worker_entry_combined.js # Standalone production Cloudflare Worker bundle
├── Changes.md # Development modification log
└── README.md # Project documentation
When editing any individual split file (00_ through 26_), rebuild worker_entry_combined.js:
.\build.ps1
python3 build.py
CI rebuilds from source and fails if the committed Worker drifted. Tests load that Worker in Node with an in-memory KV:
node --test tests/*.test.mjs
# or: bash verify.sh
| Endpoint | Method | Description |
|---|---|---|
/ | GET | Main configuration web app & PWA builder |
/:config/configure | GET | Builder interface pre-populated with existing configuration |
/:config/manifest.json | GET | Stremio addon protocol Manifest -- works in Stremio, Wako, Nuvio, and other compatible apps (redirects to /configure in browser) |
/:config/catalog/:type/:id.json | GET | Catalog item feed with pagination (skip=) support |
/api/title-search | GET | Search movies and TV shows via TMDB |
/api/bulk-resolve | POST | Batch resolve movie title/year pairs to IMDb IDs (Letterboxd import) |
/api/show-seasons | GET | Fetch season lists for a TV show |
/api/show-episodes | GET | Fetch episode lists for a specific season |
/api/toplists | GET | Fetch popular MDBList toplists |
/api/trakt-popular-lists | GET | Fetch trending and popular Trakt lists |
/api/recommendations | POST | Fetch TMDB recommendations for selected titles |
/api/trakt/device/code | POST | Generate Trakt TV / Device Code login flow |
/api/trakt/device/token | POST | Poll Trakt device token status |
/api/creator/* | POST | Creator Profile authentication, list management, and cloud sync |
/api/creator/lists | POST | The creator dashboard's list index — paged, and metadata only |
/api/creator/lists/items |
/<config>/manifest.json carries whichever provider keys and OAuth tokens you have entered — TMDB, MDBList,
Trakt, Simkl — and, if Auto-track Playback is on or the link contains one of your personal shelves
(Watch History, Continue Watching, Watchlist, Airing Next), your Creator Name and Creator Key. With KV bound that
all sits behind a 12-character id (72 bits, not guessable); without KV it is base64 in the URL itself.
Anyone you hand the link to can install your catalogs and can read those secrets back out of
/api/resolve. Share it the way you would share a password, and if you have shared one you should not
have: rotate the provider keys, and use Reset my Creator Key in the account panel./admin cookie is a self-contained signature over
its own expiry, valid for up to 7 days, with no server-side session record — so /admin/logout clears your
browser's copy and nothing else. If you believe a cookie has been captured, rotate ADMIN_KEY; that
invalidates every issued session, including your own.Trakt, MDBList and Simkl connections are OAuth access tokens, and this add-on stores no refresh token for any of them — so a connection lasts as long as its provider's token does (Trakt's is about three months) and then has to be reconnected in Settings. On the web UI that surfaces as a clear message on the affected list ("Your Trakt connection may have expired…"); inside Stremio the affected catalog row just goes empty, because a catalog row has no way to say anything.
This is a deliberate limitation rather than an oversight. Provider tokens live inside your install config, not in a server-side account record, so refreshing one would mean this Worker rewriting stored configs on a schedule — a different storage model, not a bug fix. Reconnecting takes a few seconds and is the supported answer for now.
POST /api/creator/sync/share-tracking is authenticated, supported, and has no UI. It is the only way to
opt a Watchlist, Watch History or Continue Watching shelf into being visible to anyone but you — they are
private by default and nothing else can make them public. Call it with { creatorName, creatorKey, slug, shared }, or with no slug to read the current state back.
That applies to every way those shelves can be read, not just the public /lists/:username/:slug page:
the Stremio catalog route, /api/preview and /api/resolve all ask the same question. A request reads one
of your shelves only if it proves it is you — an install link that carries your Creator Key, or a signed-in
builder page — or if you opted that specific shelf in above. Airing Next has no share flag at all, so it is
always yours alone.
For the same reason, /api/save refuses to store a configuration that names a Creator Profile unless the
request proves it owns that profile. If you are signed in, the builder page does this for you. Install links
generated before this behaviour existed are still honoured, so nothing you have already handed to Stremio
stops working — see LEGACY_UNVERIFIED_CONFIG_SHELVES in 00_constants.js for what that costs and how to
turn it off once your links have been regenerated.
MDBLIST_POPULAR_KEY or MDBLIST_API_KEY secret.TRAKT_CLIENT_ID environment secret.TMDB_API_KEY environment secret.CONFIGS.ADMIN_KEY is configured as a Secret and KV storage is bound.*/6 * * * *) is configured under Worker Triggers and TMDB_API_KEY is set. Note that cron updates apply to users with Creator Profiles.This add-on is free and always will be — you're running it entirely on your own Cloudflare account, so there's no subscription and never will be. If it's been useful to you and you'd like to support ongoing development, you can do so here:
Entirely optional — this doesn't unlock anything or change how the add-on works. It's just an option for anyone who wants to say thanks or use a recommended debrid provider.
MIT License. Designed for personal, self-hosted use.
POST |
| The contents of up to 100 named lists, so the index above does not have to ship them |
/admin | GET | Admin analytics dashboard UI |
/admin/api/* | GET/POST | Admin analytics, API usage counters, leaderboard, feedback, and moderation API (list index rebuild, creator-list and anonymous-list deletion) |
/sw.js | GET | Service worker for offline PWA support |
/app.webmanifest | GET | Web App Manifest for mobile/desktop PWA installation |