diff --git a/Makefile b/Makefile
index 66c644ba2..31b3787a8 100644
--- a/Makefile
+++ b/Makefile
@@ -80,7 +80,7 @@ MANAGE += data.all data.languages data.useragents data.osm_keys_tags
 MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
 MANAGE += docker.build docker.push docker.buildx
 MANAGE += gecko.driver
-MANAGE += node.env node.clean
+MANAGE += node.env node.env.dev node.clean
 MANAGE += py.build py.clean
 MANAGE += pyenv pyenv.install pyenv.uninstall
 MANAGE += pypi.upload pypi.upload.test
diff --git a/manage b/manage
index a779d1ff2..c51d76ddb 100755
--- a/manage
+++ b/manage
@@ -97,7 +97,8 @@ redis:
   install   : create user (${REDIS_USER}) and install systemd service (${REDIS_SERVICE_NAME})
   help      : show more redis commands
 node.:
-  env       : download & install npm dependencies locally
+  env       : download & install SearXNG's npm dependencies locally
+  env.dev   : download & install developer and CI tools
   clean     : drop locally npm installations
 py.:
   build     : Build python packages at ./${PYDIST}
@@ -563,16 +564,15 @@ nodejs.ensure() {
 node.env() {
     nodejs.ensure
     (   set -e
-
-        build_msg INSTALL "searx/static/themes/simple/package.json"
+        build_msg INSTALL "./searx/static/themes/simple/package.json"
         npm --prefix searx/static/themes/simple install
     )
     dump_return $?
 }
 
-node.env.devtools() {
+node.env.dev() {
     nodejs.ensure
-    build_msg INSTALL "package.json: developer and CI tools"
+    build_msg INSTALL "./package.json: developer and CI tools"
     npm install
 }
 
@@ -585,6 +585,10 @@ node.clean() {
     (   set -e
         npm --prefix searx/static/themes/simple run clean
     )
+    build_msg CLEAN "locally installed developer and CI tools"
+    (   set -e
+        npm --prefix . run clean
+    )
     dump_return $?
 }
 
@@ -702,7 +706,7 @@ test.pylint() {
 
 test.pyright() {
     build_msg TEST "[pyright] static type check of python sources"
-    node.env.devtools
+    node.env.dev
     # We run Pyright in the virtual environment because Pyright
     # executes "python" to determine the Python version.
     build_msg TEST "[pyright] suppress warnings related to intentional monkey patching"
diff --git a/package.json b/package.json
index 9c4b0186c..5eb3da891 100644
--- a/package.json
+++ b/package.json
@@ -2,5 +2,8 @@
   "dependencies": {
     "eslint": "^8.18.0",
     "pyright": "^1.1.255"
+  },
+  "scripts": {
+    "clean": "rm -Rf node_modules package-lock.json"
   }
 }