From f0041e05250eee11f2f9842f9ccf1c8d0374d545 Mon Sep 17 00:00:00 2001
From: Cory Dransfeldt <hi@coryd.dev>
Date: Tue, 14 May 2024 16:51:01 -0700
Subject: [PATCH] feat: host tv + movies

---
 _redirects                                    |   2 +
 config/filters/index.js                       |   3 +
 package-lock.json                             | 935 ++++++++++++++++--
 package.json                                  |   6 +-
 src/_data/movies.js                           |  69 +-
 src/_data/music.js                            |  48 +-
 src/_data/nav.js                              |   2 +-
 src/_data/tv.js                               |  79 +-
 src/_includes/book-year.liquid                |   2 +-
 src/_includes/now.liquid                      |  46 +-
 src/_includes/partials/home/posts.liquid      |   2 +-
 .../partials/watching/favorites-grid.liquid   |  23 +
 src/_includes/partials/watching/hero.liquid   |   7 +
 src/assets/styles/base/index.css              |   8 +-
 src/assets/styles/index.css                   |   1 +
 src/assets/styles/pages/watching.css          | 106 ++
 src/feeds/movies.liquid                       |   2 +-
 src/pages/books/want-to-read.html             |   2 +-
 src/pages/watching/favorite-movies.html       |   9 +
 src/pages/watching/favorite-shows.html        |   9 +
 src/pages/watching/index.html                 |  35 +
 src/pages/watching/movies-to-watch.html       |  26 +
 src/pages/watching/shows-to-watch.html        |  26 +
 23 files changed, 1282 insertions(+), 166 deletions(-)
 create mode 100644 src/_includes/partials/watching/favorites-grid.liquid
 create mode 100644 src/_includes/partials/watching/hero.liquid
 create mode 100644 src/assets/styles/pages/watching.css
 create mode 100644 src/pages/watching/favorite-movies.html
 create mode 100644 src/pages/watching/favorite-shows.html
 create mode 100644 src/pages/watching/index.html
 create mode 100644 src/pages/watching/movies-to-watch.html
 create mode 100644 src/pages/watching/shows-to-watch.html

diff --git a/_redirects b/_redirects
index b503e743..f9df9fe5 100644
--- a/_redirects
+++ b/_redirects
@@ -75,6 +75,8 @@
 /tags /search 301!
 /posts/0 /posts/ 200!
 /links/0 /links/ 200!
+/watching/movies-to-watch/0 /watching/movies-to-watch/ 200!
+/watching/shows-to-watch/0 /watching/shows-to-watch/ 200!
 /mastodon https://social.lol/@cory 301!
 /coffee https://www.buymeacoffee.com/cory 301!
 /speedlify https://speedlify.coryd.dev 301!
diff --git a/config/filters/index.js b/config/filters/index.js
index 790d980b..1fe90296 100644
--- a/config/filters/index.js
+++ b/config/filters/index.js
@@ -72,6 +72,9 @@ export default {
     return text
   },
 
+  // watching
+  featuredWatching: (watching, count) => shuffleArray(watching.filter(watch => watch.favorite === true)).slice(0, count),
+
   // authors
   authorLookup: (url) => {
     if (!url) return null
diff --git a/package-lock.json b/package-lock.json
index 5c8f6677..2ce7c0f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,16 @@
 {
   "name": "coryd.dev",
-  "version": "14.6.0",
+  "version": "15.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "coryd.dev",
-      "version": "14.6.0",
+      "version": "15.0.0",
       "license": "MIT",
       "dependencies": {
         "@cdransf/api-text": "^1.2.2",
-        "@cdransf/select-pagination": "^1.0.5",
+        "@cdransf/select-pagination": "^1.1.0",
         "@cdransf/theme-toggle": "^1.2.3",
         "@daviddarnes/link-peek": "^1.1.0",
         "@daviddarnes/mastodon-post": "^1.3.0",
@@ -25,7 +25,7 @@
         "@11ty/eleventy-plugin-rss": "^1.2.0",
         "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
         "@11tyrocks/eleventy-plugin-lightningcss": "^1.4.0",
-        "@aws-sdk/client-s3": "^3.575.0",
+        "@aws-sdk/client-s3": "^3.576.0",
         "@cdransf/eleventy-plugin-tabler-icons": "^1.3.0",
         "@supabase/supabase-js": "^2.43.1",
         "dotenv-flow": "^4.1.0",
@@ -451,18 +451,18 @@
       "dev": true
     },
     "node_modules/@aws-sdk/client-s3": {
-      "version": "3.575.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.575.0.tgz",
-      "integrity": "sha512-4h0YIvLNcKNqwPbxWqwHCH3KWMpRdKhfQPq7kZcZXzFRi3yVAVaAsZcH8eXZsKPlitxkfWNgvfcTXOjStL1uHA==",
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.576.0.tgz",
+      "integrity": "sha512-6Xhj8x7ijLqoLYncKMUn433QKWzEezDLR3TipKv/qHThTa8oYXkymMat/MfJ/lx3jsc8wS72i+1kTwO+AFUg6w==",
       "dev": true,
       "dependencies": {
         "@aws-crypto/sha1-browser": "3.0.0",
         "@aws-crypto/sha256-browser": "3.0.0",
         "@aws-crypto/sha256-js": "3.0.0",
-        "@aws-sdk/client-sso-oidc": "3.575.0",
-        "@aws-sdk/client-sts": "3.575.0",
-        "@aws-sdk/core": "3.575.0",
-        "@aws-sdk/credential-provider-node": "3.575.0",
+        "@aws-sdk/client-sso-oidc": "3.576.0",
+        "@aws-sdk/client-sts": "3.576.0",
+        "@aws-sdk/core": "3.576.0",
+        "@aws-sdk/credential-provider-node": "3.576.0",
         "@aws-sdk/middleware-bucket-endpoint": "3.575.0",
         "@aws-sdk/middleware-expect-continue": "3.575.0",
         "@aws-sdk/middleware-flexible-checksums": "3.575.0",
@@ -519,15 +519,66 @@
         "node": ">=16.0.0"
       }
     },
-    "node_modules/@aws-sdk/client-sso": {
-      "version": "3.575.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.575.0.tgz",
-      "integrity": "sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==",
+    "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.576.0.tgz",
+      "integrity": "sha512-GHqqfRcUW/nGE4lpRafNKRxi4K7+SaQjYLjQnTEioUhr+w1IT/fFb3rGZYHHnN9ZCzbnrBULRC+1XOPIQWyLsw==",
       "dev": true,
       "dependencies": {
         "@aws-crypto/sha256-browser": "3.0.0",
         "@aws-crypto/sha256-js": "3.0.0",
-        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/client-sso-oidc": "3.576.0",
+        "@aws-sdk/core": "3.576.0",
+        "@aws-sdk/credential-provider-node": "3.576.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sso": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.576.0.tgz",
+      "integrity": "sha512-xbKE4bf3HYvkdrvn5kkpUdcoi3mg7uDLLkSbGaj0tzW3vNSdx9qLrCMuwfV7KrhVKWwx+lnw/2LGuCR2B5y0IA==",
+      "dev": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/core": "3.576.0",
         "@aws-sdk/middleware-host-header": "3.575.0",
         "@aws-sdk/middleware-logger": "3.575.0",
         "@aws-sdk/middleware-recursion-detection": "3.575.0",
@@ -569,16 +620,67 @@
       }
     },
     "node_modules/@aws-sdk/client-sso-oidc": {
-      "version": "3.575.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.575.0.tgz",
-      "integrity": "sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==",
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.576.0.tgz",
+      "integrity": "sha512-6U8933O9h6iMnQDpH3OtFhS3G3FVttYZUqTpC2T0FnSSX7zgG0GnlxdQiyZh1j1aFrEB8bFw/RSmxPcMJJuSlQ==",
       "dev": true,
       "dependencies": {
         "@aws-crypto/sha256-browser": "3.0.0",
         "@aws-crypto/sha256-js": "3.0.0",
-        "@aws-sdk/client-sts": "3.575.0",
-        "@aws-sdk/core": "3.575.0",
-        "@aws-sdk/credential-provider-node": "3.575.0",
+        "@aws-sdk/client-sts": "3.576.0",
+        "@aws-sdk/core": "3.576.0",
+        "@aws-sdk/credential-provider-node": "3.576.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/client-sts": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.576.0.tgz",
+      "integrity": "sha512-GHqqfRcUW/nGE4lpRafNKRxi4K7+SaQjYLjQnTEioUhr+w1IT/fFb3rGZYHHnN9ZCzbnrBULRC+1XOPIQWyLsw==",
+      "dev": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/client-sso-oidc": "3.576.0",
+        "@aws-sdk/core": "3.576.0",
+        "@aws-sdk/credential-provider-node": "3.576.0",
         "@aws-sdk/middleware-host-header": "3.575.0",
         "@aws-sdk/middleware-logger": "3.575.0",
         "@aws-sdk/middleware-recursion-detection": "3.575.0",
@@ -624,6 +726,7 @@
       "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.575.0.tgz",
       "integrity": "sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@aws-crypto/sha256-browser": "3.0.0",
         "@aws-crypto/sha256-js": "3.0.0",
@@ -670,11 +773,218 @@
         "node": ">=16.0.0"
       }
     },
-    "node_modules/@aws-sdk/core": {
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/client-sso": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.575.0.tgz",
+      "integrity": "sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/client-sso-oidc": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.575.0.tgz",
+      "integrity": "sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/client-sts": "3.575.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/credential-provider-node": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/core": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.575.0.tgz",
       "integrity": "sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==",
       "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@smithy/core": "^2.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/signature-v4": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "fast-xml-parser": "4.2.5",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-node": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.575.0.tgz",
+      "integrity": "sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/credential-provider-env": "3.575.0",
+        "@aws-sdk/credential-provider-http": "3.575.0",
+        "@aws-sdk/credential-provider-ini": "3.575.0",
+        "@aws-sdk/credential-provider-process": "3.575.0",
+        "@aws-sdk/credential-provider-sso": "3.575.0",
+        "@aws-sdk/credential-provider-web-identity": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/credential-provider-imds": "^3.0.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-sso": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.575.0.tgz",
+      "integrity": "sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/client-sso": "3.575.0",
+        "@aws-sdk/token-providers": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/token-providers": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.575.0.tgz",
+      "integrity": "sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "peerDependencies": {
+        "@aws-sdk/client-sso-oidc": "3.575.0"
+      }
+    },
+    "node_modules/@aws-sdk/client-sts/node_modules/fast-xml-parser": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
+      "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/naturalintelligence"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/NaturalIntelligence"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "strnum": "^1.0.5"
+      },
+      "bin": {
+        "fxparser": "src/cli/cli.js"
+      }
+    },
+    "node_modules/@aws-sdk/core": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.576.0.tgz",
+      "integrity": "sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==",
+      "dev": true,
       "dependencies": {
         "@smithy/core": "^2.0.0",
         "@smithy/protocol-http": "^4.0.0",
@@ -750,6 +1060,7 @@
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.575.0.tgz",
       "integrity": "sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@aws-sdk/credential-provider-env": "3.575.0",
         "@aws-sdk/credential-provider-process": "3.575.0",
@@ -769,11 +1080,133 @@
         "@aws-sdk/client-sts": "3.575.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-node": {
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sso": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.575.0.tgz",
+      "integrity": "sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sso-oidc": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.575.0.tgz",
+      "integrity": "sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/client-sts": "3.575.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/credential-provider-node": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.575.0.tgz",
+      "integrity": "sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@smithy/core": "^2.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/signature-v4": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "fast-xml-parser": "4.2.5",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-node": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.575.0.tgz",
       "integrity": "sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@aws-sdk/credential-provider-env": "3.575.0",
         "@aws-sdk/credential-provider-http": "3.575.0",
@@ -792,6 +1225,167 @@
         "node": ">=16.0.0"
       }
     },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-sso": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.575.0.tgz",
+      "integrity": "sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/client-sso": "3.575.0",
+        "@aws-sdk/token-providers": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/token-providers": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.575.0.tgz",
+      "integrity": "sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "peerDependencies": {
+        "@aws-sdk/client-sso-oidc": "3.575.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini/node_modules/fast-xml-parser": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
+      "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/naturalintelligence"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/NaturalIntelligence"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "strnum": "^1.0.5"
+      },
+      "bin": {
+        "fxparser": "src/cli/cli.js"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-node": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.576.0.tgz",
+      "integrity": "sha512-Ad244g3TJnfY1QFlZ+cywD6kgGD2yj+qg47Ryt50Y42bwmNuuqSpF9n0C71opRR68Rcl7ksOxixCJomWqpcHbA==",
+      "dev": true,
+      "dependencies": {
+        "@aws-sdk/credential-provider-env": "3.575.0",
+        "@aws-sdk/credential-provider-http": "3.575.0",
+        "@aws-sdk/credential-provider-ini": "3.576.0",
+        "@aws-sdk/credential-provider-process": "3.575.0",
+        "@aws-sdk/credential-provider-sso": "3.576.0",
+        "@aws-sdk/credential-provider-web-identity": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/credential-provider-imds": "^3.0.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sts": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.576.0.tgz",
+      "integrity": "sha512-GHqqfRcUW/nGE4lpRafNKRxi4K7+SaQjYLjQnTEioUhr+w1IT/fFb3rGZYHHnN9ZCzbnrBULRC+1XOPIQWyLsw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/client-sso-oidc": "3.576.0",
+        "@aws-sdk/core": "3.576.0",
+        "@aws-sdk/credential-provider-node": "3.576.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.576.0.tgz",
+      "integrity": "sha512-AwH/+29SbjhxGJVYhFn6+7r0MZ7TjJClySTJzuOoyjJGPWAifTdEuFkyOw8Bs9fEvbJ0ExgFxSaa445fO56kmg==",
+      "dev": true,
+      "dependencies": {
+        "@aws-sdk/credential-provider-env": "3.575.0",
+        "@aws-sdk/credential-provider-process": "3.575.0",
+        "@aws-sdk/credential-provider-sso": "3.576.0",
+        "@aws-sdk/credential-provider-web-identity": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/credential-provider-imds": "^3.0.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "peerDependencies": {
+        "@aws-sdk/client-sts": "3.576.0"
+      }
+    },
     "node_modules/@aws-sdk/credential-provider-process": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.575.0.tgz",
@@ -809,10 +1403,124 @@
       }
     },
     "node_modules/@aws-sdk/credential-provider-sso": {
+      "version": "3.576.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.576.0.tgz",
+      "integrity": "sha512-1F17issiqf+mSG7KJ+D0SfZRYBZPAmRcA5+VHDUuMLozhh8tyYMe0mwzOt9IKc7ocrJA+2Wp7l7sg3h6aanedQ==",
+      "dev": true,
+      "dependencies": {
+        "@aws-sdk/client-sso": "3.576.0",
+        "@aws-sdk/token-providers": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sso-oidc": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.575.0.tgz",
+      "integrity": "sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/client-sts": "3.575.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/credential-provider-node": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/core": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.575.0.tgz",
+      "integrity": "sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@smithy/core": "^2.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/signature-v4": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "fast-xml-parser": "4.2.5",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/credential-provider-node": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.575.0.tgz",
+      "integrity": "sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-sdk/credential-provider-env": "3.575.0",
+        "@aws-sdk/credential-provider-http": "3.575.0",
+        "@aws-sdk/credential-provider-ini": "3.575.0",
+        "@aws-sdk/credential-provider-process": "3.575.0",
+        "@aws-sdk/credential-provider-sso": "3.575.0",
+        "@aws-sdk/credential-provider-web-identity": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/credential-provider-imds": "^3.0.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/credential-provider-sso": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.575.0.tgz",
       "integrity": "sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@aws-sdk/client-sso": "3.575.0",
         "@aws-sdk/token-providers": "3.575.0",
@@ -826,6 +1534,98 @@
         "node": ">=16.0.0"
       }
     },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sso": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.575.0.tgz",
+      "integrity": "sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@aws-crypto/sha256-browser": "3.0.0",
+        "@aws-crypto/sha256-js": "3.0.0",
+        "@aws-sdk/core": "3.575.0",
+        "@aws-sdk/middleware-host-header": "3.575.0",
+        "@aws-sdk/middleware-logger": "3.575.0",
+        "@aws-sdk/middleware-recursion-detection": "3.575.0",
+        "@aws-sdk/middleware-user-agent": "3.575.0",
+        "@aws-sdk/region-config-resolver": "3.575.0",
+        "@aws-sdk/types": "3.575.0",
+        "@aws-sdk/util-endpoints": "3.575.0",
+        "@aws-sdk/util-user-agent-browser": "3.575.0",
+        "@aws-sdk/util-user-agent-node": "3.575.0",
+        "@smithy/config-resolver": "^3.0.0",
+        "@smithy/core": "^2.0.0",
+        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/hash-node": "^3.0.0",
+        "@smithy/invalid-dependency": "^3.0.0",
+        "@smithy/middleware-content-length": "^3.0.0",
+        "@smithy/middleware-endpoint": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-serde": "^3.0.0",
+        "@smithy/middleware-stack": "^3.0.0",
+        "@smithy/node-config-provider": "^3.0.0",
+        "@smithy/node-http-handler": "^3.0.0",
+        "@smithy/protocol-http": "^4.0.0",
+        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "@smithy/url-parser": "^3.0.0",
+        "@smithy/util-base64": "^3.0.0",
+        "@smithy/util-body-length-browser": "^3.0.0",
+        "@smithy/util-body-length-node": "^3.0.0",
+        "@smithy/util-defaults-mode-browser": "^3.0.0",
+        "@smithy/util-defaults-mode-node": "^3.0.0",
+        "@smithy/util-endpoints": "^2.0.0",
+        "@smithy/util-middleware": "^3.0.0",
+        "@smithy/util-retry": "^3.0.0",
+        "@smithy/util-utf8": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": {
+      "version": "3.575.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.575.0.tgz",
+      "integrity": "sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==",
+      "dev": true,
+      "dependencies": {
+        "@aws-sdk/types": "3.575.0",
+        "@smithy/property-provider": "^3.0.0",
+        "@smithy/shared-ini-file-loader": "^3.0.0",
+        "@smithy/types": "^3.0.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "peerDependencies": {
+        "@aws-sdk/client-sso-oidc": "3.575.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/fast-xml-parser": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
+      "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/naturalintelligence"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/NaturalIntelligence"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "strnum": "^1.0.5"
+      },
+      "bin": {
+        "fxparser": "src/cli/cli.js"
+      }
+    },
     "node_modules/@aws-sdk/credential-provider-web-identity": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.575.0.tgz",
@@ -1056,25 +1856,6 @@
         "node": ">=16.0.0"
       }
     },
-    "node_modules/@aws-sdk/token-providers": {
-      "version": "3.575.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.575.0.tgz",
-      "integrity": "sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==",
-      "dev": true,
-      "dependencies": {
-        "@aws-sdk/types": "3.575.0",
-        "@smithy/property-provider": "^3.0.0",
-        "@smithy/shared-ini-file-loader": "^3.0.0",
-        "@smithy/types": "^3.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=16.0.0"
-      },
-      "peerDependencies": {
-        "@aws-sdk/client-sso-oidc": "3.575.0"
-      }
-    },
     "node_modules/@aws-sdk/types": {
       "version": "3.575.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.575.0.tgz",
@@ -1196,9 +1977,9 @@
       "dev": true
     },
     "node_modules/@cdransf/select-pagination": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@cdransf/select-pagination/-/select-pagination-1.0.5.tgz",
-      "integrity": "sha512-qxv6MxSuJXbyCsB+zsdzjwgY/sqVZNhIwAnXP2bfh1CpHkt5043qtZLOMI1KdzCmcNxraDZXC5TsEIcz8XC4xA=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@cdransf/select-pagination/-/select-pagination-1.1.0.tgz",
+      "integrity": "sha512-h7uUAFbyr7exKqvkK1F1sdl5G6esEixJ0CpWApBRLRvdE5kh3BiiCgKU4H6syIXHer47n5L9UxgMvfcL4B6KUg=="
     },
     "node_modules/@cdransf/theme-toggle": {
       "version": "1.2.3",
@@ -1881,16 +2662,16 @@
       }
     },
     "node_modules/@smithy/core": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.0.0.tgz",
-      "integrity": "sha512-y1VuiOpU8nL0KlL0pvYpOddKGK+8xpD4Jvg9NN42Bl6gHWAr46LpAzWi4I78WxcFIMN1vw1+RUVOlcqR/vfs5g==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.0.1.tgz",
+      "integrity": "sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==",
       "dev": true,
       "dependencies": {
         "@smithy/middleware-endpoint": "^3.0.0",
-        "@smithy/middleware-retry": "^3.0.0",
+        "@smithy/middleware-retry": "^3.0.1",
         "@smithy/middleware-serde": "^3.0.0",
         "@smithy/protocol-http": "^4.0.0",
-        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.1",
         "@smithy/types": "^3.0.0",
         "@smithy/util-middleware": "^3.0.0",
         "tslib": "^2.6.2"
@@ -1983,9 +2764,9 @@
       }
     },
     "node_modules/@smithy/fetch-http-handler": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.0.tgz",
-      "integrity": "sha512-gP1MlOpIB/onIbh4g9eSG3XdI/G31cAvd9Lo11192eL4mxks3xpkPaa+RIcZaX2Vmb8I8HzxBddPSXviY1iq0w==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.1.tgz",
+      "integrity": "sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==",
       "dev": true,
       "dependencies": {
         "@smithy/protocol-http": "^4.0.0",
@@ -2102,15 +2883,15 @@
       }
     },
     "node_modules/@smithy/middleware-retry": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.0.tgz",
-      "integrity": "sha512-kFaBiTa50y0iwhrOjX5UISo1SfiXPrE1EsMtZJAVF7Oci3AUpVzaMzRxzQJFGnxioSyCwSmzqiE9x4X3dW+7VQ==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.1.tgz",
+      "integrity": "sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==",
       "dev": true,
       "dependencies": {
         "@smithy/node-config-provider": "^3.0.0",
         "@smithy/protocol-http": "^4.0.0",
         "@smithy/service-error-classification": "^3.0.0",
-        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.1",
         "@smithy/types": "^3.0.0",
         "@smithy/util-middleware": "^3.0.0",
         "@smithy/util-retry": "^3.0.0",
@@ -2275,16 +3056,16 @@
       }
     },
     "node_modules/@smithy/smithy-client": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.0.0.tgz",
-      "integrity": "sha512-HTLlEOPOoPxyVCoqzwRGJuRh4hyAAo+eveRcEPi7UpIaq2PCAmdFZM76jabUuzlPPR9ge+OQlKzZre+LT1nXzA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.0.1.tgz",
+      "integrity": "sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==",
       "dev": true,
       "dependencies": {
         "@smithy/middleware-endpoint": "^3.0.0",
         "@smithy/middleware-stack": "^3.0.0",
         "@smithy/protocol-http": "^4.0.0",
         "@smithy/types": "^3.0.0",
-        "@smithy/util-stream": "^3.0.0",
+        "@smithy/util-stream": "^3.0.1",
         "tslib": "^2.6.2"
       },
       "engines": {
@@ -2375,13 +3156,13 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-browser": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.0.tgz",
-      "integrity": "sha512-/ChTQXFZVK/92dLR9RLW2fOG03ghgUYZnRfrs9d9T3L7UxtsGx9QitF7Ppu64A8xcUHqA30kV7TUayFRBd7YQw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.1.tgz",
+      "integrity": "sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==",
       "dev": true,
       "dependencies": {
         "@smithy/property-provider": "^3.0.0",
-        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.1",
         "@smithy/types": "^3.0.0",
         "bowser": "^2.11.0",
         "tslib": "^2.6.2"
@@ -2391,16 +3172,16 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-node": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.0.tgz",
-      "integrity": "sha512-gfABCXswcMgDUcVO+16e4BgTFnouaXNCowp9mVxV8dgaOCpUT9eEWIC+PK3ZoEm26QwlwT7WgfuN1Y22HKX36g==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.1.tgz",
+      "integrity": "sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==",
       "dev": true,
       "dependencies": {
         "@smithy/config-resolver": "^3.0.0",
         "@smithy/credential-provider-imds": "^3.0.0",
         "@smithy/node-config-provider": "^3.0.0",
         "@smithy/property-provider": "^3.0.0",
-        "@smithy/smithy-client": "^3.0.0",
+        "@smithy/smithy-client": "^3.0.1",
         "@smithy/types": "^3.0.0",
         "tslib": "^2.6.2"
       },
@@ -2462,12 +3243,12 @@
       }
     },
     "node_modules/@smithy/util-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.0.tgz",
-      "integrity": "sha512-AYQeeAxBi3yee9SXC0HgrbeIchQeo6EAkpiwwmmCK6Z7uq8GnMGe8AxRZT3O4wyMNRNK2qfjZSvx6+wKfuMajg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.1.tgz",
+      "integrity": "sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==",
       "dev": true,
       "dependencies": {
-        "@smithy/fetch-http-handler": "^3.0.0",
+        "@smithy/fetch-http-handler": "^3.0.1",
         "@smithy/node-http-handler": "^3.0.0",
         "@smithy/types": "^3.0.0",
         "@smithy/util-base64": "^3.0.0",
@@ -3432,9 +4213,9 @@
       "dev": true
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.767",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.767.tgz",
-      "integrity": "sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw==",
+      "version": "1.4.768",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.768.tgz",
+      "integrity": "sha512-z2U3QcvNuxdkk33YV7R1bVMNq7fL23vq3WfO5BHcqrm4TnDGReouBfYKLEFh5umoK1XACjEwp8mmnhXk2EJigw==",
       "dev": true
     },
     "node_modules/encodeurl": {
diff --git a/package.json b/package.json
index 6555a92d..8c508254 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "coryd.dev",
-  "version": "14.6.1",
+  "version": "15.0.0",
   "description": "The source for my personal site. Built using 11ty.",
   "type": "module",
   "scripts": {
@@ -22,7 +22,7 @@
   "license": "MIT",
   "dependencies": {
     "@cdransf/api-text": "^1.2.2",
-    "@cdransf/select-pagination": "^1.0.5",
+    "@cdransf/select-pagination": "^1.1.0",
     "@cdransf/theme-toggle": "^1.2.3",
     "@daviddarnes/link-peek": "^1.1.0",
     "@daviddarnes/mastodon-post": "^1.3.0",
@@ -37,7 +37,7 @@
     "@11ty/eleventy-plugin-rss": "^1.2.0",
     "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
     "@11tyrocks/eleventy-plugin-lightningcss": "^1.4.0",
-    "@aws-sdk/client-s3": "^3.575.0",
+    "@aws-sdk/client-s3": "^3.576.0",
     "@cdransf/eleventy-plugin-tabler-icons": "^1.3.0",
     "@supabase/supabase-js": "^2.43.1",
     "dotenv-flow": "^4.1.0",
diff --git a/src/_data/movies.js b/src/_data/movies.js
index 6b62da50..226c3ea8 100644
--- a/src/_data/movies.js
+++ b/src/_data/movies.js
@@ -5,27 +5,49 @@ const SUPABASE_URL = process.env.SUPABASE_URL
 const SUPABASE_KEY = process.env.SUPABASE_KEY
 const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
 
+const PAGE_SIZE = 1000
+
+const fetchAllMovies = async () => {
+  let movies = []
+  let rangeStart = 0
+
+  while (true) {
+    const { data, error } = await supabase
+      .from('movies')
+      .select(`
+        tmdb_id,
+        slug,
+        last_watched,
+        title,
+        year,
+        collected,
+        plays,
+        favorite
+      `)
+      .order('last_watched', { ascending: false })
+      .range(rangeStart, rangeStart + PAGE_SIZE - 1)
+
+    if (error) {
+      console.error(error)
+      break
+    }
+
+    movies = movies.concat(data)
+
+    if (data.length < PAGE_SIZE) break
+    rangeStart += PAGE_SIZE
+  }
+
+  return movies
+}
+
 export default async function () {
-  const { data: movies, error } = await supabase
-    .from('movies')
-    .select(`
-      tmdb_id,
-      slug,
-      last_watched,
-      title,
-      year,
-      collected,
-      plays,
-      favorite
-    `)
-    .order('last_watched', { ascending: false })
-
-  if (error) return []
-
-  const formatMovieData = (movies) => movies.map((item) => {
+  const movies = await fetchAllMovies()
+  const formatMovieData = (movies, watched = true) => movies.map((item) => {
     const movie = {
       title: item['title'],
-      dateAdded: item['last_watched'],
+      lastWatched: item['last_watched'],
+      year: item['year'],
       url: `https://www.themoviedb.org/movie/${item['tmdb_id']}`,
       description: `<p>${item['title']} (${item['year']})</p><p>Watched at: ${DateTime.fromISO(item['last_watched'], { zone: 'utc' }).setZone('America/Los_Angeles').toFormat('MMMM d, yyyy, h:mma')}</p>`,
       type: 'movie',
@@ -35,17 +57,18 @@ export default async function () {
       collected: item['collected'],
       favorite: item['favorite'],
     }
-    return movie;
-  })
-
+    return movie
+  }).filter(movie => watched ? movie['lastWatched'] : !movie['lastWatched'])
   const favoriteMovies = movies.filter(movie => movie['favorite'])
   const collectedMovies = movies.filter(movie => movie['collected'])
+  const recentlyWatchedMovies = movies.filter(movie => movie['last_watched']).sort((a, b) => new Date(b['last_watched']) - new Date(a['last_watched'])).slice(0, 6)
 
   return {
     movies,
     watchHistory: formatMovieData(movies),
-    recentlyWatched: formatMovieData(movies.slice(0, 6)),
-    favorites: formatMovieData(favoriteMovies),
+    recentlyWatched: formatMovieData(recentlyWatchedMovies),
+    favorites: formatMovieData(favoriteMovies).sort((a, b) => a['title'].localeCompare(b['title'])),
     collection: formatMovieData(collectedMovies),
+    toWatch: formatMovieData(movies, false).sort((a, b) => a['title'].localeCompare(b['title'])),
   }
 }
\ No newline at end of file
diff --git a/src/_data/music.js b/src/_data/music.js
index 8ed1a143..362f1032 100644
--- a/src/_data/music.js
+++ b/src/_data/music.js
@@ -32,6 +32,32 @@ const fetchDataForPeriod = async (startPeriod, fields, table) => {
   return rows
 }
 
+const fetchAllTimeData = async (fields, table) => {
+  const PAGE_SIZE = 1000
+  let rows = []
+  let rangeStart = 0
+
+  while (true) {
+    const { data, error } = await supabase
+      .from(table)
+      .select(fields)
+      .order('listened_at', { ascending: false })
+      .range(rangeStart, rangeStart + PAGE_SIZE - 1)
+
+    if (error) {
+      console.error(error)
+      break
+    }
+
+    rows = rows.concat(data)
+
+    if (data.length < PAGE_SIZE) break
+    rangeStart += PAGE_SIZE
+  }
+
+  return rows
+}
+
 const aggregateData = (data, groupByField, groupByType, sort = true) => {
   const aggregation = {}
   data.forEach(item => {
@@ -65,16 +91,14 @@ const aggregateData = (data, groupByField, groupByType, sort = true) => {
     aggregation[key].plays++
   })
   const aggregatedData = sort ? Object.values(aggregation).sort((a, b) => b.plays - a.plays) : Object.values(aggregation)
-  return aggregatedData
+  return aggregatedData.filter(item => item.plays > 0)
 }
 
-
 export default async function() {
   const periods = {
-    week: DateTime.now().minus({ days: 7 }).startOf('day'), // Last week
-    month: DateTime.now().minus({ days: 30 }).startOf('day'), // Last 30 days
-    threeMonth: DateTime.now().minus({ months: 3 }).startOf('day'), // Last three months
-    year: DateTime.now().minus({ years: 1 }).startOf('day'), // Last 365 days
+    week: DateTime.now().minus({ days: 7 }).startOf('day'), // last week
+    month: DateTime.now().minus({ days: 30 }).startOf('day'), // last 30 days
+    threeMonth: DateTime.now().minus({ months: 3 }).startOf('day'), // last three months
   }
 
   const results = {}
@@ -97,15 +121,23 @@ export default async function() {
     }
   }
 
+  // Fetch and aggregate all-time data
+  const allTimeData = await fetchAllTimeData(selectFields, 'listens')
+  results['allTime'] = {
+    artists: aggregateData(allTimeData, 'artist_name', 'artists'),
+    albums: aggregateData(allTimeData, 'album_name', 'albums'),
+    tracks: aggregateData(allTimeData, 'track_name', 'track')
+  }
+
   const recentData = await fetchDataForPeriod(DateTime.now().minus({ days: 7 }), selectFields, 'listens')
 
-  results.recent = {
+  results['recent'] = {
     artists: aggregateData(recentData, 'artist_name', 'artists'),
     albums: aggregateData(recentData, 'album_name', 'albums'),
     tracks: aggregateData(recentData, 'track_name', 'track'),
     tracksChronological: aggregateData(recentData, 'track_name', 'track', false),
   }
-  results.nowPlaying = results.recent.tracksChronological[0]
+  results['nowPlaying'] = results['recent']['tracksChronological'][0]
 
   return results
 }
\ No newline at end of file
diff --git a/src/_data/nav.js b/src/_data/nav.js
index ed863e91..5983bb11 100644
--- a/src/_data/nav.js
+++ b/src/_data/nav.js
@@ -21,7 +21,7 @@ export default async function () {
       { name: 'npm', url: 'https://www.npmjs.com/~cdransf', icon: 'brand-npm'},
       { name: 'Mastodon', url: 'https://social.lol/@cory', icon: 'brand-mastodon' },
       { name: 'ListenBrainz', url: 'https://listenbrainz.org/user/cdransf/', icon: 'brain' },
-      { name: 'Trakt', url: 'https://trakt.tv/users/cdransf', icon: 'device-tv' },
+      { name: 'Watching', url: '/watching', icon: 'device-tv' },
       { name: 'Instapaper', url: 'https://www.instapaper.com/p/coryd', icon: 'news' },
       { name: 'Books', url: '/books', icon: 'books' },
       { name: 'Webrings', url: '/webrings', icon: 'heart-handshake' },
diff --git a/src/_data/tv.js b/src/_data/tv.js
index 2a4c3058..ed9e1158 100644
--- a/src/_data/tv.js
+++ b/src/_data/tv.js
@@ -4,22 +4,45 @@ const SUPABASE_URL = process.env.SUPABASE_URL
 const SUPABASE_KEY = process.env.SUPABASE_KEY
 const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
 
-export default async function () {
-  const { data: shows, error } = await supabase
-    .from('shows')
-    .select(`
-      title,
-      tmdb_id,
-      collected,
-      favorite,
-      episodes (
-        episode_number,
-        season_number,
-        last_watched_at
-      )
-    `)
+const PAGE_SIZE = 1000
 
-  if (error) return []
+const fetchAllShows = async () => {
+  let shows = []
+  let rangeStart = 0
+
+  while (true) {
+    const { data, error } = await supabase
+      .from('shows')
+      .select(`
+        title,
+        tmdb_id,
+        collected,
+        favorite,
+        year,
+        episodes (
+          episode_number,
+          season_number,
+          last_watched_at
+        )
+      `)
+      .range(rangeStart, rangeStart + PAGE_SIZE - 1)
+
+    if (error) {
+      console.error(error)
+      break
+    }
+
+    shows = shows.concat(data)
+
+    if (data.length < PAGE_SIZE) break
+    rangeStart += PAGE_SIZE
+  }
+
+  return shows
+}
+
+export default async function () {
+  const shows = await fetchAllShows()
 
   let episodes = []
   shows.forEach(show => {
@@ -29,14 +52,15 @@ export default async function () {
         show_title: show['title'],
         show_tmdb_id: show['tmdb_id'],
         collected: show['collected'],
-        favorite: show['favorite']
+        favorite: show['favorite'],
+        year: show['year']
       })
     })
   })
 
   episodes.sort((a, b) => new Date(b['last_watched_at']) - new Date(a['last_watched_at']))
   const allEpisodes = episodes
-  episodes = episodes.slice(0, 75)
+  const recentlyWatchedEpisodes = episodes.slice(0, 75)
 
   const formatEpisodeData = (episodes) => {
     const episodeData = []
@@ -55,8 +79,9 @@ export default async function () {
         showEpisodesMap[showTmdbId] = {
           title: showTitle,
           tmdbId: showTmdbId,
-          collected: collected,
-          favorite: favorite,
+          collected,
+          favorite,
+          lastWatchedAt,
           episodes: []
         }
       }
@@ -71,7 +96,7 @@ export default async function () {
         type: 'tv',
         image: `https://coryd.dev/media/shows/poster-${showTmdbId}.jpg`,
         backdrop: `https://coryd.dev/media/shows/backdrops/backdrop-${showTmdbId}.jpg`,
-        lastWatchedAt: lastWatchedAt
+        lastWatchedAt
       })
     })
 
@@ -101,8 +126,8 @@ export default async function () {
         })
       } else {
         const singleEpisode = show['episodes'][0]
-        singleEpisode.collected = show['collected']
-        singleEpisode.favorite = show['favorite']
+        singleEpisode['collected'] = show['collected']
+        singleEpisode['favorite'] = show['favorite']
         episodeData.push(singleEpisode)
       }
     })
@@ -112,24 +137,26 @@ export default async function () {
 
   const favoriteShows = shows.filter(show => show['favorite'])
   const collectedShows = shows.filter(show => show['collected'])
+  const toWatch = shows.filter(show => !show.episodes.some(episode => episode.last_watched_at)).sort((a, b) => a['title'].localeCompare(b['title']))
 
   return {
     shows,
     watchHistory: formatEpisodeData(allEpisodes),
-    recentlyWatched: formatEpisodeData(episodes),
+    recentlyWatched: formatEpisodeData(recentlyWatchedEpisodes),
     favorites: formatEpisodeData(favoriteShows.flatMap(show => show['episodes'].map(episode => ({
       ...episode,
       show_title: show['title'],
       show_tmdb_id: show['tmdb_id'],
       collected: show['collected'],
       favorite: show['favorite']
-    })))),
+    })))).sort((a, b) => a['name'].localeCompare(b['name'])),
     collection: formatEpisodeData(collectedShows.flatMap(show => show['episodes'].map(episode => ({
       ...episode,
       show_title: show['title'],
       show_tmdb_id: show['tmdb_id'],
       collected: show['collected'],
       favorite: show['favorite']
-    }))))
+    })))),
+    toWatch
   }
-}
+}
\ No newline at end of file
diff --git a/src/_includes/book-year.liquid b/src/_includes/book-year.liquid
index 0da28540..62350f46 100644
--- a/src/_includes/book-year.liquid
+++ b/src/_includes/book-year.liquid
@@ -5,7 +5,7 @@ layout: default
 {%- capture currentYear -%}{% currentYear %}{%- endcapture -%}
 {%- assign yearString = year | append: '' -%}
 {%- assign currentYearString = currentYear | append: '' -%}
-<p><a class="link-arrow flex-centered" href="/books">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
+<p><a class="link-icon flex-centered" href="/books">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
 <h2 class="page-header">{{ title }}</h2>
 {{ content }}
 {% if yearString == currentYearString %}
diff --git a/src/_includes/now.liquid b/src/_includes/now.liquid
index acb75368..41013020 100644
--- a/src/_includes/now.liquid
+++ b/src/_includes/now.liquid
@@ -15,7 +15,7 @@ layout: default
     <button class="small active" data-toggle="artists-window">This week</button>
     <button class="small secondary" data-toggle="artists-month">This month</button>
     <button class="small secondary" data-toggle="artists-three-months">3 months</button>
-    <button class="small secondary" data-toggle="artists-year">This year</button>
+    <button class="small secondary" data-toggle="artists-all-time">All time</button>
   </div>
 </div>
 <div id="artists-window">
@@ -27,8 +27,8 @@ layout: default
 <div class="hidden" id="artists-three-months">
   {% render "partials/now/media-grid.liquid", data:music.threeMonth.artists, shape: "square", count: 8 %}
 </div>
-<div class="hidden" id="artists-year">
-  {% render "partials/now/media-grid.liquid", data:music.year.artists, shape: "square", count: 8 %}
+<div class="hidden" id="artists-all-time">
+  {% render "partials/now/media-grid.liquid", data:music.allTime.artists, shape: "square", count: 8 %}
 </div>
 <div class="section-header-wrapper">
   <h2 id="albums" class="section-header flex-centered">
@@ -39,7 +39,7 @@ layout: default
     <button class="small active" data-toggle="albums-window">This week</button>
     <button class="small secondary" data-toggle="albums-month">This month</button>
     <button class="small secondary" data-toggle="albums-three-months">3 months</button>
-    <button class="small secondary" data-toggle="albums-year">This year</button>
+    <button class="small secondary" data-toggle="albums-all-time">All time</button>
   </div>
 </div>
 <div id="albums-window">
@@ -51,8 +51,8 @@ layout: default
 <div class="hidden" id="albums-three-months">
   {% render "partials/now/media-grid.liquid", data:music.threeMonth.albums, shape: "square", count: 8 %}
 </div>
-<div class="hidden" id="albums-year">
-  {% render "partials/now/media-grid.liquid", data:music.year.albums, shape: "square", count: 8 %}
+<div class="hidden" id="albums-all-time">
+  {% render "partials/now/media-grid.liquid", data:music.allTime.albums, shape: "square", count: 8 %}
 </div>
 <div class="section-header-wrapper">
   <h2 id="tracks" class="section-header flex-centered">
@@ -83,22 +83,28 @@ layout: default
   {% render "partials/now/track-chart.liquid", data:music.year.tracks, mostPlayed:music.year.tracks[0].plays %}
 </div>
 {% render "partials/now/album-releases.liquid", albumReleases:albumReleases %}
-<h2 id="books" class="section-header flex-centered">
-  {% tablericon "books" "Books" %}
-  Books
-</h2>
+<a class="link-icon flex-centered" href="/books">
+  <h2 id="books" class="section-header flex-centered">
+    {% tablericon "books" "Books" %}
+    Books
+  </h2>
+</a>
 {% assign bookData = books | bookStatus: 'started' | reverse %}
 {% render "partials/now/media-grid.liquid", data:bookData, shape: "vertical", count: 6 %}
 {% render "partials/widgets/recent-links.liquid", links:collections.links %}
-<h2 id="movies" class="section-header flex-centered">
-  {% tablericon "movie" "Movies" %}
-  Movies
-</h2>
-{% render "partials/now/media-grid.liquid", data:movies.recentlyWatched, icon: "movie", title: "Movies", shape: "vertical", count: 6 %}
-<h2 id="tv" class="section-header flex-centered">
-  {% tablericon "device-tv" "TV" %}
-  TV
-</h2>
-{% render "partials/now/media-grid.liquid", data:tv.recentlyWatched, icon: "device-tv", title: "TV", shape: "vertical", count: 6 %}
+<a class="link-icon flex-centered" href="/watching#movies">
+  <h2 id="movies" class="section-header flex-centered">
+    {% tablericon "movie" "Movies" %}
+    Movies
+  </h2>
+</a>
+{% render "partials/now/media-grid.liquid", data:movies.recentlyWatched, shape: "vertical", count: 6 %}
+<a class="link-icon flex-centered" href="/watching#tv">
+  <h2 id="tv" class="section-header flex-centered">
+    {% tablericon "device-tv" "TV" %}
+    TV
+  </h2>
+</a>
+{% render "partials/now/media-grid.liquid", data:tv.recentlyWatched, shape: "vertical", count: 6 %}
 <p class="now-explainer text-small text-centered">This is a <a href="https://nownownow.com/about">now page</a>, and if you have your own site, <a href="https://nownownow.com/about">you should make one too</a>.</p>
 <p class="text-small text-centered"><em>This page was last updated on {{ "now"  | date: "%B %-d, %-I:%M%p", "America/Los_Angeles" }}.</em></p>
\ No newline at end of file
diff --git a/src/_includes/partials/home/posts.liquid b/src/_includes/partials/home/posts.liquid
index 0bc15d2b..019eb3f1 100644
--- a/src/_includes/partials/home/posts.liquid
+++ b/src/_includes/partials/home/posts.liquid
@@ -23,6 +23,6 @@
   </article>
   {% endfor %}
   {% if postType != 'featured' %}
-    <a class="link-arrow flex-centered" href="/posts">View all posts {% tablericon "arrow-right" "View all posts" %}</a>
+    <a class="link-icon flex-centered" href="/posts">View all posts {% tablericon "arrow-right" "View all posts" %}</a>
   {% endif %}
 </div>
\ No newline at end of file
diff --git a/src/_includes/partials/watching/favorites-grid.liquid b/src/_includes/partials/watching/favorites-grid.liquid
new file mode 100644
index 00000000..9d59cfbf
--- /dev/null
+++ b/src/_includes/partials/watching/favorites-grid.liquid
@@ -0,0 +1,23 @@
+{% if favorites.size > 0 %}
+  <div class="watching grid">
+    {% for favorite in favorites limit: count %}
+      {% capture alt %}{{ favorite.title | escape }} ({{ favorite.year }}){% endcapture %}
+      <a href="{{ favorite.url }}">
+        <div class="watching item shadow">
+          <div class="meta-text">
+            {% if favorite.type == 'movie' %}
+              <div class="header">{{ favorite.title }}</div>
+              <div class="subheader">{{ favorite.year }}</div>
+            {% else %}
+              <div class="header">{{ favorite.name }}</div>
+            {% endif %}
+          </div>
+          {%- capture loadingStrategy -%}
+            {%- if loading -%}{{ loading }}{%- else -%}lazy{%- endif -%}
+          {%- endcapture -%}
+          <img src="https://coryd.dev/.netlify/images/?url={{ favorite.backdrop }}&fit=cover&w=256&h=144&fm=webp&q=75" alt="{{ alt }}" loading="{{ loadingStrategy }}" decoding="async" width="256" height="144" />
+        </div>
+      </a>
+    {% endfor %}
+  </div>
+{% endif %}
\ No newline at end of file
diff --git a/src/_includes/partials/watching/hero.liquid b/src/_includes/partials/watching/hero.liquid
new file mode 100644
index 00000000..64d6f03f
--- /dev/null
+++ b/src/_includes/partials/watching/hero.liquid
@@ -0,0 +1,7 @@
+{% capture alt %}{{ movie.title | escape }} ({{ movie.year }}){% endcapture %}
+<a href="{{ movie.url }}">
+  <div class="watching hero shadow">
+    <span>{{ movie.title }} ({{ movie.year }})</span>
+    <img src="https://coryd.dev/.netlify/images/?url={{ movie.backdrop }}&fit=cover&w=1200&h=675&fm=webp&q=75" alt="{{ alt }}" loading="eager" decoding="async" width="1200" height="765" />
+  </div>
+</a>
\ No newline at end of file
diff --git a/src/assets/styles/base/index.css b/src/assets/styles/base/index.css
index 380e5237..8633af5c 100644
--- a/src/assets/styles/base/index.css
+++ b/src/assets/styles/base/index.css
@@ -284,13 +284,13 @@ a svg:focus {
   stroke: var(--accent-color-hover);
 }
 
-a.link-arrow svg {
+a.link-icon svg {
   stroke: var(--accent-color);
 }
 
-a.link-arrow:hover svg,
-a.link-arrow:active svg,
-a.link-arrow:focus svg {
+a.link-icon:hover svg,
+a.link-icon:active svg,
+a.link-icon:focus svg {
   transform: rotate(0deg);
   stroke: var(--accent-color-hover);
 }
diff --git a/src/assets/styles/index.css b/src/assets/styles/index.css
index 22ce5f0b..fdd34a6d 100644
--- a/src/assets/styles/index.css
+++ b/src/assets/styles/index.css
@@ -23,6 +23,7 @@
 @import url('./pages/links.css') layer(page);
 @import url('./pages/now.css') layer(page);
 @import url('./pages/post.css') layer(page);
+@import url('./pages/watching.css') layer(page);
 @import url('./pages/webrings.css') layer(page);
 
 /* component styles */
diff --git a/src/assets/styles/pages/watching.css b/src/assets/styles/pages/watching.css
new file mode 100644
index 00000000..1733dd47
--- /dev/null
+++ b/src/assets/styles/pages/watching.css
@@ -0,0 +1,106 @@
+.watching {
+  &.page-header {
+    margin-bottom: var(--sizing-base);
+  }
+
+  &.hero {
+    position: relative;
+    overflow: hidden;
+
+    span {
+      color: white;
+      font-weight: var(--font-weight-bold);
+      position: absolute;
+      left: var(--sizing-sm);
+      bottom: var(--sizing-md);
+      z-index: 2;
+    }
+
+    & img {
+      width: 100%;
+      height: auto;
+      border: 1px solid var(--accent-color);
+    }
+
+    &.shadow::after {
+      position: absolute;
+      z-index: 1;
+      content: '';
+      bottom: 10px;
+      left: 1px;
+      box-shadow: inset 0 -70px 75px -40px #000;
+      width: calc(100% - 2px);
+      height: calc(100% - 11px);
+    }
+  }
+
+  &.grid {
+    display: grid;
+    gap: var(--sizing-sm);
+    grid-template-columns: repeat(2,minmax(0,1fr));
+
+    & a,
+    & div {
+      display: flex;
+    }
+
+    & div {
+      position: relative;
+    }
+
+    & .meta-text {
+      position: absolute;
+      z-index: 2;
+      padding: 0 var(--sizing-sm);
+      bottom: var(--sizing-sm);
+      width: 100%;
+      box-sizing: border-box;
+      display: flex;
+      flex-direction: column;
+
+      & .header,
+      & .subheader {
+        color: var(--color-lightest);
+        font-size: var(--font-size-xs);
+        line-height: 1.5;
+        text-shadow: rgba(0, 0, 0, 0.7) 0px 0px 10px;
+      }
+
+      & .header {
+        font-weight: var(--font-weight-bold);
+      }
+    }
+
+    & img {
+      width: 100%;
+      height: auto;
+      border: 1px solid var(--accent-color);
+    }
+  }
+
+  &.item {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    position: relative;
+    display: flex;
+    overflow: hidden;
+
+    &.shadow::after {
+      position: absolute;
+      z-index: 1;
+      content: '';
+      top: 0;
+      left: 1px;
+      box-shadow: inset 0 -70px 75px -40px #000;
+      width: calc(100% - 2px);
+      height: calc(100% - 1px);
+    }
+  }
+}
+
+@media screen and (min-width: 768px) {
+  .watching.grid {
+    grid-template-columns: repeat(3,minmax(0,1fr))
+  }
+}
\ No newline at end of file
diff --git a/src/feeds/movies.liquid b/src/feeds/movies.liquid
index 7e7700bd..fef98681 100644
--- a/src/feeds/movies.liquid
+++ b/src/feeds/movies.liquid
@@ -8,6 +8,6 @@ permalink: /feeds/movies
   title:"Movies • Cory Dransfeldt"
   description:"Movies I've watched recently."
   data:movies.recentlyWatched
-  updated:movies.recentlyWatched[0].dateAdded
+  updated:movies.recentlyWatched[0].lastWatched
   site:site
 %}
\ No newline at end of file
diff --git a/src/pages/books/want-to-read.html b/src/pages/books/want-to-read.html
index d98c732c..33152d43 100644
--- a/src/pages/books/want-to-read.html
+++ b/src/pages/books/want-to-read.html
@@ -15,7 +15,7 @@ permalink: "/books/want-to-read/{{ pagination.pageNumber }}/index.html"
 <ul class="link-list reduced-spacing">
   {% for book in pagination.items %}
     <li>
-      <a href="{{ book.url }}" title="{{ book.title | escape }}">
+      <a href="{{ book.url }}">
         <strong>{{ book.title }}</strong>
       </a>
       {% if book.authors %}by {{ book.authors }}{% endif %}{% if book.categories %} • <em>{{ book.categories }}</em>{% endif %}
diff --git a/src/pages/watching/favorite-movies.html b/src/pages/watching/favorite-movies.html
new file mode 100644
index 00000000..077a1ca1
--- /dev/null
+++ b/src/pages/watching/favorite-movies.html
@@ -0,0 +1,9 @@
+---
+title: Favorite movies
+layout: default
+permalink: "/watching/favorite-movies/index.html"
+---
+<p><a class="link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
+<h2 class="watching page-header">{{ title }}</h2>
+<p>These are my favorite movies. There are many like them, but these are mine.</p>
+{% render "partials/watching/favorites-grid.liquid", favorites:movies.favorites, count: 99 %}
\ No newline at end of file
diff --git a/src/pages/watching/favorite-shows.html b/src/pages/watching/favorite-shows.html
new file mode 100644
index 00000000..197f4c04
--- /dev/null
+++ b/src/pages/watching/favorite-shows.html
@@ -0,0 +1,9 @@
+---
+title: Favorite shows
+layout: default
+permalink: "/watching/favorite-shows/index.html"
+---
+<p><a class="link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
+<h2 class="watching page-header">{{ title }}</h2>
+<p>These are my favorite shows. There are many like them, but these are mine.</p>
+{% render "partials/watching/favorites-grid.liquid", favorites:tv.favorites, count: 99 %}
\ No newline at end of file
diff --git a/src/pages/watching/index.html b/src/pages/watching/index.html
new file mode 100644
index 00000000..952a26f5
--- /dev/null
+++ b/src/pages/watching/index.html
@@ -0,0 +1,35 @@
+---
+title: Watching
+layout: default
+permalink: "/watching/index.html"
+---
+{% assign featuredMovie = movies.favorites | featuredWatching: 1 | first %}
+<h2 class="watching page-header">{{ title }}</h2>
+{% render "partials/watching/hero.liquid" movie:featuredMovie %}
+<p>Here's all of the TV and movies I've been watching recently presented in what is (hopefully) an organized fashion. You can also take a look at the <a href="/watching/movies-to-watch/0">movies</a> and <a href="/watching/shows-to-watch/0">shows</a> I'm planning to watch.</p>
+<h2 id="movies" class="section-header flex-centered">
+  {% tablericon "movie" "Recent movies" %}
+  Recent movies
+</h2>
+{% render "partials/now/media-grid.liquid", data:movies.recentlyWatched, shape: "vertical", count: 6 %}
+<h2 id="tv" class="section-header flex-centered">
+  {% tablericon "device-tv" "Recent shows" %}
+  Recent shows
+</h2>
+{% render "partials/now/media-grid.liquid", data:tv.recentlyWatched, shape: "vertical", count: 6 %}
+<a class="link-icon flex-centered" href="/watching/favorite-movies">
+  <h2 class="section-header flex-centered">
+    {% tablericon "star" "Favorite movies" %}
+    Favorite movies
+  </h2>
+</a>
+{% assign favoriteMovies = movies.favorites | featuredWatching: 6 %}
+{% render "partials/watching/favorites-grid.liquid", favorites:favoriteMovies, count: 6 %}
+<a class="link-icon flex-centered" href="/watching/favorite-shows">
+  <h2 class="section-header flex-centered">
+    {% tablericon "star" "Favorite shows" %}
+    Favorite shows
+  </h2>
+</a>
+{% assign favoriteShows = tv.favorites | featuredWatching: 6 %}
+{% render "partials/watching/favorites-grid.liquid", favorites:favoriteShows, count: 6 %}
\ No newline at end of file
diff --git a/src/pages/watching/movies-to-watch.html b/src/pages/watching/movies-to-watch.html
new file mode 100644
index 00000000..95105bce
--- /dev/null
+++ b/src/pages/watching/movies-to-watch.html
@@ -0,0 +1,26 @@
+---
+title: Movies to watch
+layout: default
+pagination:
+  data: movies.toWatch
+  alias: movies
+  size: 30
+permalink: "/watching/movies-to-watch/{{ pagination.pageNumber }}/index.html"
+---
+<p><a class="link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
+{% if pagination.pageNumber == 0 %}
+<h2 class="page-header">{{ title }}</h2>
+<p>These are movies I want to watch, sorted in alphabetical order. As one would expect, it will change as I navigate through and add to it.</p>
+<hr class="large-spacing" />
+{% endif %}
+<ul class="link-list reduced-spacing">
+  {% for movie in pagination.items %}
+    <li>
+      <a href="{{ movie.url }}">
+        <strong>{{ movie.title }}</strong>
+      </a>
+      ({{ movie.year }})
+    </li>
+  {% endfor %}
+</ul>
+{% render "partials/widgets/paginator.liquid", pagination:pagination %}
\ No newline at end of file
diff --git a/src/pages/watching/shows-to-watch.html b/src/pages/watching/shows-to-watch.html
new file mode 100644
index 00000000..e1b2ae7f
--- /dev/null
+++ b/src/pages/watching/shows-to-watch.html
@@ -0,0 +1,26 @@
+---
+title: Shows to watch
+layout: default
+pagination:
+  data: tv.toWatch
+  alias: shows
+  size: 30
+permalink: "/watching/shows-to-watch/{{ pagination.pageNumber }}/index.html"
+---
+<p><a class="link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a></p>
+{% if pagination.pageNumber == 0 %}
+<h2 class="page-header">{{ title }}</h2>
+<p>These are shpws I want to watch, sorted in alphabetical order. As one would expect, it will change as I navigate through and add to it.</p>
+<hr class="large-spacing" />
+{% endif %}
+<ul class="link-list reduced-spacing">
+  {% for show in pagination.items %}
+    <li>
+      <a href="{{ show.url }}">
+        <strong>{{ show.title }}</strong>
+      </a>
+      {% if show.year %}({{ show.year }}){% endif %}
+    </li>
+  {% endfor %}
+</ul>
+{% render "partials/widgets/paginator.liquid", pagination:pagination %}
\ No newline at end of file