diff --git a/apps/config/package-lock.json b/apps/config/package-lock.json
index 8daf39c6..dbe8b7bc 100644
--- a/apps/config/package-lock.json
+++ b/apps/config/package-lock.json
@@ -15,7 +15,7 @@
                 "jiti": "2.4.2",
                 "pkg-types": "1.3.1",
                 "typescript": "5.7.3",
-                "typescript-eslint": "8.21.0"
+                "typescript-eslint": "8.22.0"
             }
         },
         "node_modules/@es-joy/jsdoccomment": {
@@ -358,17 +358,17 @@
             "license": "MIT"
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz",
-            "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz",
+            "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/regexpp": "^4.10.0",
-                "@typescript-eslint/scope-manager": "8.21.0",
-                "@typescript-eslint/type-utils": "8.21.0",
-                "@typescript-eslint/utils": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/scope-manager": "8.22.0",
+                "@typescript-eslint/type-utils": "8.22.0",
+                "@typescript-eslint/utils": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "graphemer": "^1.4.0",
                 "ignore": "^5.3.1",
                 "natural-compare": "^1.4.0",
@@ -388,14 +388,14 @@
             }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
-            "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
+            "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0"
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -406,9 +406,9 @@
             }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
-            "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
+            "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
             "dev": true,
             "license": "MIT",
             "engines": {
@@ -420,14 +420,14 @@
             }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
-            "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
+            "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "debug": "^4.3.4",
                 "fast-glob": "^3.3.2",
                 "is-glob": "^4.0.3",
@@ -447,16 +447,16 @@
             }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz",
-            "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
+            "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
-                "@typescript-eslint/scope-manager": "8.21.0",
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/typescript-estree": "8.21.0"
+                "@typescript-eslint/scope-manager": "8.22.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/typescript-estree": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -471,13 +471,13 @@
             }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
-            "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
+            "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
                 "eslint-visitor-keys": "^4.2.0"
             },
             "engines": {
@@ -502,16 +502,16 @@
             }
         },
         "node_modules/@typescript-eslint/parser": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz",
-            "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz",
+            "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/scope-manager": "8.21.0",
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/typescript-estree": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/scope-manager": "8.22.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/typescript-estree": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "debug": "^4.3.4"
             },
             "engines": {
@@ -527,14 +527,14 @@
             }
         },
         "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
-            "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
+            "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0"
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -545,9 +545,9 @@
             }
         },
         "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
-            "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
+            "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
             "dev": true,
             "license": "MIT",
             "engines": {
@@ -559,14 +559,14 @@
             }
         },
         "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
-            "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
+            "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "debug": "^4.3.4",
                 "fast-glob": "^3.3.2",
                 "is-glob": "^4.0.3",
@@ -586,13 +586,13 @@
             }
         },
         "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
-            "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
+            "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
                 "eslint-visitor-keys": "^4.2.0"
             },
             "engines": {
@@ -635,14 +635,14 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz",
-            "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz",
+            "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/typescript-estree": "8.21.0",
-                "@typescript-eslint/utils": "8.21.0",
+                "@typescript-eslint/typescript-estree": "8.22.0",
+                "@typescript-eslint/utils": "8.22.0",
                 "debug": "^4.3.4",
                 "ts-api-utils": "^2.0.0"
             },
@@ -659,14 +659,14 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
-            "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
+            "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0"
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -677,9 +677,9 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
-            "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
+            "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
             "dev": true,
             "license": "MIT",
             "engines": {
@@ -691,14 +691,14 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
-            "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
+            "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "debug": "^4.3.4",
                 "fast-glob": "^3.3.2",
                 "is-glob": "^4.0.3",
@@ -718,16 +718,16 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz",
-            "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
+            "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
-                "@typescript-eslint/scope-manager": "8.21.0",
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/typescript-estree": "8.21.0"
+                "@typescript-eslint/scope-manager": "8.22.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/typescript-estree": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -742,13 +742,13 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
-            "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
+            "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
                 "eslint-visitor-keys": "^4.2.0"
             },
             "engines": {
@@ -2120,15 +2120,15 @@
             }
         },
         "node_modules/typescript-eslint": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz",
-            "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz",
+            "integrity": "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/eslint-plugin": "8.21.0",
-                "@typescript-eslint/parser": "8.21.0",
-                "@typescript-eslint/utils": "8.21.0"
+                "@typescript-eslint/eslint-plugin": "8.22.0",
+                "@typescript-eslint/parser": "8.22.0",
+                "@typescript-eslint/utils": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2143,14 +2143,14 @@
             }
         },
         "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
-            "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
+            "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0"
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2161,9 +2161,9 @@
             }
         },
         "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
-            "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
+            "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
             "dev": true,
             "license": "MIT",
             "engines": {
@@ -2175,14 +2175,14 @@
             }
         },
         "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
-            "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
+            "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/visitor-keys": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/visitor-keys": "8.22.0",
                 "debug": "^4.3.4",
                 "fast-glob": "^3.3.2",
                 "is-glob": "^4.0.3",
@@ -2202,16 +2202,16 @@
             }
         },
         "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz",
-            "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
+            "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
-                "@typescript-eslint/scope-manager": "8.21.0",
-                "@typescript-eslint/types": "8.21.0",
-                "@typescript-eslint/typescript-estree": "8.21.0"
+                "@typescript-eslint/scope-manager": "8.22.0",
+                "@typescript-eslint/types": "8.22.0",
+                "@typescript-eslint/typescript-estree": "8.22.0"
             },
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2226,13 +2226,13 @@
             }
         },
         "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": {
-            "version": "8.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
-            "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+            "version": "8.22.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
+            "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
-                "@typescript-eslint/types": "8.21.0",
+                "@typescript-eslint/types": "8.22.0",
                 "eslint-visitor-keys": "^4.2.0"
             },
             "engines": {
diff --git a/apps/extract-subs/src/app.ts b/apps/extract-subs/src/app.ts
index 21b7a716..028485ad 100644
--- a/apps/extract-subs/src/app.ts
+++ b/apps/extract-subs/src/app.ts
@@ -98,8 +98,8 @@ const findSubs = (
     streams: FfprobeStream[],
 ): FfprobeStream[] => {
     const subs = streams.filter((s) => s.tags?.language &&
-        s.tags.language === lang &&
-        s.codec_type === 'subtitle');
+      s.tags.language === lang &&
+      s.codec_type === 'subtitle');
 
     const pgs = subs.filter((s) => s.codec_name === 'hdmv_pgs_subtitle');
 
@@ -139,7 +139,9 @@ const main = async(): Promise<void> => {
         }
 
         // Extract all subs
-        subs.forEach((sub) => { extractSub(sub); });
+        subs.forEach((sub) => {
+            extractSub(sub);
+        });
     });
 
     removeContainerSubs();
diff --git a/configurations/nos/modules/default.nix b/configurations/nos/modules/default.nix
index d00944b2..753c855d 100644
--- a/configurations/nos/modules/default.nix
+++ b/configurations/nos/modules/default.nix
@@ -8,8 +8,6 @@
     ./obsidian-livesync
     ./qbittorrent
     ./snapraid
-
-    # TODO: I need to actually do this properly before unleashing it on my library
-    # ./subtitles
+    ./subtitles
   ];
 }
diff --git a/configurations/nos/modules/subtitles/cleanup.nix b/configurations/nos/modules/subtitles/cleanup.nix
deleted file mode 100644
index eeafcf22..00000000
--- a/configurations/nos/modules/subtitles/cleanup.nix
+++ /dev/null
@@ -1,30 +0,0 @@
-{pkgs, ...}: let
-  scriptSrc = pkgs.fetchFromGitHub {
-    owner = "brianspilner01";
-    repo = "media-server-scripts";
-    rev = "00d9efcd37bb2667d23d7747240b59291cde64d3";
-    hash = "sha256-Qql6Z+smU8vEJaai0POjdMnYpET9ak4NddNQevEQ8Ds=";
-  };
-
-  script = pkgs.concatTextFile {
-    name = "sub-clean.sh";
-    files = ["${scriptSrc}/sub-clean.sh"];
-    executable = true;
-  };
-in
-  pkgs.writeShellApplication {
-    name = "sub-clean";
-
-    runtimeInputs = builtins.attrValues {
-      inherit
-        (pkgs)
-        findutils
-        gnugrep
-        gawk
-        ;
-    };
-
-    text = ''
-      exec ${script} "$@"
-    '';
-  }
diff --git a/configurations/nos/modules/subtitles/convert.nix b/configurations/nos/modules/subtitles/convert.nix
index 4193c993..31f0496e 100644
--- a/configurations/nos/modules/subtitles/convert.nix
+++ b/configurations/nos/modules/subtitles/convert.nix
@@ -1,13 +1,12 @@
-{pkgs, ...}:
-pkgs.writeShellApplication {
-  name = "convertMkv";
+{
+  writeShellApplication,
+  ffmpeg-full,
+  ...
+}:
+writeShellApplication {
+  name = "convert-mkv";
 
-  runtimeInputs = builtins.attrValues {
-    inherit
-      (pkgs)
-      ffmpeg-full
-      ;
-  };
+  runtimeInputs = [ffmpeg-full];
 
   text = ''
     extension="$1"
diff --git a/configurations/nos/modules/subtitles/default.nix b/configurations/nos/modules/subtitles/default.nix
index eec86d86..2fe49688 100644
--- a/configurations/nos/modules/subtitles/default.nix
+++ b/configurations/nos/modules/subtitles/default.nix
@@ -2,17 +2,15 @@
   config,
   mainUser,
   pkgs,
+  self,
   ...
-} @ inputs: let
-  convertMkv = pkgs.callPackage ./convert.nix {inherit pkgs;};
-  extractSubs = pkgs.callPackage ./extract-subs {inherit pkgs;};
-  sub-clean = pkgs.callPackage ./cleanup.nix {inherit pkgs;};
-  bazarr-bulk = pkgs.callPackage ./syncing.nix inputs;
-in {
-  # TODO:
-  # - Improve cleanup
-  # - figure out bazarr postprocessing with syncing subs
+} @ extraArgs: let
+  inherit (self.appsPackages.${pkgs.system}) extract-subs;
+  inherit (self.packages.${pkgs.system}) subscleaner;
 
+  convert-mkv = pkgs.callPackage ./convert.nix {};
+  bazarr-bulk = pkgs.callPackage ./syncing.nix ({} // extraArgs);
+in {
   environment.systemPackages = [
     bazarr-bulk
   ];
@@ -25,22 +23,22 @@ in {
       };
 
       path = [
-        convertMkv
-        extractSubs
-        sub-clean
         bazarr-bulk
+        convert-mkv
+        extract-subs
+        subscleaner
       ];
 
       script = ''
         # Make sure every video file is a mkv
-        find /data/{anime,history,movies,tv} -name '*.mp4' -exec convertMkv "mp4" "{}" \;
+        find /data/{anime,history,movies,tv} -name '*.mp4' -exec convert-mkv "mp4" "{}" \;
 
         # Export subs from mkv files
         find /data/{anime,history,movies,tv} -name '*.mkv' -printf "%h\0" |
         xargs -0 -I '{}' extract-subs '{}' "eng,fre"
 
         # Remove ads and stuff in subs
-        find /data/{anime,history,movies,tv} -name '*.srt' -exec sub-clean "{}" \;
+        find /data/{anime,history,movies,tv} -name '*.srt' | subscleaner
 
         # Bulk sync everything
         bb movies sync
diff --git a/configurations/nos/modules/subtitles/syncing.nix b/configurations/nos/modules/subtitles/syncing.nix
index 0e023c25..6e0b8438 100644
--- a/configurations/nos/modules/subtitles/syncing.nix
+++ b/configurations/nos/modules/subtitles/syncing.nix
@@ -2,14 +2,17 @@
   bazarr-bulk,
   config,
   lib,
-  pkgs,
+  system,
+  writeShellApplication,
   ...
 }: let
-  bbPkg = bazarr-bulk.packages.${pkgs.system}.default;
+  inherit (lib) getExe;
+
+  bbPkg = bazarr-bulk.packages.${system}.default;
 in
-  pkgs.writeShellApplication {
+  writeShellApplication {
     name = "bb";
     text = ''
-      exec ${lib.getExe bbPkg} --config ${config.sops.secrets.bazarr-bulk.path} "$@"
+      exec ${getExe bbPkg} --config ${config.sops.secrets.bazarr-bulk.path} "$@"
     '';
   }
diff --git a/flake.lock b/flake.lock
index ae0a7aa9..8d4c06f1 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1626,6 +1626,38 @@
         "type": "github"
       }
     },
+    "poetry2nix": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nix-github-actions": [
+          "nix-github-actions"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "systems": [
+          "systems"
+        ],
+        "treefmt-nix": [
+          "treefmt-nix"
+        ]
+      },
+      "locked": {
+        "lastModified": 1736884309,
+        "narHash": "sha256-eiCqmKl0BIRiYk5/ZhZozwn4/7Km9CWTbc15Cv+VX5k=",
+        "owner": "nix-community",
+        "repo": "poetry2nix",
+        "rev": "75d0515332b7ca269f6d7abfd2c44c47a7cbca7b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "poetry2nix",
+        "type": "github"
+      }
+    },
     "pokemon-colorscripts-src": {
       "flake": false,
       "locked": {
@@ -1761,6 +1793,7 @@
         "pam-fprint-grosshack-src": "pam-fprint-grosshack-src",
         "pcsd": "pcsd",
         "piper-src": "piper-src",
+        "poetry2nix": "poetry2nix",
         "pokemon-colorscripts-src": "pokemon-colorscripts-src",
         "pr-tracker": "pr-tracker",
         "pre-commit-hooks": "pre-commit-hooks",
@@ -1771,6 +1804,7 @@
         "sops-nix": "sops-nix",
         "spotifyplus-src": "spotifyplus-src",
         "spotifywebapi-src": "spotifywebapi-src",
+        "subscleaner-src": "subscleaner-src",
         "systems": "systems",
         "trash-d-src": "trash-d-src",
         "treefmt-nix": "treefmt-nix",
@@ -1907,6 +1941,22 @@
         "type": "github"
       }
     },
+    "subscleaner-src": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1734281369,
+        "narHash": "sha256-s36pAjfLQtvKEgtYFPH1LwogBHPLi5F8Fz04LIo/+44=",
+        "owner": "rogs",
+        "repo": "subscleaner",
+        "rev": "72e2f5afdfeded7dc05e4d1f098fc391065ec31f",
+        "type": "gitlab"
+      },
+      "original": {
+        "owner": "rogs",
+        "repo": "subscleaner",
+        "type": "gitlab"
+      }
+    },
     "systems": {
       "locked": {
         "lastModified": 1689347949,
diff --git a/flake.nix b/flake.nix
index bd063241..b2960ea8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -402,6 +402,18 @@
       repo = "piper";
       type = "github";
     };
+    poetry2nix = {
+      inputs = {
+        flake-utils.follows = "flake-utils";
+        nix-github-actions.follows = "nix-github-actions";
+        nixpkgs.follows = "nixpkgs";
+        systems.follows = "systems";
+        treefmt-nix.follows = "treefmt-nix";
+      };
+      owner = "nix-community";
+      repo = "poetry2nix";
+      type = "github";
+    };
     pokemon-colorscripts-src = {
       flake = false;
       owner = "phoneybadger";
@@ -467,6 +479,12 @@
       repo = "SpotifyWebApiPython";
       type = "github";
     };
+    subscleaner-src = {
+      flake = false;
+      owner = "rogs";
+      repo = "subscleaner";
+      type = "gitlab";
+    };
     systems = {
       owner = "nix-systems";
       repo = "default-linux";
diff --git a/inputs/default.nix b/inputs/default.nix
index dc57d049..e6ffab55 100644
--- a/inputs/default.nix
+++ b/inputs/default.nix
@@ -67,6 +67,11 @@ let
       repo = "nurl";
     };
 
+    poetry2nix = mkInput {
+      owner = "nix-community";
+      repo = "poetry2nix";
+    };
+
     # These are here to make sure all 'systems' and popular inputs are the same
     flake-compat = mkInput {
       owner = "edolstra";
@@ -336,6 +341,11 @@ let
       owner = "rushsteve1";
       repo = "trash-d";
     }
+    {
+      type = "gitlab";
+      owner = "rogs";
+      repo = "subscleaner";
+    }
     {
       type = "gitlab";
       owner = "mishakmak";
diff --git a/packages/default.nix b/packages/default.nix
index 018b6928..bffce819 100644
--- a/packages/default.nix
+++ b/packages/default.nix
@@ -45,6 +45,10 @@
 
   some-sass-language-server = pkgs.callPackage ./some-sass-language-server {};
 
+  subscleaner = pkgs.callPackage ./subscleaner {
+    inherit (inputs) poetry2nix subscleaner-src;
+  };
+
   trash-d = pkgs.callPackage ./trash-d {
     inherit (inputs) trash-d-src;
   };
diff --git a/packages/subscleaner/default.nix b/packages/subscleaner/default.nix
new file mode 100644
index 00000000..366fbceb
--- /dev/null
+++ b/packages/subscleaner/default.nix
@@ -0,0 +1,12 @@
+{
+  pkgs,
+  poetry2nix,
+  subscleaner-src,
+  ...
+}: let
+  inherit (poetry2nix.lib.mkPoetry2Nix {inherit pkgs;}) mkPoetryApplication;
+in
+  mkPoetryApplication {
+    projectDir = subscleaner-src;
+    preferWheels = true;
+  }