Addon

TPB 4K Porn

4K & 1080p adult torrent catalogs from ThePirateBay, PornRips, and more. JAV search, Hentai episodes, optional TPDB/theStashDB metadata. Real-Debrid, TorBox, and other debrid providers supported.

Features

4K & 1080p torrent catalogs

Browse ThePirateBay and HiddenBay adult releases in 4K and 1080p, with JAV title and studio search baked into Discover.

Debrid-ready playback

Real-Debrid, TorBox, Premiumize, and 10+ more providers for cached, instant streams. P2P torrent playback works without a debrid account.

Scene releases with metadata

PornRips scene catalogs with studio filters and optional ThePornDB and StashDB metadata for posters, cast, and tags.

Hentai episodes

Hentai series streamed as direct video episodes, plus Sukebei Nyaa torrents (beta) with top and recent sorts.

Stripchat live cams

Four live cam catalogs (Girls, Couples, Guys, Trans) with username search and multi-quality HLS via a dedicated proxy (beta).

Stremio and Nuvio compatible

Works in Stremio on desktop, mobile, and TV. Nuvio and other Stremio-addon clients can use the same manifest URL.

Status

Addon: Live

Updated 2026-07-05

TPB (HiddenBay)

4K & 1080p torrent catalogs, JAV search.

Live

Scenes (PornRips)

Scene releases with studio filters and TPDB metadata.

Live

Hentai

Hentai series streamed as direct video episodes.

Live

Sukebei

Sukebei Nyaa torrents, top and recent sorts.

Live

Stripchat

Live cam catalogs (Girls, Couples, Guys, Trans) via HLS proxy.

Live

ThePornDB Catalogs

Scene browser catalogs and metadata enrichment for entries across sources.

Live

StashDB Catalogs

Scene browser catalogs and metadata enrichment for entries across sources.

Live

Known issues

No known issues. All sources are operating normally.

Changelog

Showing 1-5 of 68

Unreleased

  • [Added] HQporner source is now selectable on the configure page - the Go backend ships a sixth tube source (`hqporner.com`, `hqp_*` catalogs, multi-quality mp4), added on the Phase-0 shared `TubeSource` interface. Like WatchPorn it is populated by a Mac-side launchd cron, but for a different reason: hqporner.com is reachable from prod, but its stream resolve is a 2-hop `mydaddy.cc` -> `bigcdn.cc` walk that runs on the Mac at enrich time so prod never dials mydaddy.cc (prod reads Mongo + the Redis genre blob and emits the stored tokenless bigcdn mp4s directly). The configure UI labels it "Mac-cron populated". The edge exposes it identically to the other tube sources except it has no Studio catalog (hqporner exposes no studios), so the per-source Catalogs tab has four toggles (Recent / Tag / Performer / Search) instead of five. Wiring mirrors the watchporn entry: `src/utils/config.ts` `VALID` adds `hqporner`; `src/lib/configureConstants.ts` adds it to `PRIMARY_SOURCES` plus `HQPORNER_CATALOG_IDS = ['hqp_recent','hqp_tag','hqp_performer','hqp_search']` (no `hqp_studio`); `src/lib/installBuilder.ts` reads `src_hqporner`, adds it to the piratebay fallback disjunction, and attaches its catalogs to install part 1 (per-catalog disable + display names like `HQporner · recent`, `id.slice(4)`); `src/components/configure/configureUiData.tsx` adds the tab + nav entry; `src/components/configure/ConfigureApp.tsx` holds the `hqpornerCatalogs` state and round-trips it; `src/lib/addonStatus.ts` adds `hqporner` to `REPORT_TO_KEY`; `src/types/config.ts` `ContentSource` adds `'hqporner'`; `src/components/configure/panels/TubeCatalogPanel.tsx` doc comment updated to note the 4-catalog shape. `tsc --noEmit` clean; `next build` clean; 234 tests pass.
  • [Added] WatchPorn source is now selectable on the configure page - the Go backend ships a fourth tube source (`watchporn.to`, `wpt_*` catalogs, multi-quality mp4), added on the Phase-0 shared `TubeSource` interface. Unlike the other tube sources it is populated by a Mac-side launchd cron (watchporn.to is TLS-blocked from prod egress), so the configure UI labels it "Mac-cron populated". The edge exposes it identically to YesPorn/Perverzija/FreePornVideos: an opt-in toggle in the Active Sources card (off by default) and a per-source Catalogs tab with five catalog toggles (Recent / Studio / Tag / Performer / Search). Wiring mirrors the yesporn entry: `src/utils/config.ts` `VALID` adds `watchporn`; `src/lib/configureConstants.ts` adds it to `PRIMARY_SOURCES` plus `WATCHPORN_CATALOG_IDS = ['wpt_recent','wpt_studio','wpt_tag','wpt_performer','wpt_search']`; `src/lib/installBuilder.ts` reads `src_watchporn`, adds it to the piratebay fallback disjunction, and attaches its catalogs to install part 1 (per-catalog disable + display names like `WatchPorn · recent`, `id.slice(4)`); `src/components/configure/configureUiData.tsx` adds the tab + nav entry; `src/components/configure/ConfigureApp.tsx` holds the `watchpornCatalogs` state and round-trips it; `src/lib/addonStatus.ts` adds `watchporn` to `REPORT_TO_KEY`; `src/types/config.ts` `ContentSource` adds `'watchporn'`. `tsc --noEmit` clean; 234 tests pass.
  • [Added] YesPorn source is now selectable on the configure page - the Go backend ships a third direct-play tube source (`yesporn.vip`, `ypv_*` catalogs, multi-quality mp4), added on the Phase-0 shared `TubeSource` interface. The edge now exposes it identically to Perverzija/FreePornVideos: an opt-in toggle in the Active Sources card (off by default) and a per-source Catalogs tab with five catalog toggles (Recent / Studio / Tag / Performer / Search). Wiring mirrors the freepornvideos entry: `src/utils/config.ts` `VALID` adds `yesporn`; `src/lib/configureConstants.ts` adds it to `PRIMARY_SOURCES` plus `YESPORN_CATALOG_IDS = ['ypv_recent','ypv_studio','ypv_tag','ypv_performer','ypv_search']`; `src/lib/installBuilder.ts` reads `src_yesporn`, adds it to the piratebay fallback disjunction, and attaches its catalogs to install part 1 (per-catalog disable + display names like `YesPorn · recent`, `id.slice(4)`); `src/components/configure/configureUiData.tsx` adds the tab + nav entry; `src/components/configure/ConfigureApp.tsx` holds the `yespornCatalogs` state and round-trips it; `src/lib/addonStatus.ts` adds `yesporn` to `REPORT_TO_KEY`; `src/types/config.ts` `ContentSource` adds `'yesporn'`. `tsc --noEmit` clean; `next build` clean; 234 tests pass.
  • [Added] Perverzija and FreePornVideos sources are now selectable on the configure page - the Go backend already ships these two direct-play tube sources (`pvz_*` / `fpv_*` catalogs, multi-quality HLS/mp4 streams), but the edge had no way to opt into them. They now appear as opt-in toggles in the Active Sources card (off by default; fresh installs keep HiddenBay + PornRips + Stripchat). Toggling one on reveals a per-source Catalogs tab with five catalog toggles (Recent / Studio / Tag / Performer / Search). Wiring: `src/utils/config.ts` `VALID` source whitelist adds `perverzija` / `freepornvideos` (without this `parseConfig` stripped them from every install config); `src/lib/configureConstants.ts` adds them to `PRIMARY_SOURCES` plus `PERVERZIJA_CATALOG_IDS` / `FREEPORNVIDEOS_CATALOG_IDS`; `src/lib/installBuilder.ts` reads `src_perverzija` / `src_freepornvideos`, adds them to the piratebay fallback disjunction (a tube-only install no longer forces piratebay on), and attaches their catalogs to install part 1 (with per-catalog disable + display names like `Perverzija · recent`, `id.slice(4)`); `src/components/configure/configureUiData.tsx` adds the two tabs + nav entries; `src/components/configure/panels/TubeCatalogPanel.tsx` (new) is one shared parameterized panel rendered for both sources instead of two near-duplicate panels; `src/components/configure/ConfigureApp.tsx` holds the catalog-toggle state and round-trips it through saved profiles; `src/lib/addonStatus.ts` adds the sources to `REPORT_TO_KEY` so MAINTENANCE/DOWN badges work once the backend reports them. `tsc --noEmit` clean; `next build` clean; 234 tests pass (3 new tube-source tests); encode/parse round-trip confirms a tube-only config decodes to exactly `["perverzija","freepornvideos"]`.
  • [Changed] 480p quality floor removed from the stream filter - `src/routes/stream.ts` `applyQualityFilter` no longer drops streams detected as 480p. A scene whose only available torrent is 480p (common for stashdb/porndb entries where the lone match is a 480p release) previously returned `{streams:[]}` through the edge, looking like the entry had no sources at all. 480p streams now pass through and sink to the bottom via the existing `QUALITY_RANK` sort (480p is unranked, so it sorts last), so higher-quality streams still surface first when present. The quality-scoped catalog filter (fhd/4k catalogs dropping non-matching resolutions) is unchanged; `detectQuality` still detects 480p for the sort. Matches backend behaviour, which never applied a 480p floor.
  • [Removed] Bitsearch dropped from the extra-indexers set - `src/routes/stream.ts` `EXTRA_INDEXER_WEBSITES` no longer lists `bitsearch`, and the "Extra indexers" toggle description in `src/components/configure/panels/SetupPanel.tsx` now reads "Add Knaben to search, plus XxxClub to browse" (was "Add Knaben & Bitsearch to search, plus XxxClub to browse"). The backend `bitsearch.eu` scraper/provider are removed in the matching `torrent-search-go` change; Knaben and XxxClub behaviour is unchanged. `tsc --noEmit` clean.
  • [Fixed] Sliplane builds timed out at 1h (stuck at 1.9.85, two deploys behind) - every cold build on the Sliplane builder hung for the full 1h timeout (the service runs `SLIPLANE_SKIP_CACHE`, so every build is cold). Builds through 1.9.85 were warm (~38s) because the builder's layer cache held a prior `node_modules`; once that cache was evicted (~Jul 12 04:58Z), every cold deploy hung. Root cause: `vitest` 4 / `vite` 7 / `@vitest/coverage-v8` (devDependencies) pull a native-binary stack whose fetch hangs on the Sliplane builder, and `next build` re-installs the entire dev tree (including those) via its "Installing devDependencies" auto-install whenever `typescript` is absent from `node_modules`. So the hang hit whichever step touched vitest: `npm ci --include=dev` installed it directly, and `npm ci --omit=dev` left `typescript` absent so `next build` auto-installed it right back. The fix has two parts that must both hold: (1) `npm ci --omit=dev --ignore-scripts` so vitest/vite/`@vitest/coverage-v8` are never installed by npm, and (2) `typescript` + `@types/*` moved from `devDependencies` to `dependencies` in `package.json` so `--omit=dev` still installs them (they are prod now), `next build` finds `typescript` present, and the auto-install never fires. vitest is now fetched by neither step. `--ignore-scripts` additionally skips the `esbuild` / `@rolldown/binding` postinstall binary fetches (their platform binaries ship as npm optionalDeps that esbuild/rolldown locate at require time, so `next build` + the `tsx src/server.ts` runtime work with scripts skipped). Verified on `node:24-alpine`: cold `docker build --no-cache` 17s, `vitest`/`vite`/`@vitest/coverage-v8` absent, `typescript` present, no "Installing devDependencies" banner, BUILD_ID present, container starts and binds :7000, 234 tests pass. Also added a `.dockerignore` (build context is just `src` + `public` + configs) and repointed the Sliplane service at the Dockerfile (`dockerfilePath: "Dockerfile"`) so it `docker build`s the image instead of using the Node buildpack. (Three earlier attempts - `--include=dev`, then `--ignore-scripts`, then pinning `node:22-alpine` - did not fix the hang; all three builds still timed out, which isolated the hang to the vitest native fetch + Next's dev-dep auto-install, not the base image or the install flags alone.)
  • [Fixed] StashDB (`stash:`) entries returned no streams through the edge - `src/routes/stream.ts` `handleStream` had a `porndb:` branch but no `stash:` branch, so a Stremio install hitting the edge fell through to the empty `{streams:[]}` return for every stashdb catalog entry. The Go backend resolves both `porndb:` and `stash:` ids to infoHashes through the same `tpdbStreams` path, so the edge now routes `stash:` through the existing `porndbStreams` resolver (debrid when configured, P2P magnet otherwise) - one-line branch widen on `id.startsWith('porndb:') || id.startsWith('stash:')`. Direct-backend installs were already working; only the edge path was broken.
  • [Fixed] Seedr streams never resolved (no torrents added, no streams) for `email:password` or PAT configs - `src/services/seedr.ts` used the premium-only `/rest/*` HTTP Basic-auth API, which returns `{"result":false,"error":"access_denied"}` for non-premium accounts on every call, so `addMagnet` failed before any torrent was added. A PAT (`sdp_...`) also failed because `parseCreds` required an `email:password` colon. Rewrote the client to route by credential type: a PAT (no `@` in `srKey`) now drives REST v2 at `https://www.seedr.cc/api/v0.1/p/` with `Authorization: Bearer` (`POST /tasks` -> poll `GET /tasks/{id}` -> `GET /fs/folder/{id}/contents` -> `GET /download/file/{id}/url`), the only path that can transfer torrents on free accounts; `email:password` drives the oauth_test v1 API (`POST /oauth_test/token.php` with `client_id=seedr_chrome` -> `POST /oauth_test/resource.php` with `func=`), and on non-premium accounts surfaces a clear error pointing the user at a PAT instead of failing opaquely. The torrent-URL fallback now derives the infohash from the `.torrent` (`fetchInfoHashFromTorrentUrl`) and reuses the magnet path. Configure UI label, README, and docs updated to document the PAT option. `tsc --noEmit` clean; 231 tests pass; verified live end-to-end against a free account (zero quota, cached Sintel).

1.9.80

2026-07-04
  • [Changed] Dockerfile OCI label no longer describes the addon as "adult torrent catalogs with Real-Debrid" - the `org.opencontainers.image.description` now reflects the actual surface: 12 debrid providers, six catalog sources (HiddenBay, PornRips, Hentai, Sukebei, TPDB, StashDB), Stripchat live HLS, and the React/Next.js configure UI.
  • [Changed] README env table expanded from the common 9 knobs to the full operator surface - added `ADMIN_TOKEN`, `SESSION_SECRET`, `ALLOW_USER_BACKEND`, `TRUST_PROXY_HOPS`, the three `RATE_LIMIT_*` caps, the `MONGO_*` family pointer, and the `TTL_*` range, each cross-checked against `.env.example` and `docs/configuration.md`. The full reference still lives in `docs/configuration.md`; the README now lists the knobs operators actually reach for.
  • [Changed] CLAUDE.md converted from full standalone content to a thin pointer at AGENTS.md - AGENTS.md is now the single source of truth for agent instructions (project overview, file table, data flow, commands, conventions, the "Keeping docs & instructions in sync" section). Cursor rules (`.cursor/rules/graphify.mdc`, `no-em-dashes.mdc`) and `.opencode/opencode.json` (ponytail plugin wiring) added; the existing `.opencode/agents/sliplane-ssh.md` is kept.
  • [Added] Stripchat feature documented end-to-end (previously zero mentions in README + docs/) - new README "Stripchat Live Cams" section and a dedicated `docs/stripchat.md` page covering the three services (`stripchatHls.ts`, `stripchatKeys.ts`, `stripchatMouflon.ts`), the two routes (`/stripchat/hls/:username/:quality`, `/stripchat/seg?url=`), the MOUFLON v2 decryption flow, the `PD_KEY_*` env wiring, and why streams play in the Stremio internal player (`notWebReady: false` + CSP dropped from `/stripchat/*` media-proxy responses).
  • [Added] Previously-undocumented endpoints added to the README "HTTP API" table - `/stripchat/hls`, `/stripchat/seg`, `/admin/flush-cat-cache`, `/api/profile`, and `/health` are now listed alongside the Stremio protocol routes.
  • [Added] AGENTS.md created as the single source of truth for agent instructions across Claude Code, Cursor, and OpenCode.
  • [Fixed] Em/en-dash sweep across README + docs/ - replaced every U+2014 (em dash) and U+2013 (en dash) with `-` or restructured prose across `docs/privacy.html` (15 hits incl. the `<title>`), `docs/*.md` (~270 hits across architecture, configuration, code-structure, development, providers-and-streams, go-migration, and the vendored refactor skill phases). Code identifiers, URLs, flags, and backticked content untouched. `grep -rn '[—–]' README.md docs/` now returns zero hits.

1.9.79

2026-07-03
  • [Fixed] Stripchat streams still routed to external players after the CSP fix (only MPV played) - `stripchatStreams` (`src/services/stripchatHls.ts`) set `behaviorHints: { notWebReady: true }` on every variant, telling Stremio to skip its internal player and hand off to external players, of which only MPV could play the live HLS. The `/stripchat/hls` proxy serves a standard, MOUFLON-decrypted HLS playlist with direct CDN segments - fully web-ready, the same shape debrid streams (`notWebReady: false`) play inline. Flipped the variant return to `notWebReady: false` so Stremio uses its internal hls.js player. The two `url: ''` error placeholders (pkey extraction failed / stale) keep `notWebReady: true` so Stremio doesn't try to play an empty URL inline. `tsc --noEmit` clean; 49 stripchat tests pass.

1.9.78

2026-07-03
  • [Fixed] Stripchat streams load but never play in the Stremio internal player - the global CSP middleware added in 1.9.71 (`src/createExpressApp.ts`) set `Content-Security-Policy` (incl. `frame-ancestors https://web.stremio.com https://app.stremio.com https://stremio.com`) on every response, including the `/stripchat/hls/:username/:quality` and `/stripchat/seg` media-proxy responses. Stripchat stream URLs point at the addon's own proxy (unlike debrid streams, which point at external CDNs and never receive the addon CSP), so Stremio's player was handed a CSP-gated m3u8 - the playlist loaded but playback never started, and Stremio cycled through fallback players. CSP/frame-ancestors are document headers with no security value on non-HTML `application/vnd.apple.mpegurl` / `video/mp4` subresource responses. Fix: the global middleware now skips setting CSP on `/stripchat/*` paths (alongside the existing `/configure` HTML GET skip), so media proxies serve no CSP while every document/API route keeps it. Verified locally: `/stripchat/hls/...` returns 200 with no CSP and the playlist still decrypts; `/stream/...` and `/configure` keep CSP. `tsc --noEmit` clean; 53 stripchat tests pass.

1.9.77

2026-07-02
  • [Changed] 14→12 provider-count sweep finished across the remaining docs and meta - the initial 1.9.76 AllDebrid/PikPak removal missed ten lingering "14 debrid providers" strings: the `og:description` and `twitter:description` meta in `docs/index.html`, `docs/site/site.webmanifest`, `docs/site/og-image.svg`, `docs/providers-and-streams.md`, `docs/go-migration.md` (x2), `docs/code-structure.md`, `downloads/README.md`, and the `stremioGo.ts` header comment. All now read 12. Historical CHANGELOG entries that record the old 14-provider state are intentionally left as-is.
Page 1 of 14

More questions

Is the TPB 4K Porn Stremio addon working right now?
Yes. The addon and all of its sources (TPB/HiddenBay, PornRips scenes, Hentai, Sukebei, Stripchat, ThePornDB) are live. Check the status section on this page for the current state of each source.
What sources does TPB 4K Porn include?
4K and 1080p torrent catalogs from TPB/HiddenBay, PornRips scene releases, Hentai episode series, Sukebei torrents (beta), Stripchat live cam catalogs (beta), and a ThePornDB scene browser with optional TPDB/StashDB metadata.
Which debrid providers does TPB 4K Porn support?
Real-Debrid, TorBox, Premiumize, EasyDebrid, Debrid-Link, Offcloud, Put.io, Deepbrid, LinkSnappy, Mega-Debrid, Debrider, and Seedr. Torrent P2P playback also works without a debrid account.