diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 25a76ab4..00000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,15 +0,0 @@
-// SPDX-FileCopyrightText: 2021 Johannes Loher
-//
-// SPDX-License-Identifier: MIT
-
-module.exports = {
-  parser: "@typescript-eslint/parser",
-  parserOptions: { ecmaVersion: 2020, sourceType: "module" },
-  env: { browser: true },
-  extends: ["plugin:@typescript-eslint/recommended", "prettier"],
-  plugins: ["@typescript-eslint"],
-  overrides: [
-    { files: ["./*.cjs"], rules: { "@typescript-eslint/no-var-requires": "off" } },
-    { files: ["./spec/**/*"], env: { browser: false } },
-  ],
-};
diff --git a/.woodpecker/publish.yaml b/.woodpecker/publish.yaml
index a82afd91..05d7e912 100644
--- a/.woodpecker/publish.yaml
+++ b/.woodpecker/publish.yaml
@@ -38,6 +38,7 @@ steps:
       - <<: *enable_pnpm
       - pnpm install --frozen-lockfile
   build:
+    depends_on: install
     image: *node_image
     environment:
       NODE_ENV: production
@@ -46,7 +47,7 @@ steps:
       - <<: *enable_pnpm
       - pnpm build
   package:
-    group: prepare-release
+    depends_on: build
     image: alpine:latest
     commands:
       - apk update
@@ -54,32 +55,34 @@ steps:
       - mv dist ${CI_REPO_NAME}
       - zip -r ${CI_REPO_NAME}.zip ${CI_REPO_NAME}/*
   changelog:
-    group: prepare-release
+    depends_on: build
     image: *node_image
     commands:
       - <<: *enable_pnpm
       - pnpm changelog
   choose-latest-channel:
-    group: prepare-release
+    depends_on: build
     image: alpine:latest
     commands:
       - echo latest > .RELEASE_CHANNEL
     when:
       <<: *is_latest_channel
   choose-beta-channel:
-    group: prepare-release
+    depends_on: build
     image: alpine:latest
     commands:
       - echo beta > .RELEASE_CHANNEL
     when:
       <<: *is_beta_channel
   release-latest:
+    depends_on: choose-latest-channel
     image: *release_plugin
     settings:
       <<: *release_base_settings
     when:
       <<: *is_latest_channel
   release-beta:
+    depends_on: choose-beta-channel
     image: *release_plugin
     settings:
       <<: *release_base_settings
@@ -87,7 +90,7 @@ steps:
     when:
       <<: *is_beta_channel
   publish-manifest:
-    group: publish
+    depends_on: [release-latest, release-beta]
     image: alpine:latest
     commands:
       - apk update
@@ -98,17 +101,14 @@ steps:
     secrets:
       - forge_token
   publish-to-foundry-admin:
-    group: publish
-    image: johannesloher/foundry-publish:v3.0.1
-    environment:
-      FVTT_DELETE_OBSOLETE_VERSIONS: "true"
+    depends_on: [release-latest, release-beta]
+    image: johannesloher/foundry-publish:v4.0.0
     commands:
       - export FVTT_MANIFEST_PATH=${CI_REPO_NAME}/system.json
       - export FVTT_MANIFEST_URL=${CI_REPO_URL}/releases/download/${CI_COMMIT_TAG}/system.json
       - foundry-publish
     secrets:
       - fvtt_package_id
-      - fvtt_username
-      - fvtt_password
+      - fvtt_token
     when:
       <<: *is_latest_channel
diff --git a/commitlint.config.cjs b/commitlint.config.cjs
deleted file mode 100644
index c52644d5..00000000
--- a/commitlint.config.cjs
+++ /dev/null
@@ -1,5 +0,0 @@
-// SPDX-FileCopyrightText: 2021 Johannes Loher
-//
-// SPDX-License-Identifier: MIT
-
-module.exports = { extends: ["@commitlint/config-conventional"] };
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 00000000..7401f777
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,8 @@
+// SPDX-FileCopyrightText: 2021 Johannes Loher
+//
+// SPDX-License-Identifier: MIT
+
+/**
+ * @type {import("@commitlint/types").UserConfig}
+ */
+export default { extends: ["@commitlint/config-conventional"] };
diff --git a/package.json b/package.json
index e3048a08..f1e78aa4 100644
--- a/package.json
+++ b/package.json
@@ -93,5 +93,10 @@
     "vitest": "3.0.6",
     "yargs": "17.7.2"
   },
-  "packageManager": "pnpm@10.4.1"
+  "packageManager": "pnpm@10.4.1",
+  "pnpm": {
+    "onlyBuiltDependencies": [
+      "@swc/core"
+    ]
+  }
 }
diff --git a/.prettierrc.js b/prettier.config.js
similarity index 76%
rename from .prettierrc.js
rename to prettier.config.js
index d6ceb41d..c75da361 100644
--- a/.prettierrc.js
+++ b/prettier.config.js
@@ -2,6 +2,11 @@
 //
 // SPDX-License-Identifier: MIT
 
+// @ts-check
+
+/**
+ * @type {import("prettier").Config}
+ */
 export default {
   semi: true,
   trailingComma: "all",