From 4f42774e83589cfd2a46efe5672678deb66f1a64 Mon Sep 17 00:00:00 2001
From: Bad Manners <me@badmanners.xyz>
Date: Sun, 15 Dec 2024 15:30:12 -0300
Subject: [PATCH] Migrate tags to single file

---
 .vscode/settings.json                         |   1 -
 src/content.config.ts                         |   7 +-
 src/data/tag-categories/1-types-of-vore.yaml  |  23 --
 .../10-recurring-characters.yaml              |  13 -
 src/data/tag-categories/2-body-types.yaml     |  23 --
 src/data/tag-categories/3-genders.yaml        |  35 ---
 src/data/tag-categories/4-relative-size.yaml  |  17 -
 src/data/tag-categories/5-willingness.yaml    |  23 --
 .../6-vore-related-scenarios.yaml             |  77 -----
 src/data/tag-categories/7-sexual-content.yaml |  25 --
 src/data/tag-categories/8-other-kinks.yaml    |  31 --
 .../tag-categories/9-type-of-content.yaml     |  27 --
 src/data/tags.yaml                            | 294 ++++++++++++++++++
 src/pages/tags.astro                          |  65 ++--
 14 files changed, 326 insertions(+), 335 deletions(-)
 delete mode 100644 src/data/tag-categories/1-types-of-vore.yaml
 delete mode 100644 src/data/tag-categories/10-recurring-characters.yaml
 delete mode 100644 src/data/tag-categories/2-body-types.yaml
 delete mode 100644 src/data/tag-categories/3-genders.yaml
 delete mode 100644 src/data/tag-categories/4-relative-size.yaml
 delete mode 100644 src/data/tag-categories/5-willingness.yaml
 delete mode 100644 src/data/tag-categories/6-vore-related-scenarios.yaml
 delete mode 100644 src/data/tag-categories/7-sexual-content.yaml
 delete mode 100644 src/data/tag-categories/8-other-kinks.yaml
 delete mode 100644 src/data/tag-categories/9-type-of-content.yaml
 create mode 100644 src/data/tags.yaml

diff --git a/.vscode/settings.json b/.vscode/settings.json
index 8ec09b3..b49b932 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,7 +4,6 @@
   },
   "yaml.schemas": {
     "./.astro/collections/series.schema.json": "/src/data/series/**",
-    "./.astro/collections/tag-categories.schema.json": "/src/data/tag-categories/**",
     "./.astro/collections/users.schema.json": "/src/data/users/**"
   },
   "[astro]": {
diff --git a/src/content.config.ts b/src/content.config.ts
index 159ef0a..0c06058 100644
--- a/src/content.config.ts
+++ b/src/content.config.ts
@@ -1,5 +1,5 @@
 import { defineCollection, reference, z } from "astro:content";
-import { glob } from "astro/loaders";
+import { file, glob } from "astro/loaders";
 
 // Constants
 
@@ -359,11 +359,10 @@ const seriesCollection = defineCollection({
 });
 
 const tagCategoriesCollection = defineCollection({
-  loader: glob({ pattern: "*.{yml,yaml}", base: "./src/data/tag-categories" }),
+  loader: file("./src/data/tags.yaml"),
   schema: z.object({
     // Required parameters
-    name: z.string(),
-    index: z.number().int(),
+    category: z.string(),
     tags: z
       .array(
         z.object({
diff --git a/src/data/tag-categories/1-types-of-vore.yaml b/src/data/tag-categories/1-types-of-vore.yaml
deleted file mode 100644
index f012fb8..0000000
--- a/src/data/tag-categories/1-types-of-vore.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Types of vore
-index: 1
-tags:
-  - name: { en: oral vore, tok: moku musi kepeken uta }
-    description:
-      en: Scenarios where prey are consumed by the predator's mouth.
-      tok: jan li moku musi e jan ante kepeken uta.
-  - name: anal vore
-    description: Scenarios where prey are consumed by the predator's butt/anus.
-  - name: cock vore
-    description: Scenarios where prey are consumed by the predator's penis.
-  - name: unbirth
-    description: Scenarios where prey are consumed by the predator's vagina/vulva, sometimes also called "vaginal vore".
-  - name: tail vore
-    description: Scenarios where prey are consumed by the predator's tail, through an opening or mouth on the appendage.
-  - name: slit vore
-    description: Scenarios where prey are consumed by the predator's genital slit.
-  - name: sheath vore
-    description: Scenarios where prey are consumed by the predator's genital sheath around their penis.
-  - name: nipple vore
-    description: Scenarios where prey are consumed by the predator's breast, through the nipples or cleavage.
-  - name: chest maw vore
-    description: Scenarios where prey are consumed by the predator's chest, through a maw on their chest cavity.
diff --git a/src/data/tag-categories/10-recurring-characters.yaml b/src/data/tag-categories/10-recurring-characters.yaml
deleted file mode 100644
index 1b6e795..0000000
--- a/src/data/tag-categories/10-recurring-characters.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: Recurring characters
-index: 10
-tags:
-  - name: Sam Brendan
-    description: |
-      Content that features my character and fursona <a href="https://badmanners.xyz/sam_brendan/" x-data="{ href: 'https://badmanners.xyz/sam_brendan', suffix: '?ageVerified=true' }" x-bind:href="ageVerified ? href + suffix : href" target="_blank" >Sam, the mimic x maned wolf hybrid</a>.
-  - name: Beetle
-    description: |
-      Content that features my character <a href="https://booru.badmanners.xyz/index.php?q=post/view/3" target="_blank">Beetle, the gryphon</a>.
-  - name: Muno
-    description: Content that features my character Muno, the snake.
-  - name: Yolk
-    description: Content that features <a href="https://www.furaffinity.net/user/vampire101" target="_blank" rel="nofollow">Vampire101's</a> fursona, Yolk the monkey.
\ No newline at end of file
diff --git a/src/data/tag-categories/2-body-types.yaml b/src/data/tag-categories/2-body-types.yaml
deleted file mode 100644
index 1264646..0000000
--- a/src/data/tag-categories/2-body-types.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Body types
-index: 2
-tags:
-  - name: anthro predator
-    description: Scenarios where at least one of the predators is an anthropomorphic animal, i.e. generally regarded as a "furry".
-  - name: feral predator
-    description: Scenarios where at least one of the predators is an animal based on a real or mythological creature.
-  - name: taur predator
-    description: Scenarios where at least one of the predators is a multi-legged centaur-like creature, with an animal lower body and anthropomorphic upper body.
-  - name: { en: ambiguous predator, tok: sijelo pi jan pi wawa mute li ale }
-    description:
-      en: Scenarios where the body type of at least one of the predators is left ambiguous.
-      tok: jan pi moku musi pi wawa mute la toki tan sijelo li lon ala.
-  - name: human prey
-    description: Scenarios where at least one of the prey is a human person.
-  - name: anthro prey
-    description: Scenarios where at least one of the prey is an anthropomorphic animal, i.e. generally regarded as a "furry".
-  - name: feral prey
-    description: Scenarios where at least one of the predators is an animal based on a real or mythological creature.
-  - name: { en: ambiguous prey, tok: sijelo pi jan pi wawa lili li ale }
-    description:
-      en: Scenarios where the body type of at least one of the predators is left ambiguous.
-      tok: jan pi moku musi pi wawa lili la toki tan sijelo li lon ala.
diff --git a/src/data/tag-categories/3-genders.yaml b/src/data/tag-categories/3-genders.yaml
deleted file mode 100644
index aa4a51b..0000000
--- a/src/data/tag-categories/3-genders.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Genders
-index: 3
-tags:
-  - name: male predator
-    description: Scenarios where at least one of the predators is a man and/or male-presenting.
-    related:
-      - trans male predator
-  - name: trans male predator
-    description: Scenarios where at least one of the predators is a man and/or male-presenting; more specifically, undergoing or or having undergone gender transition.
-    related:
-      - male predator
-  - name: female predator
-    description: Scenarios where at least one of the predators is a woman and/or female-presenting.
-  - name: non-binary predator
-    description: Scenarios where at least one of the predators has a non-binary gender expression, be they genderless/agender, intersex, androgynous, gender-fluid, non-binary and/or non-binary-presenting, et cetera, regardless of undergoing or having undergone gender transition or not.
-  - name: { en: ambiguous gender predator, tok: jan pi wawa mute li meli anu mije }
-    description:
-      en: Scenarios where the gender at least one of the predators is left ambiguous.
-      tok: jan pi moku musi pi wawa mute la toki tan meli anu mije anu tonsi li lon ala.
-  - name: male prey
-    description: Scenarios where at least one of the prey is a man and/or male-presenting.
-  - name: female prey
-    description: Scenarios where at least one of the prey is a woman and/or female-presenting.
-    related:
-      - trans female prey
-  - name: trans female prey
-    description: Scenarios where at least one of the prey is a woman and/or female-presenting; more specifically, undergoing or having undergone gender transition.
-    related:
-      - female prey
-  - name: non-binary prey
-    description: Scenarios where at least one of the predators has a non-binary gender expression, be they genderless/agender, intersex, androgynous, gender-fluid, non-binary and/or non-binary-presenting, et cetera, regardless of undergoing or having undergone gender transition or not.
-  - name: { en: ambiguous gender prey, tok: jan pi wawa lili li meli anu mije }
-    description:
-      en: Scenarios where the gender at least one of the predators is left ambiguous.
-      tok: jan pi moku musi pi wawa lili la toki tan meli anu mije anu tonsi li lon ala.
diff --git a/src/data/tag-categories/4-relative-size.yaml b/src/data/tag-categories/4-relative-size.yaml
deleted file mode 100644
index a123ff5..0000000
--- a/src/data/tag-categories/4-relative-size.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: Relative size
-index: 4
-tags:
-  - name: macro predator
-    description: Scenarios where at least one of the predators has a size/height one or more orders of magnitude larger than average.
-  - name: micro prey
-    description: Scenarios where at least one of the prey has a size/height one or more orders of magnitude smaller than average.
-  - name: size difference
-    description: Scenarios where at least one of the predators has a notably larger size/height than one of their prey.
-  - name: similar size
-    description: Scenarios where at least one of the predators has a slightly larger size/height than one of their prey.
-  - name: same size
-    description: Scenarios where at least one of the predators has the same size/height as one of their prey, or their sizes are comparable.
-  - name: smaller predator
-    description: Scenarios where at least one of the predators has a notably smaller size/height than one of their prey.
-    related:
-      - role reversal
diff --git a/src/data/tag-categories/5-willingness.yaml b/src/data/tag-categories/5-willingness.yaml
deleted file mode 100644
index f276150..0000000
--- a/src/data/tag-categories/5-willingness.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Willingness
-index: 5
-tags:
-  - name: { en: willing predator, tok: jan pi wawa mute li wile e moku musi }
-    description:
-      en: Scenarios where at least one of the predators participates in vore willingly.
-      tok: jan pi moku musi pi wawa mute la jan li wile e moku musi.
-  - name: semi-willing predator
-    description: Scenarios where the willingness of at least one of the predators might be partial, oscillating between willing and unwilling, somewhere in-between, or ambiguous.
-  - name: unwilling predator
-    description: Scenarios where at least one of the predators participates in vore unwillingly.
-  - name: asleep predator
-    description: Scenarios where at least one of the predators participates in vore while asleep.
-  - name: willing prey
-    description: Scenarios where at least one of the prey participates in vore willingly.
-  - name: semi-willing prey
-    description: Scenarios where the willingness of at least one of the prey might be partial, oscillating between willing and unwilling, somewhere in-between, or ambiguous.
-  - name: { en: unwilling prey, tok: jan pi wawa lili li wile ala e moku musi }
-    description:
-      en: Scenarios where at least one of the prey participates in vore unwillingly.
-      tok: jan pi moku musi pi wawa lili la jan li wile ala e moku musi.
-  - name: asleep prey
-    description: Scenarios where at least one of the predators participates in vore while asleep.
diff --git a/src/data/tag-categories/6-vore-related-scenarios.yaml b/src/data/tag-categories/6-vore-related-scenarios.yaml
deleted file mode 100644
index ad4d052..0000000
--- a/src/data/tag-categories/6-vore-related-scenarios.yaml
+++ /dev/null
@@ -1,77 +0,0 @@
-name: Vore-related scenarios
-index: 6
-tags:
-  - name: point of view
-    description: Scenarios where the narration takes the perspective of one of the characters, generally in first person.
-  - name: long-term endo
-    description: Scenarios where prey remains safely inside of their predator for an extended period of time.
-    related:
-      - perma endo
-      - implied perma endo
-  - name: perma endo
-    description: Scenarios where prey remains safely inside of their predator for an indefinite period of time.
-    related:
-      - long-term endo
-      - implied perma endo
-  - name: implied perma endo
-    description: Scenarios where prey is implied to remain safely inside of their predator for an indefinite period of time.
-    related:
-      - long-term endo
-      - perma endo
-  - name: full tour
-    description: Scenarios where prey passes all the way through their predator's gastrointestinal system, entering through one end and exiting through the opposite one.
-    related:
-      - implied full tour
-  - name: implied full tour
-    description: Scenarios where prey is implied to pass all the way through their predator's gastrointestinal system, entering through one end and supposedly exiting through the opposite one.
-    related:
-      - full tour
-  - name: regurgitation
-    description: Scenarios where prey are explicitly let out through the same spot they entered their predator, specifically their mouth.
-    related:
-      - implied regurgitation
-      - oral vore
-  - name: implied regurgitation
-    description: Scenarios where prey are implied to have been let out through the same spot they entered their predator, specifically their mouth.
-    related:
-      - regurgitation
-      - oral vore
-  - name: partial vore
-    description: Scenarios where prey don't enter they predator completely.
-    related:
-      - regurgitation
-  - name: prey transfer
-    description: Scenarios where prey are transferred from one predator into another, or transferred from one part of their predator to another.
-  - name: object vore
-    description: Scenarios where predators consume objects, alongside their prey or in place of them.
-  - name: role reversal
-    description: Scenarios where predators become prey and vice-versa, where dominant characters become prey, or where submissive characters become predators.
-    related:
-      - smaller predator
-  - name: nested vore
-    description: Scenarios where a predator becomes prey to another predator, or a prey consumes another prey.
-    related:
-      - multiple prey
-      - role reversal
-  - name: multiple prey
-    description: Scenarios where one predator consumes multiple prey at once.
-  - name: messy stomach
-    description: Scenarios where a prey visits a messy stomach, usually with semi-digested food inside.
-    related:
-      - oral vore
-  - name: hammerspace vore
-    description: Scenarios where a predator's body doesn't grow proportionally around the prey they consume, either at a substantially lower rate or not at all.
-    related:
-      - multiple prey
-  - name: bladder vore
-    description: Scenarios where prey consumed through the predator's urethra end up in their bladder.
-    related:
-      - cock vore
-  - name: soul vore
-    description: Scenarios where predators consume a soul instead of their prey's body.
-  - name: endo trait theft
-    description: Scenarios where predators acquire traits from their prey without digestion.
-    related:
-      - transformation
-  - name: Vore Day
-    description: Stories created in commemoration of Vore Day, which is celebrated on August 8th, and/or are set in said day.
diff --git a/src/data/tag-categories/7-sexual-content.yaml b/src/data/tag-categories/7-sexual-content.yaml
deleted file mode 100644
index 8e7dba2..0000000
--- a/src/data/tag-categories/7-sexual-content.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Sexual content
-index: 7
-tags:
-  - name: nudity
-    description: Scenarios where a character is nude and displaying their sexual features, without necessarily participating in a sexual situation.
-  - name: masturbation
-    description: Scenarios where a character sexually stimulates themselves.
-  - name: straight sex
-    description: Scenarios where two or more characters of different genders participate in sexual activity.
-    related:
-      - orgy
-  - name: gay sex
-    description: Scenarios where two or more characters of the same gender, both men and/or male-presenting, participate in sexual activity.
-    related:
-      - orgy
-  - name: lesbian sex
-    description: Scenarios where two or more characters of the same gender, both women and/or female-presenting, participate in sexual activity.
-    related:
-      - orgy
-  - name: orgy
-    description: Scenarios where more than two characters participate in sexual activity freely.
-    related:
-      - straight sex
-      - gay sex
-      - lesbian sex
diff --git a/src/data/tag-categories/8-other-kinks.yaml b/src/data/tag-categories/8-other-kinks.yaml
deleted file mode 100644
index ca262fc..0000000
--- a/src/data/tag-categories/8-other-kinks.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: Other kinks
-index: 8
-tags:
-  - name: hyper
-    description: Scenarios where a character has abnormally large features compared to their body, usually genitalia.
-  - name: egg play
-    description: Scenarios with sexual action involving eggs.
-    related:
-      - object vore
-  - name: transformation
-    description: Scenarios where a character changes body and/or species.
-    related:
-      - endo trait theft
-  - name: netorare
-    description: Scenarios involving a character cheating on their partner with or without consent, and/or cuckoldry.
-  - name: sizeplay
-    description: Scenarios where a character changes size.
-  - name: inflation
-    description: Scenarios where a character expands out with the excessive intake of fluids, including semen.
-  - name: daddy play
-    description: Scenarios where a character refers to another as their "daddy" in a kinky manner, as part of a sexual situation or roleplay.
-  - name: BDSM
-    description: Scenarios related to bondage, sadism, masochism, dominance, and/or submission in a kinky manner, such as roleplay.
-  - name: dubcon
-    description: Scenarios where sexual consent is dubious.
-  - name: plushie
-    description: Scenarios with sexual action involving stuffed toys or plushie-like characters.
-  - name: wardrobe malfunction
-    description: Scenarios where a mishap happens with someone's clothes, such as accidentally revealing body parts and/or bursting open.
-  - name: pet play
-    description: Scenarios with roleplay where one (or more) of the participants plays the part of "pet".
\ No newline at end of file
diff --git a/src/data/tag-categories/9-type-of-content.yaml b/src/data/tag-categories/9-type-of-content.yaml
deleted file mode 100644
index 546341c..0000000
--- a/src/data/tag-categories/9-type-of-content.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-name: Type of content
-index: 9
-tags:
-  - name: request
-    description: Stories made by someone else's request, as a gift.
-  - name: commission
-    description: Stories made as part of a commission to someone else.
-  - name: { en: flash fiction, tok: lipu lili }
-    description:
-      en: Short-format stories with no more than 2,500 words.
-      tok: lipu li jo e nanpa nimi lili.
-  - name: toki pona
-    description: 
-      en: Stories written in toki pona, the language of good.
-      tok: lipu li kepeken toki pona.
-  - name: behind the scenes
-    description: Content where I go over the process of making other content.
-  - name: retrospective
-    description: Document detailing the good and bad parts during the creation process of a certain project.
-  - name: commentary
-    description: Content where the creator gives their thoughts on a certain project of theirs.
-  - name: technical post
-    description: Content where I explain the technical details of a certain system or technology.
-  - name: programming
-    description: Posts dedicated to programming, coding, and system architecture.
-  - name: game development
-    description: Content where I detail the process of creating a game.
diff --git a/src/data/tags.yaml b/src/data/tags.yaml
new file mode 100644
index 0000000..2a1c8bc
--- /dev/null
+++ b/src/data/tags.yaml
@@ -0,0 +1,294 @@
+- id: types-of-vore
+  category: Types of vore
+  tags:
+    - name: { en: oral vore, tok: moku musi kepeken uta }
+      description:
+        en: Scenarios where prey are consumed by the predator's mouth.
+        tok: jan li moku musi e jan ante kepeken uta.
+    - name: anal vore
+      description: Scenarios where prey are consumed by the predator's butt/anus.
+    - name: cock vore
+      description: Scenarios where prey are consumed by the predator's penis.
+    - name: unbirth
+      description: Scenarios where prey are consumed by the predator's vagina/vulva, sometimes also called "vaginal vore".
+    - name: tail vore
+      description: Scenarios where prey are consumed by the predator's tail, through an opening or mouth on the appendage.
+    - name: slit vore
+      description: Scenarios where prey are consumed by the predator's genital slit.
+    - name: sheath vore
+      description: Scenarios where prey are consumed by the predator's genital sheath around their penis.
+    - name: nipple vore
+      description: Scenarios where prey are consumed by the predator's breast, through the nipples or cleavage.
+    - name: chest maw vore
+      description: Scenarios where prey are consumed by the predator's chest, through a maw on their chest cavity.
+- id: body-types
+  category: Body types
+  tags:
+    - name: anthro predator
+      description: Scenarios where at least one of the predators is an anthropomorphic animal, i.e. generally regarded as a "furry".
+    - name: feral predator
+      description: Scenarios where at least one of the predators is an animal based on a real or mythological creature.
+    - name: taur predator
+      description: Scenarios where at least one of the predators is a multi-legged centaur-like creature, with an animal lower body and anthropomorphic upper body.
+    - name: { en: ambiguous predator, tok: sijelo pi jan pi wawa mute li ale }
+      description:
+        en: Scenarios where the body type of at least one of the predators is left ambiguous.
+        tok: jan pi moku musi pi wawa mute la toki tan sijelo li lon ala.
+    - name: human prey
+      description: Scenarios where at least one of the prey is a human person.
+    - name: anthro prey
+      description: Scenarios where at least one of the prey is an anthropomorphic animal, i.e. generally regarded as a "furry".
+    - name: feral prey
+      description: Scenarios where at least one of the predators is an animal based on a real or mythological creature.
+    - name: { en: ambiguous prey, tok: sijelo pi jan pi wawa lili li ale }
+      description:
+        en: Scenarios where the body type of at least one of the predators is left ambiguous.
+        tok: jan pi moku musi pi wawa lili la toki tan sijelo li lon ala.
+- id: genders
+  category: Genders
+  tags:
+    - name: male predator
+      description: Scenarios where at least one of the predators is a man and/or male-presenting.
+      related:
+        - trans male predator
+    - name: trans male predator
+      description: Scenarios where at least one of the predators is a man and/or male-presenting; more specifically, undergoing or or having undergone gender transition.
+      related:
+        - male predator
+    - name: female predator
+      description: Scenarios where at least one of the predators is a woman and/or female-presenting.
+    - name: non-binary predator
+      description: Scenarios where at least one of the predators has a non-binary gender expression, be they genderless/agender, intersex, androgynous, gender-fluid, non-binary and/or non-binary-presenting, et cetera, regardless of undergoing or having undergone gender transition or not.
+    - name: { en: ambiguous gender predator, tok: jan pi wawa mute li meli anu mije }
+      description:
+        en: Scenarios where the gender at least one of the predators is left ambiguous.
+        tok: jan pi moku musi pi wawa mute la toki tan meli anu mije anu tonsi li lon ala.
+    - name: male prey
+      description: Scenarios where at least one of the prey is a man and/or male-presenting.
+    - name: female prey
+      description: Scenarios where at least one of the prey is a woman and/or female-presenting.
+      related:
+        - trans female prey
+    - name: trans female prey
+      description: Scenarios where at least one of the prey is a woman and/or female-presenting; more specifically, undergoing or having undergone gender transition.
+      related:
+        - female prey
+    - name: non-binary prey
+      description: Scenarios where at least one of the predators has a non-binary gender expression, be they genderless/agender, intersex, androgynous, gender-fluid, non-binary and/or non-binary-presenting, et cetera, regardless of undergoing or having undergone gender transition or not.
+    - name: { en: ambiguous gender prey, tok: jan pi wawa lili li meli anu mije }
+      description:
+        en: Scenarios where the gender at least one of the predators is left ambiguous.
+        tok: jan pi moku musi pi wawa lili la toki tan meli anu mije anu tonsi li lon ala.
+- id: relative-size
+  category: Relative size
+  tags:
+    - name: macro predator
+      description: Scenarios where at least one of the predators has a size/height one or more orders of magnitude larger than average.
+    - name: micro prey
+      description: Scenarios where at least one of the prey has a size/height one or more orders of magnitude smaller than average.
+    - name: size difference
+      description: Scenarios where at least one of the predators has a notably larger size/height than one of their prey.
+    - name: similar size
+      description: Scenarios where at least one of the predators has a slightly larger size/height than one of their prey.
+    - name: same size
+      description: Scenarios where at least one of the predators has the same size/height as one of their prey, or their sizes are comparable.
+    - name: smaller predator
+      description: Scenarios where at least one of the predators has a notably smaller size/height than one of their prey.
+      related:
+        - role reversal
+- id: willingness
+  category: Willingness
+  tags:
+    - name: { en: willing predator, tok: jan pi wawa mute li wile e moku musi }
+      description:
+        en: Scenarios where at least one of the predators participates in vore willingly.
+        tok: jan pi moku musi pi wawa mute la jan li wile e moku musi.
+    - name: semi-willing predator
+      description: Scenarios where the willingness of at least one of the predators might be partial, oscillating between willing and unwilling, somewhere in-between, or ambiguous.
+    - name: unwilling predator
+      description: Scenarios where at least one of the predators participates in vore unwillingly.
+    - name: asleep predator
+      description: Scenarios where at least one of the predators participates in vore while asleep.
+    - name: willing prey
+      description: Scenarios where at least one of the prey participates in vore willingly.
+    - name: semi-willing prey
+      description: Scenarios where the willingness of at least one of the prey might be partial, oscillating between willing and unwilling, somewhere in-between, or ambiguous.
+    - name: { en: unwilling prey, tok: jan pi wawa lili li wile ala e moku musi }
+      description:
+        en: Scenarios where at least one of the prey participates in vore unwillingly.
+        tok: jan pi moku musi pi wawa lili la jan li wile ala e moku musi.
+    - name: asleep prey
+      description: Scenarios where at least one of the predators participates in vore while asleep.
+- id: vore-related-scenarios
+  category: Vore-related scenarios
+  tags:
+    - name: point of view
+      description: Scenarios where the narration takes the perspective of one of the characters, generally in first person.
+    - name: long-term endo
+      description: Scenarios where prey remains safely inside of their predator for an extended period of time.
+      related:
+        - perma endo
+        - implied perma endo
+    - name: perma endo
+      description: Scenarios where prey remains safely inside of their predator for an indefinite period of time.
+      related:
+        - long-term endo
+        - implied perma endo
+    - name: implied perma endo
+      description: Scenarios where prey is implied to remain safely inside of their predator for an indefinite period of time.
+      related:
+        - long-term endo
+        - perma endo
+    - name: full tour
+      description: Scenarios where prey passes all the way through their predator's gastrointestinal system, entering through one end and exiting through the opposite one.
+      related:
+        - implied full tour
+    - name: implied full tour
+      description: Scenarios where prey is implied to pass all the way through their predator's gastrointestinal system, entering through one end and supposedly exiting through the opposite one.
+      related:
+        - full tour
+    - name: regurgitation
+      description: Scenarios where prey are explicitly let out through the same spot they entered their predator, specifically their mouth.
+      related:
+        - implied regurgitation
+        - oral vore
+    - name: implied regurgitation
+      description: Scenarios where prey are implied to have been let out through the same spot they entered their predator, specifically their mouth.
+      related:
+        - regurgitation
+        - oral vore
+    - name: partial vore
+      description: Scenarios where prey don't enter they predator completely.
+      related:
+        - regurgitation
+    - name: prey transfer
+      description: Scenarios where prey are transferred from one predator into another, or transferred from one part of their predator to another.
+    - name: object vore
+      description: Scenarios where predators consume objects, alongside their prey or in place of them.
+    - name: role reversal
+      description: Scenarios where predators become prey and vice-versa, where dominant characters become prey, or where submissive characters become predators.
+      related:
+        - smaller predator
+    - name: nested vore
+      description: Scenarios where a predator becomes prey to another predator, or a prey consumes another prey.
+      related:
+        - multiple prey
+        - role reversal
+    - name: multiple prey
+      description: Scenarios where one predator consumes multiple prey at once.
+    - name: messy stomach
+      description: Scenarios where a prey visits a messy stomach, usually with semi-digested food inside.
+      related:
+        - oral vore
+    - name: hammerspace vore
+      description: Scenarios where a predator's body doesn't grow proportionally around the prey they consume, either at a substantially lower rate or not at all.
+      related:
+        - multiple prey
+    - name: bladder vore
+      description: Scenarios where prey consumed through the predator's urethra end up in their bladder.
+      related:
+        - cock vore
+    - name: soul vore
+      description: Scenarios where predators consume a soul instead of their prey's body.
+    - name: endo trait theft
+      description: Scenarios where predators acquire traits from their prey without digestion.
+      related:
+        - transformation
+    - name: Vore Day
+      description: Stories created in commemoration of Vore Day, which is celebrated on August 8th, and/or are set in said day.
+- id: sexual-content
+  category: Sexual content
+  tags:
+    - name: nudity
+      description: Scenarios where a character is nude and displaying their sexual features, without necessarily participating in a sexual situation.
+    - name: masturbation
+      description: Scenarios where a character sexually stimulates themselves.
+    - name: straight sex
+      description: Scenarios where two or more characters of different genders participate in sexual activity.
+      related:
+        - orgy
+    - name: gay sex
+      description: Scenarios where two or more characters of the same gender, both men and/or male-presenting, participate in sexual activity.
+      related:
+        - orgy
+    - name: lesbian sex
+      description: Scenarios where two or more characters of the same gender, both women and/or female-presenting, participate in sexual activity.
+      related:
+        - orgy
+    - name: orgy
+      description: Scenarios where more than two characters participate in sexual activity freely.
+      related:
+        - straight sex
+        - gay sex
+        - lesbian sex
+- id: other-kinks
+  category: Other kinks
+  tags:
+    - name: hyper
+      description: Scenarios where a character has abnormally large features compared to their body, usually genitalia.
+    - name: egg play
+      description: Scenarios with sexual action involving eggs.
+      related:
+        - object vore
+    - name: transformation
+      description: Scenarios where a character changes body and/or species.
+      related:
+        - endo trait theft
+    - name: netorare
+      description: Scenarios involving a character cheating on their partner with or without consent, and/or cuckoldry.
+    - name: sizeplay
+      description: Scenarios where a character changes size.
+    - name: inflation
+      description: Scenarios where a character expands out with the excessive intake of fluids, including semen.
+    - name: daddy play
+      description: Scenarios where a character refers to another as their "daddy" in a kinky manner, as part of a sexual situation or roleplay.
+    - name: BDSM
+      description: Scenarios related to bondage, sadism, masochism, dominance, and/or submission in a kinky manner, such as roleplay.
+    - name: dubcon
+      description: Scenarios where sexual consent is dubious.
+    - name: plushie
+      description: Scenarios with sexual action involving stuffed toys or plushie-like characters.
+    - name: wardrobe malfunction
+      description: Scenarios where a mishap happens with someone's clothes, such as accidentally revealing body parts and/or bursting open.
+    - name: pet play
+      description: Scenarios with roleplay where one (or more) of the participants plays the part of "pet".
+- id: type-of-content
+  category: Type of content
+  tags:
+    - name: request
+      description: Stories made by someone else's request, as a gift.
+    - name: commission
+      description: Stories made as part of a commission to someone else.
+    - name: { en: flash fiction, tok: lipu lili }
+      description:
+        en: Short-format stories with no more than 2,500 words.
+        tok: lipu li jo e nanpa nimi lili.
+    - name: toki pona
+      description: 
+        en: Stories written in toki pona, the language of good.
+        tok: lipu li kepeken toki pona.
+    - name: behind the scenes
+      description: Content where I go over the process of making other content.
+    - name: retrospective
+      description: Document detailing the good and bad parts during the creation process of a certain project.
+    - name: commentary
+      description: Content where the creator gives their thoughts on a certain project of theirs.
+    - name: technical post
+      description: Content where I explain the technical details of a certain system or technology.
+    - name: programming
+      description: Posts dedicated to programming, coding, and system architecture.
+    - name: game development
+      description: Content where I detail the process of creating a game.
+- id: recurring-characters
+  category: Recurring characters
+  tags:
+    - name: Sam Brendan
+      description: |
+        Content that features my character and fursona <a href="https://badmanners.xyz/sam_brendan/" x-data="{ href: 'https://badmanners.xyz/sam_brendan', suffix: '?ageVerified=true' }" x-bind:href="ageVerified ? href + suffix : href" target="_blank" >Sam, the mimic x maned wolf hybrid</a>.
+    - name: Beetle
+      description: |
+        Content that features my character <a href="https://booru.badmanners.xyz/index.php?q=post/view/3" target="_blank">Beetle, the gryphon</a>.
+    - name: Muno
+      description: Content that features my character Muno, the snake.
+    - name: Yolk
+      description: Content that features <a href="https://www.furaffinity.net/user/vampire101" target="_blank" rel="nofollow">Vampire101's</a> fursona, Yolk the monkey.
\ No newline at end of file
diff --git a/src/pages/tags.astro b/src/pages/tags.astro
index 220c649..2b75ca6 100644
--- a/src/pages/tags.astro
+++ b/src/pages/tags.astro
@@ -30,43 +30,36 @@ const draftOnlyTagsSet = new Set<string>();
 uncategorizedTagsSet.forEach((tag) => draftOnlyTagsSet.delete(tag));
 
 const uniqueSlugs = new Set<string>();
-const categorizedTags = tagCategories
-  .sort((a, b) => {
-    if (a.data.index === b.data.index) {
-      throw new Error(`Found tag categories with same index value ${a.data.index} ("${a.id}", "${b.id}")`);
-    }
-    return a.data.index - b.data.index;
-  })
-  .map((category) => {
-    const tagList = category.data.tags.map<Tag>(({ name, description }) => {
-      description =
-        description &&
-        markdownToPlaintext(typeof description === "object" ? description[DEFAULT_LANG] : description).replaceAll(
-          /\n+/g,
-          " ",
-        );
-      const tag = typeof name === "string" ? name : name.en;
-      return { id: slug(tag), name: tag, description };
-    });
-    tagList.forEach(({ id, name }) => {
-      if (uniqueSlugs.has(id)) {
-        throw new Error(`Duplicated tag "${name}" found in multiple tag-categories entries`);
-      }
-      uniqueSlugs.add(id);
-    });
-    return {
-      name: category.data.name,
-      id: slug(category.data.name),
-      tags: tagList.filter(({ name }) => {
-        if (draftOnlyTagsSet.has(name)) {
-          // console.log(`Omitting draft-only tag "${name}"`);
-          return false;
-        }
-        uncategorizedTagsSet.delete(name);
-        return true;
-      }),
-    };
+const categorizedTags = tagCategories.map((category) => {
+  const tagList = category.data.tags.map<Tag>(({ name, description }) => {
+    description =
+      description &&
+      markdownToPlaintext(typeof description === "object" ? description[DEFAULT_LANG] : description).replaceAll(
+        /\n+/g,
+        " ",
+      );
+    const tag = typeof name === "string" ? name : name.en;
+    return { id: slug(tag), name: tag, description };
   });
+  tagList.forEach(({ id, name }) => {
+    if (uniqueSlugs.has(id)) {
+      throw new Error(`Duplicated tag "${name}" found in multiple tag-categories entries`);
+    }
+    uniqueSlugs.add(id);
+  });
+  return {
+    name: category.data.category,
+    id: category.id,
+    tags: tagList.filter(({ name }) => {
+      if (draftOnlyTagsSet.has(name)) {
+        // console.log(`Omitting draft-only tag "${name}"`);
+        return false;
+      }
+      uncategorizedTagsSet.delete(name);
+      return true;
+    }),
+  };
+});
 
 if (uncategorizedTagsSet.size > 0) {
   const tagList = [...uncategorizedTagsSet];