Move blogposts to mdx

This commit is contained in:
Bad Manners 2024-09-14 13:50:00 -03:00
parent cf180442c3
commit 0a76dd6172
Signed by: badmanners
GPG key ID: 8C88292CCB075609
17 changed files with 1165 additions and 370 deletions

View file

@ -1,8 +1,9 @@
{
"recommendations": [
"astro-build.astro-vscode",
"bradlc.vscode-tailwindcss",
"unifiedjs.vscode-mdx",
"esbenp.prettier-vscode",
"bradlc.vscode-tailwindcss",
"redhat.vscode-yaml"
]
}

View file

@ -1,6 +1,7 @@
import { defineConfig, envField } from "astro/config";
import tailwindIntegration from "@astrojs/tailwind";
import markdownIntegration from "@astropub/md";
import mdxIntegration from "@astrojs/mdx";
import htaccessIntegration from "astro-htaccess";
import pagefindIntegration from "astro-pagefind";
import { AI_BOTS } from "./src/data/ai_bots";
@ -13,6 +14,7 @@ export default defineConfig({
applyBaseStyles: false,
}),
markdownIntegration(),
mdxIntegration(),
htaccessIntegration({
generateHtaccessFile: import.meta.env.APACHE_CONFIG === "true",
customRules: [
@ -25,8 +27,14 @@ export default defineConfig({
"</IfModule>",
],
redirects: [
{ match: "/story/", url: "/stories/" },
{ match: "/game/", url: "/games/" },
{
match: "/story/",
url: "/stories/",
},
{
match: "/game/",
url: "/games/",
},
],
}),
pagefindIntegration(),
@ -44,8 +52,16 @@ export default defineConfig({
experimental: {
env: {
schema: {
APACHE_CONFIG: envField.boolean({ context: "server", access: "public", default: false }),
PUBLISH_DRAFTS: envField.boolean({ context: "server", access: "public", default: false }),
APACHE_CONFIG: envField.boolean({
context: "server",
access: "public",
default: false,
}),
PUBLISH_DRAFTS: envField.boolean({
context: "server",
access: "public",
default: false,
}),
},
},
},

665
package-lock.json generated
View file

@ -10,6 +10,7 @@
"hasInstallScript": true,
"dependencies": {
"@astrojs/check": "^0.9.2",
"@astrojs/mdx": "^3.1.6",
"@astrojs/rss": "^4.0.7",
"@astrojs/tailwind": "^5.1.0",
"@astropub/md": "^1.0.0",
@ -186,6 +187,34 @@
"vfile": "^6.0.2"
}
},
"node_modules/@astrojs/mdx": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.6.tgz",
"integrity": "sha512-YCEIvNgoQG3oVhe9codH4TX6zjvkl7KGla19yZO5RCnvjv2d9zyrfWqJ98I6/m18PbEY3k8Wjvha0IIf5eZ2sQ==",
"license": "MIT",
"dependencies": {
"@astrojs/markdown-remark": "5.2.0",
"@mdx-js/mdx": "^3.0.1",
"acorn": "^8.12.1",
"es-module-lexer": "^1.5.4",
"estree-util-visit": "^2.0.0",
"gray-matter": "^4.0.3",
"hast-util-to-html": "^9.0.2",
"kleur": "^4.1.5",
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.0",
"remark-smartypants": "^3.0.2",
"source-map": "^0.7.4",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.3"
},
"engines": {
"node": "^18.17.1 || ^20.3.0 || >=21.0.0"
},
"peerDependencies": {
"astro": "^4.8.0"
}
},
"node_modules/@astrojs/prism": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz",
@ -1570,6 +1599,41 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@mdx-js/mdx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz",
"integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/mdx": "^2.0.0",
"collapse-white-space": "^2.0.0",
"devlop": "^1.0.0",
"estree-util-build-jsx": "^3.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"estree-util-to-js": "^2.0.0",
"estree-walker": "^3.0.0",
"hast-util-to-estree": "^3.0.0",
"hast-util-to-jsx-runtime": "^2.0.0",
"markdown-extensions": "^2.0.0",
"periscopic": "^3.0.0",
"remark-mdx": "^3.0.0",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.0.0",
"source-map": "^0.7.0",
"unified": "^11.0.0",
"unist-util-position-from-estree": "^2.0.0",
"unist-util-stringify-position": "^4.0.0",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -1917,6 +1981,15 @@
"optional": true,
"peer": true
},
"node_modules/@types/acorn": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
"integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==",
"license": "MIT",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@ -1973,6 +2046,15 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
},
"node_modules/@types/estree-jsx": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
"integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
"license": "MIT",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/@types/hast": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@ -1989,6 +2071,12 @@
"@types/unist": "*"
}
},
"node_modules/@types/mdx": {
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
"integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
"license": "MIT"
},
"node_modules/@types/ms": {
"version": "0.7.34",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
@ -2152,6 +2240,15 @@
"node": ">=0.4.0"
}
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/acorn-walk": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
@ -2275,6 +2372,15 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/astring": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
"integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
"license": "MIT",
"bin": {
"astring": "bin/astring"
}
},
"node_modules/astro": {
"version": "4.13.3",
"resolved": "https://registry.npmjs.org/astro/-/astro-4.13.3.tgz",
@ -2647,6 +2753,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/character-reference-invalid": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
"integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@ -2827,6 +2943,16 @@
"node": ">=6"
}
},
"node_modules/collapse-white-space": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
"integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@ -3274,6 +3400,74 @@
"node": ">=4"
}
},
"node_modules/estree-util-attach-comments": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
"integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/estree-util-build-jsx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
"integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"devlop": "^1.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"estree-walker": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/estree-util-is-identifier-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
"integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/estree-util-to-js": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
"integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"astring": "^1.8.0",
"source-map": "^0.7.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/estree-util-visit": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
"integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
@ -3748,16 +3942,44 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-estree": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz",
"integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"comma-separated-tokens": "^2.0.0",
"devlop": "^1.0.0",
"estree-util-attach-comments": "^3.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"hast-util-whitespace": "^3.0.0",
"mdast-util-mdx-expression": "^2.0.0",
"mdast-util-mdx-jsx": "^3.0.0",
"mdast-util-mdxjs-esm": "^2.0.0",
"property-information": "^6.0.0",
"space-separated-tokens": "^2.0.0",
"style-to-object": "^0.4.0",
"unist-util-position": "^5.0.0",
"zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-html": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz",
"integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==",
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.2.tgz",
"integrity": "sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
"ccount": "^2.0.0",
"comma-separated-tokens": "^2.0.0",
"hast-util-raw": "^9.0.0",
"hast-util-whitespace": "^3.0.0",
"html-void-elements": "^3.0.0",
"mdast-util-to-hast": "^13.0.0",
@ -3771,6 +3993,48 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-jsx-runtime": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz",
"integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
"comma-separated-tokens": "^2.0.0",
"devlop": "^1.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"hast-util-whitespace": "^3.0.0",
"mdast-util-mdx-expression": "^2.0.0",
"mdast-util-mdx-jsx": "^3.0.0",
"mdast-util-mdxjs-esm": "^2.0.0",
"property-information": "^6.0.0",
"space-separated-tokens": "^2.0.0",
"style-to-object": "^1.0.0",
"unist-util-position": "^5.0.0",
"vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
"integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
"license": "MIT"
},
"node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
"integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
"license": "MIT",
"dependencies": {
"inline-style-parser": "0.2.4"
}
},
"node_modules/hast-util-to-parse5": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz",
@ -3888,6 +4152,36 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/inline-style-parser": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==",
"license": "MIT"
},
"node_modules/is-alphabetical": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
"integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/is-alphanumerical": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
"integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
"license": "MIT",
"dependencies": {
"is-alphabetical": "^2.0.0",
"is-decimal": "^2.0.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
@ -3917,6 +4211,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-decimal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
"integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
@ -3967,6 +4271,16 @@
"node": ">=0.10.0"
}
},
"node_modules/is-hexadecimal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
"integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/is-inside-container": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
@ -4025,6 +4339,15 @@
"node": ">=0.10.0"
}
},
"node_modules/is-reference": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
"integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
"license": "MIT",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
@ -4322,6 +4645,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/markdown-extensions": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
"integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
"license": "MIT",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/markdown-table": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
@ -4501,6 +4836,83 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdast-util-mdx": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
"integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
"license": "MIT",
"dependencies": {
"mdast-util-from-markdown": "^2.0.0",
"mdast-util-mdx-expression": "^2.0.0",
"mdast-util-mdx-jsx": "^3.0.0",
"mdast-util-mdxjs-esm": "^2.0.0",
"mdast-util-to-markdown": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdast-util-mdx-expression": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
"integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/mdast": "^4.0.0",
"devlop": "^1.0.0",
"mdast-util-from-markdown": "^2.0.0",
"mdast-util-to-markdown": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdast-util-mdx-jsx": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz",
"integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/mdast": "^4.0.0",
"@types/unist": "^3.0.0",
"ccount": "^2.0.0",
"devlop": "^1.1.0",
"mdast-util-from-markdown": "^2.0.0",
"mdast-util-to-markdown": "^2.0.0",
"parse-entities": "^4.0.0",
"stringify-entities": "^4.0.0",
"unist-util-stringify-position": "^4.0.0",
"vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdast-util-mdxjs-esm": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
"integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
"license": "MIT",
"dependencies": {
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/mdast": "^4.0.0",
"devlop": "^1.0.0",
"mdast-util-from-markdown": "^2.0.0",
"mdast-util-to-markdown": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdast-util-phrasing": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
@ -4760,6 +5172,109 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/micromark-extension-mdx-expression": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz",
"integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==",
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
],
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"devlop": "^1.0.0",
"micromark-factory-mdx-expression": "^2.0.0",
"micromark-factory-space": "^2.0.0",
"micromark-util-character": "^2.0.0",
"micromark-util-events-to-acorn": "^2.0.0",
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0"
}
},
"node_modules/micromark-extension-mdx-jsx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz",
"integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==",
"license": "MIT",
"dependencies": {
"@types/acorn": "^4.0.0",
"@types/estree": "^1.0.0",
"devlop": "^1.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"micromark-factory-mdx-expression": "^2.0.0",
"micromark-factory-space": "^2.0.0",
"micromark-util-character": "^2.0.0",
"micromark-util-events-to-acorn": "^2.0.0",
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0",
"vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/micromark-extension-mdx-md": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
"integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
"license": "MIT",
"dependencies": {
"micromark-util-types": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/micromark-extension-mdxjs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
"integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
"license": "MIT",
"dependencies": {
"acorn": "^8.0.0",
"acorn-jsx": "^5.0.0",
"micromark-extension-mdx-expression": "^3.0.0",
"micromark-extension-mdx-jsx": "^3.0.0",
"micromark-extension-mdx-md": "^2.0.0",
"micromark-extension-mdxjs-esm": "^3.0.0",
"micromark-util-combine-extensions": "^2.0.0",
"micromark-util-types": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/micromark-extension-mdxjs-esm": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
"integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"devlop": "^1.0.0",
"micromark-core-commonmark": "^2.0.0",
"micromark-util-character": "^2.0.0",
"micromark-util-events-to-acorn": "^2.0.0",
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0",
"unist-util-position-from-estree": "^2.0.0",
"vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/micromark-factory-destination": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz",
@ -4801,6 +5316,33 @@
"micromark-util-types": "^2.0.0"
}
},
"node_modules/micromark-factory-mdx-expression": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz",
"integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==",
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
],
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"devlop": "^1.0.0",
"micromark-factory-space": "^2.0.0",
"micromark-util-character": "^2.0.0",
"micromark-util-events-to-acorn": "^2.0.0",
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0",
"unist-util-position-from-estree": "^2.0.0",
"vfile-message": "^4.0.0"
}
},
"node_modules/micromark-factory-space": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
@ -4992,6 +5534,32 @@
}
]
},
"node_modules/micromark-util-events-to-acorn": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz",
"integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==",
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
],
"license": "MIT",
"dependencies": {
"@types/acorn": "^4.0.0",
"@types/estree": "^1.0.0",
"@types/unist": "^3.0.0",
"devlop": "^1.0.0",
"estree-util-visit": "^2.0.0",
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0",
"vfile-message": "^4.0.0"
}
},
"node_modules/micromark-util-html-tag-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz",
@ -5432,6 +6000,32 @@
"@pagefind/windows-x64": "1.1.1"
}
},
"node_modules/parse-entities": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
"integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==",
"license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"character-entities": "^2.0.0",
"character-entities-legacy": "^3.0.0",
"character-reference-invalid": "^2.0.0",
"decode-named-character-reference": "^1.0.0",
"is-alphanumerical": "^2.0.0",
"is-decimal": "^2.0.0",
"is-hexadecimal": "^2.0.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/parse-entities/node_modules/@types/unist": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
"integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
"license": "MIT"
},
"node_modules/parse-latin": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
@ -5523,6 +6117,17 @@
"integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==",
"license": "MIT"
},
"node_modules/periscopic": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
"integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"estree-walker": "^3.0.0",
"is-reference": "^3.0.0"
}
},
"node_modules/picocolors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
@ -5993,6 +6598,20 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/remark-mdx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz",
"integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==",
"license": "MIT",
"dependencies": {
"mdast-util-mdx": "^3.0.0",
"micromark-extension-mdxjs": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/remark-parse": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
@ -6434,6 +7053,15 @@
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
},
"node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">= 8"
}
},
"node_modules/source-map-js": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
@ -6604,6 +7232,15 @@
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
"license": "MIT"
},
"node_modules/style-to-object": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz",
"integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==",
"license": "MIT",
"dependencies": {
"inline-style-parser": "0.1.1"
}
},
"node_modules/sucrase": {
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
@ -7469,6 +8106,19 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-position-from-estree": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
"integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
"license": "MIT",
"dependencies": {
"@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-remove-position": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
@ -7577,13 +8227,12 @@
"peer": true
},
"node_modules/vfile": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz",
"integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
"integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
"license": "MIT",
"dependencies": {
"@types/unist": "^3.0.0",
"unist-util-stringify-position": "^4.0.0",
"vfile-message": "^4.0.0"
},
"funding": {

View file

@ -17,6 +17,7 @@
},
"dependencies": {
"@astrojs/check": "^0.9.2",
"@astrojs/mdx": "^3.1.6",
"@astrojs/rss": "^4.0.7",
"@astrojs/tailwind": "^5.1.0",
"@astropub/md": "^1.0.0",

Binary file not shown.

Before

(image error) Size: 124 KiB

After

(image error) Size: 80 KiB

View file

@ -4,11 +4,11 @@ import { IconTriangleExclamation } from "./icons";
---
<div
style={{ display: "none" }}
id="modal-age-restricted"
class="fixed inset-0 bg-stone-100 dark:bg-stone-900"
role="dialog"
aria-labelledby="title-age-restricted"
hidden
>
<div class="mx-auto flex min-h-screen max-w-3xl flex-col items-center justify-center text-center tracking-tight">
<div class="text-bm-500 dark:text-bm-400">
@ -30,9 +30,9 @@ import { IconTriangleExclamation } from "./icons";
screen from appearing in the future.
</p>
<div
style={{ display: "none" }}
id="age-verification-button-list"
class="flex w-full max-w-md flex-col-reverse justify-evenly gap-y-5 px-6 pt-5 sm:max-w-2xl sm:flex-row"
hidden
>
<button
data-modal-reject
@ -88,14 +88,12 @@ import { IconTriangleExclamation } from "./icons";
localStorage.ageVerified = "true";
document.body.style.overflow = "auto";
document.querySelectorAll("body>:not(#modal-age-restricted)").forEach((el) => el.removeAttribute("inert"));
modal.style.display = "none";
modal.hidden = true;
addAgeVerifiedQueryToLinks();
},
{ once: true },
);
modal
.querySelector<HTMLElementTagNameMap["div"]>("div#age-verification-button-list")!
.style.removeProperty("display");
modal.querySelector<HTMLElementTagNameMap["div"]>("div#age-verification-button-list")!.hidden = false;
rejectButton.focus();
}
};

View file

@ -1,4 +1,4 @@
---
---
<script is:inline>(a=>{let b="body>",c="#modal-age-restricted",d="true",e="ageVerified",f="searchParams",g=localStorage,h=new URL(location),i=x=>a.querySelectorAll(x),j=i(b+c)[0];h[f].get(e)==d&&(g[e]=d,h[f].delete(e),history.replaceState({},"",h));j&&(g[e]!=d&&((a.body.style.overflow="hidden"),i(b+":not("+c+")").forEach(x=>x.setAttribute("inert",d)),(j.style.display="block")))})(document)</script>
<script is:inline>(a=>{let b="body>",c="#modal-age-restricted",d="true",e="ageVerified",f="searchParams",g=localStorage,h=new URL(location),i=x=>a.querySelectorAll(x),j=i(b+c)[0];h[f].get(e)==d&&(g[e]=d,h[f].delete(e),history.replaceState({},"",h));j&&g[e]!=d&&((a.body.style.overflow="hidden"),i(b+":not("+c+")").forEach(x=>x.setAttribute("inert",d)),(j.hidden=!1))})(document)</script>

View file

@ -26,7 +26,7 @@ import DarkModeScriptInline from "./DarkModeScriptInline.astro";
document.querySelectorAll<HTMLElementTagNameMap["button"]>("button[data-dark-mode]").forEach((button) => {
button.addEventListener("click", toggleColorScheme);
button.classList.remove("hidden");
button.style.removeProperty("display");
button.hidden = false;
button.setAttribute("aria-hidden", "false");
});
};

View file

@ -31,19 +31,19 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
<span data-noscript
><a class="u-syndication text-link underline" href={link} target="_blank">View comments on Mastodon</a>.</span
>
<span style={{ display: "none" }} data-no-comments
<span hidden data-no-comments
>No comments yet. <a class="text-link underline" href={link} target="_blank"
>Be the first to join the conversation on Mastodon</a
>.</span
>
<span style={{ display: "none" }} data-comments
<span hidden data-comments
>Join the conversation <a class="text-link underline" href={link} target="_blank">by replying on Mastodon</a
>.</span
>
<span style={{ display: "none" }} data-error>Unable to load comments. Please try again later.</span>
<span hidden data-error>Unable to load comments. Please try again later.</span>
</p>
<button
style={{ display: "none" }}
hidden
class="group mx-auto w-64 rounded-lg bg-bm-300 px-4 py-1 text-stone-800 disabled:bg-bm-400 dark:bg-green-800 dark:text-stone-100 dark:disabled:bg-green-900"
id="load-comments-button"
>
@ -66,7 +66,7 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
Loading...
</span>
</button>
<div id="comments" style={{ display: "none" }}></div>
<div id="comments" hidden></div>
</section>
<template id="template-comment-emoji">
@ -101,7 +101,7 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
target="_blank"
>
<time class="dt-published mr-1" data-published-date aria-label="Publish date"></time>
<time style={{ display: "none" }} class="italic" data-edited-date>(edited)</time>
<time hidden class="italic" data-edited-date>(edited)</time>
</a>
</div>
<div
@ -249,7 +249,7 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
edited.title = comment.edited_at;
edited.classList.remove("hidden");
edited.classList.add("dt-updated");
edited.style.removeProperty("display");
edited.hidden = false;
}
const commentBoxContent = commentBox.querySelector<HTMLElementTagNameMap["div"]>("div[data-content]")!;
@ -276,26 +276,20 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
if (commentsList.length) {
const fragment = document.createDocumentFragment();
commentsList.forEach((comment) => fragment.appendChild(comment));
commentsDescription
.querySelector<HTMLElementTagNameMap["span"]>("span[data-comments]")!
.style.removeProperty("display");
commentsDescription.querySelector<HTMLElementTagNameMap["span"]>("span[data-comments]")!.hidden = false;
const commentsDiv = section.querySelector<HTMLElementTagNameMap["div"]>("div#comments")!;
commentsDiv.appendChild(fragment);
commentsDiv.style.removeProperty("display");
commentsDiv.hidden = false;
} else {
commentsDescription
.querySelector<HTMLElementTagNameMap["span"]>("span[data-no-comments]")!
.style.removeProperty("display");
commentsDescription.querySelector<HTMLElementTagNameMap["span"]>("span[data-no-comments]")!.hidden = false;
}
} catch (e) {
console.error("Fetch Mastodon comments error", e);
commentsDescription
.querySelector<HTMLElementTagNameMap["span"]>("span[data-error]")!
.style.removeProperty("display");
commentsDescription.querySelector<HTMLElementTagNameMap["span"]>("span[data-error]")!.hidden = false;
} finally {
loadCommentsButton.style.display = "none";
loadCommentsButton.hidden = true;
loadCommentsButton.blur();
commentsDescription.style.removeProperty("display");
commentsDescription.hidden = false;
}
}
@ -327,9 +321,9 @@ const { link, instance, user, postId, blacklistedComments } = Astro.props;
{ once: true },
);
const commentsDescription = commentSection.querySelector<HTMLElementTagNameMap["p"]>("p#comments-description")!;
commentsDescription.style.display = "none";
commentsDescription.querySelector<HTMLElementTagNameMap["span"]>("span[data-noscript]")!.style.display = "none";
loadCommentsButton.style.removeProperty("display");
commentsDescription.hidden = true;
commentsDescription.querySelector<HTMLElementTagNameMap["span"]>("span[data-noscript]")!.hidden = true;
loadCommentsButton.hidden = false;
}
initCommentSection();

View file

@ -0,0 +1,16 @@
---
type Props = {
id: number;
title: string;
text: string;
};
const { id, title, text } = Astro.props;
---
<Fragment>
<a class="decoration-dotted" id={`note-${id}`} href={`#note-${id}`} title={title} data-tooltip>
{text}
</a>
<sup>{id}</sup>
</Fragment>

View file

@ -22,6 +22,20 @@ relatedGames:
- crossing-over
---
import { Image } from "astro:assets";
import imageMarcoConceptArt from "../../assets/images/crossing_over/marco_concept_art.jpg";
import imageMarcoFirstAppearance from "../../assets/images/crossing_over/marco_first_appearance.png";
import imageBardConceptArt from "../../assets/images/crossing_over/bard_concept_art.jpg";
import imageBardAppearance from "../../assets/images/crossing_over/bard.png";
import imageBriefcase from "../../assets/images/crossing_over/briefcase.png";
import imageBoatWakes from "../../assets/images/crossing_over/boat_wakes.png";
import imageLooseThoughts from "../../assets/images/crossing_over/loose_thoughts.png";
import imageArchitectureVn from "../../assets/images/crossing_over/architecture_vn.png";
import imageTextbox from "../../assets/images/crossing_over/textbox.png";
import imageScriptWordCount from "../../assets/images/crossing_over/script_word_count.png";
import imageMarcoSprites from "../../assets/images/crossing_over/marco_sprites.png";
import imageSceneInFinalGame from "../../assets/images/crossing_over/scene_in_final_game.png";
A.K.A. that time I made a game in a month.
_(it really wasn't that long ago...)_
@ -30,7 +44,7 @@ _(it really wasn't that long ago...)_
## Part 1: Preparations
It all started with an idea for a story. One of many that I had before it got shelved, hoping to one day turn it into an actual story when I had the chance. The initial idea was for an 'endo soul vore' scenario, which I described to a friend (hi Dee!) back in August '23. Here it is reproduced verbatim:
It all started with an idea for a story. One of many that I had before it got shelved, hoping to one day turn it into an actual story when I had the chance. The initial idea was for an 'endo soul vore' scenario, which I described to a friend (hi, Dee!) back in August '23. Here it is, reproduced verbatim:
> Me: I had an idea a long while ago you may like, but I don't think it's something I'd ever feel like sitting down to write
@ -54,7 +68,7 @@ At the same time, I had been following somewhat closely the starting date for ee
2. Motivation. I had a boost in it not only from getting psychiatric treatment, but also from learning a bunch of stuff. I've been getting better at writing in the two years I've been writing (or I'd like to believe so!), and I'd just started learning Blender earlier in January '24. Plus, I had the desire to try out Godot, learning the basics just two days before the game jam started (it helped that I had a heavy background in programming). As long as I could manage the scope well, I felt that I could deliver a finished project in time.
3. Time and energy. Of course, I don't think I would be able to do this project if I still worked full- or even part-time. Despite being unemployed (mostly due to personal reasons), I'm lucky to still have resources to maintain myself for a while. Plus, having just finished two big commissions to my clients' great satisfaction, and then just launched my SubscribeStar, I was feeling more confident than usual that I could pull off such a monumental task.
Despite all of this, I was still unsure if I should really join, feeling that it'd be a waste of time or that I would deliver something embarrassing. But my friend Hans really encouraged me to move forward, and so, I decided to join Strawberry Jam 8.
Despite all of this, I was still unsure if I should really join, feeling that it'd be a waste of time or that I would deliver something embarrassing. But my friend Hans Woofington really encouraged me to move forward, and so, I decided to join Strawberry Jam 8.
Until February rolled around, I refrained from investing too heavily into the conceptualization of my game only deciding that I would make a visual novel. I spent most of those few days getting familiar with Godot as well as Blender and MuseScore, since I knew that I wanted to make my own soundtrack using their open high-quality sound library. Still, I was committed from the start to the soul vore story idea, and had some vague notions that it would help with the relatively short time frame:
@ -87,35 +101,43 @@ In terms of themes, I put a lot of research into [borderline personality disorde
Speaking of, I did work on some concept art! Including the two characters, the boat, and the environment. The quality of those drawings was terrible (further convincing me to make all the graphics in 3D instead), but it really helped with deciding how to make each element look. I knew that I wanted the environment to be simple, like the inside of a cave, and give the river a striking but single color the cave portion of Undertale, [Waterfall](https://undertale.fandom.com/wiki/Waterfall), was a strong influence on its look, especially the room with dark floor/walls and cyan water. And the boat, named after the aforementioned "akhirah", was made to look vaguely similar to ancient rowboats used by the Babylonians.
<figure>
![Photograph of a page, with several drawings of an anthropomorphic jackal named Marco, wearing a large coat, a mask, and ankle cuffs. There's also a drawing of a boat in the corner.](../../assets/images/crossing_over/marco_concept_art.jpg)
<figcaption class="text-center">Concept art of Marco and Akhirah. Feel free to judge my awful drawing skills...</figcaption>
<Image
src={imageMarcoConceptArt}
alt="Photograph of a page, with several drawings of an anthropomorphic jackal named Marco, wearing a large coat, a mask, and ankle cuffs. There's also a drawing of a boat in the corner."
/>
<figcaption class="text-center">
Concept art of Marco and Akhirah. Feel free to judge my awful drawing skills...
</figcaption>
</figure>
<figure>
![The character Marco on his boat over a pink river, leaning down towards the camera with an open hand to the side.](../../assets/images/crossing_over/marco_first_appearance.png)
<figcaption class="text-center">Marco's (and Akhirah's) first appearance in the game.</figcaption>
<Image
src={imageMarcoFirstAppearance}
alt="The character Marco on his boat over a pink river, leaning down towards the camera with an open hand to the side."
/>
<figcaption class="text-center">Marco's (and Akhirah's) first appearance in the game.</figcaption>
</figure>
Marco's design was mostly inspired by that of [Anubis](https://en.wikipedia.org/wiki/Anubis), the Ancient Egyptian god of the underworld, with his dark fur and very long ears. The golden cuffs that he wears are also a reference to him. But I wanted to incorporate other cultural elements associated with death in his design the skull-like mask that he wears, and his large coat, are somewhat modern interpretations of the grim reaper (with its skeletal body and dark cloak) but also because I thought muzzle fangs and trenchcoats look cool, lol! When he eventually takes off his mask (which I had planned to be late in the game, when the soul eventually grows weak), he would reveal his green eyes. I had originally intended for the eyes of the mask to glow green as well, but eventually I settled on the red ones, which I thought ended up looking much better. When it came to modeling his head, it took 4 different tries until I was satisfied! As for the name "Marco", he was named after someone from my past, someone very smart and clever and kind the kind of person one should strive to be, I feel like.
<figure>
![Photograph of a page, with several drawings of a blobby and oval character named Bard. There are also a few framed drawings of different angles of scenes taking place on a boat.](../../assets/images/crossing_over/bard_concept_art.jpg)
<figcaption class="text-center">Concept art of Bard and some screens. I don't think his original look is physically possible...</figcaption>
<Image
src={imageBardConceptArt}
alt="Photograph of a page, with several drawings of a blobby and oval character named Bard. There are also a few framed drawings of different angles of scenes taking place on a boat."
/>
<figcaption class="text-center">
Concept art of Bard and some screens. I don't think his original look is physically possible...
</figcaption>
</figure>
For Bard's design, I had a couple of inspirations the main one being the visual novel [Ghost Trick](https://en.wikipedia.org/wiki/Ghost_Trick%3A_Phantom_Detective), where the protagonist is also a cyan soul (or a ghost, rather). In that game, ghosts look like flaming balls, and for my take on what a soul would look like, I wanted it to feel more droopy, like something gooey that is slowly dripping and disappearing. As I sat down to draw the concept art, I decided to take some inspiration from the look of [a black hole with an accretion disk surrounding it](https://en.wikipedia.org/wiki/Accretion_disk); a symbol that represents how, inevitably, everything will come to an end. Although I flipped that image on its head (and quite literally too!), giving the core a white appearance instead of black. I played a bit with an upper and lower part surrounding that core, making the top one look inside-out (with the use of Blender's "backface culling") to give it a more ghostly look. The name "Bard" has a few meanings aside from being non-binary (like the character in my mind), it also represents a bard who tells tales, as well as the association with the word "burden" that Bard themself carries a lot of. I knew that I wanted their soul to be very geometric, and I used a few shapes like ovals, sine waves, and circles to create their unique look.
<figure>
![A cyan orb, surrounded on the top by an inside-out dark blue oval, and on the bottom by cyan ribbon-like strands.](../../assets/images/crossing_over/bard.png)
<figcaption class="text-center">Bard's final look.</figcaption>
<Image
src={imageBardAppearance}
alt="A cyan orb, surrounded on the top by an inside-out dark blue oval, and on the bottom by cyan ribbon-like strands."
/>
<figcaption class="text-center">Bard's final look.</figcaption>
</figure>
Both characters underwent several iterations until I was satisfied with them in fact, I changed them yet again when making the minute-long animation, near the end of the project! Marco especially took most of the work for obvious reasons, but thankfully my friend Hans gave me good pointers on modeling them.
@ -129,10 +151,11 @@ There. Still haven't forgotten how to make some text bigger than other text.
I guess I'll start by talking about something Blender-related that isn't exactly modeling: shading. It simply means selecting the materials for all the different elements colors, textures, etc. Like I've said back in Part 1, I wanted a pixel art/cellshaded artstyle. And to commit to it even further, I looked for palettes to use for said shading. Limiting the choices helped with making things have a unified identity, as well as stick out from the background and other objects. The surfaces are all made of a similar base material, which creates cells based on the light level and then applies a dithering effect between them (i.e. some pixels of each color blend into each other, between two different cells, as old games with limited palettes did to make smooth transitions). They also had different colors under the two sets of lights: one being "white" for the default look, and the other being "blue" from Bard's glow. This helps with the illusion of the soul actually having its own light. On top of that, I also added an outline to most materials, based off the dark color of the material. This kind of breaks the convention for pixel art, since I'm relying on how Blender generates the alpha for those outlines, but it certainly makes objects much more readable. For each outline, I had to handpick values for the thickness and color sometimes having to deviate from the palette to do so.
<figure>
![A briefcase filled with gold bars.](../../assets/images/crossing_over/briefcase.png)
<figcaption class="text-center">A gold-filled briefcase, one of the many items that you fish in Crossing Over. Notice the dark yellow outline around the gold bars, and the dark brown one around the light brown bits.</figcaption>
<Image src={imageBriefcase} alt="A briefcase filled with gold bars." />
<figcaption class="text-center">
A gold-filled briefcase, one of the many items that you fish in Crossing Over. Notice the dark yellow outline around
the gold bars, and the dark brown one around the light brown bits.
</figcaption>
</figure>
The individual items that you fish were straightforward to model, using some low poly techniques, and then applying a subdivision surface modifier (to add more geometry and make shapes more curvy, therefore more realistic). For the fishing items themselves, the modeling was done late into development (once I'd started work on writing, which we'll get to in a later part) so most of my early modeling was into the two characters and the boat.
@ -140,10 +163,13 @@ The individual items that you fish were straightforward to model, using some low
Speaking of, the "wake" effect that you see sometimes while Akhirah is moving (i.e. the foams behind the boat) was easily a day-long chore. For starters, I couldn't remember the word "wake" so I've spent an embarrassing amount of time trying to remember it, having to go back and skim through my YouTube history (looking for a Minecraft video showcasing [a mod that implemented wakes](https://www.curseforge.com/minecraft/mc-mods/wakes), haha!). Anyway, it was an interesting experience to implement them, [going off of a tutorial](https://www.youtube.com/watch?v=14SNmHvVBio) and having to get more acquainted with some intermediate-level topics from Blender such as conditional shading and using noise displacement. They didn't turn out perfectly realistic, but I think they made the somewhat dull pink environment of the river feel more natural, and the end result was well worth the effort. In fact, the boat doesn't ever move around in the river and when it does look like it's moving, it's just a bunch of tricks with the camera and the wakes!
<figure>
![Marco sitting down against the railing at the back of his boat, without a mask and keeping his hands underneath a hovering Bard. Behind him are wakes being made by the boat moving over the water.](../../assets/images/crossing_over/boat_wakes.png)
<figcaption class="text-center">A late-game shot, displaying multiple light sources and wakes behind the boat.</figcaption>
<Image
src={imageBoatWakes}
alt="Marco sitting down against the railing at the back of his boat, without a mask and keeping his hands underneath a hovering Bard. Behind him are wakes being made by the boat moving over the water."
/>
<figcaption class="text-center">
A late-game shot, displaying multiple light sources and wakes behind the boat.
</figcaption>
</figure>
But as I've hinted at before, Marco's model was the hardest challenge. His model is far from perfect his arms are too short, his feet are just bricks, his thumbs are in unnatural spots, his lips are wonky, and his body often clipped through his trenchcoat , which is understandable given my inexperience. But most issues I've managed to cover or fix in an image editor. Despite the inexperienced modeling and rigging, he still turned out decent enough to pose around. It definitely taught me a lot about animating, the hard way! At the very least, my amateurish experience was complemented by retro look that I was going for, so I'll take that as a win.
@ -159,10 +185,11 @@ I've had some amateur experience writing music before but not on the scale o
When it comes to making music, my process focuses more on individual voices (i.e. each note played by each instrument, including duration and pitch) than harmonies, only falling back to chords in a few cases, such as arpeggios or some fancier harmonization. But sometimes, a chord will simply be the tonic key, or tonic + fifth. I feel that too many voices can muddy the melodies, and make it harder to follow the motions which, sometimes, can be the desired effect! Percussion is not my strong suit, so you may notice throughout the OST how I often resort to simple (but hopefully effective) rhythms.
<figure>
![Part of a page containing sheet music, entitled Loose Thoughts, and composed by Bad Manners. The instruments include low trombone, piano, harp, and strings.](../../assets/images/crossing_over/loose_thoughts.png)
<figcaption class="text-center">The first musical bars that ever were.</figcaption>
<Image
src={imageLooseThoughts}
alt="Part of a page containing sheet music, entitled Loose Thoughts, and composed by Bad Manners. The instruments include low trombone, piano, harp, and strings."
/>
<figcaption class="text-center">The first musical bars that ever were.</figcaption>
</figure>
The very first track I composed was "Loose Thoughts" a slow song that starts with a piano and plucked strings. It plays in introspective moments, and it helped me define a few other leitmotifs that would be used ad nauseam in the other tracks, as well as the general vibe. I really dig the orchestral vibe that MuseScore's sound library has to offer, and made a lot of use of violins, cellos and contrabasses in other tracks. Over the first week, I also made "Aboard the Akhirah" (the jazzy song that plays in the more "I don't know if I should trust this ferryman!" moments, with an electric bass and a plucked contrabass before the Hammond organ joins in, and an extended sax solo alter on) and "Fulminant" (the more energetic and catchy main menu song, with a violin and simple drums joined by an electric bass and an acoustic guitar). These three songs really helped steer the general vibe I was going for, in terms of the game's atmosphere.
@ -182,19 +209,23 @@ There was one song that I had planned but didn't make it. It was supposed to pla
One of the first things I started working on in the project was the textbox. Compared to other game genres, coding a VN is probably simpler but I still wanted to nail it down, since I wasn't familiar with Godot. Learning the ropes for development with all the Control and 2D nodes would have been a huge challenge if not for the extensive tutorials out there (I relied on [this nearly 12-hour video tutorial](https://www.youtube.com/watch?v=nAh_Kx5Zh5Q) a lot!) but the basis for the textbox and architecture was done fairly quickly.
<figure>
![A crude digital drawing showing multiple components communicating in order to bring functionality to the game, with emphasis on the ones named visual_novel and VNInterpreter.](../../assets/images/crossing_over/architecture_vn.png)
<figcaption class="text-center">Basic overview of my visual novel architecture. There's a lot that I would have changed in hindsight...</figcaption>
<Image
src={imageArchitectureVn}
alt="A crude digital drawing showing multiple components communicating in order to bring functionality to the game, with emphasis on the ones named visual_novel and VNInterpreter."
/>
<figcaption class="text-center">
Basic overview of my visual novel architecture. There's a lot that I would have changed in hindsight...
</figcaption>
</figure>
Which isn't to say that implementing more and more features was a breeze. By the end of the first week, when I was handling the load/save system (which took a LOT of work to get right), I was seriously considering switching to something other than Godot, just because its pain points can be annoying. Meanwhile, its strengths a robust animation system, good input handling, and easy export to multiple platforms incentivized me to stay. After all, I'd joined the game jam mainly as a learning process, and for better or worse, I was definitely learning a lot.
<figure>
![Screenshot of a game screen, with a blue text box displaying the name "Bard" and the parenthesized text "Okay, that's enough...". The background is completely gray.](../../assets/images/crossing_over/textbox.png)
<figcaption class="text-center">One of the earliest implementations of the text box.</figcaption>
<Image
src={imageTextbox}
alt="Screenshot of a game screen, with a blue text box displaying the name 'Bard' and the parenthesized text 'Okay, that's enough...'. The background is completely gray."
/>
<figcaption class="text-center">One of the earliest implementations of the text box.</figcaption>
</figure>
Still, I managed to stumble my way through some messy logic, often going for quick and messy fixes because of time constraints. With the basic visual novel architecture and load/save system in place, I added more features a main menu, prompts, autosaving, music support, backgrounds, text log... When it came time to implement the fishing minigame (by that point, I had scrapped the idea for other puzzle-based minigames), it thankfully wasn't too bad to implement.
@ -214,10 +245,13 @@ So instead, I've left the actual writing for late into the project once I ha
And my bluff eventually paid off, as I managed to ruminate on the setting and the characters and their arcs, and I was a lot more confident when it was time to put those thoughts into words.
<figure>
![Screenshot of a text editor containing the start of the game's script. It shows that there are 14139 words in the document.](../../assets/images/crossing_over/script_word_count.png)
<figcaption class="text-center">Word count for the script's draft, with ~1000 different lines, and ~13000 words of dialogue.</figcaption>
<Image
src={imageScriptWordCount}
alt="Screenshot of a text editor containing the start of the game's script. It shows that there are 14139 words in the document."
/>
<figcaption class="text-center">
Word count for the script's draft, with ~1000 different lines, and ~13000 words of dialogue.
</figcaption>
</figure>
Aside from the unique challenges of writing for a visual novel (perhaps more akin to stage play direction, having to integrate audiovisual aspects into the script between the lines, with the added challenge of doing it with algorithmic precision), I generally followed the same process for regular stories. I wrote an outline first, breaking the story into different parts and deciding what happened in each one and choosing the differences between each route, adjusting it until I decided to have four different ones.
@ -246,10 +280,13 @@ The "cousin" route was initially intended to be a complex route, but was eventua
Most of these narrative decisions came about in the "outline" portion, to decide how each character should act. Their actual personalities came about when I was writing the script's draft, which would eventually become the actual lines in the visual novel. The draft also included how each character reacts ("Marco feels dejected", "Bard blushes", etc.). These emotion prompts were very useful for posing the characters and creating sprites I knew beforehand if I had to make them look happy, confused, sad, and so on. I made the sprites in one go, before the draft was implemented as a visual novel. Although later on, I had to redo all of the sprites, because I messed up the shaders...oops.
<figure>
![Three screenshots of Marco. From left to right: tilting his head and holding a closed fist underneath his chin; facing down and putting his open hand over his chest; partially covering his smiling snout with his open hand while facing forwards.](../../assets/images/crossing_over/marco_sprites.png)
<figcaption class="text-center">A few of Marco's sprites, respectively named "curious", "clutching chest", and "playful".</figcaption>
<Image
src={imageMarcoSprites}
alt="Three screenshots of Marco. From left to right: tilting his head and holding a closed fist underneath his chin; facing down and putting his open hand over his chest; partially covering his smiling snout with his open hand while facing forwards."
/>
<figcaption class="text-center">
A few of Marco's sprites, respectively named "curious", "clutching chest", and "playful".
</figcaption>
</figure>
There's a lot more that I could say about the story, but it's kinda hard. Writing this was emotionally taxing (I was literally sobbing when I finished it). It always gets me when Bard says "Thank you." at the very end, and I dunno why...! Funny enough, it's hard to explain what I'm writing instead of explaining which emotions I'm trying to rouse, it's much easier to just rouse them in story form. The story was very personal and dear to me I've added lots of moments that would make me laugh, cry, ache, and reflect. I could write ten times as many words to go over everything that went through my head when I worked on it. And in some ways, I think this is the best that my writing has ever been.
@ -259,15 +296,18 @@ There's a lot more that I could say about the story, but it's kinda hard. Writin
With the first version of the script done, as well as most music and character sprites, I've spent the final week putting everything together. I've adapted the draft of my script to fit the format that my Godot code expected, while also creating background sprites (stills and animated) and adjusting individual lines as I worked my way scene-by-scene while also fixing the occasional bug here and there. It was at this point that all the separate things I had really started to feel like a game and I was proud of it!
<figure>
![Marco and Bard sitting in the boat, with two sprites overlaid. Within those, Bard is taken aback and sweating, and Marco is having a hearty laugh. Through the textbox, Marco says: "Haha, of course not! How would a butt plug bite a fishing hook?"](../../assets/images/crossing_over/scene_in_final_game.png)
<figcaption class="text-center">A scene from the final game; finally putting UI, dialogue, sprites, music, and backgrounds all together.</figcaption>
<Image
src={imageSceneInFinalGame}
alt="Marco and Bard sitting in the boat, with two sprites overlaid. Within those, Bard is taken aback and sweating, and Marco is having a hearty laugh. According to the textbox, Marco says: 'Haha, of course not! How would a butt plug bite a fishing hook?'"
/>
<figcaption class="text-center">
A scene from the final game; finally putting UI, dialogue, sprites, music, and backgrounds all together.
</figcaption>
</figure>
With a single setting, it was easy to make several animated backgrounds and work with interesting angles and poses a process which certainly helped me get used to Marco's rig, for the greatest challenge to come. I often replayed each chapter up to 12 times (at least 3 times for each "route"...!), to make sure the dialogue was to my liking, and that effects like bouncing sprites or screen flashes/transitions looked proper. I worked on each scene in sequence, only going back to fix the occasional set-up in the lines. It was a slow but satisfying process.
With about 4 days before the game jam's deadline, I had ~95% of the project done I had just added support for sound effects, and only the animation remained to be done. My friend Hans had asked to playtest it, and I wasn't sure I would be able to handle the feedback in time. But at his insistence, I decided to let him play it, as well as our friend Desiran (creator of [Wrangler](https://desiran.itch.io/wrangler)). I wasn't sure how useful their feedback would be, but they managed to give some pointers on some dialogue and bugs, which were relatively easy fixes. And I'm glad that they did play it beforehand, because it meant I could fix these issues that I missed before I ended up publishing my game...!
With about 4 days before the game jam's deadline, I had ~95% of the project done I had just added support for sound effects, and only the animation remained to be done. My friend Hans had asked to playtest it, and I wasn't sure I would be able to handle the feedback in time. But at his insistence, I decided to let him play it, as well as our friend Desiran. I wasn't sure how useful their feedback would be, but they managed to give some pointers on some dialogue and bugs, which were relatively easy fixes. And I'm glad that they did play it beforehand, because it meant I could fix these issues that I missed before I ended up publishing my game...!
And the animation was still a big challenge. I had set aside the last 4 days of February '24 to work exclusively on it. I imagined that it would take a long time to get a minute of animation done especially since I had to rely on it syncing up with the music that I had done ~2 weeks prior, at that point. But it really wasn't as bad as I thought it would be. I honestly had a blast working on it... And I didn't even need a storyboard! After listening to the track over and over, I had a pretty clear idea of how the scene would go in my head. In just two days, I managed to animate everything (and even dedicate some time to make a nice internal shot, hehe), fix the occasional clipping, and render it all. After struggling to deal with the .ogv video encoder, I managed to get it to work relatively well in-game (with a slight hiccup in the audio that would eventually be fixed in a later release).
@ -293,4 +333,4 @@ At the end of the day, I would be happy to become even a fraction of who Marco w
---
Oh, hey, I didn't expect you to read all of this! I hope it was enjoyable. By the way, since I first wrote this retrospective-slash-postmortem, I've [opened the source code for this game](https://gitgud.io/BadMannersXYZ/CrossingOver)! If you are interested in an even more hands-on look at how it was made, or want to make your own visual novel in Godot, feel free to peruse it to your heart's content.
Oh, hey, I didn't expect you to read all of this! I hope it was enjoyable. By the way, since I first wrote this retrospective-slash-postmortem, I've [released the source code for this game](https://gitgud.io/BadMannersXYZ/CrossingOver)! If you are interested in an even more hands-on look at how it was made, or want to make your own visual novel in Godot, feel free to peruse it to your heart's content.

View file

@ -1,262 +0,0 @@
---
title: "Taken In: Story Breakdown!"
pubDate: 2024-01-23
isAgeRestricted: true
authors: bad-manners
thumbnail: /src/assets/thumbnails/other/taken_in_breakdown.png
description: |
First time annotating a vore story; in this case, [Taken In](/stories/taken-in). Here, I go over my writing process while offering additional tidbits of information.
tags:
- behind the scenes
- Sam Brendan
- feral predator
- anthro prey
- male predator
- ambiguous gender prey
- willing predator
- unwilling prey
- oral vore
- same size
- full tour
- point of view
relatedStories:
- taken-in
---
All in all, going over the story and breaking it down was a fun process. This was originally a text document, which I had to completely refit into this blog post that you're reading (oof...!). But for the sake of posteriority, I think it was worth the effort.
If you're up for this non-linear read, then I hope you enjoy this sneak-peek into my thoughts! Just hover or long-press over the links with dotted underlines, and it should show the relevant annotations. Now, without further ado, let me reintroduce...
<h2><a class="decoration-dotted" id="note-1" href="#note-1" title="I usually try to make titles with a double meaning. Here, 'take in' usually means bringing a pet to one's home - in this case, it's more like the 'pet' has forced itself into the PoV's place! Plus, the PoV is taken into Sam's body." data-tooltip>Taken In</a><sup>1</sup></h2>
<a class="decoration-dotted" id="note-2" href="#note-2" title="I actually had to rewrite most of the intro from scratch, it got too wordy and just boring to read. For a PoV segment, I thought something less detailed and to-the-point was more fun." data-tooltip>Clank! Shuffle! Crunch!</a><sup>2</sup> The sounds outside are too loud to be stopped by the walls in your room, and you jolt awake.
Ugh, and you were finally in deep sleep...
<a class="decoration-dotted" id="note-3" href="#note-3" title="With PoV stuff, even details like 'when you wake up in the middle of the night' are better left ambiguous." data-tooltip>You check the time, and it's still too early to be out of bed</a><sup>3</sup>. The sun hasn't even risen yet. But the commotion continues outside, forcing you to get up and investigate.
It's probably some wild animal messing with the trash, you think to yourself. <a class="decoration-dotted" id="note-4" href="#note-4" title="Again, leaving 'what the place is' ambiguous so it could be a house, an apartment, etc." data-tooltip>You navigate through your place in the dark and out the door</a><sup>4</sup>, too tired to worry about your own safety. You don't even bother to lock it behind you as you leave.
There's nobody outside, with only dim streetlights to illuminate the empty street. It seems you're the only one who bothers to investigate the noise, and it definitely sounds like it's coming from a metal trashcan. Or more precisely, from something messing with it, with no regard for the neighborhood's peace and quiet.
When you get close enough, <a class="decoration-dotted" id="note-5" href="#note-5" title="A lot of this was having fun with how I would look and act as a feral. Despite the narration following the PoV, I still wanted to make my sona's actions credible, even if the intentions are omitted. In this case, Sam is just digging through trash, looking for something interesting to play with." data-tooltip>you find some animal with its upper half inside of the metal bin</a><sup>5</sup>. It's too big to be a raccoon, or even a fox. You can only see its long, furry legs and tail sticking out from the cylinder as it continues to nose its contents.
You can't tell what species it is without looking at its face, but the feral might be a dog or a wolf. Its coat is quite unusual, green with white patterns at the back. The paws and the tip of its tail are also colorless, except for its bright green pawpads, and some light teal spots between body and limbs. An unusual coloration, for sure you imagine that the tones don't offer the creature much in terms of camouflage, out in the wild...
As it continues to scavenge the trash can for food, and make a ruckus while at it, you slowly approach it without any sense of danger. It doesn't really give wolf vibes, so maybe it's just a weird breed of dog? If it's an escaped pet, it might be wearing a collar — hopefully, it'll have the owner's phone number engraved on a tag.
"Easy, boy..."
You call out in a whisper, instinctively assuming that the animal is a 'he'. The slim and fuzzy creature stops, <a class="decoration-dotted" id="note-6" href="#note-6" title="Sam has great hearing thanks to his large maned wolf ears." data-tooltip>hearing your groggy voice even while constantly bumping against the metal walls</a><sup>6</sup>, and pulls himself out from the can.
As you step back, you can see his front side when he turns on all fours towards you. The front paws are similar to the hind ones. Definitely canine, with a gradient that goes from white to green, and teal at the middle. Sadly, <a class="decoration-dotted" id="note-7" href="#note-7" title="Always fun to pretend the briefcase is covering my face. I also played with that concept in the story 'Part of the Show'." data-tooltip>you can't get a good view of his face, as he's carrying a sizable object with his snout</a><sup>7</sup>. Something rectangular, which he must've fished out of the trash. Your tired eyes have to adjust to the bad lighting in order to process the blurry image, but the defining features of the gray texture and the handle at the top clear up any confusion.
"Is that a...metal briefcase?" You ask yourself, and <a class="decoration-dotted" id="note-8" href="#note-8" title="I never decided if Sam actually understood what the PoV spoke or not, despite being sapient. So I left that ambiguous, even for myself. Whatever the case, here he just acts curious about the PoV." data-tooltip>the strange dog simply tilts his head to the side</a><sup>8</sup>.
The container hiding his head also rolls along, only letting you spot his large ears. They are too big for a dog, so his species can't be that, either. Maybe a maned wolf, then...? It'd certainly explain why he's got such long legs...! But they aren't from around here, you're pretty sure. He might be an exotic pet that has escaped, one without a collar. <a class="decoration-dotted" id="note-9" href="#note-9" title="Normally I write the reasons after I decide what happens. In the case of PoV stories, it's easier since reasons don't have to necessarily follow or be consistent. For example, the narrator could be mistaken - like in this case." data-tooltip>Maybe he was looking for food, and smelled something tasty inside of the briefcase</a><sup>9</sup>.
"It's okay, boy..." You slowly approach him with a cutesy voice, careful that he might get aggressive, drop the case, and bite you. Do maned wolves even get rabies?
Your bluff about him being domesticated seems right on the money, <a class="decoration-dotted" id="note-10" href="#note-10" title="Sam just acts like a silly dog who wants to play." data-tooltip>as he doesn't seem alarmed by you at all. He sits down, slowly wagging his tail like a huge brush as he eagerly awaits</a><sup>10</sup>. <a class="decoration-dotted" id="note-11" href="#note-11" title="Sam can see with his entire mimic face. In his case, I like to play with that eerie feeling you get when you're being observed, but without any eyes staring back at you (see the story 'Part of the Show' I mentioned earlier)." data-tooltip>You can't see his eyes, but it definitely feels like he's staring at you</a><sup>11</sup> even with the metal box in the way.
One of your hands moves to the back of his head, holding the base of his ear. His fur is so silky and warm! You can't help it but give it a few rubs. He seems to immediately like your scritches, thumping one of his legs against the floor and panting excitedly. He certainly sounds just like a dog, making you wonder if maned wolves also bark like them.
"Good boy..." You whisper to him, stopping the scritches <a class="decoration-dotted" id="note-12" href="#note-12" title="You can pet the Sam! This was one of the cheeky images I really wanted to include. My stories have plenty of self-serving moments like this scattered around." data-tooltip>to give his head a couple of pats</a><sup>12</sup>.
He replies with a happy whine, and your hand brushes against the back of the briefcase. He still hasn't let go of his prized possession. Either that, or you think to yourself it may be stuck to his face... Poor thing, that must be it! Of course, domesticated or not, the best thing that you can do for the maned wolf is get his face free. <a class="decoration-dotted" id="note-13" href="#note-13" title="Poking fun at the absurd line of reasoning. The reader is likely aware (either from seeing my sona or reading the tags) that the plan won't work, so there's a big chance they're in on the joke." data-tooltip>That's simply the logical line of reasoning</a><sup>13</sup>.
You squat to his height. Your other hand approaches the friendly canine, and each one holds the aluminum briefcase by the edges. Then you grasp it and start pulling slowly. It's weird, the metal almost feels warm to the touch...
His head moves along with it, and <a class="decoration-dotted" id="note-14" href="#note-14" title="Sam growls because you're pulling on his face! But it's sturdy enough that it doesn't actually hurt him, it's just bothersome." data-tooltip>he starts growling like a dog that doesn't want to let go of his toy</a><sup>14</sup>. You mentally apologize for the temporary discomfort you might be causing, but the briefcase is stuck harder than you thought. If so, this unfortunate canine could've been starving for hours, or more...! His growls don't matter it will be over soon, once you manage to get this blasted thing off.
You start pulling harder, but the briefcase simply won't budge! In turn, <a class="decoration-dotted" id="note-15" href="#note-15" title="Being a mimic, Sam communicates with sounds he's learned. Even as he speaks, he doesn't use his vocal chords! Which means he can communicate even with prey blocking his throat." data-tooltip>the maned wolf growls harder at you, and then...hisses at you? Isn't that more of a feline thing...?</a><sup>15</sup> Regardless, the aluminum case doesn't seem to move an inch. Even though it feels stuck to the creature's face, it almost seems to bulge forward as he continues to hiss...
"...Wh-What?"
It's hard to tell under the awful streetlight, but for a moment, out of the corner of your eye, you swear that you just saw something, slithering in the middle of the maned wolf's face...
The slight distraction causes you to lose your balance, falling back and pulling the maned wolf on top of you. Lying flat against the hard sidewalk, his canine forepaws pin your chest down. He's not too heavy that it hurts, but you notice how he's about the same size as you. But something more urgent calls your attention. He still has that briefcase on his head, almost against your own face and you can see an opening in the middle.
<a class="decoration-dotted" id="note-16" href="#note-16" title="I hardly display my maw if I can help it. But here I want to give you some affectionate face licks, to show I'm just being playful - not realizing my actions will be misunderstood." data-tooltip>The metal deforms and bends, not unlike skin or some other organic tissue. A symmetrical slit begins to expand and part the rectangular surface into an upper and a lower half. A pair of jaws. It opens just enough to reveal a set of long and jagged teeth along the vertical direction and a yellowish tongue that looks more like an octopus tentacle without its suckers. The maw twists into something like a smile, and the maned wolf wags his tail as the slobbery appendage drags over your face.</a><sup>16</sup>
Panic sets into you. Suddenly face to face with monstrous mandibles, <a class="decoration-dotted" id="note-17" href="#note-17" title="His teeth are dull, so this is another case where the narration is purposefully wrong. I tried to lean heavily into the unwillingness of the PoV with these descriptions." data-tooltip>your instincts tell you to fear for your life before those razor-sharp fangs can sink into your skin</a><sup>17</sup>. You squirm and struggle, trying to get out from underneath this 'maned wolf'.
He makes no effort to keep you down, and slips to one side while you roll to the other. The creature yelps before falling with his back against the trash can, knocking it over with <a class="decoration-dotted" id="note-18" href="#note-18" title="A bit of a self-joke, since that's the sound I make when I (purposefully) bang my face against a hard surface. It's become a bit of a joke greeting, similar to kobolds yipping and dogs murring - meanwhile I go 'clang!'." data-tooltip>a loud 'clang!'</a><sup>18</sup> that rings in your ears. Adrenaline rushes through your bloodstream, and you quickly get up to run back to your door.
Maybe the beast wasn't trying to eat you. But that thought immediately gets shoved to the back of your mind, as you are still too frightened to think about whether you should've given it a second chance. Right now, your only priority is making your way home, and locking the door for safety.
Each step as you sprint feels like it's in slow-motion. You don't even pay attention to whether there's anyone else around the street to cry out to, and running seems like your best call of making it out of this hunt.
Finally, you're back at the entrance to your place. Relief washes over you... <a class="decoration-dotted" id="note-19" href="#note-19" title="In my head-canon, Sam doesn't get angry at the PoV for pushing me, thinking that it was a mistake. But seeing them run away makes him think that the PoV is playing tag." data-tooltip>But suddenly, something grabs your body and constricts you like a lasso.</a><sup>19</sup> You lose your balance and fall forward.
"Oof...!"
Thankfully, the appendage coiling around your chest and arms cushions your fall. You can hear excited murrs behind you. It's clear that the creature gave chase after you, catching up before you could make it inside and, quite literally, <a class="decoration-dotted" id="note-20" href="#note-20" title="My tongue is very helpful, able to grab and lift heavy objects with ease." data-tooltip>catching your fall with his tongue</a><sup>20</sup>. It feels so slimy and fleshy, drooling over your constrained ribs. You struggle some more, but the tentacle's grip is almost like a vise's.
Then, <a class="decoration-dotted" id="note-21" href="#note-21" title="Feral Sam thinks vore is just another kind of play! He thinks everyone likes being squished in his stomach, even if that's more of an exception than a rule." data-tooltip>you can feel warm slobber much further down your body. The tip of your feet are quickly engulfed by his maw that terrifying, ravenous opening</a><sup>21</sup>. You don't even look, squirming harder and trying to pull your legs free. He keeps his tongue around you, preventing you from getting up again. Your ankles brush against the inside of his maw, wet flesh against your skin. His mouth is as wide as the briefcase he has for a face. It has no issue squeezing your limbs towards his throat.
"H-Help..." Your voice comes out weak after the initial shock. Your only choice now is to hope a passerby can hear your pleas. "Someone! Please helppmMFmf...!"
Before you even have the chance to shout, <a class="decoration-dotted" id="note-22" href="#note-22" title="...Although he can get too into his predatorial role. Even if you are willing, chances are he will still fall into his instincts and try to restrain you. His tongue definitely helps with that!" data-tooltip>something gags you. It's the yellow tip of the creature's incredibly long tongue</a><sup>22</sup>, forcing itself between your jaws and pinning down your own tongue! Yuck... It tastes like saliva but also citric? Not what you expected...
Then again, having a beast's tongue pry your lips open as it devours you alive was the last thing you'd expected when you left to check the noise outside your place.
His surprisingly versatile muscle does an unfortunately great job at keeping you quiet and still, helping the voracious animal consume you whole. ...Which does _seem_ weird, and begs the question. If it wanted to devour you, why go to such lengths to immobilize you and eat you alive?
First of all, <a class="decoration-dotted" id="note-23" href="#note-23" title="Same size prey are Sam's favorite, even if they are harder to devour. Though he will usually nom prey smaller than him." data-tooltip>you're too big. There's no way it can swallow you whole...right?</a><sup>23</sup> Besides, with the daggers protruding from his monstrous gums, he could have shredded you to pieces. But even as you feel the pearly spires brushing against your lubricated calves while struggling, his tongue seems to do its best to guide you through the gap between them, leaving you unscathed.
Unable to do much, you look back at it. The sight of your feet disappearing between the two rows of fangs is terrifying but you can feel them in his throat. When you struggle, you catch a glimpse of bulges moving in his neck. His back legs are straightened vertically, and his forepaws are low against the ground. This twisted maned wolf almost looks like a playful pup...and the tail wagging wildly behind him seems to confirm it. He seems to be eating you alive not just for food, but for fun.
Well, you can't say you're sharing in any of that fun. You thrash and grunt helplessly, yet you continue to gradually vanish within the lime green confines of the unnatural canine. The bulge in his neck slowly shifts down to his chest and belly, distending his slim abdomen with your own limbs. The dry, clean appearance of his furred midriff doesn't reflect the sensations around your feet it's hot, slimy, and tight inside. He shouldn't be eating you... He _can't_ be eating you! You aren't meant to be food!
Keeping you down on the ground, he slowly scoots closer, maneuvering his parted jaws around you to claim you. <a class="decoration-dotted" id="note-24" href="#note-24" title="I wanted to give the PoV some agency to make the vore scene more interesting, in contrast to my previous, more passive attempts at PoV prey. It also elevates the unwillingness and the pred's cluelessness." data-tooltip>One of your arm slips free from his tongue's grip</a><sup>24</sup>, and you reach for the first thing you see your doormat. You grab it and toss it against your assailant, but it misses and flops pathetically to the side.
The briefcase-faced creature is completely unfazed, simply fitting the last of your legs into his mouth with more gulps. He begins working up your hips with no signs of stopping, and your knees get forced through his cardiac sphincter, bending to fit more into his tight stomach. It's surprising (and disturbing) how much his can distend to fit a large prey, just like a snake.
His tongue seems too busy plugging your mouth, making sure that you aren't making any sounds that may alarm your neighbors. Though considering how no one bothered to investigate all the noise earlier, it seems unlikely to you that anyone would even respond to your calls for help.
Regardless, you still have a free hand, and you tap around the ground for anything else that you can grab onto or throw at him again. It's hard to move your eyes or focus, but you can't really find anything. Your time is running short. Unless you want to become maned wolf food, you need to think of something.
With his tongue being the only thing you can reach, you grab back the slick appendage that was just holding your arm fast. It's smooth and slippery, and not really a pleasant texture to have between your fingers. It's hard to keep your grip on it, but you pull on it and try to get it out from your mouth.
The beast only seems to enjoy the fight you're putting up. <a class="decoration-dotted" id="note-25" href="#note-25" title="Again, Sam isn't restricted to only the sounds a maned wolf would make - in fact, he's more likely to mimic a dog's bark than a maned wolf's one. (Seriously, have you heard a maned wolf's bark? It sounds like a bark in reverse!)" data-tooltip>It starts making sharp, repeated noises a hyena's laughter, perhaps...?</a><sup>25</sup> As he mimics yet again the sounds of a completely different animal, he keeps wolfing you down as quickly as before, or maybe even faster.
Your other arm, pinned against your ribs, sinks in against the squishy floor of his maw. The touch of tight walls and warm saliva reaches your fingertips. Your lower body has been crammed into his belly, squeezed as compactly as it can be. Despite your size, <a class="decoration-dotted" id="note-26" href="#note-26" title="Sam could eat prey larger than him - if they are cooperative enough! This sentence is also a play on the story's title." data-tooltip>you fear that he may have just enough room to take in all of you.</a><sup>26</sup>
With your upper body slipping down the back of his maw, he's forced to readjust the serpentine coil of his tongue. His entire pose shifts, craning his neck upwards and standing tall on all fours to lift your head off the ground. With gravity on his side, the constant tug from his throat is more potent. <a class="decoration-dotted" id="note-27" href="#note-27" title="Sam can control each section of his tongue independently." data-tooltip>His greenish tongue moves up your body, wrapping itself around your face and slobbering you as it steals your flavor... All without its tip ever leaving your mouth.</a><sup>27</sup>
You continue to pull on the probing muscle. Your chances of breaking free on your own are nearly null. No matter how stretched his stomach might already be, the beast likely won't be satisfied until the rest of you slides down the slope of his esophagus. Your last recourse is to call for help, one last time.
His jaws relax a bit after your shoulders squeeze into his gullet, and his swallows only get louder and closer to your ears. Your head is still smooshed by the tongue wrapped around it, slithering like a tentacle across your skin. Your whole body is drenched in his slobber by now. It's getting tighter around your arm, and thus harder to keep trying to yank his muscly appendage out.
But for a moment, its unforgiving strength wanes. You finally manage to yank the appendage and ungag yourself...! But you need a moment to sputter all of his drool from your mouth before you can speak. Once it's clear, you can yell.
"S-Somebody!"
Unfortunately, it's too little too late. This single moment cut short by a snap of his jaws, his teeth clacking less than an inch away from your face. The frail light from the lamppost turns into complete darkness, and your gaze is confronted with the squelching, hungry reality of your situation.
With just a single gulp, you slip away from his maw entirely.
The peristaltic tunnel hugs the contours of your face even more greedily than his tongue did. It feels like being shoved into a stuffy bag a wet, tight, groaning bag. You still want to shout for help, but a part of you knows full well that your words will fall on deaf ears. You lost, and the animal has claimed his quarry.
Compressed into the tightest ball that your flexibility allows, your upper half curls past the bend at the bottom of his gullet. It's not a loose fit, but at least the pressure doesn't hurt. The tautened wrinkles of his stomach massage your muscles, making sure that your body won't be sore from the stress that the walls inherently force onto you. That's one less worry for your stay in his organ, at least though now your worries shift to how long that stay might be.
<a class="decoration-dotted" id="note-28" href="#note-28" title="Sam doesn't ever digest his prey, but the PoV doesn't know that. I'm exclusively a non-fatal vore writer, but I'll play around with mentions of digestion when it fits the narrative. In this case, it comes back to the prey's unwillingness - and any reader that has checked the tags beforehand, or is familiar with my writing, knows that no digestion will occur." data-tooltip>Given what stomachs normally excel at, your prospects are not great, admittedly. The walls, probably green-hued like his tongue, churn around you with careless abandon, likely treating you no different from a large clump of food. Despite that, the damp air is breathable, and the slime sluicing around you doesn't cause you any harm. Maybe this creature can't really digest you, or maybe it won't. You can only guess and hope.</a><sup>28</sup>
Nevertheless, the creepy-looking canid starts walking it's easy to tell when the chamber sloshes and sways with your weight. You can hear his happy heartbeat as he heads somewhere after his satiating meal. <a class="decoration-dotted" id="note-29" href="#note-29" title="He wasn't actually looking for food. Plus, my vision was for the vore to be clean, except for drool and slime to accentuate the possessiveness of the predator over his prey." data-tooltip>Thankfully, there isn't anything else in his stomach other than you and his sluices. His trashcan scavenging must have been a flop, you figure...</a><sup>29</sup> And you are (relatively) lucky to have been the only thing he has eaten tonight.
<a class="decoration-dotted" id="note-30" href="#note-30" title="As is revealed later, after voring the PoV, Sam walks through their half-open door and lies on their bed." data-tooltip>Suddenly, the movement stops, and you are flipped against your side. The whole place shifts as the ravenous animal lies down on his side, keeping his extremely bulged out stomach against a soft surface.</a><sup>30</sup> You can hear when he starts purring like a cat, rumbling the walls around you in his pleased state.
As if all of this already isn't demeaning enough, something outside of his stomach starts pressing and rubbing the wall against you. It's too small and long to be one of his paws, and it makes a subtle 'shlick... shlick...' noise each time that it presses into his fur... <a class="decoration-dotted" id="note-31" href="#note-31" title="Also another self-indulgent image I wanted to include. I love the mix of possessiveness and affection when a pred licks their prey-filled belly." data-tooltip>Is he licking his own belly?</a><sup>31</sup> Why would he do such a thing? Is he trying to comfort you...?
Well, it would certainly explain why you saw him wagging his tail playfully earlier although you were more focused on escaping his metallic lips , and why his body isn't interested in breaking you down like food. This is all simply dumb fun for him, at your expense. A twisted entertainment for a twisted being. At one point, you considered that you'd judged it too harshly... But then again, you _did_ end up in the belly of the beast, and you don't really have a choice except to trust in his good intentions if he really has any.
The licks seem to stop, and you figure that you might as well try talking to it. He may be feral, but with the artificial-looking face of his, he's not your usual feral. Perhaps he can understand language.
"H-Hey, uhh, boy..." You speak out, trying to avoid the gastric mucus from getting onto your mouth. "You maned wolf...briefcase...thingy. Can you hear me?"
His body shakes around you briefly, reverberating with a soft cat-like trill. That doesn't really say much about his sapience.
"Umm... Do you think you can let me out? Please...?"
Silence. You try to adjust your position, but the walls cradle you tightly. You ask him again, but you can only hear the idle sounds of your predator's body. Then, you finally hear something else in return: his gentle, cute snores. <a class="decoration-dotted" id="note-32" href="#note-32" title="Who can resist a good nap after a hefty meal...? Either way, Sam thinks his prey will also relax in his belly and enjoy a nice night's sleep inside of his stomach." data-tooltip>He fell asleep with you in his stomach...</a><sup>32</sup>
Well, then. This isn't good. It could be worse but matter of fact, it seems that you're stuck in this creature for now. Your limbs are compressed, so there isn't any way of struggling or escaping on your own. Stuck in a stomach, against your volition. You can only hope that his organ won't get active while he's unconscious. Other than that, there's nothing you can do. All that you can do is wait and see.
<a class="decoration-dotted" id="note-33" href="#note-33" title="This story was meant to have full-tour from the start, but it did end up feeling like two stories stitched together. I was considering breaking it into two shorter stories, but I feel that would defeat its purpose. Still, I personally prefer the first half over the second. Especially since I've never actually gone and written an actual full-tour scene before (only the beginning, or the end; never the FULL full tour)." data-tooltip>\* \* \*</a><sup>33</sup>
Despite the creature's peaceful slumber, and how tired you feel, you can't really catch any sleep. Forced into a fetal position, you are constantly disturbed by rolling wrinkles and their low groans. The air is heavy and sour, even though it's breathable. Slime keeps clinging to your skin, unable to be brushed off as it coats the entire chamber.
Time doesn't seem to move, and you can't tell if it's been minutes or hours. By now, you wish that you'd been asleep all along, that this had all been a nightmare you'll simply wake up from... But it was all blatantly real the creature with an unprecedented appearance really had consumed you whole. <a class="decoration-dotted" id="note-34" href="#note-34" title="Here's the biggest reason why I wanted to make the prey unwilling. By giving the PoV a motivation - escaping from Sam -, I figured that the second half could be more dynamic, giving them more to do than simply watch the full tour unfold itself around them. It was still a gamble, since it might not suit the reader's preferences, but I think this specific story wouldn't work quite as well if I had taken a more passive approach to the PoV." data-tooltip>If only you knew what it was, you could figure out how to escape its clutches. Maybe.</a><sup>34</sup>
The walls turn and squish, constantly creating a vacuum between the flesh and your skin, making squelches when the gaps are filled with gastric sluices. It's a persistent suction along your trapped body. If this wasn't his literal stomach, you could mistake it for some weird massage, where his inactive acids served as some acrid lotion.
Suddenly, the walls stop and churn louder. The low sound isn't pleasant, especially from inside. It shakes your whole body with its rumble. The walls uncomfortably contract and smoosh you tighter. You fear that this is finally the moment when the creature's nefarious intentions get revealed, <a class="decoration-dotted" id="note-35" href="#note-35" title="As much as I wanted to use 'imagined imminent digestion' as a plot point, I ended up rewriting this specific part a lot. I didn't want to be too graphic in my descriptions, and alienate people who dislike digestion like myself." data-tooltip>and his digestive system will make short work of you.</a><sup>35</sup>
You feel a shift at the parts furthest from the stomach's entrance. Suddenly, there's some new space manifesting at the bottom, beside your butt. Your body is slowly eased into the opening by the muscles, and you can feel the heat and smoothness creeping up <a class="decoration-dotted" id="note-36" href="#note-36" title="Standard PoV ambiguity to broaden the definition of 'anthro'. No fur/scales/feathers, only skin. No paws/wings/talons/etc., only hand/feet. And no mentions of tails, either." data-tooltip>your skin</a><sup>36</sup>.
Knowing that you aren't being digested is a huge relief but it doesn't change your situation. If anything, it only means you'll be sent even deeper into this feral's guts. <a class="decoration-dotted" id="note-37" href="#note-37" title="In my head, Sam's intention was to keep the prey in his stomach for the whole duration of their stay. Having them slip into his intestines is more of an accident." data-tooltip>After the stomach comes the intestines, of course which doesn't give you much comfort.</a><sup>37</sup> <a class="decoration-dotted" id="note-38" href="#note-38" title="This is something I think I've read about on vore Twitter, but I've never actually verified it myself, so I added it as a little nod to that random memory that might be incorrect. lol" data-tooltip>Supposedly, this initial part of the long tubes should be even more efficient at breaking down food than the first chamber.</a><sup>38</sup> But your experience so far tells you it won't be that simple, for better or worse.
<a class="decoration-dotted" id="note-39" href="#note-39" title="I haven't really done a lot of research into the gastrointestinal system for this story, so the descriptions might not be accurate. But since I was committed to the full tour part, I wanted to make each part different visually to show the progress throughout the story." data-tooltip>More and more of these new walls, taut and smooth, replace the cushy folds from before.</a><sup>39</sup> Since your predator is about your size, there isn't much physical space in here for you. It feels less like you're actually slipping deeper, and more like his whole body is expanding and contracting, readjusting itself around you.
Like the rest of his anatomy so far, the snug spot is stretched way beyond an ordinary creature's capacity. The walls of the duodenum, much tighter and more uniform, are coated in that same pervasive slime from before. Overshadowed by the myriad sounds of his gastrointestinal system, you hear something akin to a purr. Your captor is surely having pleasant dreams with the large mass hidden within him, adding even more insult to injury.
After your head passes through the pyloric sphincter, there's thankfully no huge discomfort. Still, this place manages to be worse than the last. It's just as loud in here, the flesh has even less give, and the juices slathering your body are thicker.
Your only hope really seems to be waiting it out, making more progress slowly but surely. But how long is that going to take? ...How long has it already taken? What if the creature wakes up, and forces you to stay even longer?! That won't do! Since there's no help on the way, your best bet is to try and exit before he wakes up.
With nothing to lose, you try to squirm again. Unexpectedly, the walls clearly shift in turn. They are slippery enough, and your movements help the muscles' natural disposition to push chyme deeper in. It's still sending you the opposite way from the closest exit but at least you manage to find a sliver of agency.
It's still a cramped and uncomfortable fit. More of the sluices slobber you up, not ruining your skin more than it already has been ruined, yet lubing it up in turn. Your squirms continue to dig a path, slightly making headway past the entrance of his intestines.
<a class="decoration-dotted" id="note-40" href="#note-40" title="I pictured that it wouldn't be the first time feral!Sam has passed a large prey through his body - which explains his actions after he wakes up, later on." data-tooltip>The tunnel groans, likely from being filled past its any reasonable limit with something that shouldn't be there a living being, big and squirmy.</a><sup>40</sup> The fact that you are even conscious to experience all of this is a tragic miracle.
With enough back and forth, the texture changes around your feet. Instead of smooth, it's bumpy and soft, like a bunch of squishy buds. Fidgeting like this is a tiring process, but you don't imagine yourself getting any rest as long as you're surrounded by the hostile creature. You slip into the small intestines, and instead of muscles lined with gooey mucus, there are many villi brushing against your limbs.
Like myriad tendrils, the walls brush and tickle your tightly compacted body, now nestled in the tightest part of the tract. There's a more noticeable peristalsis from the walls compared to the duodenum, intended to guide whatever ends up in here through the long and winding path of absorbent tissues. It's at this stage that his body finally agrees about how you don't belong here and its autonomous movements draw you through the tortuously long journey that will follow.
You try to wriggle, but your mind and body are in in a numb haze. Less so from the environment which is equally distant from amenable and intolerable , and more from your lack of energy and sleep. Whatever vigor you can muster is spent fidgeting, to push yourself through seemingly unending flesh.
<a class="decoration-dotted" id="note-41" href="#note-41" title="The second part of this story was much more wordy, with loose internal thoughts and repetitive descriptions. Basically, stuff that I added in a first pass, thinking they'd be cool additions. But most of them felt pointless and dragged down the pace of an already long section. Normally, when I edit, the total word count increases by about 5% in average, as I clarify certain passages and add missing bits. For this story, the word count during editing actually went down, from 6k to 5.9k - which is the first time that happened in writing for me." data-tooltip>The slimy lubrication on your skin slowly rubs off on the villi, making your skin less sticky as it's recycled back into the body.</a><sup>41</sup>
You are unable to fall asleep, no matter how much your physiology craves it. But the harsh environment forces your hand with its unsettling cacophony. Sore and tired, your muscles continue to thrash within his muscles, but the progress is literally palpable from the many protrusions lining the walls moving past your head.
From outside, <a class="decoration-dotted" id="note-42" href="#note-42" title="Wanted to play a bit with my mental image of a large prey forced through guts, without the bulges looking any different to an outside observer. Keeping the prey stuck in the same position for all of it was part of that objective, albeit a challenging limitation in itself." data-tooltip>it wouldn't seem like much has happened after you'd been consumed just a person-sized bulge occasionally moving a few inches here and there</a><sup>42</sup>. But after many bends and twists, the walls relent a little, stretching further out as you approach the end of the small intestines. <a class="decoration-dotted" id="note-43" href="#note-43" title="I did make the small intestines part short on purpose, even if it is technically the longest, since there's only so much you can describe without being too repetitive. Thankfully, there's no need for the story's length to reflect the actual passage of time - it's all for the sake of making the story interesting, after all." data-tooltip>The worst leg of the journey is finally over...</a><sup>43</sup> Though other than a thinner coat of slime than before, and extreme exhaustion, there's not much to show for it.
Then, you hear a musical sound, muffled by flesh as it comes from outside. But you know this ringtone, it's the alarm going off on your phone. Has it been this long already...? At least, you have an idea of how many hours you've spent trapped in these detestable tunnels.
Still, how come you can hear your alarm? You thought you'd left your phone at home when you went out to check the noise. Unless... Oh! The dots finally connect in your fatigued head. The creature must've made his way into your room in order to sleep.
The briefcase-faced animal stretches on your mattress, and the intestine clenches you as he yawns. His most minute stirs cause everything to shift around. The alarm has clearly caused him to awaken, and without you to turn it off, you two might be listening to it on repeat for who knows how long.
Your surroundings move again, and then the phone goes silent. What?! Did he? ...What <a class="decoration-dotted" id="note-44" href="#note-44" title="Yep, can't forget my cheeky secondary signature! I've tried to include the word 'manner' or variations of it in every story, and the ones featuring my sona are no exception. In order to avoid it from being too distracting, I make sure it only appears once. There have been times I forgot to add it to the text until I edited them, but I try to insert them in the initial writing so it doesn't feel too ham-fisted. But in this case, this one got moved around from a usage in the first half (specifically, when I mention Sam making cat noises in the trash can scene) to here. Partially because it felt more natural, and partially because I like using it when referring specifically to my sona or another of my OCs, since it's so fitting!" data-tooltip>Manner</a><sup>44</sup> of beast even knows how to even disable an alarm?
"H-Hey!" You call out, realizing the creature may be sapient after all. "Can you let me out?"
<a class="decoration-dotted" id="note-45" href="#note-45" title="Feral or no, he does enjoy having the prey in his intestines. As he wakes up to find his prey deeper than before, he decides to enjoy himself with this nice morning surprise, not really minding that things didn't go to plan." data-tooltip>The feral doesn't reply, except by slumping his weight onto you. It makes things harder and more flustering. He simultaneously pants like a dog and purrs like a cat, seemingly enjoying your mass lodged deep in his intestines.</a><sup>45</sup> Thankfully, the walls continue to gently squeeze you further out rather than in, and with the promise of freedom lurking so closely, you keep squirming against his tight flesh.
Finally, you feel your ankles brush against another sphincter. It's gotta be the bend leading to his large intestines! Unfortunately, it seems closed off, thanks to the tunnel being pinched by him lying on his belly. No matter how much you struggle, there's no way you can make any headway without his cooperation.
"I-I'm stuck...!" You whisper to yourself in frustration. "Please..."
<a class="decoration-dotted" id="note-46" href="#note-46" title="Another instance of me not deciding on making Sam capable of understanding the PoV or not. At the very least, he can tell the prey is frustrated - and having pushed other prey through his whole body before, he realizes this and decides to help their 'new friend'." data-tooltip>As you bemoan, the creature seems to acknowledge this with a gloating bird's chirp, no less. Everything shifts and sways as your predator turns over, no longer grinding his belly against the mattress. Instead, two objects squeeze the walls near the top. You imagine that the beast is kneading his own guts with his forepaws. It temporarily takes away some precious space, but dislodges you through bowels once more.</a><sup>46</sup>
You wonder if your captor even understood your plea, but he appears to agree that you've overstayed your 'welcome'. You're in no position to deny this improbable aid, but eager to finally leave the winding intestines behind.
Finally, it's time to go spelunking into his large bowels, the last of the tunnels. His massage spills you into the wrinkly chamber in no time, <a class="decoration-dotted" id="note-47" href="#note-47" title="I tried to be careful with the language, since this story isn't supposed to be sexual. Maybe it didn't come across too well in the final version (and I'd have to spend way too much time perfecting these descriptions), but I wanted to convey that Sam's gratification is solely from the vore itself, enjoying the hefty prey in his guts and what-not." data-tooltip>earning you a quaking stream of playful growls. Of course, he seems to love having you in there... The beast continues to make joyful moans that sound so alien, from animals you don't recognize.</a><sup>47</sup>
Still, with newfound resolve, you prepare yourself for this final trial. It's much easier and quicker to make progress in this wide and linear section of his gastrointestinal system. The bigger folds roll around you as your curled body trudges through each corner. It definitely smells in here too, but your nose is too familiar with it to be bothered.
It's still hard to believe that you went through all of this. That you took a meal's route, forcefully balled-up this whole time; that you managed to use what little and precious resources were at disposal; and, <a class="decoration-dotted" id="note-48" href="#note-48" title="Another instance where I'm not too happy with the language I finally settled with. But balancing the unwillingness and non-fatal aspects was hard enough, and I didn't want this story to never be released, so at one point I settled with 'good enough'." data-tooltip>most of all, that you survived</a><sup>48</sup>. But it's too early to celebrate.
Your toes brush against yet another sphincter, one with much thicker muscles than the others. As your weight is forced against it, the beast pants and heaves his belly, flipping you around. From the way your surroundings are inclined, he's likely getting into position to push you out.
He strains himself and pants, putting a lot of effort into passing you. NOW he cares about getting you out of his body. Still, beggars can't be choosers, and you fidget to try and push your toes through the anal barrier.
Finally, your feet slip out, and the creature lets out a soft whine. You can feel a slight draft it's so cold compared to these innards , but it's such a relief to finally move your toes and not brush against another one of his walls! But your extremities are still covered in slime, and it follows them to the outer world. It dreadfully dawns on you that the creature is still standing on your mattress.
"Not on the bed!" You shout out panickedly. "Not on the A-Ack...!"
But it's too late, and the creature doesn't bother to readjust himself. <a class="decoration-dotted" id="note-49" href="#note-49" title="Again, tried to avoid too many descriptions of anal bits, since there's no sexual component to it, simply the hostility of being forced all the way through a pred's guts." data-tooltip>He strains harder, forcing your face against the rectal wall while the bowel compresses you outward.</a><sup>49</sup> More of your ankles and butt get freed, but his anus continues to grip you. Your upper half can barely wriggle in his clenching tunnel, meaning your freedom is subject to his pace.
These seconds feel like an eternity, slowly feeling your grimy body being deposited onto the soft bed that you'd just cleaned. In a few more moments, your bent legs fully slip out, and they slowly stretch once they find more space. Your knees and muscles feel so sore and weak. The abuse they had to endure finally catches up once they are allowed to move. But they are intact, like the rest of you and frankly, you can't really ask for more right now.
Your chest feels lighter once it reaches the other side, and his pucker quickly releases your shoulders as well, growing less tight around the smaller girth of your neck. Only your head remains to be released. You can't wait to get some fresh air, but your arms feel too much like jelly to push against the creature's hinds and free yourself immediately.
One more squeeze from the feral is all that remains, and with the last of his straining, your head slumps onto the bed along with the enveloping slime. Still mostly curled up in a ball, you sputter the sluices coating your lips and the rest of your body.
<a class="decoration-dotted" id="note-50" href="#note-50" title="A lot of the editing went into the second half, and a sizable chunk of it focused on the last part of the full tour. Editing in this case mostly consisted moving sentences around, cutting on some superficial descriptions, and reorganizing the break points of sentences into different paragraphs, clustering related stuff in tidy blocks. If that sounds tedious, it's because it is. But I think it's an important process. Not only to make sure your story is understandable on a full pass or has few typos, but that it's paced properly." data-tooltip>The morning light strains your eyes, after getting used to the complete darkness of your captor's insides. The foul smell with the slight hint of lime is perceptible against the fresh air of your room. You shiver as his enveloping warmth quickly dissipates once exposed to the elements.</a><sup>50</sup>
You're finally free, but your body and mind are both too weak after the ordeal. The better part of tonight has been spent inside of this voracious creature, writhing about instead of getting some much needed rest. Far from a pleasant journey, you wish that you could erase it from your head but for better or worse, you are alive and free from the beast's clutches.
But the fluffy perpetrator is still standing on the bed with you. Carefully avoiding any stains from getting to his fur, he jumps off and brings his metallic face close to yours. You can only stare, with anger and scorn, at the rectangular surface. He has no eyes, but <a class="decoration-dotted" id="note-51" href="#note-51" title="It's subtle, but I wanted to give the PoV a bit of an arc. After having to endure all of these events, they can't help but feel contempt for Sam - and that feeling is only strengthened by his alien appearance." data-tooltip>this...thing</a><sup>51</sup> is clearly looking right back at you.
Then, the briefcase starts to split again, forcing you to realize that the feral still has razor-sharp teeth, a prehensile tongue, and an empty stomach and you can barely move as he approaches.
"N-No," you beg hoarsely. "No more..."
With your spent energy, you can only muster to lift your fingers. The beast's maw follows them, watching the greenish ooze between the digits. Then, it happily licks your hand and purrs, replacing slime with saliva in a lacking attempting at cleaning them.
<a class="decoration-dotted" id="note-52" href="#note-52" title="A huge hint into Sam's motivations, to complement the other ones peppered about the story! This pretty much confirms that Sam was only having fun, and he had no intention of harming you. But it does leave the reader with contradictory views of both Sam's actions vs. intentions (he wants to play, but he is a bit of a bully by forcing his prey to swallow them down), and the PoV's inner thoughts (the narration sides with them, but their misconceptions are constantly challenged). It's something I purposefully had in mind when writing this story, in order to add some depth and challenge both myself when writing and the reader when interpreting it." data-tooltip>Satisfied with his little show of affection, his tongue retracts into his maw. He closes his jaws, hiding the terrifying features within. As if nothing had happened, he heads to the half-open door, tail wagging on his back, and leaps out into the world, leaving you with even more questions.</a><sup>52</sup>
You simply stare blankly, fully aware that you're a filthy, aching, sorry mess that smells like canine guts. As the sun shines brightly outside, you collapse against the slimy pool on your bed, <a class="decoration-dotted" id="note-53" href="#note-53" title="Kind of an implicit joke that, whatever the PoV's alarm was for, they are gonna miss it. Maybe work or something? I did want to leave it ambiguous as well, and the fact that it's not explicitly mentioned plays into it. It also plays into the narration reflecting the PoV's internal monologue - they are too exhausted to even worry about that!" data-tooltip>before dozing off for some extremely overdue sleep.</a><sup>53</sup>

View file

@ -0,0 +1,334 @@
---
title: "Taken In: Story Breakdown!"
pubDate: 2024-01-23
isAgeRestricted: true
authors: bad-manners
thumbnail: /src/assets/thumbnails/other/taken_in_breakdown.png
description: |
First time annotating a vore story; in this case, [Taken In](/stories/taken-in). Here, I go over my writing process while offering additional tidbits of information.
tags:
- behind the scenes
- commentary
- Sam Brendan
- feral predator
- anthro prey
- male predator
- ambiguous gender prey
- willing predator
- unwilling prey
- oral vore
- same size
- full tour
- point of view
relatedStories:
- taken-in
---
import NoteTooltip from "../../components/NoteTooltip.astro";
export let count = 0;
export function getCount() {
count += 1;
return count;
}
Going over the story and breaking it down was a fun process, all in all. But this was originally a text document, which I had to completely manually refit into this post you're reading (oof...!). Still, for the sake of posteriority, I think it was worth the effort.
If you're up for this non-linear read, then I hope you enjoy this sneak-peek into my thoughts! Just hover or long-press over the links with dotted underlines, and it should show the relevant annotations. Now, without further ado, let me reintroduce...
<h2>
<NoteTooltip
id={getCount()}
title="I usually try to make titles with a double meaning. Here, 'take in' usually means bringing a pet to one's home - in this case, it's more like the 'pet' has forced itself into the PoV's place! Plus, the PoV is taken into Sam's body."
text="Taken In"
/>
</h2>
<NoteTooltip
id={getCount()}
title="I actually had to rewrite most of the intro from scratch, it got too wordy and just boring to read. For a PoV segment, I thought something less detailed and to-the-point was more fun."
text="Clank! Shuffle! Crunch!"
/> The sounds outside are too loud to be stopped by the walls in your room, and you jolt awake.
Ugh, and you were finally in deep sleep...
<NoteTooltip
id={getCount()}
title="With PoV stuff, even details like 'when you wake up in the middle of the night' are better left ambiguous."
text="You check the time, and it's still too early to be out of bed."
/> The sun hasn't even risen yet. But the commotion continues outside, forcing you to get up and investigate.
It's probably some wild animal messing with the trash, you think to yourself. <NoteTooltip id={getCount()} title="Again, leaving 'what the place is' ambiguous so it could be a house, an apartment, etc." text="You navigate through your place in the dark and out the door" />, too tired to worry about your own safety. You don't even bother to lock it behind you as you leave.
There's nobody outside, with only dim streetlights to illuminate the empty street. It seems you're the only one who bothers to investigate the noise, and it definitely sounds like it's coming from a metal trashcan. Or more precisely, from something messing with it, with no regard for the neighborhood's peace and quiet.
When you get close enough, <NoteTooltip id={getCount()} title="A lot of this was having fun with how I would look and act as a feral. Despite the narration following the PoV, I still wanted to make my sona's actions credible, even if the intentions are omitted. In this case, Sam is just digging through trash, looking for something interesting to play with." text="you find some animal with its upper half inside of the metal bin" />. It's too big to be a raccoon, or even a fox. You can only see its long, furry legs and tail sticking out from the cylinder as it continues to nose its contents.
You can't tell what species it is without looking at its face, but the feral might be a dog or a wolf. Its coat is quite unusual, green with white patterns at the back. The paws and the tip of its tail are also colorless, except for its bright green pawpads, and some light teal spots between body and limbs. An unusual coloration, for sure you imagine that the tones don't offer the creature much in terms of camouflage, out in the wild...
As it continues to scavenge the trash can for food, and make a ruckus while at it, you slowly approach it without any sense of danger. It doesn't really give wolf vibes, so maybe it's just a weird breed of dog? If it's an escaped pet, it might be wearing a collar — hopefully, it'll have the owner's phone number engraved on a tag.
"Easy, boy..."
You call out in a whisper, instinctively assuming that the animal is a 'he'. The slim and fuzzy creature stops, <NoteTooltip id={getCount()} title="Sam has great hearing thanks to his large maned wolf ears." text="hearing your groggy voice even while constantly bumping against the metal walls" />, and pulls himself out from the can.
As you step back, you can see his front side when he turns on all fours towards you. The front paws are similar to the hind ones. Definitely canine, with a gradient that goes from white to green, and teal at the middle. Sadly, <NoteTooltip id={getCount()} title="Always fun to pretend the briefcase is covering my face. I also played with that concept in the story 'Part of the Show'." text="you can't get a good view of his face, as he's carrying a sizable object with his snout" />. Something rectangular, which he must've fished out of the trash. Your tired eyes have to adjust to the bad lighting in order to process the blurry image, but the defining features of the gray texture and the handle at the top clear up any confusion.
"Is that a...metal briefcase?" You ask yourself, and <NoteTooltip id={getCount()} title="I never decided if Sam actually understood what the PoV spoke or not, despite being sapient. So I left that ambiguous, even for myself. Whatever the case, here he just acts curious about the PoV." text="the strange dog simply tilts his head to the side" />.
The container hiding his head also rolls along, only letting you spot his large ears. They are too big for a dog, so his species can't be that, either. Maybe a maned wolf, then...? It'd certainly explain why he's got such long legs...! But they aren't from around here, you're pretty sure. He might be an exotic pet that has escaped, one without a collar. <NoteTooltip id={getCount()} title="Normally I write the reasons after I decide what happens. In the case of PoV stories, it's easier since reasons don't have to necessarily follow or be consistent. For example, the narrator could be mistaken - like in this case." text="Maybe he was looking for food, and smelled something tasty inside of the briefcase" />.
"It's okay, boy..." You slowly approach him with a cutesy voice, careful that he might get aggressive, drop the case, and bite you. Do maned wolves even get rabies?
Your bluff about him being domesticated seems right on the money, <NoteTooltip id={getCount()} title="Sam just acts like a silly dog who wants to play." text="as he doesn't seem alarmed by you at all. He sits down, slowly wagging his tail like a huge brush as he eagerly awaits" />. <NoteTooltip id={getCount()} title="Sam can see with his entire mimic face. In his case, I like to play with that eerie feeling you get when you're being observed, but without any eyes staring back at you (see the story 'Part of the Show' I mentioned earlier)." text="You can't see his eyes, but it definitely feels like he's staring at you" /> even with the metal box in the way.
One of your hands moves to the back of his head, holding the base of his ear. His fur is so silky and warm! You can't help it but give it a few rubs. He seems to immediately like your scritches, thumping one of his legs against the floor and panting excitedly. He certainly sounds just like a dog, making you wonder if maned wolves also bark like them.
"Good boy..." You whisper to him, stopping the scritches <NoteTooltip id={getCount()} title="You can pet the Sam! This was one of the cheeky images I really wanted to include. My stories have plenty of self-serving moments like this scattered around." text="to give his head a couple of pats" />.
He replies with a happy whine, and your hand brushes against the back of the briefcase. He still hasn't let go of his prized possession. Either that, or you think to yourself it may be stuck to his face... Poor thing, that must be it! Of course, domesticated or not, the best thing that you can do for the maned wolf is get his face free. <NoteTooltip id={getCount()} title="Poking fun at the absurd line of reasoning. The reader is likely aware (either from seeing my sona or reading the tags) that the plan won't work, so there's a big chance they're in on the joke." text="That's simply the logical line of reasoning" />.
You squat to his height. Your other hand approaches the friendly canine, and each one holds the aluminum briefcase by the edges. Then you grasp it and start pulling slowly. It's weird, the metal almost feels warm to the touch...
His head moves along with it, and <NoteTooltip id={getCount()} title="Sam growls because you're pulling on his face! But it's sturdy enough that it doesn't actually hurt him, it's just bothersome." text="he starts growling like a dog that doesn't want to let go of his toy" />. You mentally apologize for the temporary discomfort you might be causing, but the briefcase is stuck harder than you thought. If so, this unfortunate canine could've been starving for hours, or more...! His growls don't matter it will be over soon, once you manage to get this blasted thing off.
You start pulling harder, but the briefcase simply won't budge! In turn, <NoteTooltip id={getCount()} title="Being a mimic, Sam communicates with sounds he's learned. Even as he speaks, he doesn't use his vocal chords! Which means he can communicate even with prey blocking his throat." text="the maned wolf growls harder at you, and then...hisses at you? Isn't that more of a feline thing...?" /> Regardless, the aluminum case doesn't seem to move an inch. Even though it feels stuck to the creature's face, it almost seems to bulge forward as he continues to hiss...
"...Wh-What?"
It's hard to tell under the awful streetlight, but for a moment, out of the corner of your eye, you swear that you just saw something, slithering in the middle of the maned wolf's face...
The slight distraction causes you to lose your balance, falling back and pulling the maned wolf on top of you. Lying flat against the hard sidewalk, his canine forepaws pin your chest down. He's not too heavy that it hurts, but you notice how he's about the same size as you. But something more urgent calls your attention. He still has that briefcase on his head, almost against your own face and you can see an opening in the middle.
<NoteTooltip
id={getCount()}
title="I hardly display my maw if I can help it. But here I want to give you some affectionate face licks, to show I'm just being playful - not realizing my actions will be misunderstood."
text="The metal deforms and bends, not unlike skin or some other organic tissue. A symmetrical slit begins to expand and part the rectangular surface into an upper and a lower half. A pair of jaws. It opens just enough to reveal a set of long and jagged teeth along the vertical direction and a yellowish tongue that looks more like an octopus tentacle without its suckers. The maw twists into something like a smile, and the maned wolf wags his tail as the slobbery appendage drags over your face."
/>
Panic sets into you. Suddenly face to face with monstrous mandibles, <NoteTooltip id={getCount()} title="His teeth are dull, so this is another case where the narration is purposefully wrong. I tried to lean heavily into the unwillingness of the PoV with these descriptions." text="your instincts tell you to fear for your life before those razor-sharp fangs can sink into your skin" />. You squirm and struggle, trying to get out from underneath this 'maned wolf'.
He makes no effort to keep you down, and slips to one side while you roll to the other. The creature yelps before falling with his back against the trash can, knocking it over with <NoteTooltip id={getCount()} title="A bit of a self-joke, since that's the sound I make when I (purposefully) bang my face against a hard surface. It's become a bit of a joke greeting, similar to kobolds yipping and dogs murring - meanwhile I go 'clang!'." text="a loud 'clang!'" /> that rings in your ears. Adrenaline rushes through your bloodstream, and you quickly get up to run back to your door.
Maybe the beast wasn't trying to eat you. But that thought immediately gets shoved to the back of your mind, as you are still too frightened to think about whether you should've given it a second chance. Right now, your only priority is making your way home, and locking the door for safety.
Each step as you sprint feels like it's in slow-motion. You don't even pay attention to whether there's anyone else around the street to cry out to, and running seems like your best call of making it out of this hunt.
Finally, you're back at the entrance to your place. Relief washes over you... <NoteTooltip id={getCount()} title="In my head-canon, Sam doesn't get angry at the PoV for pushing me, thinking that it was a mistake. But seeing them run away makes him think that the PoV is playing tag." text="But suddenly, something grabs your body and constricts you like a lasso." /> You lose your balance and fall forward.
"Oof...!"
Thankfully, the appendage coiling around your chest and arms cushions your fall. You can hear excited murrs behind you. It's clear that the creature gave chase after you, catching up before you could make it inside and, quite literally, <NoteTooltip id={getCount()} title="My tongue is very helpful, able to grab and lift heavy objects with ease." text="catching your fall with his tongue" />. It feels so slimy and fleshy, drooling over your constrained ribs. You struggle some more, but the tentacle's grip is almost like a vise's.
Then, <NoteTooltip id={getCount()} title="Feral Sam thinks vore is just another kind of play! He thinks everyone likes being squished in his stomach, even if that's more of an exception than a rule." text="you can feel warm slobber much further down your body. The tip of your feet are quickly engulfed by his maw that terrifying, ravenous opening" />. You don't even look, squirming harder and trying to pull your legs free. He keeps his tongue around you, preventing you from getting up again. Your ankles brush against the inside of his maw, wet flesh against your skin. His mouth is as wide as the briefcase he has for a face. It has no issue squeezing your limbs towards his throat.
"H-Help..." Your voice comes out weak after the initial shock. Your only choice now is to hope a passerby can hear your pleas. "Someone! Please helppmMFmf...!"
Before you even have the chance to shout, <NoteTooltip id={getCount()} title="...Although he can get too into his predatorial role. Even if you are willing, chances are he will still fall into his instincts and try to restrain you. His tongue definitely helps with that!" text="something gags you. It's the yellow tip of the creature's incredibly long tongue" />, forcing itself between your jaws and pinning down your own tongue! Yuck... It tastes like saliva but also citric? Not what you expected...
Then again, having a beast's tongue pry your lips open as it devours you alive was the last thing you'd expected when you left to check the noise outside your place.
His surprisingly versatile muscle does an unfortunately great job at keeping you quiet and still, helping the voracious animal consume you whole. ...Which does _seem_ weird, and begs the question. If it wanted to devour you, why go to such lengths to immobilize you and eat you alive?
First of all, <NoteTooltip id={getCount()} title="Same size prey are Sam's favorite, even if they are harder to devour. Though he will usually nom prey smaller than him." text="you're too big. There's no way it can swallow you whole...right?" /> Besides, with the daggers protruding from his monstrous gums, he could have shredded you to pieces. But even as you feel the pearly spires brushing against your lubricated calves while struggling, his tongue seems to do its best to guide you through the gap between them, leaving you unscathed.
Unable to do much, you look back at it. The sight of your feet disappearing between the two rows of fangs is terrifying but you can feel them in his throat. When you struggle, you catch a glimpse of bulges moving in his neck. His back legs are straightened vertically, and his forepaws are low against the ground. This twisted maned wolf almost looks like a playful pup...and the tail wagging wildly behind him seems to confirm it. He seems to be eating you alive not just for food, but for fun.
Well, you can't say you're sharing in any of that fun. You thrash and grunt helplessly, yet you continue to gradually vanish within the lime green confines of the unnatural canine. The bulge in his neck slowly shifts down to his chest and belly, distending his slim abdomen with your own limbs. The dry, clean appearance of his furred midriff doesn't reflect the sensations around your feet it's hot, slimy, and tight inside. He shouldn't be eating you... He _can't_ be eating you! You aren't meant to be food!
Keeping you down on the ground, he slowly scoots closer, maneuvering his parted jaws around you to claim you. <NoteTooltip id={getCount()} title="I wanted to give the PoV some agency to make the vore scene more interesting, in contrast to my previous, more passive attempts at PoV prey. It also elevates the unwillingness and the pred's cluelessness." text="One of your arm slips free from his tongue's grip" />, and you reach for the first thing you see your doormat. You grab it and toss it against your assailant, but it misses and flops pathetically to the side.
The briefcase-faced creature is completely unfazed, simply fitting the last of your legs into his mouth with more gulps. He begins working up your hips with no signs of stopping, and your knees get forced through his cardiac sphincter, bending to fit more into his tight stomach. It's surprising (and disturbing) how much his can distend to fit a large prey, just like a snake.
His tongue seems too busy plugging your mouth, making sure that you aren't making any sounds that may alarm your neighbors. Though considering how no one bothered to investigate all the noise earlier, it seems unlikely to you that anyone would even respond to your calls for help.
Regardless, you still have a free hand, and you tap around the ground for anything else that you can grab onto or throw at him again. It's hard to move your eyes or focus, but you can't really find anything. Your time is running short. Unless you want to become maned wolf food, you need to think of something.
With his tongue being the only thing you can reach, you grab back the slick appendage that was just holding your arm fast. It's smooth and slippery, and not really a pleasant texture to have between your fingers. It's hard to keep your grip on it, but you pull on it and try to get it out from your mouth.
The beast only seems to enjoy the fight you're putting up. <NoteTooltip id={getCount()} title="Again, Sam isn't restricted to only the sounds a maned wolf would make - in fact, he's more likely to mimic a dog's bark than a maned wolf's one. (Seriously, have you heard a maned wolf's bark? It sounds like a bark in reverse!)" text="It starts making sharp, repeated noises a hyena's laughter, perhaps...?" /> As he mimics yet again the sounds of a completely different animal, he keeps wolfing you down as quickly as before, or maybe even faster.
Your other arm, pinned against your ribs, sinks in against the squishy floor of his maw. The touch of tight walls and warm saliva reaches your fingertips. Your lower body has been crammed into his belly, squeezed as compactly as it can be. Despite your size, <NoteTooltip id={getCount()} title="Sam could eat prey larger than him - if they are cooperative enough! This sentence is also a play on the story's title." text="you fear that he may have just enough room to take in all of you." />
With your upper body slipping down the back of his maw, he's forced to readjust the serpentine coil of his tongue. His entire pose shifts, craning his neck upwards and standing tall on all fours to lift your head off the ground. With gravity on his side, the constant tug from his throat is more potent. <NoteTooltip id={getCount()} title="Sam can control each section of his tongue independently." text="His greenish tongue moves up your body, wrapping itself around your face and slobbering you as it steals your flavor... All without its tip ever leaving your mouth." />
You continue to pull on the probing muscle. Your chances of breaking free on your own are nearly null. No matter how stretched his stomach might already be, the beast likely won't be satisfied until the rest of you slides down the slope of his esophagus. Your last recourse is to call for help, one last time.
His jaws relax a bit after your shoulders squeeze into his gullet, and his swallows only get louder and closer to your ears. Your head is still smooshed by the tongue wrapped around it, slithering like a tentacle across your skin. Your whole body is drenched in his slobber by now. It's getting tighter around your arm, and thus harder to keep trying to yank his muscly appendage out.
But for a moment, its unforgiving strength wanes. You finally manage to yank the appendage and ungag yourself...! But you need a moment to sputter all of his drool from your mouth before you can speak. Once it's clear, you can yell.
"S-Somebody!"
Unfortunately, it's too little too late. This single moment cut short by a snap of his jaws, his teeth clacking less than an inch away from your face. The frail light from the lamppost turns into complete darkness, and your gaze is confronted with the squelching, hungry reality of your situation.
With just a single gulp, you slip away from his maw entirely.
The peristaltic tunnel hugs the contours of your face even more greedily than his tongue did. It feels like being shoved into a stuffy bag a wet, tight, groaning bag. You still want to shout for help, but a part of you knows full well that your words will fall on deaf ears. You lost, and the animal has claimed his quarry.
Compressed into the tightest ball that your flexibility allows, your upper half curls past the bend at the bottom of his gullet. It's not a loose fit, but at least the pressure doesn't hurt. The tautened wrinkles of his stomach massage your muscles, making sure that your body won't be sore from the stress that the walls inherently force onto you. That's one less worry for your stay in his organ, at least though now your worries shift to how long that stay might be.
<NoteTooltip
id={getCount()}
title="Sam doesn't ever digest his prey, but the PoV doesn't know that. I'm exclusively a non-fatal vore writer, but I'll play around with mentions of digestion when it fits the narrative. In this case, it comes back to the prey's unwillingness - and any reader that has checked the tags beforehand, or is familiar with my writing, knows that no digestion will occur."
text="Given what stomachs normally excel at, your prospects are not great, admittedly. The walls, probably green-hued like his tongue, churn around you with careless abandon, likely treating you no different from a large clump of food. Despite that, the damp air is breathable, and the slime sluicing around you doesn't cause you any harm. Maybe this creature can't really digest you, or maybe it won't. You can only guess and hope."
/>
Nevertheless, the creepy-looking canid starts walking it's easy to tell when the chamber sloshes and sways with your weight. You can hear his happy heartbeat as he heads somewhere after his satiating meal. <NoteTooltip id={getCount()} title="He wasn't actually looking for food. Plus, my vision was for the vore to be clean, except for drool and slime to accentuate the possessiveness of the predator over his prey." text="Thankfully, there isn't anything else in his stomach other than you and his sluices. His trashcan scavenging must have been a flop, you figure..." /> And you are (relatively) lucky to have been the only thing he has eaten tonight.
<NoteTooltip
id={getCount()}
title="As is revealed later, after voring the PoV, Sam walks through their half-open door and lies on their bed."
text="Suddenly, the movement stops, and you are flipped against your side. The whole place shifts as the ravenous animal lies down on his side, keeping his extremely bulged out stomach against a soft surface."
/> You can hear when he starts purring like a cat, rumbling the walls around you in his pleased state.
As if all of this already isn't demeaning enough, something outside of his stomach starts pressing and rubbing the wall against you. It's too small and long to be one of his paws, and it makes a subtle 'shlick... shlick...' noise each time that it presses into his fur... <NoteTooltip id={getCount()} title="Also another self-indulgent image I wanted to include. I love the mix of possessiveness and affection when a pred licks their prey-filled belly." text="Is he licking his own belly?" /> Why would he do such a thing? Is he trying to comfort you...?
Well, it would certainly explain why you saw him wagging his tail playfully earlier although you were more focused on escaping his metallic lips , and why his body isn't interested in breaking you down like food. This is all simply dumb fun for him, at your expense. A twisted entertainment for a twisted being. At one point, you considered that you'd judged it too harshly... But then again, you _did_ end up in the belly of the beast, and you don't really have a choice except to trust in his good intentions if he really has any.
The licks seem to stop, and you figure that you might as well try talking to it. He may be feral, but with the artificial-looking face of his, he's not your usual feral. Perhaps he can understand language.
"H-Hey, uhh, boy..." You speak out, trying to avoid the gastric mucus from getting onto your mouth. "You maned wolf...briefcase...thingy. Can you hear me?"
His body shakes around you briefly, reverberating with a soft cat-like trill. That doesn't really say much about his sapience.
"Umm... Do you think you can let me out? Please...?"
Silence. You try to adjust your position, but the walls cradle you tightly. You ask him again, but you can only hear the idle sounds of your predator's body. Then, you finally hear something else in return: his gentle, cute snores. <NoteTooltip id={getCount()} title="Who can resist a good nap after a hefty meal...? Either way, Sam thinks his prey will also relax in his belly and enjoy a nice night's sleep inside of his stomach." text="He fell asleep with you in his stomach..." />
Well, then. This isn't good. It could be worse but matter of fact, it seems that you're stuck in this creature for now. Your limbs are compressed, so there isn't any way of struggling or escaping on your own. Stuck in a stomach, against your volition. You can only hope that his organ won't get active while he's unconscious. Other than that, there's nothing you can do. All that you can do is wait and see.
<NoteTooltip
id={getCount()}
title="This story was meant to have full-tour from the start, but it did end up feeling like two stories stitched together. I was considering breaking it into two shorter stories, but I feel that would defeat its purpose. Still, I personally prefer the first half over the second. Especially since I've never actually gone and written an actual full-tour scene before (only the beginning, or the end; never the FULL full tour)."
text="* * *"
/>
Despite the creature's peaceful slumber, and how tired you feel, you can't really catch any sleep. Forced into a fetal position, you are constantly disturbed by rolling wrinkles and their low groans. The air is heavy and sour, even though it's breathable. Slime keeps clinging to your skin, unable to be brushed off as it coats the entire chamber.
Time doesn't seem to move, and you can't tell if it's been minutes or hours. By now, you wish that you'd been asleep all along, that this had all been a nightmare you'll simply wake up from... But it was all blatantly real the creature with an unprecedented appearance really had consumed you whole. <NoteTooltip id={getCount()} title="Here's the biggest reason why I wanted to make the prey unwilling. By giving the PoV a motivation - escaping from Sam -, I figured that the second half could be more dynamic, giving them more to do than simply watch the full tour unfold itself around them. It was still a gamble, since it might not suit the reader's preferences, but I think this specific story wouldn't work quite as well if I had taken a more passive approach to the PoV." text="If only you knew what it was, you could figure out how to escape its clutches. Maybe." />
The walls turn and squish, constantly creating a vacuum between the flesh and your skin, making squelches when the gaps are filled with gastric sluices. It's a persistent suction along your trapped body. If this wasn't his literal stomach, you could mistake it for some weird massage, where his inactive acids served as some acrid lotion.
Suddenly, the walls stop and churn louder. The low sound isn't pleasant, especially from inside. It shakes your whole body with its rumble. The walls uncomfortably contract and smoosh you tighter. You fear that this is finally the moment when the creature's nefarious intentions get revealed, <NoteTooltip id={getCount()} title="As much as I wanted to use 'imagined imminent digestion' as a plot point, I ended up rewriting this specific part a lot. I didn't want to be too graphic in my descriptions, and alienate people who dislike digestion like myself." text="and his digestive system will make short work of you." />
You feel a shift at the parts furthest from the stomach's entrance. Suddenly, there's some new space manifesting at the bottom, beside your butt. Your body is slowly eased into the opening by the muscles, and you can feel the heat and smoothness creeping up <NoteTooltip id={getCount()} title="Standard PoV ambiguity to broaden the definition of 'anthro'. No fur/scales/feathers, only skin. No paws/wings/talons/etc., only hand/feet. And no mentions of tails, either." text="your skin" />.
Knowing that you aren't being digested is a huge relief but it doesn't change your situation. If anything, it only means you'll be sent even deeper into this feral's guts. <NoteTooltip id={getCount()} title="In my head, Sam's intention was to keep the prey in his stomach for the whole duration of their stay. Having them slip into his intestines is more of an accident." text="After the stomach comes the intestines, of course which doesn't give you much comfort." /> <NoteTooltip id={getCount()} title="This is something I think I've read about on vore Twitter, but I've never actually verified it myself, so I added it as a little nod to that random memory that might be incorrect. lol" text="Supposedly, this initial part of the long tubes should be even more efficient at breaking down food than the first chamber." /> But your experience so far tells you it won't be that simple, for better or worse.
<NoteTooltip
id={getCount()}
title="I haven't really done a lot of research into the gastrointestinal system for this story, so the descriptions might not be accurate. But since I was committed to the full tour part, I wanted to make each part different visually to show the progress throughout the story."
text="More and more of these new walls, taut and smooth, replace the cushy folds from before."
/> Since your predator is about your size, there isn't much physical space in here for you. It feels less like you're
actually slipping deeper, and more like his whole body is expanding and contracting, readjusting itself around you.
Like the rest of his anatomy so far, the snug spot is stretched way beyond an ordinary creature's capacity. The walls of the duodenum, much tighter and more uniform, are coated in that same pervasive slime from before. Overshadowed by the myriad sounds of his gastrointestinal system, you hear something akin to a purr. Your captor is surely having pleasant dreams with the large mass hidden within him, adding even more insult to injury.
After your head passes through the pyloric sphincter, there's thankfully no huge discomfort. Still, this place manages to be worse than the last. It's just as loud in here, the flesh has even less give, and the juices slathering your body are thicker.
Your only hope really seems to be waiting it out, making more progress slowly but surely. But how long is that going to take? ...How long has it already taken? What if the creature wakes up, and forces you to stay even longer?! That won't do! Since there's no help on the way, your best bet is to try and exit before he wakes up.
With nothing to lose, you try to squirm again. Unexpectedly, the walls clearly shift in turn. They are slippery enough, and your movements help the muscles' natural disposition to push chyme deeper in. It's still sending you the opposite way from the closest exit but at least you manage to find a sliver of agency.
It's still a cramped and uncomfortable fit. More of the sluices slobber you up, not ruining your skin more than it already has been ruined, yet lubing it up in turn. Your squirms continue to dig a path, slightly making headway past the entrance of his intestines.
<NoteTooltip
id={getCount()}
title="I pictured that it wouldn't be the first time feral!Sam has passed a large prey through his body - which explains his actions after he wakes up, later on."
text="The tunnel groans, likely from being filled past its any reasonable limit with something that shouldn't be there a living being, big and squirmy."
/> The fact that you are even conscious to experience all of this is a tragic miracle.
With enough back and forth, the texture changes around your feet. Instead of smooth, it's bumpy and soft, like a bunch of squishy buds. Fidgeting like this is a tiring process, but you don't imagine yourself getting any rest as long as you're surrounded by the hostile creature. You slip into the small intestines, and instead of muscles lined with gooey mucus, there are many villi brushing against your limbs.
Like myriad tendrils, the walls brush and tickle your tightly compacted body, now nestled in the tightest part of the tract. There's a more noticeable peristalsis from the walls compared to the duodenum, intended to guide whatever ends up in here through the long and winding path of absorbent tissues. It's at this stage that his body finally agrees about how you don't belong here and its autonomous movements draw you through the tortuously long journey that will follow.
You try to wriggle, but your mind and body are in in a numb haze. Less so from the environment which is equally distant from amenable and intolerable , and more from your lack of energy and sleep. Whatever vigor you can muster is spent fidgeting, to push yourself through seemingly unending flesh.
<NoteTooltip
id={getCount()}
title="The second part of this story was much more wordy, with loose internal thoughts and repetitive descriptions. Basically, stuff that I added in a first pass, thinking they'd be cool additions. But most of them felt pointless and dragged down the pace of an already long section. Normally, when I edit, the total word count increases by about 5% in average, as I clarify certain passages and add missing bits. For this story, the word count during editing actually went down, from 6k to 5.9k - which is the first time that happened in writing for me."
text="The slimy lubrication on your skin slowly rubs off on the villi, making your skin less sticky as it's recycled back into the body."
/>
You are unable to fall asleep, no matter how much your physiology craves it. But the harsh environment forces your hand with its unsettling cacophony. Sore and tired, your muscles continue to thrash within his muscles, but the progress is literally palpable from the many protrusions lining the walls moving past your head.
From outside, <NoteTooltip id={getCount()} title="Wanted to play a bit with my mental image of a large prey forced through guts, without the bulges looking any different to an outside observer. Keeping the prey stuck in the same position for all of it was part of that objective, albeit a challenging limitation in itself." text="it wouldn't seem like much has happened after you'd been consumed just a person-sized bulge occasionally moving a few inches here and there" />. But after many bends and twists, the walls relent a little, stretching further out as you approach the end of the small intestines. <NoteTooltip id={getCount()} title="I did make the small intestines part short on purpose, even if it is technically the longest, since there's only so much you can describe without being too repetitive. Thankfully, there's no need for the story's length to reflect the actual passage of time - it's all for the sake of making the story interesting, after all." text="The worst leg of the journey is finally over..." /> Though other than a thinner coat of slime than before, and extreme exhaustion, there's not much to show for it.
Then, you hear a musical sound, muffled by flesh as it comes from outside. But you know this ringtone, it's the alarm going off on your phone. Has it been this long already...? At least, you have an idea of how many hours you've spent trapped in these detestable tunnels.
Still, how come you can hear your alarm? You thought you'd left your phone at home when you went out to check the noise. Unless... Oh! The dots finally connect in your fatigued head. The creature must've made his way into your room in order to sleep.
The briefcase-faced animal stretches on your mattress, and the intestine clenches you as he yawns. His most minute stirs cause everything to shift around. The alarm has clearly caused him to awaken, and without you to turn it off, you two might be listening to it on repeat for who knows how long.
Your surroundings move again, and then the phone goes silent. What?! Did he? ...What <NoteTooltip id={getCount()} title="Yep, can't forget my cheeky secondary signature! I've tried to include the word 'manner' or variations of it in every story, and the ones featuring my sona are no exception. In order to avoid it from being too distracting, I make sure it only appears once. There have been times I forgot to add it to the text until I edited them, but I try to insert them in the initial writing so it doesn't feel too ham-fisted. But in this case, this one got moved around from a usage in the first half (specifically, when I mention Sam making cat noises in the trash can scene) to here. Partially because it felt more natural, and partially because I like using it when referring specifically to my sona or another of my OCs, since it's so fitting!" text="Manner" /> of beast even knows how to even disable an alarm?
"H-Hey!" You call out, realizing the creature may be sapient after all. "Can you let me out?"
<NoteTooltip
id={getCount()}
title="Feral or no, he does enjoy having the prey in his intestines. As he wakes up to find his prey deeper than before, he decides to enjoy himself with this nice morning surprise, not really minding that things didn't go to plan."
text="The feral doesn't reply, except by slumping his weight onto you. It makes things harder and more flustering. He simultaneously pants like a dog and purrs like a cat, seemingly enjoying your mass lodged deep in his intestines."
/> Thankfully, the walls continue to gently squeeze you further out rather than in, and with the promise of freedom
lurking so closely, you keep squirming against his tight flesh.
Finally, you feel your ankles brush against another sphincter. It's gotta be the bend leading to his large intestines! Unfortunately, it seems closed off, thanks to the tunnel being pinched by him lying on his belly. No matter how much you struggle, there's no way you can make any headway without his cooperation.
"I-I'm stuck...!" You whisper to yourself in frustration. "Please..."
<NoteTooltip
id={getCount()}
title="Another instance of me not deciding on making Sam capable of understanding the PoV or not. At the very least, he can tell the prey is frustrated - and having pushed other prey through his whole body before, he realizes this and decides to help their 'new friend'."
text="As you bemoan, the creature seems to acknowledge this with a gloating bird's chirp, no less. Everything shifts and sways as your predator turns over, no longer grinding his belly against the mattress. Instead, two objects squeeze the walls near the top. You imagine that the beast is kneading his own guts with his forepaws. It temporarily takes away some precious space, but dislodges you through bowels once more."
/>
You wonder if your captor even understood your plea, but he appears to agree that you've overstayed your 'welcome'. You're in no position to deny this improbable aid, but eager to finally leave the winding intestines behind.
Finally, it's time to go spelunking into his large bowels, the last of the tunnels. His massage spills you into the wrinkly chamber in no time, <NoteTooltip id={getCount()} title="I tried to be careful with the language, since this story isn't supposed to be sexual. Maybe it didn't come across too well in the final version (and I'd have to spend way too much time perfecting these descriptions), but I wanted to convey that Sam's gratification is solely from the vore itself, enjoying the hefty prey in his guts and what-not." text="earning you a quaking stream of playful growls. Of course, he seems to love having you in there... The beast continues to make joyful moans that sound so alien, from animals you don't recognize." />
Still, with newfound resolve, you prepare yourself for this final trial. It's much easier and quicker to make progress in this wide and linear section of his gastrointestinal system. The bigger folds roll around you as your curled body trudges through each corner. It definitely smells in here too, but your nose is too familiar with it to be bothered.
It's still hard to believe that you went through all of this. That you took a meal's route, forcefully balled-up this whole time; that you managed to use what little and precious resources were at disposal; and, <NoteTooltip id={getCount()} title="Another instance where I'm not too happy with the language I finally settled with. But balancing the unwillingness and non-fatal aspects was hard enough, and I didn't want this story to never be released, so at one point I settled with 'good enough'." text="most of all, that you survived" />. But it's too early to celebrate.
Your toes brush against yet another sphincter, one with much thicker muscles than the others. As your weight is forced against it, the beast pants and heaves his belly, flipping you around. From the way your surroundings are inclined, he's likely getting into position to push you out.
He strains himself and pants, putting a lot of effort into passing you. NOW he cares about getting you out of his body. Still, beggars can't be choosers, and you fidget to try and push your toes through the anal barrier.
Finally, your feet slip out, and the creature lets out a soft whine. You can feel a slight draft it's so cold compared to these innards , but it's such a relief to finally move your toes and not brush against another one of his walls! But your extremities are still covered in slime, and it follows them to the outer world. It dreadfully dawns on you that the creature is still standing on your mattress.
"Not on the bed!" You shout out panickedly. "Not on the A-Ack...!"
But it's too late, and the creature doesn't bother to readjust himself. <NoteTooltip id={getCount()} title="Again, tried to avoid too many descriptions of anal bits, since there's no sexual component to it, simply the hostility of being forced all the way through a pred's guts." text="He strains harder, forcing your face against the rectal wall while the bowel compresses you outward." /> More of your ankles and butt get freed, but his anus continues to grip you. Your upper half can barely wriggle in his clenching tunnel, meaning your freedom is subject to his pace.
These seconds feel like an eternity, slowly feeling your grimy body being deposited onto the soft bed that you'd just cleaned. In a few more moments, your bent legs fully slip out, and they slowly stretch once they find more space. Your knees and muscles feel so sore and weak. The abuse they had to endure finally catches up once they are allowed to move. But they are intact, like the rest of you and frankly, you can't really ask for more right now.
Your chest feels lighter once it reaches the other side, and his pucker quickly releases your shoulders as well, growing less tight around the smaller girth of your neck. Only your head remains to be released. You can't wait to get some fresh air, but your arms feel too much like jelly to push against the creature's hinds and free yourself immediately.
One more squeeze from the feral is all that remains, and with the last of his straining, your head slumps onto the bed along with the enveloping slime. Still mostly curled up in a ball, you sputter the sluices coating your lips and the rest of your body.
<NoteTooltip
id={getCount()}
title="A lot of the editing went into the second half, and a sizable chunk of it focused on the last part of the full tour. Editing in this case mostly consisted moving sentences around, cutting on some superficial descriptions, and reorganizing the break points of sentences into different paragraphs, clustering related stuff in tidy blocks. If that sounds tedious, it's because it is. But I think it's an important process. Not only to make sure your story is understandable on a full pass or has few typos, but that it's paced properly."
text="The morning light strains your eyes, after getting used to the complete darkness of your captor's insides. The foul smell with the slight hint of lime is perceptible against the fresh air of your room. You shiver as his enveloping warmth quickly dissipates once exposed to the elements."
/>
You're finally free, but your body and mind are both too weak after the ordeal. The better part of tonight has been spent inside of this voracious creature, writhing about instead of getting some much needed rest. Far from a pleasant journey, you wish that you could erase it from your head but for better or worse, you are alive and free from the beast's clutches.
But the fluffy perpetrator is still standing on the bed with you. Carefully avoiding any stains from getting to his fur, he jumps off and brings his metallic face close to yours. You can only stare, with anger and scorn, at the rectangular surface. He has no eyes, but <NoteTooltip id={getCount()} title="It's subtle, but I wanted to give the PoV a bit of an arc. After having to endure all of these events, they can't help but feel contempt for Sam - and that feeling is only strengthened by his alien appearance." text="this...thing" /> is clearly looking right back at you.
Then, the briefcase starts to split again, forcing you to realize that the feral still has razor-sharp teeth, a prehensile tongue, and an empty stomach and you can barely move as he approaches.
"N-No," you beg hoarsely. "No more..."
With your spent energy, you can only muster to lift your fingers. The beast's maw follows them, watching the greenish ooze between the digits. Then, it happily licks your hand and purrs, replacing slime with saliva in a lacking attempting at cleaning them.
<NoteTooltip
id={getCount()}
title="A huge hint into Sam's motivations, to complement the other ones peppered about the story! This pretty much confirms that Sam was only having fun, and he had no intention of harming you. But it does leave the reader with contradictory views of both Sam's actions vs. intentions (he wants to play, but he is a bit of a bully by forcing his prey to swallow them down), and the PoV's inner thoughts (the narration sides with them, but their misconceptions are constantly challenged). It's something I purposefully had in mind when writing this story, in order to add some depth and challenge both myself when writing and the reader when interpreting it."
text="Satisfied with his little show of affection, his tongue retracts into his maw. He closes his jaws, hiding the terrifying features within. As if nothing had happened, he heads to the half-open door, tail wagging on his back, and leaps out into the world, leaving you with even more questions."
/>
You simply stare blankly, fully aware that you're a filthy, aching, sorry mess that smells like canine guts. As the sun shines brightly outside, you collapse against the slimy pool on your bed, <NoteTooltip id={getCount()} title="Kind of an implicit joke that, whatever the PoV's alarm was for, they are gonna miss it. Maybe work or something? I did want to leave it ambiguous as well, and the fact that it's not explicitly mentioned plays into it. It also plays into the narration reflecting the PoV's internal monologue - they are too exhausted to even worry about that!" text="before dozing off for some extremely overdue sleep." />
---
And that's that! I don't think this is something I'll do often, but who knows? It was fun to try my hand at meta-commentary, at least once. I hope it can be instructive for any potential writers.

View file

@ -41,7 +41,7 @@ tags:
- soul vore
- long-term endo
relatedBlogPosts:
- crossing-over-retrospective
- crossing-over-postmortem
---
<iframe

View file

@ -12,4 +12,6 @@ tags:
- name: behind the scenes
description: Content where I go over the process of making other content.
- name: retrospective
description: Documents detailing the good and bad parts of the process of creation of a certain project.
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.

View file

@ -113,7 +113,7 @@ const isCurrentRoute = (path: string) =>
<li>
<button
data-dark-mode
style={{ display: "none" }}
hidden
class="text-link group"
aria-label={t("en", "published_content/toggle_dark_mode")}
>

View file

@ -21,6 +21,7 @@ import {
IconArrowUp,
} from "../components/icons";
import ExternalPosts from "../components/ExternalPosts.astro";
import { markdownToPlaintext } from "../utils/markdown_to_plaintext";
interface RelatedContent {
link: string;
@ -61,26 +62,29 @@ type Props = {
const { props } = Astro;
const series = props.series && (await getEntry(props.series));
const categorizedTags = Object.fromEntries(
const categorizedTags: Record<string, { name: string | null; description?: string }> = Object.fromEntries(
(await getCollection("tag-categories")).flatMap((category) =>
category.data.tags.map<[string, string | null]>(({ name }) =>
typeof name === "string" ? [name, name] : [name[DEFAULT_LANG], name[props.lang] ?? null],
category.data.tags.map<[string, { name: string | null; description?: string }]>(({ name, description }) =>
typeof name === "string"
? [name, { name, description }]
: [name[DEFAULT_LANG], { name: name[props.lang] ?? null, description }],
),
),
);
const description = props.description && (await qualifyLocalURLsInMarkdown(props.description, props.lang));
const summary = props.summary && (await qualifyLocalURLsInMarkdown(props.summary, props.lang));
const tags = props.tags.map<{ id: string; name: string }>((tag) => {
const tags = props.tags.map<{ id: string; name: string; description?: string }>((tag) => {
const tagSlug = slug(tag);
if (!(tag in categorizedTags)) {
console.warn(`WARNING: Tag "${tag}" doesn't have a category in the "tag-categories" collection`);
return { id: tagSlug, name: tag };
return { id: tagSlug, name: tag, description: undefined };
}
if (categorizedTags[tag] == null) {
const { name, description } = categorizedTags[tag]!;
if (name == null) {
console.warn(`WARNING: No "${props.lang}" translation for tag "${tag}"`);
return { id: tagSlug, name: tag };
return { id: tagSlug, name: tag, description };
}
return { id: tagSlug, name: categorizedTags[tag] };
return { id: tagSlug, name, description };
});
const thumbnail =
props.thumbnail &&
@ -134,7 +138,7 @@ const returnTo = series
</a>
<button
data-dark-mode
style={{ display: "none" }}
hidden
class="text-link my-1 border-l border-stone-300 p-2 dark:border-stone-700"
aria-label={t(props.lang, "published_content/toggle_dark_mode")}
>
@ -397,11 +401,13 @@ const returnTo = series
{t(props.lang, "published_content/tags")}
</h2>
<ul class="p-category flex flex-wrap gap-x-2 gap-y-3 px-3">
{tags.map(({ id, name }) => (
{tags.map(({ id, name, description }) => (
<li>
<a
class="rounded-full bg-bm-300 px-3 py-1 text-sm text-black shadow-sm hover:underline focus:underline dark:bg-bm-600 dark:text-white print:bg-none"
href={`/tags/${id}`}
title={description ? markdownToPlaintext(description) : undefined}
data-tooltip={description ? "" : undefined}
>
{name}
</a>