diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4974438c5dd777b4ba40304213a31ad0d449b3da..e0760a841ada2b21d5a2017c1b33f3fae3bf4f6d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,7 +15,7 @@ compiling:
   script:
     - apt update
     - DEBIAN_FRONTEND="noninteractive" apt install -y gettext php php-simplexml
-    - npm install
+    - pnpm install
     - make build-js
     - make translations
   artifacts:
@@ -45,7 +45,7 @@ packaging:
   image: ubuntu:rolling
   script:
     - apt update
-    - DEBIAN_FRONTEND="noninteractive" apt install -y wget sudo gettext php php-simplexml nodejs npm git
+    - DEBIAN_FRONTEND="noninteractive" apt install -y wget sudo gettext php php-simplexml nodejs pnpm git
     - wget https://github.com/ChristophWurst/krankerl/releases/download/v0.13.0/krankerl_0.13.0_amd64.deb
     - sudo dpkg -i krankerl_0.13.0_amd64.deb
     - krankerl package
diff --git a/Makefile b/Makefile
index a1affe5d6c8d218bab64674322b431f18ead7844..b800ad36e04bca217d9d365088ea28dca53c0cef 100644
--- a/Makefile
+++ b/Makefile
@@ -7,44 +7,44 @@ all: dev-setup lint build-js-production test
 dev-setup: clean clean-dev npm-init
 
 npm-init:
-	npm ci
+	pnpm ci
 
 npm-update:
-	npm update
+	pnpm update
 
 # Building
 build-js:
-	npm run dev
+	pnpm run dev
 
 build-js-production:
-	npm run build
+	pnpm run build
 
 watch-js:
-	npm run watch
+	pnpm run watch
 
 # Testing
 test:
-	npm run test
+	pnpm run test
 
 test-watch:
-	npm run test:watch
+	pnpm run test:watch
 
 test-coverage:
-	npm run test:coverage
+	pnpm run test:coverage
 
 # Linting
 lint:
-	npm run lint
+	pnpm run lint
 
 lint-fix:
-	npm run lint:fix
+	pnpm run lint:fix
 
 # Style linting
 stylelint:
-	npm run stylelint
+	pnpm run stylelint
 
 stylelint-fix:
-	npm run stylelint:fix
+	pnpm run stylelint:fix
 
 # Cleaning
 clean:
diff --git a/package.json b/package.json
index 1f2e8f11b8ad859221a1e18bfe65791a05d8d6a1..977828f22876035b081a0cab0781b7269e6cc517 100644
--- a/package.json
+++ b/package.json
@@ -30,25 +30,27 @@
 		"stylelint:fix": "stylelint src --fix"
 	},
 	"dependencies": {
+		"@babel/eslint-parser": "^7.15.8",
 		"@nextcloud/auth": "^1.3.0",
-		"@nextcloud/axios": "^1.6.0",
-		"@nextcloud/dialogs": "^3.1.1",
+		"@nextcloud/axios": "^1.7.0",
+		"@nextcloud/dialogs": "^3.1.2",
 		"@nextcloud/l10n": "^1.4.1",
 		"@nextcloud/moment": "^1.1.1",
-		"@nextcloud/router": "^1.2.0",
-		"@nextcloud/vue": "^2.9.0",
-		"@nextcloud/vue-dashboard": "^1.1.0",
-		"autoprefixer": "^9.8.6",
-		"howler": "^2.2.1",
-		"javascript-time-ago": "^2.3.4",
-		"music-metadata": "^7.8.1",
-		"postcss-loader": "^4.2.0",
-		"style-loader": "^2.0.0",
-		"vue": "^2.6.12",
-		"vue-content-loader": "^0.2.3",
+		"@nextcloud/router": "^2.0.0",
+		"@nextcloud/vue": "^4.2.0",
+		"@nextcloud/vue-dashboard": "^2.0.1",
+		"autoprefixer": "^10.3.7",
+		"eslint-webpack-plugin": "^3.0.1",
+		"howler": "^2.2.3",
+		"javascript-time-ago": "^2.3.9",
+		"music-metadata": "^7.11.4",
+		"postcss-loader": "^6.2.0",
+		"style-loader": "^3.3.0",
+		"vue": "^2.6.14",
+		"vue-content-loader": "^2.0.0",
 		"vue-lazyload": "^1.3.3",
 		"vue-resize-directive": "^1.2.0",
-		"vue-router": "^3.5.1",
+		"vue-router": "^3.5.2",
 		"vue-show-more-text": "^2.0.2",
 		"vuex": "^3.6.2"
 	},
@@ -59,38 +61,35 @@
 		"node": ">=10.0.0"
 	},
 	"devDependencies": {
-		"@babel/core": "^7.13.10",
+		"@babel/core": "^7.15.8",
 		"@babel/plugin-syntax-dynamic-import": "^7.8.3",
-		"@babel/preset-env": "^7.13.10",
-		"@nextcloud/browserslist-config": "^1.0.0",
-		"@nextcloud/eslint-config": "^2.2.0",
-		"@nextcloud/eslint-plugin": "^1.5.0",
-		"@nextcloud/webpack-vue-config": "^1.4.1",
-		"@vue/test-utils": "^1.1.3",
-		"babel-eslint": "^10.1.0",
+		"@babel/preset-env": "^7.15.8",
+		"@nextcloud/browserslist-config": "^2.2.0",
+		"@nextcloud/eslint-config": "^6.1.0",
+		"@nextcloud/eslint-plugin": "^2.0.0",
+		"@nextcloud/webpack-vue-config": "^4.1.0",
+		"@vue/test-utils": "^1.2.2",
 		"babel-loader": "^8.2.2",
-		"css-loader": "^3.6.0",
-		"eslint": "^6.8.0",
-		"eslint-config-standard": "^14.1.1",
-		"eslint-import-resolver-webpack": "^0.13.0",
-		"eslint-loader": "^4.0.2",
-		"eslint-plugin-html": "^6.1.2",
-		"eslint-plugin-import": "^2.22.1",
+		"css-loader": "^6.4.0",
+		"eslint": "^8.0.1",
+		"eslint-config-standard": "^16.0.3",
+		"eslint-import-resolver-webpack": "^0.13.1",
+		"eslint-plugin-html": "^6.2.0",
+		"eslint-plugin-import": "^2.25.2",
 		"eslint-plugin-node": "^11.1.0",
-		"eslint-plugin-promise": "^4.3.1",
-		"eslint-plugin-standard": "^4.1.0",
-		"eslint-plugin-vue": "^6.2.2",
+		"eslint-plugin-promise": "^5.1.0",
+		"eslint-plugin-vue": "^7.19.1",
 		"file-loader": "^6.2.0",
-		"node-sass": "^4.14.1",
-		"sass-loader": "^8.0.2",
-		"stylelint": "^13.12.0",
-		"stylelint-config-recommended-scss": "^4.2.0",
-		"stylelint-scss": "^3.19.0",
-		"stylelint-webpack-plugin": "^2.1.1",
-		"vue-loader": "^15.9.6",
-		"vue-template-compiler": "^2.6.12",
-		"webpack": "^4.46.0",
-		"webpack-cli": "^3.3.12",
-		"webpack-merge": "^5.7.3"
+		"node-sass": "^6.0.1",
+		"sass-loader": "^12.2.0",
+		"stylelint": "^13.13.1",
+		"stylelint-config-recommended-scss": "^4.3.0",
+		"stylelint-scss": "^3.21.0",
+		"stylelint-webpack-plugin": "^3.0.1",
+		"vue-loader": "^15.9.8",
+		"vue-template-compiler": "^2.6.14",
+		"webpack": "^5.58.2",
+		"webpack-cli": "^4.9.0",
+		"webpack-merge": "^5.8.0"
 	}
 }