diff --git a/.circleci/config.yml b/.circleci/config.yml
index dc9e962..5a497fa 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -4,7 +4,7 @@ jobs:
   test_without_db:
     working_directory: ~/repo
     docker:
-      - image: cimg/node:16.15-browsers
+      - image: cimg/node:20.18.1-browsers
 
     steps:
       - checkout
@@ -15,7 +15,7 @@ jobs:
   test_with_db:
     working_directory: ~/repo
     docker:
-      - image: cimg/node:16.15-browsers
+      - image: cimg/node:20.18.1-browsers
       - image: circleci/dynamodb
 
     steps:
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 9a9e7d1..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-lib/
-renovate.json
-tsconfig.json
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 731c6be..0000000
--- a/.eslintrc
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "root": true,
-  "extends": [
-    "@shelf/eslint-config/typescript"
-  ],
-  "rules": {
-    "@typescript-eslint/no-var-requires": "off"
-  }
-}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..338fa0a
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,20 @@
+import rules from '@shelf/eslint-config/typescript.js';
+
+export default [
+  ...rules,
+  {files: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx', '**/*.json']},
+  {
+    ignores: [
+      '.idea/',
+      'coverage/',
+      'draft.js',
+      'lib/',
+      'dist/',
+      'node_modules/',
+      'packages/**/tsconfig.types.json',
+      'packages/**/node_modules/**',
+      'packages/**/lib/**',
+      'renovate.json',
+    ],
+  },
+];
diff --git a/package.json b/package.json
index 1051cdb..48a5803 100644
--- a/package.json
+++ b/package.json
@@ -24,8 +24,8 @@
     "build": "rm -rf lib/ && yarn build:types && babel src --out-dir lib --ignore '**/*.test.ts' --extensions '.ts'",
     "build:types": "tsc --emitDeclarationOnly --declaration --isolatedModules false --declarationDir lib",
     "coverage": "jest --coverage",
-    "lint": "eslint . --ext .js,.ts,.json --fix",
-    "lint:ci": "eslint . --ext .js,.ts,.json",
+    "lint": "yarn lint:ci --fix",
+    "lint:ci": "eslint . --quiet",
     "prepack": "yarn build",
     "test": "export ENVIRONMENT=local && jest tests",
     "type-check": "tsc --noEmit",
@@ -58,22 +58,22 @@
     "@babel/cli": "7.26.4",
     "@babel/core": "7.26.0",
     "@shelf/babel-config": "1.2.0",
-    "@shelf/eslint-config": "2.30.0",
+    "@shelf/eslint-config": "4.2.1",
     "@shelf/prettier-config": "1.0.0",
     "@shelf/tsconfig": "0.1.0",
     "@types/aws-sdk": "2.7.4",
     "@types/cwd": "^0.10.2",
     "@types/jest": "29.5.14",
-    "@types/node": "16",
-    "eslint": "8.57.1",
+    "@types/node": "20",
+    "eslint": "9.17.0",
     "husky": "8.0.3",
     "jest": "29.7.0",
     "lint-staged": "13.3.0",
-    "prettier": "2.8.8",
+    "prettier": "3.4.2",
     "typescript": "5.7.2"
   },
   "engines": {
-    "node": ">=16"
+    "node": ">=20"
   },
   "publishConfig": {
     "access": "public"