From d5c07465da98fa42e1b13499380137cf28912b84 Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Thu, 15 Oct 2026 11:53:36 +0200 Subject: [PATCH] docs: spec 003 (Tapas source), its plan, and captured Tapas fixtures Co-Authored-By: Claude Opus 5.5 --- docs/plans/003-tapas.md | 47 + docs/specs/003-tapas.md | 69 + .../tapas/verify-age-dog-and-bird.html | 1740 ++++++++ .../tapas/villains-episode-viewer.html | 3308 ++++++++++++++ test/fixtures/tapas/villains-info.html | 3785 +++++++++++++++++ test/fixtures/tapas/villains-novel-info.html | 3698 ++++++++++++++++ .../fixtures/wayback/tapas-villains-2020.html | 2174 ++++++++++ test/fixtures/wayback/tapas-villains-cdx.txt | 182 + 8 files changed, 15003 insertions(+) create mode 100644 docs/plans/003-tapas.md create mode 100644 docs/specs/003-tapas.md create mode 100644 test/fixtures/tapas/verify-age-dog-and-bird.html create mode 100644 test/fixtures/tapas/villains-episode-viewer.html create mode 100644 test/fixtures/tapas/villains-info.html create mode 100644 test/fixtures/tapas/villains-novel-info.html create mode 100644 test/fixtures/wayback/tapas-villains-2020.html create mode 100644 test/fixtures/wayback/tapas-villains-cdx.txt diff --git a/docs/plans/003-tapas.md b/docs/plans/003-tapas.md new file mode 100644 index 0000000..a23aab8 --- /dev/null +++ b/docs/plans/003-tapas.md @@ -0,0 +1,47 @@ +# Tapas source — implementation plan + +> **For agentic workers:** superpowers:executing-plans (native, the user's standing choice). Checkbox steps. + +**Goal:** a `tapas` Source (comics and novels) registered next to `webtoons`. +**Architecture:** `src/core/sources/tapas/{urls,parse,index}.ts` mirroring `webtoons/`; one registry line; host +lists; source-neutral copy. **Spec:** [`docs/specs/003-tapas.md`](../specs/003-tapas.md). + +## Global constraints +- `src/core` pure (no DOM/Bun/node/GM). Tests offline, fixtures captured (done: `test/fixtures/tapas/*`, + `test/fixtures/wayback/tapas-villains-*`). No new dependencies. + +## Review focus +1. Wayback rows for `-novel` must not count as the comic. → Task 1 same-series test, Task 3 history test. +2. Age-gated series must not fail the run. → Task 3 test. +3. CloudFront URLs from 2020 normalise to `us-a.tapas.io` without the size suffix. → Task 1 test. +4. Episode links resolve to the series. → Task 3 test. +5. Capitalised/underscored slugs (`RU_Screwed`) parse. → Task 1 test. + +### Task 1: URLs (`tapas/urls.ts`) +**Produces:** `TAPAS_HOSTS`, `IMAGE_HOST = "us-a.tapas.io"`, `IMAGE_HOSTS`, `parseTapasUrl(url): TapasRef` +(`{ kind: "series", key: string /* slug or id */ } | { kind: "episode", id: string }`), `isTapasUrl(url)`, +`infoUrl(key)`, `normalizeImageUrl(raw)`, `isSameTapasSeries(linkUrl, slug, id)`, `slugOf(canonicalUrl)`. +- [ ] Tests: every link form; non-series paths rejected (`/comics`, `/series/`); normalisation (cloudfront → us-a, + `_z`/`_m` dropped, query dropped, other hosts untouched); same-series by slug (case-insensitive, `/info`, + trailing slash), by id, `-novel` rejected. RED → implement → GREEN → commit. + +### Task 2: Parsing (`tapas/parse.ts`) +**Produces:** `parseInfoPage(html, pageUrl): { id, title, canonicalUrl, novel, covers }`, `extractCovers(html, +pageUrl)`, `episodeSeriesId(html)`, `ageGateTarget(html): string | null`. +- [ ] Tests on fixtures: comic (id 186414, title, not novel, poster 960×1440 URL, banner), novel (266599, novel), + 2020 archive (cloudfront poster + banner normalised), reader page (`seriesId` 186414), age check (`from` URL). + RED → implement → GREEN → commit. + +### Task 3: Source (`tapas/index.ts`) and registry +- [ ] Tests through `FakeTransport`: info link; `/series/` (fake redirect = info page served for id URL); + episode link (two fetches); age check (mature, no covers, warning via a `SourceSeries` flag read by the + pipeline → add `ageGated` flag and pipeline warning); Wayback history over the CDX fixture keeps only the + comic rows. Register in `SOURCES`; hosts. RED → implement → GREEN → commit. + +### Task 4: Copy, userscript @connect, docs +- [ ] Link hint, "No rehosting" warning, userscript description/@connect (+ gm test), README sources section, + ARCHITECTURE map, DECISIONS entry. Commit. + +### Task 5: Verify +- [ ] Real run in headless Chrome: comic and novel (no Wayback), and one with Wayback every 12 months; final + review; remove this plan; merge; push. diff --git a/docs/specs/003-tapas.md b/docs/specs/003-tapas.md new file mode 100644 index 0000000..86dc58f --- /dev/null +++ b/docs/specs/003-tapas.md @@ -0,0 +1,69 @@ +--- +status: approved +--- + +# 003 — Tapas source + +A second source (spec 001 §4.1): covers of a [Tapas](https://tapas.io) series, comics and novels. Design approved +by the user in chat on 2026-10-15 ("Comics and novels"). Everything else — inspection, dedupe, Wayback history, +hosting, download, history — is the existing pipeline. + +## 1. Verified facts (2026-10-15) + +Checked against *Villains Are Destined to Die* (comic, id 186414) and its novel (id 266599), a mature series +(id 286112) and Wayback captures since 2020-10. Fixtures in `test/fixtures/tapas/` and `test/fixtures/wayback/tapas-*`. + +- **Series page:** `https://tapas.io/series//info` (its own canonical URL). `/series/` serves the + episode reader (canonical `/episode/`). `/series//info` redirects to the slug form. Slugs may contain + capitals and underscores (`/series/RU_Screwed`). +- **Series id:** on the info page `pageMeta : { id: , type: 'series_id' }`; on the reader `seriesId: `. +- **Comic or novel:** the stats row links `/static-landing/genre?category=COMIC` or `…=NOVEL`. `og:type` is + `comicpanda:webcomic_series` for both. +- **Title:** the cover image's `alt` in `.thumb-wrapper`; `og:title` is "Read | Tapas Web Comics". +- **Images** (`us-a.tapas.io/sa/<xx>/<uuid>[_<size>].<ext>`, no token, no Referer needed): + - **Portrait cover:** the `<img>` in `.thumb-wrapper` (both the info page and the 2020 reader page), + `…_z.jpg` = 400×600. Without the suffix: the original, 960×1440. + - **Banner:** `og:image` (also the `js-top-banner` / `header-layer` background), 1280×460, no suffix. + - Lists use `_m` (180 px) of other images; `pc/…` images are signed promotions of other series. Neither is used. + - Older pages use `d30womf5coomej.cloudfront.net/sa/…`; the same paths answer on `us-a.tapas.io`. +- **Mature series:** without a signed-in, age-verified account, `/series/…/info` redirects to + `/account/verify-age?from=https://tapas.io/series/<slug>/info`, a page with no series data. The userscript's + `GM_xmlhttpRequest` sends the user's own tapas.io cookies, so a signed-in adult gets the real page there. +- **Language:** English only (MangaBaka `en`). +- **Wayback:** `tapas.io/series/<slug>` captured about monthly since 2020; the prefix also matches + `<slug>-novel` and other longer slugs. + +## 2. Behaviour + +- **Links accepted:** `tapas.io/series/<slug>`, `…/info`, `…/<id>`, `…/<id>/info`, and `tapas.io/episode/<id>` + (the reader page names its series id). `www.` and `m.` hosts too. Fetched as `https://tapas.io/series/<slug or + id>/info`; an episode link first fetches the episode page for its series id. +- **Series:** `externalId` = the numeric id, `title`, `language: "en"`, `canonicalUrl` = + `https://tapas.io/series/<slug>/info`, `flags.novel`, `archiveUrls` = [`tapas.io/series/<slug>`]. +- **Current covers:** portrait (role `poster`, suffix removed) and banner (role `banner`). The poster is the + suggested main cover as for Webtoons. +- **Mature (age check):** the series is resolved from the `from=` link (slug; title from the slug), `mature: true`, + no current covers, and a warning: Tapas shows this series only to signed-in adults; use the userscript while + signed in, or tick the Wayback history. History still runs. +- **Image URLs:** `normalizeImageUrl` maps both image hosts to `us-a.tapas.io`, drops `_<letters>` size suffixes + after the UUID and any query. +- **Same series:** a link is the same series when it is a tapas.io `/series/<slug>[/info][/]` with the same slug + (case-insensitive) or `/series/<id>[/info]` with the same id. This also filters Wayback rows (`-novel`). +- **Hosts:** fetch `tapas.io`, `www.tapas.io`, `m.tapas.io`, `us-a.tapas.io`, `d30womf5coomej.cloudfront.net`; + images `us-a.tapas.io`, `d30womf5coomej.cloudfront.net`. The userscript `@connect`s `tapas.io` and the + CloudFront host. +- **Chrome:** source-neutral where it named WEBTOON: the link hint ("WEBTOON or Tapas for now"), the + "No rehosting" warning ("the source's own image URL"), the userscript description. + +## 3. Testing + +Unit tests on the captured pages, no network: link parsing (every form, rejects), page parsing (comic, novel, +reader, 2020 archive, age check), URL normalisation, same-series (slug, id, `-novel` rejected), and the source +end to end through the fake transport (info page, episode link, age check, `/series/<id>` redirect). +Then a real run in headless Chrome for one comic and one novel. + +## 4. Risks + +- Tapas markup changes; the parser looks for two stable hooks (`thumb-wrapper`, `og:image`) and the page type link. +- The info page may show a mature badge to signed-in users that we never saw; mature is only known from the + age check. diff --git a/test/fixtures/tapas/verify-age-dog-and-bird.html b/test/fixtures/tapas/verify-age-dog-and-bird.html new file mode 100644 index 0000000..081dc6a --- /dev/null +++ b/test/fixtures/tapas/verify-age-dog-and-bird.html @@ -0,0 +1,1740 @@ + + + + + +<!DOCTYPE html> +<html> +<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# comicpanda: http://ogp.me/ns/fb/comicpanda#" itemscope itemtype="http://schema.org/Article"> + <title>Age Verification | Tapas + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+ + +
+ + + +
+
+
+
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + +
+ +
+ +
+
+ +
+ + + + + + + + + + + + + + + + +
+
+ +

Verify your age

+

You must be 18 years or older to continue browsing mature content. Please verify your age.

+
+ + + +
+
+
+

MM

+ +
+
    + +
  • January

  • + +
  • February

  • + +
  • March

  • + +
  • April

  • + +
  • May

  • + +
  • June

  • + +
  • July

  • + +
  • August

  • + +
  • September

  • + +
  • October

  • + +
  • November

  • + +
  • December

  • + +
+
+
+
+

DD

+ +
+
    + +
  • 1

  • + +
  • 2

  • + +
  • 3

  • + +
  • 4

  • + +
  • 5

  • + +
  • 6

  • + +
  • 7

  • + +
  • 8

  • + +
  • 9

  • + +
  • 10

  • + +
  • 11

  • + +
  • 12

  • + +
  • 13

  • + +
  • 14

  • + +
  • 15

  • + +
  • 16

  • + +
  • 17

  • + +
  • 18

  • + +
  • 19

  • + +
  • 20

  • + +
  • 21

  • + +
  • 22

  • + +
  • 23

  • + +
  • 24

  • + +
  • 25

  • + +
  • 26

  • + +
  • 27

  • + +
  • 28

  • + +
  • 29

  • + +
  • 30

  • + +
  • 31

  • + +
+
+
+
+

YYYY

+ +
+
    + +
  • 2026

  • + +
  • 2025

  • + +
  • 2024

  • + +
  • 2023

  • + +
  • 2022

  • + +
  • 2021

  • + +
  • 2020

  • + +
  • 2019

  • + +
  • 2018

  • + +
  • 2017

  • + +
  • 2016

  • + +
  • 2015

  • + +
  • 2014

  • + +
  • 2013

  • + +
  • 2012

  • + +
  • 2011

  • + +
  • 2010

  • + +
  • 2009

  • + +
  • 2008

  • + +
  • 2007

  • + +
  • 2006

  • + +
  • 2005

  • + +
  • 2004

  • + +
  • 2003

  • + +
  • 2002

  • + +
  • 2001

  • + +
  • 2000

  • + +
  • 1999

  • + +
  • 1998

  • + +
  • 1997

  • + +
  • 1996

  • + +
  • 1995

  • + +
  • 1994

  • + +
  • 1993

  • + +
  • 1992

  • + +
  • 1991

  • + +
  • 1990

  • + +
  • 1989

  • + +
  • 1988

  • + +
  • 1987

  • + +
  • 1986

  • + +
  • 1985

  • + +
  • 1984

  • + +
  • 1983

  • + +
  • 1982

  • + +
  • 1981

  • + +
  • 1980

  • + +
  • 1979

  • + +
  • 1978

  • + +
  • 1977

  • + +
  • 1976

  • + +
  • 1975

  • + +
  • 1974

  • + +
  • 1973

  • + +
  • 1972

  • + +
  • 1971

  • + +
  • 1970

  • + +
  • 1969

  • + +
  • 1968

  • + +
  • 1967

  • + +
  • 1966

  • + +
  • 1965

  • + +
  • 1964

  • + +
  • 1963

  • + +
  • 1962

  • + +
  • 1961

  • + +
  • 1960

  • + +
  • 1959

  • + +
  • 1958

  • + +
  • 1957

  • + +
  • 1956

  • + +
  • 1955

  • + +
  • 1954

  • + +
  • 1953

  • + +
  • 1952

  • + +
  • 1951

  • + +
  • 1950

  • + +
  • 1949

  • + +
  • 1948

  • + +
  • 1947

  • + +
  • 1946

  • + +
  • 1945

  • + +
  • 1944

  • + +
  • 1943

  • + +
  • 1942

  • + +
  • 1941

  • + +
  • 1940

  • + +
  • 1939

  • + +
  • 1938

  • + +
  • 1937

  • + +
  • 1936

  • + +
  • 1935

  • + +
  • 1934

  • + +
  • 1933

  • + +
  • 1932

  • + +
  • 1931

  • + +
  • 1930

  • + +
  • 1929

  • + +
  • 1928

  • + +
  • 1927

  • + +
  • 1926

  • + +
  • 1925

  • + +
  • 1924

  • + +
  • 1923

  • + +
  • 1922

  • + +
  • 1921

  • + +
  • 1920

  • + +
  • 1919

  • + +
  • 1918

  • + +
  • 1917

  • + +
  • 1916

  • + +
  • 1915

  • + +
  • 1914

  • + +
  • 1913

  • + +
  • 1912

  • + +
  • 1911

  • + +
  • 1910

  • + +
  • 1909

  • + +
  • 1908

  • + +
  • 1907

  • + +
  • 1906

  • + +
  • 1905

  • + +
  • 1904

  • + +
  • 1903

  • + +
  • 1902

  • + +
  • 1901

  • + +
+
+
+
+ Cancel + +
+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/tapas/villains-episode-viewer.html b/test/fixtures/tapas/villains-episode-viewer.html new file mode 100644 index 0000000..8e6e3f8 --- /dev/null +++ b/test/fixtures/tapas/villains-episode-viewer.html @@ -0,0 +1,3308 @@ + + + + + + + + + Read Villains Are Destined to Die | Tapas Web Comics + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/tapas/villains-info.html b/test/fixtures/tapas/villains-info.html new file mode 100644 index 0000000..32fbf54 --- /dev/null +++ b/test/fixtures/tapas/villains-info.html @@ -0,0 +1,3785 @@ + + + + + + + + + Read Villains Are Destined to Die | Tapas Web Comics + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+ + +
+ + + +
+
+
+
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + +
+ +
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/tapas/villains-novel-info.html b/test/fixtures/tapas/villains-novel-info.html new file mode 100644 index 0000000..e42b6a1 --- /dev/null +++ b/test/fixtures/tapas/villains-novel-info.html @@ -0,0 +1,3698 @@ + + + + + + + + + Read Villains Are Destined to Die | Tapas Web Novels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+ + +
+ + + +
+
+
+
+ + + + + + + + +
+ Home +
+ + + + + + + + + + +
+ Comics +
+ + + + + + + + + + +
+ Novels +
+ + + + + + + + + + +
+ Community +
+ + + + + + + + + + +
+ Mature +
+ + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + +
+ +
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/wayback/tapas-villains-2020.html b/test/fixtures/wayback/tapas-villains-2020.html new file mode 100644 index 0000000..27b887f --- /dev/null +++ b/test/fixtures/wayback/tapas-villains-2020.html @@ -0,0 +1,2174 @@ + + + + + + + + + Villains Are Destined to Die | Tapas + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/wayback/tapas-villains-cdx.txt b/test/fixtures/wayback/tapas-villains-cdx.txt new file mode 100644 index 0000000..fd1524a --- /dev/null +++ b/test/fixtures/wayback/tapas-villains-cdx.txt @@ -0,0 +1,182 @@ +20201031233824 https://tapas.io/series/villains-are-destined-to-die +20201101073743 https://tapas.io/series/villains-are-destined-to-die +20201201230244 https://tapas.io/series/villains-are-destined-to-die +20210115210204 https://tapas.io/series/villains-are-destined-to-die +20210310220234 https://tapas.io/series/villains-are-destined-to-die +20210815193810 https://tapas.io/series/villains-are-destined-to-die +20220207235742 https://tapas.io/series/villains-are-destined-to-die/ +20220314091858 https://tapas.io/series/villains-are-destined-to-die +20221020175350 https://tapas.io/series/villains-are-destined-to-die +20230130104227 https://tapas.io/series/villains-are-destined-to-die +20230216203609 https://tapas.io/series/villains-are-destined-to-die +20230711060200 https://tapas.io/series/villains-are-destined-to-die +20240324214731 https://tapas.io/series/villains-are-destined-to-die +20240722175417 https://tapas.io/series/villains-are-destined-to-die +20240910161454 https://tapas.io/series/villains-are-destined-to-die +20241002071717 https://tapas.io/series/villains-are-destined-to-die +20241122170150 https://tapas.io/series/villains-are-destined-to-die +20241210090231 https://tapas.io/series/villains-are-destined-to-die +20250321012616 https://tapas.io/series/villains-are-destined-to-die +20250401004641 https://tapas.io/series/villains-are-destined-to-die +20250801205333 https://tapas.io/series/villains-are-destined-to-die +20251112024545 https://tapas.io/series/villains-are-destined-to-die +20251201020925 https://tapas.io/series/villains-are-destined-to-die +20260112215610 https://tapas.io/series/villains-are-destined-to-die +20260309000646 https://tapas.io/series/villains-are-destined-to-die +20260527150043 https://tapas.io/series/villains-are-destined-to-die +20260701201337 https://tapas.io/series/villains-are-destined-to-die +20260825092034 https://tapas.io/series/villains-are-destined-to-die +20260908215721 https://tapas.io/series/villains-are-destined-to-die +20261011020749 https://tapas.io/series/villains-are-destined-to-die +20230916222951 https://tapas.io/series/villains-are-destined-to-die-novel +20231207104017 https://tapas.io/series/villains-are-destined-to-die-novel +20240101234523 https://tapas.io/series/villains-are-destined-to-die-novel +20240203072125 https://tapas.io/series/villains-are-destined-to-die-novel +20240302031318 https://tapas.io/series/villains-are-destined-to-die-novel +20240402010836 https://tapas.io/series/villains-are-destined-to-die-novel +20240502022841 https://tapas.io/series/villains-are-destined-to-die-novel +20240605030250 https://tapas.io/series/villains-are-destined-to-die-novel +20240705062104 https://tapas.io/series/villains-are-destined-to-die-novel +20240801210136 https://tapas.io/series/villains-are-destined-to-die-novel +20240902111241 https://tapas.io/series/villains-are-destined-to-die-novel +20241109074723 https://tapas.io/series/villains-are-destined-to-die-novel +20241210034115 https://tapas.io/series/villains-are-destined-to-die-novel +20250115001019 https://tapas.io/series/villains-are-destined-to-die-novel +20250203123143 https://tapas.io/series/villains-are-destined-to-die-novel +20250403074738 https://tapas.io/series/villains-are-destined-to-die-novel +20250711024058 https://tapas.io/series/villains-are-destined-to-die-novel +20251116194411 https://tapas.io/series/villains-are-destined-to-die-novel +20251219041119 https://tapas.io/series/villains-are-destined-to-die-novel +20260214141029 https://tapas.io/series/villains-are-destined-to-die-novel +20260819182839 https://tapas.io/series/villains-are-destined-to-die-novel +20260913185942 https://tapas.io/series/villains-are-destined-to-die-novel +20231221015719 https://tapas.io/series/villains-are-destined-to-die-novel/info +20240322004209 https://tapas.io/series/villains-are-destined-to-die-novel/info +20240506074459 https://tapas.io/series/villains-are-destined-to-die-novel/info +20240623184336 https://tapas.io/series/villains-are-destined-to-die-novel/info +20240712220349 https://tapas.io/series/villains-are-destined-to-die-novel/info +20240905185533 https://tapas.io/series/villains-are-destined-to-die-novel/info +20241203140218 https://tapas.io/series/villains-are-destined-to-die-novel/info +20250124084148 https://tapas.io/series/villains-are-destined-to-die-novel/info +20250228023359 https://tapas.io/series/villains-are-destined-to-die-novel/info +20250319155034 https://tapas.io/series/villains-are-destined-to-die-novel/info +20250426151250 https://tapas.io/series/villains-are-destined-to-die-novel/info +20250729162654 https://tapas.io/series/villains-are-destined-to-die-novel/info +20251008221657 https://tapas.io/series/villains-are-destined-to-die-novel/info +20251208081857 https://tapas.io/series/villains-are-destined-to-die-novel/info +20260215113844 https://tapas.io/series/villains-are-destined-to-die-novel/info +20260913185954 https://tapas.io/series/villains-are-destined-to-die-novel/info +20261003173459 https://tapas.io/series/villains-are-destined-to-die-novel/?_escaped_fragment_=/go-to-top +20260923013556 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1881&c_title=%F0%9F%8F%86Tapas%20Top%20Titles%F0%9F%8F%86 +20241004093328 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1888&c_title=%F0%9F%8E%86March%20Series%20Finale%20Sale%F0%9F%8E%87 +20260923025415 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1888&c_title=%F0%9F%8E%86March%20Series%20Finale%20Sale%F0%9F%8E%87 +20260227125134 https://tapas.io/series/villains-are-destined-to-die/announcement +20201101061815 https://tapas.io/series/villains-are-destined-to-die/info +20201209223441 https://tapas.io/series/villains-are-destined-to-die/info +20210720144012 https://tapas.io/series/villains-are-destined-to-die/info +20220307133159 https://tapas.io/series/villains-are-destined-to-die/info +20220616190944 https://tapas.io/series/villains-are-destined-to-die/info +20221024005722 https://tapas.io/series/villains-are-destined-to-die/info +20221105204538 https://tapas.io/series/villains-are-destined-to-die/info +20230325233316 https://tapas.io/series/villains-are-destined-to-die/info +20230417173531 https://tapas.io/series/villains-are-destined-to-die/info +20241109074750 https://tapas.io/series/villains-are-destined-to-die/info +20241207140447 https://tapas.io/series/villains-are-destined-to-die/info +20250116032916 https://tapas.io/series/villains-are-destined-to-die/info +20250203123325 https://tapas.io/series/villains-are-destined-to-die/info +20250304001719 https://tapas.io/series/villains-are-destined-to-die/info +20250419222427 https://tapas.io/series/villains-are-destined-to-die/info +20250801205419 https://tapas.io/series/villains-are-destined-to-die/info +20251002220415 https://tapas.io/series/villains-are-destined-to-die/info +20251124103547 https://tapas.io/series/villains-are-destined-to-die/info +20251213022322 https://tapas.io/series/villains-are-destined-to-die/info +20260306115123 https://tapas.io/series/villains-are-destined-to-die/info +20260604195453 https://tapas.io/series/villains-are-destined-to-die/info +20260815195119 https://tapas.io/series/villains-are-destined-to-die/info +20260905232522 https://tapas.io/series/villains-are-destined-to-die/info +20261003190724 https://tapas.io/series/villains-are-destined-to-die/info +20260925012911 https://tapas.io/series/villains-are-destined-to-die/?_escaped_fragment_= +20230127171805 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection +20250513063636 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection +20260923015219 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection +20240224192751 https://tapas.io/series/villains-are-destined-to-die?c_id=1011&c_title=Women%27s%20History%20Month +20260923024728 https://tapas.io/series/villains-are-destined-to-die?c_id=1011&c_title=Women%27s%20History%20Month +20230329141002 https://tapas.io/series/villains-are-destined-to-die?c_id=1031&c_title=Fight%20for%20Love +20260923014557 https://tapas.io/series/villains-are-destined-to-die?c_id=1031&c_title=Fight%20for%20Love +20240225201156 https://tapas.io/series/villains-are-destined-to-die?c_id=1055&c_title=Best%20of%20Romance +20260923013434 https://tapas.io/series/villains-are-destined-to-die?c_id=1055&c_title=Best%20of%20Romance +20220521225521 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection +20230321044352 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection +20240418234531 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection +20260923022147 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection +20230325201634 https://tapas.io/series/villains-are-destined-to-die?c_id=1078&c_title=Most_viewed_comics_romance +20260923021822 https://tapas.io/series/villains-are-destined-to-die?c_id=1078&c_title=Most_viewed_comics_romance +20240302232254 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection +20241208054523 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection +20260923025515 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection +20220523165656 https://tapas.io/series/villains-are-destined-to-die?c_id=1113&c_title=The%20Immersive%20Gaming%20collection +20260923032027 https://tapas.io/series/villains-are-destined-to-die?c_id=1113&c_title=The%20Immersive%20Gaming%20collection +20230131004552 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21 +20250514082332 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21 +20260608085958 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21 +20260923015655 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21 +20230202081423 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection +20260423000531 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection +20260923020956 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection +20250319165522 https://tapas.io/series/villains-are-destined-to-die?c_id=1397&c_title=Tyrants%20in%20love +20260923030759 https://tapas.io/series/villains-are-destined-to-die?c_id=1397&c_title=Tyrants%20in%20love +20250113210223 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games +20260422152724 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games +20260923025934 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games +20240724005926 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection +20250213134412 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection +20260923020807 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection +20240616181138 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010 +20250907141930 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010 +20260923024142 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010 +20250714001404 https://tapas.io/series/villains-are-destined-to-die?c_id=1474&c_title=Villainesses%20are%20here%20to%20Stay +20260923013259 https://tapas.io/series/villains-are-destined-to-die?c_id=1474&c_title=Villainesses%20are%20here%20to%20Stay +20251011045613 https://tapas.io/series/villains-are-destined-to-die?c_id=1479&c_title=March%20Takeover%20Week%203%20Collection +20260923014334 https://tapas.io/series/villains-are-destined-to-die?c_id=1479&c_title=March%20Takeover%20Week%203%20Collection +20250126055929 https://tapas.io/series/villains-are-destined-to-die?c_id=1491&c_title=Best%20Dramatic%20Stories%21 +20260923020334 https://tapas.io/series/villains-are-destined-to-die?c_id=1491&c_title=Best%20Dramatic%20Stories%21 +20250217164440 https://tapas.io/series/villains-are-destined-to-die?c_id=1498&c_title=Top%2010%20Romance%20Stories +20260923023032 https://tapas.io/series/villains-are-destined-to-die?c_id=1498&c_title=Top%2010%20Romance%20Stories +20250206141557 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21 +20260608151039 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21 +20260923021013 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21 +20250616192131 https://tapas.io/series/villains-are-destined-to-die?c_id=1556&c_title=Romance%20with%20Fantasy +20260923030730 https://tapas.io/series/villains-are-destined-to-die?c_id=1556&c_title=Romance%20with%20Fantasy +20230606014551 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21 +20250123124357 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21 +20260923020103 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21 +20240715233146 https://tapas.io/series/villains-are-destined-to-die?c_id=1670&c_title=Strategic%20Leads +20260923012757 https://tapas.io/series/villains-are-destined-to-die?c_id=1670&c_title=Strategic%20Leads +20250122205620 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale +20260219001555 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale +20260923021113 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale +20240811222255 https://tapas.io/series/villains-are-destined-to-die?c_id=1684&c_title=September%20Binge-A-Thon%3A%20Hand-picked%20series%20for%20you%21 +20260923023244 https://tapas.io/series/villains-are-destined-to-die?c_id=1684&c_title=September%20Binge-A-Thon%3A%20Hand-picked%20series%20for%20you%21 +20251010161412 https://tapas.io/series/villains-are-destined-to-die?c_id=1688&c_title=Hand-picked%20series%20for%20you%21 +20260923012845 https://tapas.io/series/villains-are-destined-to-die?c_id=1688&c_title=Hand-picked%20series%20for%20you%21 +20250326011650 https://tapas.io/series/villains-are-destined-to-die?c_id=1832&c_title=%F0%9F%8E%B9A%20Helpful%20Guide%20to%20Tapas%20July%20Deals%F0%9F%8E%B9 +20260923022750 https://tapas.io/series/villains-are-destined-to-die?c_id=1832&c_title=%F0%9F%8E%B9A%20Helpful%20Guide%20to%20Tapas%20July%20Deals%F0%9F%8E%B9 +20250804191603 https://tapas.io/series/villains-are-destined-to-die?c_id=1880&c_title=%F0%9F%8E%89Tapas%2012th%20Birthday%20Bash%F0%9F%8E%82 +20260923020934 https://tapas.io/series/villains-are-destined-to-die?c_id=1880&c_title=%F0%9F%8E%89Tapas%2012th%20Birthday%20Bash%F0%9F%8E%82 +20250521233327 https://tapas.io/series/villains-are-destined-to-die?c_id=1882&c_title=%5BBirthday%20Bash%5D%20Romance +20260923020348 https://tapas.io/series/villains-are-destined-to-die?c_id=1882&c_title=%5BBirthday%20Bash%5D%20Romance +20220129003329 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics +20221207052610 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics +20230321162858 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics +20220309091051 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured+comics +20260923015856 https://tapas.io/series/villains-are-destined-to-die?c_id=911&c_title=Grateful%20for%20Love%F0%9F%92%9D +20240221075429 https://tapas.io/series/villains-are-destined-to-die?c_id=937&c_title=Best%20of%202020 +20260923021202 https://tapas.io/series/villains-are-destined-to-die?c_id=937&c_title=Best%20of%202020 +20250719171504 https://tapas.io/series/villains-are-destined-to-die?c_id=953&c_title=%E2%9D%84%EF%B8%8FLet%20It%20Snow%20Hide%20and%20Seek%20Challenge%E2%9D%84%EF%B8%8F +20260923033236 https://tapas.io/series/villains-are-destined-to-die?c_id=953&c_title=%E2%9D%84%EF%B8%8FLet%20It%20Snow%20Hide%20and%20Seek%20Challenge%E2%9D%84%EF%B8%8F +20230127080232 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on +20241011084243 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on +20260923015454 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on +20220521133810 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21 +20230320232000 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21 +20260923020331 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21