diff --git a/core/base-service/base-graphql.spec.js b/core/base-service/base-graphql.spec.js
index ca06f22d0d9f629cdb832c6d25ad0d7ca27593b8..187063c88da698bc812a95694a7ad13d3b674573 100644
--- a/core/base-service/base-graphql.spec.js
+++ b/core/base-service/base-graphql.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const gql = require('graphql-tag')
 const sinon = require('sinon')
diff --git a/core/base-service/base-json.spec.js b/core/base-service/base-json.spec.js
index 02e0399f18f73600ce5cdd14e048d6db98b0206d..464b3800e6f04d34972aef423e6a42754f3883a0 100644
--- a/core/base-service/base-json.spec.js
+++ b/core/base-service/base-json.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseJsonService = require('./base-json')
diff --git a/core/base-service/base-svg-scraping.spec.js b/core/base-service/base-svg-scraping.spec.js
index 349aa2fb01ecd9e522625f3272882336ca2011ef..6378e81faff802c430ec02fcb97f32b977daaba4 100644
--- a/core/base-service/base-svg-scraping.spec.js
+++ b/core/base-service/base-svg-scraping.spec.js
@@ -2,7 +2,7 @@
 
 const { expect } = require('chai')
 const sinon = require('sinon')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const makeBadge = require('../../badge-maker/lib/make-badge')
 const BaseSvgScrapingService = require('./base-svg-scraping')
 
diff --git a/core/base-service/base-xml.spec.js b/core/base-service/base-xml.spec.js
index b9e59990f0a9aa353a1b0b9b711e6b5308738253..42ca1505fb31453b61750455e614ad0f582f1443 100644
--- a/core/base-service/base-xml.spec.js
+++ b/core/base-service/base-xml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseXmlService = require('./base-xml')
diff --git a/core/base-service/base-yaml.spec.js b/core/base-service/base-yaml.spec.js
index c19965860a8718ed0d488e0fec12634d23ac8eeb..781c76f1303047155c751449e425652260e053d9 100644
--- a/core/base-service/base-yaml.spec.js
+++ b/core/base-service/base-yaml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseYamlService = require('./base-yaml')
diff --git a/core/base-service/base.js b/core/base-service/base.js
index c72ecd050f8d1f32d2113cd74dbecc4d1f494309..cd7ca9618cfc5044c0f708cae320a4f2ed0e5978 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -5,7 +5,7 @@
 
 // See available emoji at http://emoji.muan.co/
 const emojic = require('emojic')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const log = require('../server/log')
 const { AuthHelper } = require('./auth-helper')
 const { MetricHelper, MetricNames } = require('./metric-helper')
diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js
index b060b4f990ad2f199e430d6b6a77202e699845a4..96e72263e27389c5652d8b011fef93a54c1997a8 100644
--- a/core/base-service/base.spec.js
+++ b/core/base-service/base.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const chai = require('chai')
 const { expect } = chai
 const sinon = require('sinon')
diff --git a/core/base-service/cache-headers.js b/core/base-service/cache-headers.js
index 4b869e716b1df520d352c4ccdd1b337b14fd70cf..999867aa22b0499ce35ab91c7b10181e2f0daf78 100644
--- a/core/base-service/cache-headers.js
+++ b/core/base-service/cache-headers.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const assert = require('assert')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const coalesce = require('./coalesce')
 
 const serverStartTimeGMTString = new Date().toGMTString()
diff --git a/core/base-service/categories.js b/core/base-service/categories.js
index cc91a808df0a60da21b0888fb6c067c532ed9fc4..d1bb0028fa5c416a1a8e1b5e0aa0d0f4ef0c6af2 100644
--- a/core/base-service/categories.js
+++ b/core/base-service/categories.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const categories = require('../../services/categories')
 
 const isRealCategory = Joi.equal(...categories.map(({ id }) => id)).required()
diff --git a/core/base-service/deprecated-service.js b/core/base-service/deprecated-service.js
index 1f6e98fea04d8d49ec89d59352c6a4dd7d755dc7..a2c4796a5831968f0a833cfa3ffabf6fa66899c9 100644
--- a/core/base-service/deprecated-service.js
+++ b/core/base-service/deprecated-service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const camelcase = require('camelcase')
 const BaseService = require('./base')
 const { isValidCategory } = require('./categories')
diff --git a/core/base-service/examples.js b/core/base-service/examples.js
index b62fc96760401d9e7361f034f8cf79272dd0e87a..5219081510519584403cfaa10ca13cb04985e19f 100644
--- a/core/base-service/examples.js
+++ b/core/base-service/examples.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { pathToRegexp, compile } = require('path-to-regexp')
 const categories = require('../../services/categories')
 const coalesceBadge = require('./coalesce-badge')
diff --git a/core/base-service/redirector.js b/core/base-service/redirector.js
index a01d54a2e75d9c4dd5d569c610be592ad441a68e..c7334955891184d26c33089c137b6ca4b1fa64b1 100644
--- a/core/base-service/redirector.js
+++ b/core/base-service/redirector.js
@@ -2,7 +2,7 @@
 
 const camelcase = require('camelcase')
 const emojic = require('emojic')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const queryString = require('query-string')
 const BaseService = require('./base')
 const {
diff --git a/core/base-service/route.js b/core/base-service/route.js
index 73c45e266febdb4dd552b297b47db70263510117..9d60b495af0478079fae02032a5ba2ca274007fc 100644
--- a/core/base-service/route.js
+++ b/core/base-service/route.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const escapeStringRegexp = require('escape-string-regexp')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { pathToRegexp } = require('path-to-regexp')
 
 function makeFullUrl(base, partialUrl) {
diff --git a/core/base-service/route.spec.js b/core/base-service/route.spec.js
index 2c199939f7162c2c7ce99e03e0711a1b7b6ead5d..612a0d5cc27f1aa6b1c9ebe8acfa8a94486a798d 100644
--- a/core/base-service/route.spec.js
+++ b/core/base-service/route.spec.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { expect } = require('chai')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { test, given, forCases } = require('sazerac')
 const {
   prepareRoute,
diff --git a/core/base-service/service-definitions.js b/core/base-service/service-definitions.js
index 1ad387cc766da3d0d742bc1d1857d042afc5ac59..3f931458276cf07c2d4353bae36a96708a7ed172 100644
--- a/core/base-service/service-definitions.js
+++ b/core/base-service/service-definitions.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 // This should be kept in sync with the schema in
 // `frontend/lib/service-definitions/index.ts`.
diff --git a/core/base-service/validate.js b/core/base-service/validate.js
index 0bfc4a8773269b0a08629469c2b9dedbf49fad14..a2da0e922da020f4ae2d3b2c0d86ab6d16588b0a 100644
--- a/core/base-service/validate.js
+++ b/core/base-service/validate.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const emojic = require('emojic')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const trace = require('./trace')
 
 function validate(
diff --git a/core/base-service/validate.spec.js b/core/base-service/validate.spec.js
index 1cdde0cec76e532982a3e6f10c72023e458830ac..c51f7710703857bed08be6d83ca07f05cec9797c 100644
--- a/core/base-service/validate.spec.js
+++ b/core/base-service/validate.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const trace = require('./trace')
diff --git a/core/server/server.js b/core/server/server.js
index afce333b23bd144222d88bb371a21cc3059a7e53..60988a40b2a49f779cc1d04b24bd4194dd2bf81d 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -8,7 +8,7 @@ const url = require('url')
 const { URL } = url
 const bytes = require('bytes')
 const Camp = require('@shields_io/camp')
-const originalJoi = require('@hapi/joi')
+const originalJoi = require('joi')
 const makeBadge = require('../../badge-maker/lib/make-badge')
 const GithubConstellation = require('../../services/github/github-constellation')
 const suggest = require('../../services/suggest')
diff --git a/core/service-test-runner/icedfrisby-shields.js b/core/service-test-runner/icedfrisby-shields.js
index a1ce0a8d85caa291637917c5da569f1a140f33b3..f4a99b7b720b7b1fc05bdc117b9e80fa180d6b0b 100644
--- a/core/service-test-runner/icedfrisby-shields.js
+++ b/core/service-test-runner/icedfrisby-shields.js
@@ -3,7 +3,7 @@
  * @module
  */
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 
 /**
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index 55bfc39784cbb8d47231f348eb4fc12b30b801c6..00a834ea04bfe28c6c45a464c917e7abe2d74491 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -179,7 +179,7 @@ const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 
 // (4)
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const schema = Joi.object({
   version: Joi.string().required(),
 }).required()
diff --git a/doc/rewriting-services.md b/doc/rewriting-services.md
index 91c2f729f0b7f7d8c785006fbd43b94e15b30cbe..ea5cce0119bedb281d077baac86a380e2123b443 100644
--- a/doc/rewriting-services.md
+++ b/doc/rewriting-services.md
@@ -145,7 +145,7 @@ Once the route is working, fill out `render()` and `handle()`.
 <details>
 
 ```js
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { errorMessagesFor } = require('./github-helpers')
 
 const issueSchema = Joi.object({
@@ -174,7 +174,7 @@ or create an abstract superclass like **PypiBase**:
 <details>
 
 ```js
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const BaseJsonService = require('../base-json')
 
 const schema = Joi.object({
diff --git a/lib/logos.js b/lib/logos.js
index cdfc0ce6ab7010c0b54671765b78662852c2c90c..26000732e50ef86fff00044b7fe111d24720528b 100644
--- a/lib/logos.js
+++ b/lib/logos.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   toSvgColor,
   brightness,
diff --git a/package-lock.json b/package-lock.json
index 40d699af3f02c200735c0ac9d9d09eb8c6167538..62036686d2c5b53414228a960e513c8496d14a53 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6090,6 +6090,8 @@
       "version": "17.1.1",
       "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz",
       "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==",
+      "dev": true,
+      "optional": true,
       "requires": {
         "@hapi/address": "^4.0.1",
         "@hapi/formula": "^2.0.0",
@@ -6102,6 +6104,8 @@
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz",
           "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==",
+          "dev": true,
+          "optional": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -6109,12 +6113,16 @@
         "@hapi/hoek": {
           "version": "9.0.4",
           "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz",
-          "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw=="
+          "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==",
+          "dev": true,
+          "optional": true
         },
         "@hapi/topo": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
           "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+          "dev": true,
+          "optional": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -7493,11 +7501,6 @@
         "@types/node": "*"
       }
     },
-    "@types/hapi__joi": {
-      "version": "16.0.12",
-      "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-16.0.12.tgz",
-      "integrity": "sha512-xJYifuz59jXdWY5JMS15uvA3ycS3nQYOGqoIIE0+fwQ0qI3/4CxBc6RHsOTp6wk9M0NWEdpcTl02lOQOKMifbQ=="
-    },
     "@types/hast": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz",
@@ -23047,7 +23050,6 @@
       "version": "17.2.1",
       "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz",
       "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==",
-      "dev": true,
       "requires": {
         "@hapi/address": "^4.1.0",
         "@hapi/formula": "^2.0.0",
@@ -23060,7 +23062,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz",
           "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==",
-          "dev": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -23068,14 +23069,12 @@
         "@hapi/hoek": {
           "version": "9.1.0",
           "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz",
-          "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==",
-          "dev": true
+          "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw=="
         },
         "@hapi/topo": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
           "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
-          "dev": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -23083,11 +23082,10 @@
       }
     },
     "joi-extension-semver": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-4.1.1.tgz",
-      "integrity": "sha512-mzDM+W0reD4kYrQmCcMCH9/pIM/1bMBOoLkAZ0Xel3xhcgiwKFv2Cn27syS0kNn6mPibIdLXIMHfuQDLteoqVQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-5.0.0.tgz",
+      "integrity": "sha512-g23Majx+TFtxRHAcQn48j+GYts2E0opkUieNxJ6PzLz1dKKZHrKYuEt3p/JY+RgJmyEG961E0dekTuilns8fVA==",
       "requires": {
-        "@types/hapi__joi": "^16.0.12",
         "semver": "^6.1.1"
       },
       "dependencies": {
diff --git a/package.json b/package.json
index 97831cce8d5e9d74acf9111c5c8445602a08dee3..bdf38565892c98b1a918bc494b8469f5ddfd4fb4 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
     "url": "https://github.com/badges/shields"
   },
   "dependencies": {
-    "@hapi/joi": "^17.1.1",
+    "joi": "17.2.1",
     "@sentry/node": "^5.24.2",
     "@shields_io/camp": "^18.0.0",
     "badge-maker": "file:badge-maker",
@@ -44,7 +44,7 @@
     "graphql": "^14.7.0",
     "graphql-tag": "^2.11.0",
     "ioredis": "4.17.3",
-    "joi-extension-semver": "4.1.1",
+    "joi-extension-semver": "5.0.0",
     "js-yaml": "^3.14.0",
     "jsonpath": "~1.0.2",
     "lodash.countby": "^4.6.0",
diff --git a/services/amo/amo-base.js b/services/amo/amo-base.js
index f8f6a839d10237bca304721b3ba9d4a64845f302..090221348fd678b695b8eeebe88a2b32b0e81219 100644
--- a/services/amo/amo-base.js
+++ b/services/amo/amo-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/amo/amo-rating.tester.js b/services/amo/amo-rating.tester.js
index 55d83c436e2ffd04c3bc057e039594bc68ab6d34..f17a90656f67ee0b20d190bbdf340063c3d9d264 100644
--- a/services/amo/amo-rating.tester.js
+++ b/services/amo/amo-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/ansible/ansible-quality.service.js b/services/ansible/ansible-quality.service.js
index d76848e4b287af7bad41dd0db80c0c6272bea3ab..75b27d92abbed487379a8b459b54206f5d0058fa 100644
--- a/services/ansible/ansible-quality.service.js
+++ b/services/ansible/ansible-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
 
diff --git a/services/ansible/ansible-role.service.js b/services/ansible/ansible-role.service.js
index 54132ebdbcc04992b4dea106bf2c747addc50d13..c447859782cb6d2ffb7960e194b163e0cd2d0283 100644
--- a/services/ansible/ansible-role.service.js
+++ b/services/ansible/ansible-role.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/apm/apm.service.js b/services/apm/apm.service.js
index ee2de5c98527e7555667a2412229c53f95953cb1..9b52cfe7ed2d786fc182f2ff94c12344e5817314 100644
--- a/services/apm/apm.service.js
+++ b/services/apm/apm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { metric } = require('../text-formatters')
diff --git a/services/appveyor/appveyor-base.js b/services/appveyor/appveyor-base.js
index 02382c5cce78e6ed3bdbb8e3c5faef4705a4b347..015612c43c3c0067950e6a39a54986f22ef2b042 100644
--- a/services/appveyor/appveyor-base.js
+++ b/services/appveyor/appveyor-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { isBuildStatus } = require('../build-status')
 const { BaseJsonService } = require('..')
diff --git a/services/appveyor/appveyor-tests.tester.js b/services/appveyor/appveyor-tests.tester.js
index a08bc2937ac3394d1d215da367f6d7df5d238678..df81a2de2e521254e73835008387b352311f360a 100644
--- a/services/appveyor/appveyor-tests.tester.js
+++ b/services/appveyor/appveyor-tests.tester.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const queryString = require('querystring')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isAppveyorTestTotals = Joi.string().regex(
diff --git a/services/archlinux/archlinux.service.js b/services/archlinux/archlinux.service.js
index f219b161d104b6b3bf10ede804500bc44fbe63da..f06a5003a8fded2e0d7e2b28dfbf1da82ed52543 100644
--- a/services/archlinux/archlinux.service.js
+++ b/services/archlinux/archlinux.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index bd60b251a83894593d25995d46461781d20dfab8..fa30c8fc37892470c6468bf30042911b10662f19 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { addv, metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/azure-devops/azure-devops-base.js b/services/azure-devops/azure-devops-base.js
index 904db4c28bea74963138d5838bd02e070affda14..f22f4c02c06780d067e9270f0bc258f75d1f7887 100644
--- a/services/azure-devops/azure-devops-base.js
+++ b/services/azure-devops/azure-devops-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 
 const latestBuildSchema = Joi.object({
diff --git a/services/azure-devops/azure-devops-build.service.js b/services/azure-devops/azure-devops-build.service.js
index a8632128d35657f5d5c4215902b8e68552ef5c91..5159c86408231ed956f2b73e71594ae1eabcadd8 100644
--- a/services/azure-devops/azure-devops-build.service.js
+++ b/services/azure-devops/azure-devops-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 const { keywords, fetch } = require('./azure-devops-helpers')
diff --git a/services/azure-devops/azure-devops-coverage.service.js b/services/azure-devops/azure-devops-coverage.service.js
index 3d50c484eea9439431b076378b329b05ee1faec8..f2c28adeae9e6c351c436cafcb4cfb14ef2a99a4 100644
--- a/services/azure-devops/azure-devops-coverage.service.js
+++ b/services/azure-devops/azure-devops-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/azure-devops/azure-devops-helpers.js b/services/azure-devops/azure-devops-helpers.js
index 82cb62d8ab6a9b94a5a507d4e30dce38eabcf8aa..9b841bb0772ee9770686230fba265509274bea4b 100644
--- a/services/azure-devops/azure-devops-helpers.js
+++ b/services/azure-devops/azure-devops-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 
 const keywords = ['vso', 'vsts', 'azure-devops']
diff --git a/services/azure-devops/azure-devops-tests.service.js b/services/azure-devops/azure-devops-tests.service.js
index 6402c2a649b5e23192162c72d5038db07c864ab1..5b373a3fe7e1c248606d7cdf793dffbb02f87caf 100644
--- a/services/azure-devops/azure-devops-tests.service.js
+++ b/services/azure-devops/azure-devops-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   testResultQueryParamSchema,
   renderTestResultBadge,
diff --git a/services/azure-devops/azure-devops-tests.tester.js b/services/azure-devops/azure-devops-tests.tester.js
index 495e681a1d8b70f42c053cafd3d83aeb3b097d6e..eb3425b89c3b402ab60a4ccdf034b4a9e88a2b7c 100644
--- a/services/azure-devops/azure-devops-tests.tester.js
+++ b/services/azure-devops/azure-devops-tests.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const org = 'azuredevops-powershell'
diff --git a/services/beerpay/beerpay.service.js b/services/beerpay/beerpay.service.js
index 1fb657a2edbbb61c4cdf5652dc4df6586c19004d..9d2167647cafdebe3f22f6fba652266bed0658a1 100644
--- a/services/beerpay/beerpay.service.js
+++ b/services/beerpay/beerpay.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bintray/bintray-downloads.service.js b/services/bintray/bintray-downloads.service.js
index 314656353cd031e3c3022a910f0e72bf6a2482ee..8f3ed7520a7d5c668923de8033aa41cd6a41fe4a 100644
--- a/services/bintray/bintray-downloads.service.js
+++ b/services/bintray/bintray-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/bintray/bintray-version.service.js b/services/bintray/bintray-version.service.js
index a44c6bcd37ed4c760bbb8896f92d057617d5308d..3e66c5d4b588324c195e276109a70f0f9defbf56 100644
--- a/services/bintray/bintray-version.service.js
+++ b/services/bintray/bintray-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bit/bit-components.service.js b/services/bit/bit-components.service.js
index aa5a154f5b1784615f2ac6ed1b96a0b4d5e07618..3b852d46e626309e99e779373c4acd8bf50c3bb1 100644
--- a/services/bit/bit-components.service.js
+++ b/services/bit/bit-components.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { downloadCount } = require('../color-formatters')
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index 1e742087b7ec6684c87e9a634d300f03465092d6..f2399d66cfbb4c73d3f511a8c7905730aa953ff7 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index 9e38753fca8974c4ce8021564e7f7f33353e1b8c..347e1d97cbf079ac1a67593032a8028c89af8e16 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, redirector } = require('..')
 
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index 47b9726f2d480596fb58253512a70a545fa5cd9e..3ecc0028997331e42fc79379a542970e2daa58ae 100644
--- a/services/bitbucket/bitbucket-pull-request.service.js
+++ b/services/bitbucket/bitbucket-pull-request.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { AuthHelper } = require('../../core/base-service/auth-helper')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger, optionalUrl } = require('../validators')
diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js
index 79d81e06ec3d4ec9fd354a4a922c7ca186a1acbb..c3a27f68388c751cb69d8ab0b0374b593aeb70b1 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 // https://devcenter.bitrise.io/api/app-status-badge/
diff --git a/services/bountysource/bountysource.service.js b/services/bountysource/bountysource.service.js
index 96b793630e7a7cd19c1e72e2cf2026eeae82cde5..9834fdd8e66eb88ab8ecdc3bf6366966af6e9e31 100644
--- a/services/bountysource/bountysource.service.js
+++ b/services/bountysource/bountysource.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/bower/bower-base.js b/services/bower/bower-base.js
index 793102d70a631a93e77bc289d75a1932b73cffbc..035844993acfcfb304cde7ba7ec8ab7f7a80d17b 100644
--- a/services/bower/bower-base.js
+++ b/services/bower/bower-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object()
diff --git a/services/bower/bower-version.service.js b/services/bower/bower-version.service.js
index d4c8672a4f31b31c883221162e9de55a586e7119..2ebb7ed7e9e9249316d123cdffbf606f248e01b3 100644
--- a/services/bower/bower-version.service.js
+++ b/services/bower/bower-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { InvalidResponse, redirector } = require('..')
 const BaseBowerService = require('./bower-base')
diff --git a/services/bower/bower-version.tester.js b/services/bower/bower-version.tester.js
index 2e5ff2736d086267b83ada63f39b49e1c1ca8954..2f7129b438b91842ea1fedcfccdabbd04eccfe05 100644
--- a/services/bower/bower-version.tester.js
+++ b/services/bower/bower-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
diff --git a/services/bstats/bstats-players.service.js b/services/bstats/bstats-players.service.js
index 462159e4b3e345c9f5fb7cd579302a752d4a5d8d..855875c46754e1d0d20d8480b5d75c2652253e45 100644
--- a/services/bstats/bstats-players.service.js
+++ b/services/bstats/bstats-players.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bstats/bstats-servers.service.js b/services/bstats/bstats-servers.service.js
index 2ddbb794fe85f09cb4f7957581c7ea42591a817b..156458798b8098354e1f00138e8f90059b94f9c7 100644
--- a/services/bstats/bstats-servers.service.js
+++ b/services/bstats/bstats-servers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index dc8f3da11af9951e7b41d470960ca5b62ed3013a..e0acfd608f5a0243378ca5843e00d107f954bf0d 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.tester.js b/services/bugzilla/bugzilla.tester.js
index bcd666028e22c5fdcf3f86834256799347534fcc..3bdffa120a12f5803520c9f32f36d81b997f54c2 100644
--- a/services/bugzilla/bugzilla.tester.js
+++ b/services/bugzilla/bugzilla.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const bzBugStatus = Joi.equal(
diff --git a/services/build-status.js b/services/build-status.js
index 45a95c197f7c25fa8e6577e492714c71c74a2cb8..4a088eee453742a6851bcca0ed5d5cd223c6ac80 100644
--- a/services/build-status.js
+++ b/services/build-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const greenStatuses = [
   'fixed',
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index d428b13a3f4dcf5f283d068d3d4fca4042b009cc..16b298b0cf9c4a589875d569820b6f11997e50af 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/buildkite/buildkite.tester.js b/services/buildkite/buildkite.tester.js
index fe15e3d088a12fb317a92bae705d53f1a1a5b7de..bca5c506e74e6ff7f2552696c4af6e6e7e2420ce 100644
--- a/services/buildkite/buildkite.tester.js
+++ b/services/buildkite/buildkite.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/bundlephobia/bundlephobia.service.js b/services/bundlephobia/bundlephobia.service.js
index e95061a7acc64a7d178232acfaa91678d4b4b98d..fbc4eb5e6892fc6ff583674fe085903a99d826ab 100644
--- a/services/bundlephobia/bundlephobia.service.js
+++ b/services/bundlephobia/bundlephobia.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/cdnjs/cdnjs.service.js b/services/cdnjs/cdnjs.service.js
index 8d0813ac7b410db4a6d718d8ac23717eb42f70b0..4e3503de27f1ed7c276e30f9a8ab51d249b620ac 100644
--- a/services/cdnjs/cdnjs.service.js
+++ b/services/cdnjs/cdnjs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/chrome-web-store/chrome-web-store-price.tester.js b/services/chrome-web-store/chrome-web-store-price.tester.js
index 4f0201aa71e35de93bb78df7aa0c196cb831aa0d..cc2ffaa587f181b4ae3677e3403b1be7ef015593 100644
--- a/services/chrome-web-store/chrome-web-store-price.tester.js
+++ b/services/chrome-web-store/chrome-web-store-price.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Price')
diff --git a/services/cii-best-practices/cii-best-practices.service.js b/services/cii-best-practices/cii-best-practices.service.js
index dfe52ff239c98a926e7331ac0fe5e9ab504888d1..af45b4090c187fca8bda28019919ea2048ca0c8f 100644
--- a/services/cii-best-practices/cii-best-practices.service.js
+++ b/services/cii-best-practices/cii-best-practices.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale, coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/circleci/circleci.service.js b/services/circleci/circleci.service.js
index 6e2bca6a601c78a9f8a448838921d4f4470ebf0d..84efe01135c19b1cd330472ffa947876bb759a00 100644
--- a/services/circleci/circleci.service.js
+++ b/services/circleci/circleci.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, redirector } = require('..')
 
diff --git a/services/cirrus/cirrus.service.js b/services/cirrus/cirrus.service.js
index 32d8da0e2d444616811808e91b5d1152dc7792df..7e4b9d07bbaeba44407052972f999ea8b8218fe2 100644
--- a/services/cirrus/cirrus.service.js
+++ b/services/cirrus/cirrus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/cirrus/cirrus.tester.js b/services/cirrus/cirrus.tester.js
index b3f1cd8c90ba3db06bd49f7d1219ff8298f760c8..a23d9cc8ce8d4e86653e5627e938550169642c5c 100644
--- a/services/cirrus/cirrus.tester.js
+++ b/services/cirrus/cirrus.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/clojars/clojars-base.js b/services/clojars/clojars-base.js
index 75d79b830bb0072327ec3e1c4a7561f0aae23be1..9a89c9e6ddadfb01849d627b077d82990e376a7c 100644
--- a/services/clojars/clojars-base.js
+++ b/services/clojars/clojars-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/clojars/clojars-version.service.js b/services/clojars/clojars-version.service.js
index 3d19d0cb1931a137ad42a5eb092f0a535085896f..048161a8ff9ef40137202c4cba00a9b43b623bfd 100644
--- a/services/clojars/clojars-version.service.js
+++ b/services/clojars/clojars-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { version: versionColor } = require('../color-formatters')
 const { redirector } = require('..')
 const { BaseClojarsService } = require('./clojars-base')
diff --git a/services/cocoapods/cocoapods-base.js b/services/cocoapods/cocoapods-base.js
index a47f9c069314febd4545aa0b776394282b335401..e0ae168661fa0c1bbe0a0989b93ee4a5a36c35aa 100644
--- a/services/cocoapods/cocoapods-base.js
+++ b/services/cocoapods/cocoapods-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cocoapods/cocoapods-docs.service.js b/services/cocoapods/cocoapods-docs.service.js
index ba683be6ab921b31bea83596d4b58a2a40893176..3f942a24ffbbab1d694e422f7dde005ff193afb0 100644
--- a/services/cocoapods/cocoapods-docs.service.js
+++ b/services/cocoapods/cocoapods-docs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/cocoapods/cocoapods-platform.tester.js b/services/cocoapods/cocoapods-platform.tester.js
index 87a407e3d8134a42dfcdddaef85dc3622ee76ba6..c05aa58bb5b0e6167e327b463f31b9fd2b2383a3 100644
--- a/services/cocoapods/cocoapods-platform.tester.js
+++ b/services/cocoapods/cocoapods-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPlatform = Joi.string().regex(
diff --git a/services/codacy/codacy-coverage.service.js b/services/codacy/codacy-coverage.service.js
index 458e2c4cacebea45f7c771577c51d29c023e09eb..3c0b4b082e766caa215ed41215d6e07ffcc06924 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index 193a67a5ce3b8ab8d9a79e767dc402d2f071da05..7f417bd26e771eac5d75c7400f10f109068cdbfe 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseSvgScrapingService } = require('..')
 const { codacyGrade } = require('./codacy-helpers')
 
diff --git a/services/codacy/codacy-helpers.js b/services/codacy/codacy-helpers.js
index 308456981bd40802cf30d3f166902c7f4f934dd4..9c222194c34c9752ad5ef1571e8e4c1f88890760 100644
--- a/services/codacy/codacy-helpers.js
+++ b/services/codacy/codacy-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const codacyGrade = Joi.equal('A', 'B', 'C', 'D', 'E', 'F')
 
diff --git a/services/codeclimate/codeclimate-analysis.service.js b/services/codeclimate/codeclimate-analysis.service.js
index 3080fcc053c256f2e0ec2c7ba9b9e1ec1f1550b2..2de65a67a1be47016d7b27f45194b4d37cc39e48 100644
--- a/services/codeclimate/codeclimate-analysis.service.js
+++ b/services/codeclimate/codeclimate-analysis.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale, letterScore } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js
index 6d2d00a9afb7d7aa0421a27e1aa944a6c5829db7..33ee8fd13156a7f8b3809c327bb59851389292a1 100644
--- a/services/codeclimate/codeclimate-analysis.tester.js
+++ b/services/codeclimate/codeclimate-analysis.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codeclimate/codeclimate-common.js b/services/codeclimate/codeclimate-common.js
index fc5b09fca7e1a28d483477b2c3f68cea17a07f1a..94c441a5ca5e236adc4bbbba345d09b0ee75301d 100644
--- a/services/codeclimate/codeclimate-common.js
+++ b/services/codeclimate/codeclimate-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 
 const keywords = ['codeclimate']
diff --git a/services/codeclimate/codeclimate-coverage.service.js b/services/codeclimate/codeclimate-coverage.service.js
index 174f1242906d00f215752f36619eb290d47df9ed..a58bce7b6db7f524a4f80a3628ba24c1d68f613c 100644
--- a/services/codeclimate/codeclimate-coverage.service.js
+++ b/services/codeclimate/codeclimate-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage, letterScore } = require('../color-formatters')
 const { BaseJsonService, NotFound } = require('..')
 const { keywords, isLetterGrade, fetchRepo } = require('./codeclimate-common')
diff --git a/services/codeclimate/codeclimate-coverage.tester.js b/services/codeclimate/codeclimate-coverage.tester.js
index 16882263c021d27691bda662c88c098b60fc52f2..de7c9acdc9a995fcdcd3e9ef4686b1574509b6e6 100644
--- a/services/codeclimate/codeclimate-coverage.tester.js
+++ b/services/codeclimate/codeclimate-coverage.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js
index 6091d25d144336ba5f2cfa2227965468b95e9129..4a8f8ec890f8c99e1992e58022f966189e64cdd5 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseSvgScrapingService } = require('..')
 const { parseJson } = require('../../core/base-service/json')
diff --git a/services/codefactor/codefactor-grade.service.js b/services/codefactor/codefactor-grade.service.js
index d4d20a6c7825ed71c4dea8aa375b28f6516c6593..613efb13062bbd0c4bdd6e11cc4414a1c737ba4a 100644
--- a/services/codefactor/codefactor-grade.service.js
+++ b/services/codefactor/codefactor-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseSvgScrapingService } = require('..')
 const { isValidGrade, gradeColor } = require('./codefactor-helpers')
 
diff --git a/services/codefactor/codefactor-helpers.js b/services/codefactor/codefactor-helpers.js
index 6b2749eb7688d70a6eb0e92dbfbeb2c96f0103a7..1672c89c96814e3d84118e484a7b3f7790ace1bb 100644
--- a/services/codefactor/codefactor-helpers.js
+++ b/services/codefactor/codefactor-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 // https://support.codefactor.io/i14-glossary
 // https://github.com/badges/shields/issues/4269
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index 3dd4d2442af26c2ce8d9a9b671cff202a6f67559..1cac77ef25c4626421569a1e22701a74a9030c51 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 
diff --git a/services/conda/conda-base.js b/services/conda/conda-base.js
index 0967e1134f9e803d175f3133da1836032786f270..939cee58de9846703a8e802b41a91f523b6b0864 100644
--- a/services/conda/conda-base.js
+++ b/services/conda/conda-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/conda/conda-license.service.js b/services/conda/conda-license.service.js
index 41691f508bed2bea540ed39ac865ffefb91ef57b..d2ecf978701743233ba34d16975bae01f01ca698 100644
--- a/services/conda/conda-license.service.js
+++ b/services/conda/conda-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const toArray = require('../../core/base-service/to-array')
 const BaseCondaService = require('./conda-base')
diff --git a/services/conda/conda-platform.tester.js b/services/conda/conda-platform.tester.js
index be82e86ba17d560e303f07251b63f085e0b430ab..aa06463aaf1161928d172cc476d25460bcae2727 100644
--- a/services/conda/conda-platform.tester.js
+++ b/services/conda/conda-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const isCondaPlatform = Joi.string().regex(/^\w+-[\w\d]+( \| \w+-[\w\d]+)*$/)
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/continuousphp/continuousphp.service.js b/services/continuousphp/continuousphp.service.js
index 212a4ae274c0dc23610c2c94b8af4cdfa2352c65..f080af0a64da919d58d51febd83a6521df9f5352 100644
--- a/services/continuousphp/continuousphp.service.js
+++ b/services/continuousphp/continuousphp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/continuousphp/continuousphp.tester.js b/services/continuousphp/continuousphp.tester.js
index 7f597be6b53c96a4256026bdd1b2955e6128ab5a..6fa7f59fc592a31468ec14177b91cbf0e98d542a 100644
--- a/services/continuousphp/continuousphp.tester.js
+++ b/services/continuousphp/continuousphp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/cookbook/cookbook.service.js b/services/cookbook/cookbook.service.js
index 922b0fbd31fe8ce8d47567953044d85e96a9280e..0e45f12abcada8d1dc36713ada299f04128d7a95 100644
--- a/services/cookbook/cookbook.service.js
+++ b/services/cookbook/cookbook.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index cf5d542401e38d45fa4f8d3aaf829c7d0aa6401b..ee2683652a3c2eb267cceeba9f95bb3ce97b1bb6 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/coverity/coverity-scan.service.js b/services/coverity/coverity-scan.service.js
index 0104704af678302058db4d3879483285f47384d9..1643786e91ea224a9359f5afdd51376f1f744007 100644
--- a/services/coverity/coverity-scan.service.js
+++ b/services/coverity/coverity-scan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const messageRegex = /passed|passed .* new defects|pending|failed/
diff --git a/services/coverity/coverity-scan.tester.js b/services/coverity/coverity-scan.tester.js
index 93247dc1d377c855ae1c68d2777b8965e2af7f9a..e8a997cacde5eb0afcba09dc0506296656a3bc0f 100644
--- a/services/coverity/coverity-scan.tester.js
+++ b/services/coverity/coverity-scan.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('known project id')
diff --git a/services/cpan/cpan.js b/services/cpan/cpan.js
index 39eef52cc0f33d0ddaaf0c4a372dcb0933eee62e..56af7786617a3f07dd5e50775f0ea3463d3f6711 100644
--- a/services/cpan/cpan.js
+++ b/services/cpan/cpan.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cran/cran.service.js b/services/cran/cran.service.js
index 927f29920821f965928a42072a8875b041ee60c3..eb2ba3ce96d123be182959f04eb0a943b8d42d89 100644
--- a/services/cran/cran.service.js
+++ b/services/cran/cran.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index 8efab2b81fc27ac1e4ce02f1814ba6dc16166a5b..855072761c4f62d1ba3783d5542242a7ccff0be1 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/criterion/criterion.service.js b/services/criterion/criterion.service.js
index 457514bfd628ce923d069814e3d7d98fdca8337c..0fd70f95db4104fdcceb787d636faa72c208eea6 100644
--- a/services/criterion/criterion.service.js
+++ b/services/criterion/criterion.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   IMPROVED_STATUS,
diff --git a/services/criterion/criterion.tester.js b/services/criterion/criterion.tester.js
index 0fe0bda2dc631a006c2fbce6badd45220843a6d6..f297d44d2492e5bc5a114aeb6f7d81956a8149b1 100644
--- a/services/criterion/criterion.tester.js
+++ b/services/criterion/criterion.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   IMPROVED_STATUS,
diff --git a/services/ctan/ctan.service.js b/services/ctan/ctan.service.js
index 401a754f170a42224b4c3cd1d0c640cc24dd9fc3..4e8d95c3ee1fc4b9cb90c7ca1e8e2eb991b8db49 100644
--- a/services/ctan/ctan.service.js
+++ b/services/ctan/ctan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
diff --git a/services/david/david.service.js b/services/david/david.service.js
index d78f95d858f90a8ad17289f939a1c1dec8cee1fa..e5b28f2b74c478f7a1e144b5917d1be5f306a082 100644
--- a/services/david/david.service.js
+++ b/services/david/david.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/david/david.tester.js b/services/david/david.tester.js
index 72f50c5057cb0fc5bf568dc140f96aeb526d17c4..21400f45a8aaf8e6dc89992e9e339e431bb76a10 100644
--- a/services/david/david.tester.js
+++ b/services/david/david.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/debian/debian.service.js b/services/debian/debian.service.js
index 5b119ff017f99b851c9fdcc1af32bc8aa6235afa..c113ca13e0d114f924d6120f830e6b5f2f943df0 100644
--- a/services/debian/debian.service.js
+++ b/services/debian/debian.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound, InvalidResponse } = require('..')
 
diff --git a/services/debug/debug.tester.js b/services/debug/debug.tester.js
index 745862ad3f97f427b72eed0ad8a78647828c1e62..2885b9479d1852a352d1a7570f8cceb1e8e0c176 100644
--- a/services/debug/debug.tester.js
+++ b/services/debug/debug.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('start time')
diff --git a/services/dependabot/dependabot.service.js b/services/dependabot/dependabot.service.js
index a0a422d2673e700acae02b96eb5332a3ef9749c2..25b7eb5e2563a134cca7cc85a75a5e4d3bc147b0 100644
--- a/services/dependabot/dependabot.service.js
+++ b/services/dependabot/dependabot.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const url = require('url')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/depfu/depfu.service.js b/services/depfu/depfu.service.js
index 832f3cb0330c87660e549315c4392fcf9eda84bf..8be46d36a41eadec1c876888351101aeac39059f 100644
--- a/services/depfu/depfu.service.js
+++ b/services/depfu/depfu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const depfuSchema = Joi.object({
diff --git a/services/depfu/depfu.tester.js b/services/depfu/depfu.tester.js
index d8fea928d4037e5d389fef2137cc543464509fe5..957704f3c47cbe4072e801402d068bbdea2efe35 100644
--- a/services/depfu/depfu.tester.js
+++ b/services/depfu/depfu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js
index b3edfa88bdc7ec2ef8419b6f73381583e1e57855..ca58be83d92992e0f3c898090b0e7631ed031cc9 100644
--- a/services/discord/discord.service.js
+++ b/services/discord/discord.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/discord/discord.tester.js b/services/discord/discord.tester.js
index 1d4c660d58d569f3f1eed8476480550ec8e6db41..694775133a684d9c1c7b47b87691297fa76575ad 100644
--- a/services/discord/discord.tester.js
+++ b/services/discord/discord.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('gets status for Reactiflux')
diff --git a/services/discourse/discourse.service.js b/services/discourse/discourse.service.js
index 1e899d2c24c8b86e1898e3bbf4f461c25154cf3f..7037fca298b97233dd24ccf76e7dc01ba022e08c 100644
--- a/services/discourse/discourse.service.js
+++ b/services/discourse/discourse.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const camelcase = require('camelcase')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger, optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/discourse/discourse.tester.js b/services/discourse/discourse.tester.js
index b357ddb2861ed71f3e47652ae41dbddf940946f8..a074fe85e8dab807fa4679d2a2425e8eab09d145 100644
--- a/services/discourse/discourse.tester.js
+++ b/services/discourse/discourse.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 
 const t = (module.exports = new ServiceTester({
diff --git a/services/docker/docker-automated.service.js b/services/docker/docker-automated.service.js
index 48a9057c8c5da11b422a1c5db04994fe827edfba..c48a57d63a730624eb6734c5161b669c13d9c258 100644
--- a/services/docker/docker-automated.service.js
+++ b/services/docker/docker-automated.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   dockerBlue,
diff --git a/services/docker/docker-automated.tester.js b/services/docker/docker-automated.tester.js
index f98d2144282d86be26f004df6d6cf51b2bf45d23..4cc144d7ceb9ac87ad9d3a237e35d8facf743663 100644
--- a/services/docker/docker-automated.tester.js
+++ b/services/docker/docker-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-build.service.js b/services/docker/docker-build.service.js
index 2c228072f3a595e1f5c628932383e919b015c0f0..39d73d014308af898e2855c77ef1f07889d73e18 100644
--- a/services/docker/docker-build.service.js
+++ b/services/docker/docker-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { anyInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 const {
diff --git a/services/docker/docker-cloud-automated.tester.js b/services/docker/docker-cloud-automated.tester.js
index e3827f21b51c496096bbd78e7128a7bf2c716492..22d508dcc3be25ee681d6f82ab4dbc9848ddee10 100644
--- a/services/docker/docker-cloud-automated.tester.js
+++ b/services/docker/docker-cloud-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-cloud-common-fetch.js b/services/docker/docker-cloud-common-fetch.js
index 2f10c52eebf1aaa406846d5e3eff497751d98a73..8ac3db1fa4f69ab30c8d7398d893fbb061b89169 100644
--- a/services/docker/docker-cloud-common-fetch.js
+++ b/services/docker/docker-cloud-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const cloudBuildSchema = Joi.object({
   objects: Joi.array()
diff --git a/services/docker/docker-pulls.service.js b/services/docker/docker-pulls.service.js
index e05c5064dbeaf457b6309fda524e6c71dd5df043..5749215cac8ca113151cd5322e171ff6b3b193ee 100644
--- a/services/docker/docker-pulls.service.js
+++ b/services/docker/docker-pulls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/docker/docker-size.service.js b/services/docker/docker-size.service.js
index d99c62dc01ba789e3d80fbf3cf8720e58f116823..14ed46232fc10ceab39afbf25d7559f3b9ea302c 100644
--- a/services/docker/docker-size.service.js
+++ b/services/docker/docker-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { latest } = require('../version')
diff --git a/services/docker/docker-version.service.js b/services/docker/docker-version.service.js
index 6443a6e426cbcdaf6bde51fb6553ca85f594321e..0df6ba47ec06ebb29e5dc36a7b2d6cd5e0220863 100644
--- a/services/docker/docker-version.service.js
+++ b/services/docker/docker-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound, InvalidResponse } = require('..')
diff --git a/services/drone/drone-build.service.js b/services/drone/drone-build.service.js
index 4d52f6549a8576f98f27162b6850c04c43f343d7..13aaa0721d5d655aa4e5cc20a54838766e4beb76 100644
--- a/services/drone/drone-build.service.js
+++ b/services/drone/drone-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/drone/drone-build.tester.js b/services/drone/drone-build.tester.js
index d00f477c280e6972eb18fac47ed536af8f340749..59882a0089139e4234865039a73fba8e3e316a42 100644
--- a/services/drone/drone-build.tester.js
+++ b/services/drone/drone-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dub/dub-download.service.js b/services/dub/dub-download.service.js
index 218d6116bd6ef8c9695ff622bfef4f461dd23097..3c050bc5d901bdcd2fd3da52e95ff8043e8e0991 100644
--- a/services/dub/dub-download.service.js
+++ b/services/dub/dub-download.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/dub/dub-download.tester.js b/services/dub/dub-download.tester.js
index c2ce2779f201504271b061f4c1cbc6a35fe78eb5..423c091513206d81afa82d1d1678c512af4dee24 100644
--- a/services/dub/dub-download.tester.js
+++ b/services/dub/dub-download.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dub/dub-license.service.js b/services/dub/dub-license.service.js
index 6574f8f239eca2c94259a816cd4e3c18277252f8..62f99a0cf2823882ff482e1b66b10b6800ac9486 100644
--- a/services/dub/dub-license.service.js
+++ b/services/dub/dub-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { BaseJsonService } = require('..')
 
diff --git a/services/dub/dub-version.service.js b/services/dub/dub-version.service.js
index 83931f4ea5175d0c7ff747f1ecb2a7f6a3a68c76..8aeced3af473913e7d60f0f08e07397b1f624208 100644
--- a/services/dub/dub-version.service.js
+++ b/services/dub/dub-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/dub/dub-version.tester.js b/services/dub/dub-version.tester.js
index 26824bdee41c56c47ecb5cc5d16c087e9d48f215..972c7256e377ce99e316ab40d55c44504c16233c 100644
--- a/services/dub/dub-version.tester.js
+++ b/services/dub/dub-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/dynamic-common.js b/services/dynamic-common.js
index d291e611c9ecf77424199b15479830fa52db8ecc..292c84964e11574aa2eb2ba81acd1044d3266121 100644
--- a/services/dynamic-common.js
+++ b/services/dynamic-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const toArray = require('../core/base-service/to-array')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
diff --git a/services/dynamic/dynamic-helpers.js b/services/dynamic/dynamic-helpers.js
index ceddf69f747dd590f5b76d398ccf39e990c2183d..6921857674490eaa1153794bebe07aced9bd62d8 100644
--- a/services/dynamic/dynamic-helpers.js
+++ b/services/dynamic/dynamic-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js
index 42eed630f046dedef95bd19acc089d7a869b59f6..d36dda48a30e40b59add4997b1c85a7ab6dac7c3 100644
--- a/services/dynamic/dynamic-json.tester.js
+++ b/services/dynamic/dynamic-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dynamic/json-path.js b/services/dynamic/json-path.js
index 2ef0af988a753d78be8e9d848850cd0cfbc0a83a..9797e81673650d063e87601987126bc2ae062b98 100644
--- a/services/dynamic/json-path.js
+++ b/services/dynamic/json-path.js
@@ -4,7 +4,7 @@
 
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const jp = require('jsonpath')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
 const { InvalidParameter, InvalidResponse } = require('..')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
index 44dab4edce52f07b11f3dcbc4d255d74c97a2c20..8ac996c5bae7c1058649eb442d8114e830fca92c 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
index 50643104ac28f717f7ca07024d77b8a1395bc452..fe83995d8b1e292b1f936a17d62d5af5d360b5a0 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
index 79cf1e71cd3c005bccbeb696c88c948ee6de6fd4..4322263077a893ec11196c6b79e20baf232f1bb1 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('favorites count').get('/notepad4e.json').expectBadge({
diff --git a/services/eclipse-marketplace/eclipse-marketplace-license.service.js b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
index 0dd25fa0d6552dc38505f78e2142362e43c2ccca..adf94139b3cdda42b1d502fcbbffb522f5a415e0 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-license.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
 const licenseResponseSchema = Joi.object({
diff --git a/services/eclipse-marketplace/eclipse-marketplace-update.service.js b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
index ca32c4ae734396d0dddc7225ee58d36711707c30..68361338e7c87d81e69900fc54dca63143c0c2d1 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-update.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-version.service.js b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
index 12081dfe6faf4f3192794d2944668bd0a2a4f8b2..9b44d628441f87b3b316b1c667f219ccdacfbc48 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-version.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/ecologi/ecologi-carbon.service.js b/services/ecologi/ecologi-carbon.service.js
index d35e52f1efd2b87e32d92f5035e8493dcac61fa5..b2eb4040e015779058cb896447eb2f6846ec6d18 100644
--- a/services/ecologi/ecologi-carbon.service.js
+++ b/services/ecologi/ecologi-carbon.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/ecologi/ecologi-trees.service.js b/services/ecologi/ecologi-trees.service.js
index e707d5d9bf02cc751b03e7fe9a50bc526b161fc0..d2e0a98f485b6135808c4dd7c5f460fb39b4a783 100644
--- a/services/ecologi/ecologi-trees.service.js
+++ b/services/ecologi/ecologi-trees.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/elm-package/elm-package.service.js b/services/elm-package/elm-package.service.js
index 3dad7d3853e5129b9d186f43aa425f22a1d0fd12..f2f7e45736a3b99105092f21d42d83a931342cc0 100644
--- a/services/elm-package/elm-package.service.js
+++ b/services/elm-package/elm-package.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { semver } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/endpoint-common.js b/services/endpoint-common.js
index 9c7bffb3c6cdfd1c12cb6ddd67f808708b9902e3..6fda5e3e1acd19ceb27f121da26d18a6e7c75d97 100644
--- a/services/endpoint-common.js
+++ b/services/endpoint-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
 
diff --git a/services/endpoint/endpoint.service.js b/services/endpoint/endpoint.service.js
index a6eaf0dbfd5754b13a46354a2fe398ee56ccd30f..0ebab00c2618257c6ba36cacb92993be97be73cf 100644
--- a/services/endpoint/endpoint.service.js
+++ b/services/endpoint/endpoint.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { URL } = require('url')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { errorMessages } = require('../dynamic-common')
 const { optionalUrl } = require('../validators')
 const { fetchEndpointData } = require('../endpoint-common')
diff --git a/services/f-droid/f-droid.service.js b/services/f-droid/f-droid.service.js
index 1e6bdcffa8a9e221e78c9c3c21a97cb2c4053dc7..485edfc2e0895eb14e9f88d7f983460b5b256aba 100644
--- a/services/f-droid/f-droid.service.js
+++ b/services/f-droid/f-droid.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   optionalNonNegativeInteger,
   nonNegativeInteger,
diff --git a/services/fedora/fedora.service.js b/services/fedora/fedora.service.js
index fae32be1c54f9c309cbf35978d1a3910f6a61c97..80e39535411a1a37083d65d6dc547a031289014b 100644
--- a/services/fedora/fedora.service.js
+++ b/services/fedora/fedora.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/flathub/flathub.service.js b/services/flathub/flathub.service.js
index 4b64f4096e9a1ea44e74cb994bb0de629086c6ae..93f97df3138bdfe993e8bbc800c30cce781f9c58 100644
--- a/services/flathub/flathub.service.js
+++ b/services/flathub/flathub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidResponse, NotFound } = require('..')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
diff --git a/services/gem/gem-downloads.service.js b/services/gem/gem-downloads.service.js
index 4fb1e03968f7524d46071ba11d4ab42b07219d60..fd3f10638694aa45773a5ddf2778d0a19ddb2f3c 100644
--- a/services/gem/gem-downloads.service.js
+++ b/services/gem/gem-downloads.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const semver = require('semver')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { latest: latestVersion } = require('../version')
diff --git a/services/gem/gem-owner.service.js b/services/gem/gem-owner.service.js
index 2fceac6f1cb50252260e92b15dac082a424de1d5..1be79b524505cf8e600a91f7ac1a4756c1e85ca1 100644
--- a/services/gem/gem-owner.service.js
+++ b/services/gem/gem-owner.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gem/gem-owner.tester.js b/services/gem/gem-owner.tester.js
index 4513dce24622531a47f7c15860bbf26deea7a2ca..80d1d9286c8d7fbb2caca23af47363ef0269f0aa 100644
--- a/services/gem/gem-owner.tester.js
+++ b/services/gem/gem-owner.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('users (valid)')
diff --git a/services/gem/gem-rank.service.js b/services/gem/gem-rank.service.js
index 464cb4d7e3caa1551bd1a50846f3d71668020cef..1a78371e9212ee0fbeba23e95bb88218133abfa2 100644
--- a/services/gem/gem-rank.service.js
+++ b/services/gem/gem-rank.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount } = require('../color-formatters')
 const { ordinalNumber } = require('../text-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
diff --git a/services/gem/gem-rank.tester.js b/services/gem/gem-rank.tester.js
index e0e80ae86b82f3b72890a81ef26510c44c13a8a4..4cc5d89fcd82170f2ff414f0ca420044ad8b20b3 100644
--- a/services/gem/gem-rank.tester.js
+++ b/services/gem/gem-rank.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isOrdinalNumber = Joi.string().regex(/^[1-9][0-9]+(ᵗʰ|ˢᵗ|ⁿᵈ|ʳᵈ)$/)
diff --git a/services/gem/gem-version.service.js b/services/gem/gem-version.service.js
index 8663288fba96687b99028262134dbbe8dd6e8350..ba8c7bc62a3b18cf5ac3325e90ba9d4f7ff1377f 100644
--- a/services/gem/gem-version.service.js
+++ b/services/gem/gem-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gerrit/gerrit.service.js b/services/gerrit/gerrit.service.js
index 3810270610326bf80a5783f0378c4f7c9b9a64eb..4a3c4df77ed1eebda0f4441037fa15d5e656472f 100644
--- a/services/gerrit/gerrit.service.js
+++ b/services/gerrit/gerrit.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/github/github-all-contributors.service.js b/services/github/github-all-contributors.service.js
index 4176bf71c12cdee2c6242cdfa511e84facce3618..af2dd85b44854deeb9db66070527d04b82e4d80b 100644
--- a/services/github/github-all-contributors.service.js
+++ b/services/github/github-all-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderContributorBadge } = require('../contributor-count')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
 const { fetchJsonFromRepo } = require('./github-common-fetch')
diff --git a/services/github/github-api-provider.js b/services/github/github-api-provider.js
index 632965bddaf01cc60549363f8f07274e115ddf96..ba3075a8f4d6d782b74fe6ae26fb8c6a29646180 100644
--- a/services/github/github-api-provider.js
+++ b/services/github/github-api-provider.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const log = require('../../core/server/log')
 const { TokenPool } = require('../../core/token-pooling/token-pool')
 const { userAgent } = require('../../core/base-service/legacy-request-handler')
diff --git a/services/github/github-commit-activity.service.js b/services/github/github-commit-activity.service.js
index 8dd7011b84c1aa79bf096254d250d5acf70868fd..d9190659c2856239671e32d47b13b330494488d7 100644
--- a/services/github/github-commit-activity.service.js
+++ b/services/github/github-commit-activity.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-commit-activity.tester.js b/services/github/github-commit-activity.tester.js
index 66d6d7cc606b83d752c39561b1fd484a81f335a3..3a401e9bc9547ca9746581ec4c6a64dfe428bfc8 100644
--- a/services/github/github-commit-activity.tester.js
+++ b/services/github/github-commit-activity.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/github/github-commit-status.service.js b/services/github/github-commit-status.service.js
index 9ccfba7baa714c3078ccf1ce8b032a5d80a1b0d4..613d1f90d8621243a7900bdbbf1959a10dbfe991 100644
--- a/services/github/github-commit-status.service.js
+++ b/services/github/github-commit-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound, InvalidParameter } = require('..')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-commits-since.service.js b/services/github/github-commits-since.service.js
index 4ad8fd854038c62599c2c076383cd9dc27a6ef00..bda397e8094939a1932e1eee2967f0805b3e0963 100644
--- a/services/github/github-commits-since.service.js
+++ b/services/github/github-commits-since.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index 7c216b274b082d4df44da6c0c2aca12283ded7a6..0ddd022a5e15b64bad9887ebb4076d4d948507de 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidResponse } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-common-release.js b/services/github/github-common-release.js
index ca958deb52ea4419b043492b6a5d884cec77d559..e599876014f40c9826baf37ccd0edb292cbf7dde 100644
--- a/services/github/github-common-release.js
+++ b/services/github/github-common-release.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest } = require('../version')
 const { NotFound } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-contributors.service.js b/services/github/github-contributors.service.js
index 0c7b66d85cf4bc9a9b44cf10caa547f66a6c7324..0103295624dcc61e5ad66794ecccae54fa91b898 100644
--- a/services/github/github-contributors.service.js
+++ b/services/github/github-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const parseLinkHeader = require('parse-link-header')
 const { renderContributorBadge } = require('../contributor-count')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-deployments.service.js b/services/github/github-deployments.service.js
index c14ea83361a37da17a245fb348684b59966e50c4..098f2d9d140873f329dca7f523bd608973920b2a 100644
--- a/services/github/github-deployments.service.js
+++ b/services/github/github-deployments.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 const { GithubAuthV4Service } = require('./github-auth-service')
 const { documentation, transformErrors } = require('./github-helpers')
diff --git a/services/github/github-deployments.tester.js b/services/github/github-deployments.tester.js
index 309f3acde7d02800236aad1dcaa31a550ec3c282..799141ecb2bbf092eb649275d0d5a4bae98434ee 100644
--- a/services/github/github-deployments.tester.js
+++ b/services/github/github-deployments.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const validMessages = [
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index 94126f7e89800e5be7e697c3bbfc6dbf719f93fa..e2761c0aa6f7072d1cda3c6e9f43c3d49aa45814 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
diff --git a/services/github/github-downloads.tester.js b/services/github/github-downloads.tester.js
index f527d4061755331eadf5f8e440fd4d5c7328a928..30babf3336fac6b4968abb83bd7378812d711967 100644
--- a/services/github/github-downloads.tester.js
+++ b/services/github/github-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-followers.service.js b/services/github/github-followers.service.js
index 6ac160d9d01f319cb5420ded8843e63a201be5be..5489552dc3b9aa19b374e15e5ac9638d24e6323d 100644
--- a/services/github/github-followers.service.js
+++ b/services/github/github-followers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 23e8ec33a0ad1f8263ce0048b6fca1c338c3002a..9f59b9766d87d1b045042d2a0f004bfaeabbcb87 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV4Service } = require('./github-auth-service')
diff --git a/services/github/github-go-mod.service.js b/services/github/github-go-mod.service.js
index b5c82a37b2f14bd2e5d102b6c7be3679cf60faae..2351ec1e23eb4b87a79880d685d370a565b405ec 100644
--- a/services/github/github-go-mod.service.js
+++ b/services/github/github-go-mod.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { InvalidResponse } = require('..')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-hacktoberfest.service.js b/services/github/github-hacktoberfest.service.js
index b0067e1d1ac86cb8aadf3954842d36f534b04b83..7c6ad7eb849e68846dfd294224351835c20e245a 100644
--- a/services/github/github-hacktoberfest.service.js
+++ b/services/github/github-hacktoberfest.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const moment = require('moment')
 const { metric, maybePluralize } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/github/github-hacktoberfest.tester.js b/services/github/github-hacktoberfest.tester.js
index 69138d33edec778a59625bfd6033cad6557e24f7..b11b1526d08806798e976f354651c2a7b6996a17 100644
--- a/services/github/github-hacktoberfest.tester.js
+++ b/services/github/github-hacktoberfest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isHacktoberfestNoIssuesStatus = Joi.string().regex(
diff --git a/services/github/github-issue-detail.service.js b/services/github/github-issue-detail.service.js
index 4c5a6c05fbf85d8a5ff6c7857e6410093f189fdf..8fca29bee68664b546584877a39edeb6f449b800 100644
--- a/services/github/github-issue-detail.service.js
+++ b/services/github/github-issue-detail.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { formatDate, metric } = require('../text-formatters')
 const { age } = require('../color-formatters')
diff --git a/services/github/github-issue-detail.tester.js b/services/github/github-issue-detail.tester.js
index 8b5775d928c0dd5d9eb01a1af878f8858a55085d..0a9de66414ee365918ca664d22a3801613d62daf 100644
--- a/services/github/github-issue-detail.tester.js
+++ b/services/github/github-issue-detail.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isFormattedDate } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js
index 5c949f4135a0d3e56d8b3910b225bc8b80ceaaa6..bc906b4bc668583bda892263cb6d3d4f36ef2a6f 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV4Service } = require('./github-auth-service')
diff --git a/services/github/github-issues.tester.js b/services/github/github-issues.tester.js
index c8e380734fbd9c76f7c57643a2e74b8f409aeec0..29773c0c212832e93c03e03fc047e211a23578b1 100644
--- a/services/github/github-issues.tester.js
+++ b/services/github/github-issues.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric, isMetricOpenIssues } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-labels.service.js b/services/github/github-labels.service.js
index 91f75bb192bcde7720fddb318bc4f5a2dd273c28..1bed157eaa96d3db0d2a8986cb9d769a8bdfc9a7 100644
--- a/services/github/github-labels.service.js
+++ b/services/github/github-labels.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-language-count.tester.js b/services/github/github-language-count.tester.js
index 1f9c7c2a7dd600c8c3042af1231a0572107a36eb..f7277d884baaa221211e1bf90c5d51f78f7b67cf 100644
--- a/services/github/github-language-count.tester.js
+++ b/services/github/github-language-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('language count').get('/badges/shields.json').expectBadge({
diff --git a/services/github/github-languages-base.js b/services/github/github-languages-base.js
index 61c9b4470c05d525211b1cef4aa08241f9ceb71f..aa6dc250a606dea17d254d8072a26d6ad72082a4 100644
--- a/services/github/github-languages-base.js
+++ b/services/github/github-languages-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index 1dead7e8925254503797e83b1ce28ce19e8aeba2..76f92fe72a159b395faa9482391ab731f7034721 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-lerna-json.service.js b/services/github/github-lerna-json.service.js
index 54237f6b583efef6d0b0e93b6a633934facb06f8..9fabd62df00c8e049a3dd1ceeb284da47738d4af 100644
--- a/services/github/github-lerna-json.service.js
+++ b/services/github/github-lerna-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { semver } = require('../validators')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js
index ea5efbd286b289b96c4d4366d711adca91a82fcb..0a628700f2fd0b0851195d85538974466910fb3a 100644
--- a/services/github/github-license.service.js
+++ b/services/github/github-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-manifest.service.js b/services/github/github-manifest.service.js
index 33af19edad4cd9bbb963c78211d607d5a9165b84..248397a730faaa4249b473702c8a1fe0454f5dda 100644
--- a/services/github/github-manifest.service.js
+++ b/services/github/github-manifest.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const {
   individualValueSchema,
diff --git a/services/github/github-manifest.tester.js b/services/github/github-manifest.tester.js
index 34f4236cd0aa5db438a56512854bc544a75bd766..77c1beb32df472e41a6be25fe58ed14bcb19dcb0 100644
--- a/services/github/github-manifest.tester.js
+++ b/services/github/github-manifest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/github/github-milestone-detail.service.js b/services/github/github-milestone-detail.service.js
index 6c6a9cc119e7f8f5bcaffeb7aed91009ae482d0c..1e89e9d6b153f8d0f7d99a3d3309e330fd4fa6b1 100644
--- a/services/github/github-milestone-detail.service.js
+++ b/services/github/github-milestone-detail.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-milestone.service.js b/services/github/github-milestone.service.js
index ff3c9403e29f3797d96a90a5f8324f306607e39e..9c70840b1c13edd362c5dc510c91628e8176a465 100644
--- a/services/github/github-milestone.service.js
+++ b/services/github/github-milestone.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js
index b09cc0d379e5c935f1cf133631cbc0a579bcfe48..20cc13617e918c071271e5e3b9a71f98f65469f9 100644
--- a/services/github/github-package-json.service.js
+++ b/services/github/github-package-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const {
   transformAndValidate,
diff --git a/services/github/github-package-json.tester.js b/services/github/github-package-json.tester.js
index 87e5137c9f13007e967979cb7c8146d4b64001dd..5a15ccd3be1bfc28616fdd6732a846828d717ab8 100644
--- a/services/github/github-package-json.tester.js
+++ b/services/github/github-package-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isSemver } = require('../test-validators')
 const { semverRange } = require('../validators')
diff --git a/services/github/github-pipenv.tester.js b/services/github/github-pipenv.tester.js
index 88019391a8ff5bd0f6668203c1a600822c2d12cb..9161c206258056a304c345fba4c6ced8ca74b44c 100644
--- a/services/github/github-pipenv.tester.js
+++ b/services/github/github-pipenv.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const {
   isVPlusDottedVersionAtLeastOne,
diff --git a/services/github/github-pull-request-check-state.service.js b/services/github/github-pull-request-check-state.service.js
index 9adb59b3bd2429e389faa653c5cd060ca49ca00c..4e0d1c861b685c6c619f11b7593d49e4c3d59888 100644
--- a/services/github/github-pull-request-check-state.service.js
+++ b/services/github/github-pull-request-check-state.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const countBy = require('lodash.countby')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { fetchIssue } = require('./github-common-fetch')
diff --git a/services/github/github-release-date.service.js b/services/github/github-release-date.service.js
index f74485b75375b8c318da6a52fa25cbd68c51b0e2..acca83b2c0e60b2495a5d592045f2db9c62600b1 100644
--- a/services/github/github-release-date.service.js
+++ b/services/github/github-release-date.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { age } = require('../color-formatters')
 const { formatDate } = require('../text-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-release.tester.js b/services/github/github-release.tester.js
index 8996a2b2eaf9fa7ff02f863d02369da1af33468c..6fa28a54853de19c3fde6bc3a0c8e4e2a99bf003 100644
--- a/services/github/github-release.tester.js
+++ b/services/github/github-release.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isSemver } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/github/github-repo-size.service.js b/services/github/github-repo-size.service.js
index a1fa15bf4724a5ea6a3b72610560db12de811687..f581076bf307a4a69d0dda94f12b828318c9d2a2 100644
--- a/services/github/github-repo-size.service.js
+++ b/services/github/github-repo-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index 4393feff170c43d9c524a130eaf5fb8402e1fe78..12b6a89e83347d7a8bca87db3ecc939aab4a626a 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-size.service.js b/services/github/github-size.service.js
index 76a6b59705462cae694299d380a144cd9285680d..ecfb0326bd27f89da12ff0bbda0782f107346571 100644
--- a/services/github/github-size.service.js
+++ b/services/github/github-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { NotFound } = require('..')
diff --git a/services/github/github-stars.service.js b/services/github/github-stars.service.js
index 873e438744e9d9b1c3e8292c3e4c4ee902a94dd6..d6492603b33ba8cb593ce7ecf09a8988942498f0 100644
--- a/services/github/github-stars.service.js
+++ b/services/github/github-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-tag.service.js b/services/github/github-tag.service.js
index ebad4f1f78d4cf25436820de0e356d3e9af50988..3d6c655baa8ea9afdb084d7a54418ac8dccea674 100644
--- a/services/github/github-tag.service.js
+++ b/services/github/github-tag.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
 const { latest } = require('../version')
diff --git a/services/github/github-tag.tester.js b/services/github/github-tag.tester.js
index 1bbff0eaf0b73ff18f9b0b56016137be20511ce6..030eb3283e27c9886ab73b653d0d91c4480830e8 100644
--- a/services/github/github-tag.tester.js
+++ b/services/github/github-tag.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isSemver } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/github/github-top-language.tester.js b/services/github/github-top-language.tester.js
index f6d5c805db1c243f1fe5d48e7eb63541efed69c1..348d0dbf2c5d5d00cc8cdb04d0ba26819e644094 100644
--- a/services/github/github-top-language.tester.js
+++ b/services/github/github-top-language.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('top language')
diff --git a/services/github/github-total-star.service.js b/services/github/github-total-star.service.js
index 6a0659a88abebb829084aece1ba01429ce704422..705f5123545e5a80f451c4726d55fed90bab5227 100644
--- a/services/github/github-total-star.service.js
+++ b/services/github/github-total-star.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const gql = require('graphql-tag')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
diff --git a/services/github/github-watchers.service.js b/services/github/github-watchers.service.js
index 813f62e22679950769c19a4885cb1d20d574d36b..a3348c06a98886fc5029017124f269339cc7a83d 100644
--- a/services/github/github-watchers.service.js
+++ b/services/github/github-watchers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-watchers.tester.js b/services/github/github-watchers.tester.js
index 0713b5013388645210422975f7826381186ab599..9409eadf3cbd75b039d614d16e3990ecdbc3622c 100644
--- a/services/github/github-watchers.tester.js
+++ b/services/github/github-watchers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Watchers')
diff --git a/services/github/github-workflow-status.service.js b/services/github/github-workflow-status.service.js
index 0caf2e8b4f505d09a2438b480b4061bcfcce1134..b0e35f0c5d4004f3267755d3d8215653ee64d1f2 100644
--- a/services/github/github-workflow-status.service.js
+++ b/services/github/github-workflow-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 const { documentation } = require('./github-helpers')
diff --git a/services/github/github-workflow-status.tester.js b/services/github/github-workflow-status.tester.js
index 920135b101eb72cd9dc0f8a973efd640c096ecba..380823e4b59f95fcf5dd1b5fe60225232cf2bea7 100644
--- a/services/github/github-workflow-status.tester.js
+++ b/services/github/github-workflow-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/gitlab/gitlab-coverage.service.js b/services/gitlab/gitlab-coverage.service.js
index bed38d151c17aa3468c9fde151d76258fd43fa00..60122a26f48031f65952004a7c5ac79be64234ef 100644
--- a/services/gitlab/gitlab-coverage.service.js
+++ b/services/gitlab/gitlab-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 const { BaseSvgScrapingService, NotFound } = require('..')
diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js
index 4e179e6c7314b766b9662607c6ac8c59b127fd66..084b1a9fbe87c3e0e09add5ad43e44ad75f064e0 100644
--- a/services/gitlab/gitlab-pipeline-status.service.js
+++ b/services/gitlab/gitlab-pipeline-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
 const { BaseSvgScrapingService, NotFound, redirector } = require('..')
diff --git a/services/hackage/hackage-deps.tester.js b/services/hackage/hackage-deps.tester.js
index 3b60d7c6eac9fb4f9cc2a49cf884a9c8fe768ae8..caab395b12f29b8234cf4cb1d0dc17400ef996d1 100644
--- a/services/hackage/hackage-deps.tester.js
+++ b/services/hackage/hackage-deps.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('hackage deps (valid)')
diff --git a/services/hexpm/hexpm.service.js b/services/hexpm/hexpm.service.js
index e0093012e2eb7cba353bb1483672b3ba4f1b4ed0..a0728e5cd3108141f09862e2b4ba0249429ebc95 100644
--- a/services/hexpm/hexpm.service.js
+++ b/services/hexpm/hexpm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric, addv, maybePluralize } = require('../text-formatters')
 const { downloadCount, version: versionColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/hexpm/hexpm.tester.js b/services/hexpm/hexpm.tester.js
index 8c1f1b4c26562f91f0950640692958840bf0d1b4..e2b7da726d412819c5103e146fb5d80388a7eaea 100644
--- a/services/hexpm/hexpm.tester.js
+++ b/services/hexpm/hexpm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/homebrew/homebrew-cask.service.js b/services/homebrew/homebrew-cask.service.js
index 4ca70f9b419cfb60aaac74e77e10b009874f8ebd..93310bd31ce74e587da00c8497e12bddafc48ed7 100644
--- a/services/homebrew/homebrew-cask.service.js
+++ b/services/homebrew/homebrew-cask.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/homebrew/homebrew.service.js b/services/homebrew/homebrew.service.js
index 2b89c460a2c1488211d9ea64754e0df0579f30df..2a6a5b439097068115cd6f3129ef2c52d6796ea5 100644
--- a/services/homebrew/homebrew.service.js
+++ b/services/homebrew/homebrew.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/hsts/hsts.service.js b/services/hsts/hsts.service.js
index 7e636fde88b1516a57d102b1d530b45806a9c241..9361eb7e675315469e7f0957a1b2fe63604d938b 100644
--- a/services/hsts/hsts.service.js
+++ b/services/hsts/hsts.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const label = 'hsts preloaded'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const schema = Joi.object({
   status: Joi.string().required(),
diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js
index 975f65b88d3a58766da8b4aedef769dcaa2abc61..2f82a9580fa7b786eca6b7f288baed946932767d 100644
--- a/services/itunes/itunes.service.js
+++ b/services/itunes/itunes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index ea2c1caf6dc7e25f737363aaad26de03d3f61070..b0051963addc899a1b4b7479ae90e9e563671c70 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-build.tester.js b/services/jenkins/jenkins-build.tester.js
index 7de9c6cdb15119f263764d984edb2bd4f4ee65fc..440e309c272616add842857727752b22f6b50906 100644
--- a/services/jenkins/jenkins-build.tester.js
+++ b/services/jenkins/jenkins-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/jenkins/jenkins-common.js b/services/jenkins/jenkins-common.js
index c555abd746b9265ed3c995988b7ea741b0fc07f7..5656bdb12e2f8a2150dcfbb1795929f2609b45eb 100644
--- a/services/jenkins/jenkins-common.js
+++ b/services/jenkins/jenkins-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index d31b215655bd3f7a258ae54d732289e7e3c28ffb..4e174ad82d61db2af1de06e6eabd850492b49550 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-plugin-installs.service.js b/services/jenkins/jenkins-plugin-installs.service.js
index 9141119c26b2e07b9db7961172f568357314c962..1c9620109a50cd617327b85b4e2b067c49d71bbc 100644
--- a/services/jenkins/jenkins-plugin-installs.service.js
+++ b/services/jenkins/jenkins-plugin-installs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jenkins/jenkins-plugin-version.tester.js b/services/jenkins/jenkins-plugin-version.tester.js
index 2681a9eb0eedfcea02f57abd5b3f14603236bacf..9a64bcbae05c17768778ff8a481f717c1a62ab0b 100644
--- a/services/jenkins/jenkins-plugin-version.tester.js
+++ b/services/jenkins/jenkins-plugin-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 
 const t = new ServiceTester({
diff --git a/services/jenkins/jenkins-tests.service.js b/services/jenkins/jenkins-tests.service.js
index 3148ca94ef585577110d2fc39bd5b860f1d501f6..a438609dc1175a76a0437b64eef3db111e5432e7 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   documentation,
   testResultQueryParamSchema,
diff --git a/services/jetbrains/jetbrains-downloads.service.js b/services/jetbrains/jetbrains-downloads.service.js
index b9b95ab923844dca62a6101c928c4181e4b3a7df..3a5019072c0b811074242dc1effebbac7552e66a 100644
--- a/services/jetbrains/jetbrains-downloads.service.js
+++ b/services/jetbrains/jetbrains-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jetbrains/jetbrains-rating.service.js b/services/jetbrains/jetbrains-rating.service.js
index 244e644657036b2d244ca272bc85684b35370dad..e90fbcfcd517ff639b7a79561c01e4127e324ff0 100644
--- a/services/jetbrains/jetbrains-rating.service.js
+++ b/services/jetbrains/jetbrains-rating.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const JetbrainsBase = require('./jetbrains-base')
diff --git a/services/jetbrains/jetbrains-version.service.js b/services/jetbrains/jetbrains-version.service.js
index 4a6f699525dbae9b37642eeb6e6def3f54163b44..fa081664a82b9c40d3608383317f441a75a6ee4c 100644
--- a/services/jetbrains/jetbrains-version.service.js
+++ b/services/jetbrains/jetbrains-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const JetbrainsBase = require('./jetbrains-base')
 
diff --git a/services/jira/jira-issue.service.js b/services/jira/jira-issue.service.js
index c79bbbbca98d854c6400ca7bf66526bd9018e8e4..3d54657f5499dd42f468d9fc369cc7dfa2ba3a4d 100644
--- a/services/jira/jira-issue.service.js
+++ b/services/jira/jira-issue.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 const { authConfig } = require('./jira-common')
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index b1ed4d241b4f0a7ed355afe441ac99201a629ede..3180d42acb04efc1fd8e2211a4d415de83891f1d 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 const { authConfig } = require('./jira-common')
diff --git a/services/jitpack/jitpack-version.service.js b/services/jitpack/jitpack-version.service.js
index f13598678e4e808ad94e97e4e9e2af3d1f396ce4..3e5fdd2886fc58efe2e74e34bd590d2793189b41 100644
--- a/services/jitpack/jitpack-version.service.js
+++ b/services/jitpack/jitpack-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/jitpack/jitpack-version.tester.js b/services/jitpack/jitpack-version.tester.js
index 1debcd801b1b4ce32c58275caed973b79033f3ac..695a32d76e52f89600abf4b3e8f36fd76704dc2b 100644
--- a/services/jitpack/jitpack-version.tester.js
+++ b/services/jitpack/jitpack-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 // Github allows versions with chars, etc.
diff --git a/services/jsdelivr/jsdelivr-base.js b/services/jsdelivr/jsdelivr-base.js
index c8a78069acab5e156fa5c136a2911d05a1e7f977..f40bac5b11436b8df0b337b4a202cee602d5f9a7 100644
--- a/services/jsdelivr/jsdelivr-base.js
+++ b/services/jsdelivr/jsdelivr-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/jsdelivr/jsdelivr-hits-github.tester.js b/services/jsdelivr/jsdelivr-hits-github.tester.js
index 18446a77d315510beeb1f3b1d27f161597d65e1e..ea9a330a2084524b96b8afdf95cfa30fda4e6e3b 100644
--- a/services/jsdelivr/jsdelivr-hits-github.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-github.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/jsdelivr/jsdelivr-hits-npm.tester.js b/services/jsdelivr/jsdelivr-hits-npm.tester.js
index 3d9f1f961cd79f394c7e07b232b672376ed58673..18d53af0ef7d51b4047980d9c7c62f9b2a40a7fa 100644
--- a/services/jsdelivr/jsdelivr-hits-npm.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-npm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/keybase/keybase-btc.service.js b/services/keybase/keybase-btc.service.js
index 6193a2b77d77e2d161f166e113cc782486371df6..c463b208b0b6786eae4033dfd5efe79d042d0c86 100644
--- a/services/keybase/keybase-btc.service.js
+++ b/services/keybase/keybase-btc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.service.js b/services/keybase/keybase-pgp.service.js
index e884f066c308c178a5a064cf03057ec8012b4579..0f73aa229bee28b566eaa4fcd129582e0a88cb7f 100644
--- a/services/keybase/keybase-pgp.service.js
+++ b/services/keybase/keybase-pgp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.tester.js b/services/keybase/keybase-pgp.tester.js
index 070aa09dd2c7d22c819d1858bdccaf4c97f2d9b8..db05abe97be41f3fe61e41bf2415e95af0438998 100644
--- a/services/keybase/keybase-pgp.tester.js
+++ b/services/keybase/keybase-pgp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('existing key fingerprint')
diff --git a/services/keybase/keybase-xlm.service.js b/services/keybase/keybase-xlm.service.js
index 4e0418c658fb8007abe329e92140f34819e40189..e5b0f2ee9be354113c36586391a857338cea33e5 100644
--- a/services/keybase/keybase-xlm.service.js
+++ b/services/keybase/keybase-xlm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-zec.service.js b/services/keybase/keybase-zec.service.js
index 42f31a7857a3165830f523a8404b0d55412cefd6..b22b6ffab7580e24c4b482f48668259575f399ef 100644
--- a/services/keybase/keybase-zec.service.js
+++ b/services/keybase/keybase-zec.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/lgtm/lgtm-alerts.tester.js b/services/lgtm/lgtm-alerts.tester.js
index f312e228e79dbf20b13eefa9b2f5a01d2d673138..b8e86a13efb278c86a403d7d23c53f69f3261d36 100644
--- a/services/lgtm/lgtm-alerts.tester.js
+++ b/services/lgtm/lgtm-alerts.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { data } = require('./lgtm-test-helpers')
 
diff --git a/services/lgtm/lgtm-base.js b/services/lgtm/lgtm-base.js
index 916675d77aa25e802f772211976d60e3726a9388..f85de912b38ba74b5c5c2f8b4a1d0a1ba26831bc 100644
--- a/services/lgtm/lgtm-base.js
+++ b/services/lgtm/lgtm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/lgtm/lgtm-grade.tester.js b/services/lgtm/lgtm-grade.tester.js
index 85b053fe35d0c2e9fe58d4df7d3006179a84bc53..a9d9971f509ece97a3ecf4611db185cf63950db9 100644
--- a/services/lgtm/lgtm-grade.tester.js
+++ b/services/lgtm/lgtm-grade.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { data } = require('./lgtm-test-helpers')
 
diff --git a/services/liberapay/liberapay-base.js b/services/liberapay/liberapay-base.js
index 990818837e05c65ca1b153a105ca3af129250754..15e3e962874d0b1cdc8b3b5a6fe4874ce9145164 100644
--- a/services/liberapay/liberapay-base.js
+++ b/services/liberapay/liberapay-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js
index 59b56e346c40f0591cd09fbf829029237c159b15..7421be27f05368081f342b5864c6011f8080153b 100644
--- a/services/librariesio/librariesio-common.js
+++ b/services/librariesio/librariesio-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger, anyInteger } = require('../validators')
 
 // API doc: https://libraries.io/api#project
diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js
index 22f37d7853b6826db41b229ce95cce0a418d889c..2b30e4453c05b8fd38259fc6583b0046f3d25f51 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   transform,
diff --git a/services/localizely/localizely.service.js b/services/localizely/localizely.service.js
index d73d955155763536f7d13d143b7b588958ab5670..d29d50d658125226533f69d73b2cc6220e76223e 100644
--- a/services/localizely/localizely.service.js
+++ b/services/localizely/localizely.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, InvalidResponse } = require('..')
 const { coveragePercentage } = require('../color-formatters')
 
diff --git a/services/luarocks/luarocks.service.js b/services/luarocks/luarocks.service.js
index 6eef71d501a171ef41f3c856412f3492cc73d288..4ce526f27f2e42169d8c02f66ad29c74c3432476 100644
--- a/services/luarocks/luarocks.service.js
+++ b/services/luarocks/luarocks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { addv } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
 const { latestVersion } = require('./luarocks-version-helpers')
diff --git a/services/luarocks/luarocks.tester.js b/services/luarocks/luarocks.tester.js
index f2f95d016f2e83a1794935b3a57e72335e4a6956..0e60caf89637732881af2ac25c196426f6542f45 100644
--- a/services/luarocks/luarocks.tester.js
+++ b/services/luarocks/luarocks.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isLuaVersion = Joi.string()
diff --git a/services/mastodon/mastodon-follow.service.js b/services/mastodon/mastodon-follow.service.js
index d6842dec05648ba9f5c505917bd2af690cc73e6d..9e0881b5adfd766201077de9eb5f10b5d3fb5fdb 100644
--- a/services/mastodon/mastodon-follow.service.js
+++ b/services/mastodon/mastodon-follow.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { optionalUrl, nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/matrix/matrix.service.js b/services/matrix/matrix.service.js
index a5eacfa401e321c16aec0de1fd1e8c7fd42a08da..55239edfa379fbfda9c08ebf01a33c8ef3a1eecc 100644
--- a/services/matrix/matrix.service.js
+++ b/services/matrix/matrix.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/matrix/matrix.tester.js b/services/matrix/matrix.tester.js
index b42a55c9f9730f64f73bb905b2fd197e858086d7..564df75ad80b799e75c44b82892b0c6964cdccb1 100644
--- a/services/matrix/matrix.tester.js
+++ b/services/matrix/matrix.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('get room state as guest')
diff --git a/services/maven-central/maven-central.service.js b/services/maven-central/maven-central.service.js
index a38208d8d2e94ca1f27f201c8d04865811f9001a..dfa9c1d251a25ca87718e256cbcc75650d2be3e5 100644
--- a/services/maven-central/maven-central.service.js
+++ b/services/maven-central/maven-central.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseXmlService, NotFound } = require('..')
 
diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js
index 07af90e3b9e09b73a0257c22d905eec91e288bd7..5ad0d5856e28c11c9be359e9c7038e2ba93fc126 100644
--- a/services/maven-metadata/maven-metadata.service.js
+++ b/services/maven-metadata/maven-metadata.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { renderVersionBadge } = require('../version')
 const { BaseXmlService } = require('..')
diff --git a/services/microbadger/microbadger-base.js b/services/microbadger/microbadger-base.js
index 17362ad391993bf2bc8b23ec3cf9225b49bffe76..81b98f4b9f8cdf8da8e4dc7e39e565500f843ec8 100644
--- a/services/microbadger/microbadger-base.js
+++ b/services/microbadger/microbadger-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/mozilla-observatory/mozilla-observatory.service.js b/services/mozilla-observatory/mozilla-observatory.service.js
index bc7a808b97ffb93357e1b01c5b02987138ca0e09..30e9ce43cb8c51f05f3f6a583500f504d2262fa2 100644
--- a/services/mozilla-observatory/mozilla-observatory.service.js
+++ b/services/mozilla-observatory/mozilla-observatory.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/mozilla-observatory/mozilla-observatory.tester.js b/services/mozilla-observatory/mozilla-observatory.tester.js
index d9e6febbd0a438e474f840d566bc0700851562c7..a169bac2fc7dbddcd75450273c80a4ab3b87df41 100644
--- a/services/mozilla-observatory/mozilla-observatory.tester.js
+++ b/services/mozilla-observatory/mozilla-observatory.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isMessage = Joi.alternatives()
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 54b09e94106c7fd19c951043e1d92c7ce9e1bb62..349f81e08133b850827bdc0967a46026aa911c5c 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { version: versionColor } = require('../color-formatters')
 const { addv } = require('../text-formatters')
 const { optionalUrl } = require('../validators')
diff --git a/services/nodeping/nodeping-status.service.js b/services/nodeping/nodeping-status.service.js
index adac759a1633d43e55927909358b386856a0794c..d16b9e6a1748d6db164245c0485e322298fa3bdc 100644
--- a/services/nodeping/nodeping-status.service.js
+++ b/services/nodeping/nodeping-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   queryParamSchema,
   exampleQueryParams,
diff --git a/services/nodeping/nodeping-status.tester.js b/services/nodeping/nodeping-status.tester.js
index 464e4e70a87c008d881579f4d4bba3f18e6c6f7b..10fb23fb9db30f809c968081cc2a08a9d149168c 100644
--- a/services/nodeping/nodeping-status.tester.js
+++ b/services/nodeping/nodeping-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('NodePing status')
diff --git a/services/nodeping/nodeping-uptime.service.js b/services/nodeping/nodeping-uptime.service.js
index 4c22abbeeac51cc19e661a4e66934cb40b102715..9ce4084a62c434d7394ce465f06a9c9d7596ef8d 100644
--- a/services/nodeping/nodeping-uptime.service.js
+++ b/services/nodeping/nodeping-uptime.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/npm/npm-base.js b/services/npm/npm-base.js
index c16a9c19f9a11f9cb8d7df0708b32c5336322868..ba93fa470619801d83423bbaa6185c6c5b6dbf04 100644
--- a/services/npm/npm-base.js
+++ b/services/npm/npm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { isDependencyMap } = require('../package-json-helpers')
 const { BaseJsonService, InvalidResponse, NotFound } = require('..')
diff --git a/services/npm/npm-downloads.service.js b/services/npm/npm-downloads.service.js
index 56b693ab58042be88f5d8861fb226e23ea23466d..fa29d86b857cc8b620e5604e0ee0105c91a75962 100644
--- a/services/npm/npm-downloads.service.js
+++ b/services/npm/npm-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/npm/npm-type-definitions.tester.js b/services/npm/npm-type-definitions.tester.js
index f49a5ba0770400aa687c9c805f157d76b2720a86..accd7292cb3886c3d35b5bdd2dd32001daccf0c6 100644
--- a/services/npm/npm-type-definitions.tester.js
+++ b/services/npm/npm-type-definitions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isTypeDefinition = Joi.string().regex(
diff --git a/services/npm/npm-version.service.js b/services/npm/npm-version.service.js
index ae0a5ece1a2277bb447b2d92bc93f6faab8376da..509cb5242ffc7655aa441bab20176e554e29b33a 100644
--- a/services/npm/npm-version.service.js
+++ b/services/npm/npm-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { NotFound } = require('..')
 const NpmBase = require('./npm-base')
diff --git a/services/nuget/nuget-v2-service-family.js b/services/nuget/nuget-v2-service-family.js
index 1223245756ddbba36a8b0f1b951641eaca39e517..582771ddf21a45a8e4a28dd2129e7a09ff1b78ce 100644
--- a/services/nuget/nuget-v2-service-family.js
+++ b/services/nuget/nuget-v2-service-family.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, BaseXmlService, NotFound, redirector } = require('..')
 const {
diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index b0f9781e78b1c6c522724cf4e4abf18af5c9ec15..2ac2577560bbf4703b1916313618244afb9829a8 100644
--- a/services/nuget/nuget-v3-service-family.js
+++ b/services/nuget/nuget-v3-service-family.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { promisify } = require('util')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const semver = require('semver')
 const { regularUpdate } = require('../../core/legacy/regular-update')
 const RouteBuilder = require('../route-builder')
diff --git a/services/nycrc/nycrc.service.js b/services/nycrc/nycrc.service.js
index 25737b331005f7d79fb62e8aa3f0fd69e0217892..016d45f93d2b25118dfbb185c3cf6fe23922c986 100644
--- a/services/nycrc/nycrc.service.js
+++ b/services/nycrc/nycrc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const {
   ConditionalGithubAuthV3Service,
diff --git a/services/opencollective/opencollective-base.js b/services/opencollective/opencollective-base.js
index 55704c5b3923ec0a8d67a8a5346e35028c5c6ab2..ef4c0d7653b1f49eb7bdd41c92c95d9cd284b8b9 100644
--- a/services/opencollective/opencollective-base.js
+++ b/services/opencollective/opencollective-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/opm/opm-version.tester.js b/services/opm/opm-version.tester.js
index d6b1f145c852d079ee0c8a92290a36333f502f95..b6ae397047d20e1e5116c36573df4bf59e937cbe 100644
--- a/services/opm/opm-version.tester.js
+++ b/services/opm/opm-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isValidVersion = Joi.string()
diff --git a/services/package-json-helpers.js b/services/package-json-helpers.js
index 3fe7339de4adda231f6cdee9c1562d8b85429ca3..c41d3ca3fa1fa10a574138404c4ed315c765620f 100644
--- a/services/package-json-helpers.js
+++ b/services/package-json-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidParameter } = require('.')
 
 const isDependencyMap = Joi.object()
diff --git a/services/packagecontrol/packagecontrol.service.js b/services/packagecontrol/packagecontrol.service.js
index 5203d363fb69cb42d189868aaf6a1ec38cc6389d..93cf7bfbfd1fd0bd4d8b332968f60a153c04aa99 100644
--- a/services/packagecontrol/packagecontrol.service.js
+++ b/services/packagecontrol/packagecontrol.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js
index 4ae21b6b267b31489df4990d8bb2584bc36a1d9b..39e645be688d6235654ab894faec65a7edcd2b3d 100644
--- a/services/packagist/packagist-base.js
+++ b/services/packagist/packagist-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const packageSchema = Joi.object()
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index 7f1090b00e146c29b8e0d9dec7f0978fc4c8a720..6b8fc0836a1f718e105f7513e26371dc5a622c86 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index 11848447361c1b647c524d8babda6665884ec573..7545b225832598ba051a897a56eb8ffd6bd6737a 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { optionalUrl } = require('../validators')
 const { NotFound } = require('..')
diff --git a/services/packagist/packagist-php-version.service.js b/services/packagist/packagist-php-version.service.js
index 96ff0d1c1de1d3eb619fc6d6db1c6a38d0e01251..9ab935ff1a7664ad51c7e5ce4a18c680f8d64dae 100644
--- a/services/packagist/packagist-php-version.service.js
+++ b/services/packagist/packagist-php-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { NotFound } = require('..')
 const {
diff --git a/services/packagist/packagist-stars.service.js b/services/packagist/packagist-stars.service.js
index 08d7aebb1558a0585f70ce13e635e64d2f1ff8e2..6487a714d55f9f9f707e0eee4b3dd38da6c1e4b8 100644
--- a/services/packagist/packagist-stars.service.js
+++ b/services/packagist/packagist-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index c22055f67e7f123bf7e3f2e357ee4bd90223df29..87039f6c31d5b62678545be60640ebff062b36de 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { compare, isStable, latest } = require('../php-version')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-version.tester.js b/services/packagist/packagist-version.tester.js
index cb7115fa3a33a645428e6d45a66f3bb064fdb41e..aa85b5f087833ee3068e1e559e0d1fde20f508ed 100644
--- a/services/packagist/packagist-version.tester.js
+++ b/services/packagist/packagist-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/pipenv-helpers.js b/services/pipenv-helpers.js
index c77b7babf2e7a30318c1d087be99bfbf9fd6960e..4f31f2eaedef75825794d1b0de534b4c9e40da1e 100644
--- a/services/pipenv-helpers.js
+++ b/services/pipenv-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidParameter } = require('.')
 
 const isDependency = Joi.alternatives(
diff --git a/services/pkgreview/package-rating.service.js b/services/pkgreview/package-rating.service.js
index bcffe3f85ee7f574f2397fffed48aaaf09a6bfac..8650890516a68210f6f4bd80a5ee2272fcf6d566 100644
--- a/services/pkgreview/package-rating.service.js
+++ b/services/pkgreview/package-rating.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating, metric } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/poeditor/poeditor.service.js b/services/poeditor/poeditor.service.js
index a0bcb72ee1a18263b84d47a282827641125dd30b..7d571cb30b8f95e4b5947af16c02dcf82c57f177 100644
--- a/services/poeditor/poeditor.service.js
+++ b/services/poeditor/poeditor.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
diff --git a/services/powershellgallery/powershellgallery.tester.js b/services/powershellgallery/powershellgallery.tester.js
index 684c465c80bd3d086bd399d82f00f732af3d1a66..d9999b919a23a8b3fa62b4e02389e3bb7a79f2e2 100644
--- a/services/powershellgallery/powershellgallery.tester.js
+++ b/services/powershellgallery/powershellgallery.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const {
   isMetric,
diff --git a/services/pub/pub.service.js b/services/pub/pub.service.js
index 3420b548a90462c71b0797c05b5d907830d5e55d..ddb1592acf6580151ba0193f6f2deaa8cca6ca15 100644
--- a/services/pub/pub.service.js
+++ b/services/pub/pub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, redirector } = require('..')
 
diff --git a/services/puppetforge/puppetforge-base.js b/services/puppetforge/puppetforge-base.js
index e3abd555f5f96fb20fec4b565313ee650cff2dd5..4e209ca91821f2c1fa03a3ea67fe4cdcfd1f1203 100644
--- a/services/puppetforge/puppetforge-base.js
+++ b/services/puppetforge/puppetforge-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger, semver } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/pypi/pypi-base.js b/services/pypi/pypi-base.js
index faab58bae3a9de8cbe5f6e6a546ab199d20ff2d8..8ca4d87f770756a89867611f162d32cf43669d92 100644
--- a/services/pypi/pypi-base.js
+++ b/services/pypi/pypi-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/pypi/pypi-django-versions.tester.js b/services/pypi/pypi-django-versions.tester.js
index 21d60d38b1a785c94918bec035a2a9e1a344a824..ce0ac70e32d0f65904cfe7fbf3d854b5392ae015 100644
--- a/services/pypi/pypi-django-versions.tester.js
+++ b/services/pypi/pypi-django-versions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPipeSeparatedDjangoVersions = Joi.string().regex(
diff --git a/services/pypi/pypi-downloads.service.js b/services/pypi/pypi-downloads.service.js
index c592bca47c6f768f0b62f9b1a735046b92cdc22b..a7911d3bdafbc70c69b03f49f6cd046abb9e79fe 100644
--- a/services/pypi/pypi-downloads.service.js
+++ b/services/pypi/pypi-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/pypi/pypi-python-versions.tester.js b/services/pypi/pypi-python-versions.tester.js
index 25552ab4f2306a481b373cdeebe683682c717971..1c5360321a9220e377f8301a56e8a5390aa56e5c 100644
--- a/services/pypi/pypi-python-versions.tester.js
+++ b/services/pypi/pypi-python-versions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPipeSeparatedPythonVersions = Joi.string().regex(
diff --git a/services/pypi/pypi-version.tester.js b/services/pypi/pypi-version.tester.js
index bbc2da7ef4e2199eec38bfd0814da2320854bbc4..65f881456e841c5da7e00385f671815acba970e9 100644
--- a/services/pypi/pypi-version.tester.js
+++ b/services/pypi/pypi-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { isSemver } = require('../test-validators')
 
diff --git a/services/readthedocs/readthedocs.service.js b/services/readthedocs/readthedocs.service.js
index 18ae244e6432bb02bd2b0b31f3634d750e6b70f3..a9537f108f230705c9dd1299ff57102efba9ac6d 100644
--- a/services/readthedocs/readthedocs.service.js
+++ b/services/readthedocs/readthedocs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 
diff --git a/services/readthedocs/readthedocs.tester.js b/services/readthedocs/readthedocs.tester.js
index eab0e3e4b4a8561e58a6e0670c5cae1a0175e40f..2ed6c8bdb45c437f8c7cf51bd42d1fe8519cd1df 100644
--- a/services/readthedocs/readthedocs.tester.js
+++ b/services/readthedocs/readthedocs.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/reddit/subreddit-subscribers.service.js b/services/reddit/subreddit-subscribers.service.js
index 83a0f6a719d3df2bc7f159df71268ee9dd8c8512..1576feaa84c565f4d04311495752d0f28efbbaac 100644
--- a/services/reddit/subreddit-subscribers.service.js
+++ b/services/reddit/subreddit-subscribers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalNonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/reddit/user-karma.service.js b/services/reddit/user-karma.service.js
index d8e0d0fa7d7e93c9aa7a90f687f4370b554b1232..4537473e25010af59bfeb120e9e41f81c91ae3e3 100644
--- a/services/reddit/user-karma.service.js
+++ b/services/reddit/user-karma.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/redmine/redmine.service.js b/services/redmine/redmine.service.js
index c406dc311e93c2d9cd3b4c56235deacaef8d9cc9..5d78d07b7d6450cabe2cee1f3776ce25bcbdff73 100644
--- a/services/redmine/redmine.service.js
+++ b/services/redmine/redmine.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseXmlService } = require('..')
diff --git a/services/redmine/redmine.tester.js b/services/redmine/redmine.tester.js
index f83d51049c6cb3e1667278f63c0dcf451eea4add..720d8a77e819dbae61446d5f765c401d987cd963 100644
--- a/services/redmine/redmine.tester.js
+++ b/services/redmine/redmine.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isStarRating } = require('../test-validators')
 
diff --git a/services/repology/repology-repositories.service.js b/services/repology/repology-repositories.service.js
index 5a1ceb663355f741a5cfeab766b057699645eec6..4f33a87fc00a34d15d19734d89f6a81f5efc4c2d 100644
--- a/services/repology/repology-repositories.service.js
+++ b/services/repology/repology-repositories.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseSvgScrapingService } = require('..')
diff --git a/services/requires/requires.service.js b/services/requires/requires.service.js
index 64f13c239d5a529eaa14fb22f74d84c8554c1ce5..abdee946d13e9065424882f47897530c801655bd 100644
--- a/services/requires/requires.service.js
+++ b/services/requires/requires.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const statusSchema = Joi.object({
diff --git a/services/requires/requires.tester.js b/services/requires/requires.tester.js
index 46751adc2469678d1ff2429962e9242cc4b9f288..92545be604469e1fce369c22f784ba850f05ce21 100644
--- a/services/requires/requires.tester.js
+++ b/services/requires/requires.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isRequireStatus = Joi.string().regex(
diff --git a/services/scoop/scoop-version.service.js b/services/scoop/scoop-version.service.js
index fed239c639015dd1d7fa43b358eb0ca22b2a5fcb..3fe8249c2bf940cf36e2d38dd74300307c4e73e7 100644
--- a/services/scoop/scoop-version.service.js
+++ b/services/scoop/scoop-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 const {
   ConditionalGithubAuthV3Service,
diff --git a/services/scrutinizer/scrutinizer-build.service.js b/services/scrutinizer/scrutinizer-build.service.js
index 1166fd11248bba9c36c7c90f181ae7e39f3ca5a5..50e04e28323f75122e485084825f9b6af3ecfe36 100644
--- a/services/scrutinizer/scrutinizer-build.service.js
+++ b/services/scrutinizer/scrutinizer-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-build.tester.js b/services/scrutinizer/scrutinizer-build.tester.js
index 7730006c57d9d588d6f14145d2fc660a290281a5..a14498e93933bac7f3fc2c1cb73a837cb11a3fad 100644
--- a/services/scrutinizer/scrutinizer-build.tester.js
+++ b/services/scrutinizer/scrutinizer-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js
index 4ded0fc03fb213eb91dbd1d01e71c9bd1ea8c04c..ccc3cf4314e6bd72a4e1939c41b998da3a9496e5 100644
--- a/services/scrutinizer/scrutinizer-coverage.service.js
+++ b/services/scrutinizer/scrutinizer-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { NotFound } = require('..')
 const ScrutinizerBase = require('./scrutinizer-base')
diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js
index 514351e529af94b2540049f642d41d3e9c4ba30a..5dba4b9334befdbfc4603fde3e6460e58eb26724 100644
--- a/services/scrutinizer/scrutinizer-quality.service.js
+++ b/services/scrutinizer/scrutinizer-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-quality.tester.js b/services/scrutinizer/scrutinizer-quality.tester.js
index 849da9e2bc7d57961f1e495df52b1642da2df6a9..d4e14bd1371373ba78057cd94c019aba33d5610b 100644
--- a/services/scrutinizer/scrutinizer-quality.tester.js
+++ b/services/scrutinizer/scrutinizer-quality.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'ScrutinizerQuality',
diff --git a/services/security-headers/security-headers.service.js b/services/security-headers/security-headers.service.js
index f3776bdf25923b68abfc3f85e3482b9c066eb53a..3216a93cbf2bd9615b79e1b289a5d500f7da8b04 100644
--- a/services/security-headers/security-headers.service.js
+++ b/services/security-headers/security-headers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseService, NotFound } = require('..')
 
diff --git a/services/shippable/shippable.service.js b/services/shippable/shippable.service.js
index f912d03f271eca76799c7e2cfce90e73f46b0f60..ccf7c089f0c174ab059e7b22134d6bbce3235ce2 100644
--- a/services/shippable/shippable.service.js
+++ b/services/shippable/shippable.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, NotFound, redirector } = require('..')
 
diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js
index f6e8e0e889a1887e7635727e9cf9c6e6804be09a..69a493e7e29dc35093425b44d33c3b4c43e281aa 100644
--- a/services/snyk/snyk-vulnerability-base.js
+++ b/services/snyk/snyk-vulnerability-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseSvgScrapingService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/snyk/snyk-vulnerability-github.tester.js b/services/snyk/snyk-vulnerability-github.tester.js
index ab96aa5c56cb8b176be1865183700cdc64219b7a..32326e9d313e5a20b8403e02b0acc80aae70d332 100644
--- a/services/snyk/snyk-vulnerability-github.tester.js
+++ b/services/snyk/snyk-vulnerability-github.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/snyk/snyk-vulnerability-npm.tester.js b/services/snyk/snyk-vulnerability-npm.tester.js
index 3ab9e42c3b7288726fb0955fa1e6ac875325a5b8..859eaacfe82e1532109000342e23883ecdbabc77 100644
--- a/services/snyk/snyk-vulnerability-npm.tester.js
+++ b/services/snyk/snyk-vulnerability-npm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js
index 2f6dd272374e15ab79961d2b14c184bc4b0a2674..18f8a6e2b1cfaf07f7bda8a169a1eb0f4e1629ea 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 const { isLegacyVersion } = require('./sonar-helpers')
 
diff --git a/services/sonar/sonar-helpers.js b/services/sonar/sonar-helpers.js
index 605c92ae828b6645bdde3a52f0e254b3e92d1a7d..e5764304ead5c4c6e15f7035ebf0adf16b3a1f30 100644
--- a/services/sonar/sonar-helpers.js
+++ b/services/sonar/sonar-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 
diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js
index f7c79b1d83ae0b69da58e559a2c5f5fb4dce91a6..518ce9451ba18b433304b9bd00b74043c143557b 100644
--- a/services/sonar/sonar-quality-gate.tester.js
+++ b/services/sonar/sonar-quality-gate.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isQualityGateStatus = Joi.allow('passed', 'failed')
diff --git a/services/sonar/sonar-tests.tester.js b/services/sonar/sonar-tests.tester.js
index 1f5f413272d3998d74a1180c7881bb97fffe0ddd..2b66bd9296f271c6e58ee14e6509a78b80592b17 100644
--- a/services/sonar/sonar-tests.tester.js
+++ b/services/sonar/sonar-tests.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'SonarTests',
diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js
index dc3d7e9e95eda3e1c5c8a97ad11a3fcf4c1d1e50..f5c8095c2e35edb0983d9d3e721163c44170f38e 100644
--- a/services/sonar/sonar-violations.tester.js
+++ b/services/sonar/sonar-violations.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric, withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const isViolationsLongFormMetric = Joi.alternatives(
diff --git a/services/sourceforge/sourceforge-open-tickets.service.js b/services/sourceforge/sourceforge-open-tickets.service.js
index 971ed71d8ef0805d98b099d55c76b24ba9f38767..4011cb29d33aefd311b0ac39e5464ae44e710c67 100644
--- a/services/sourceforge/sourceforge-open-tickets.service.js
+++ b/services/sourceforge/sourceforge-open-tickets.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index 4eebed4b1af8b8853a691f252beed45927d68770..527ab970401f9c714df6749d7be54c8f62764963 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const moment = require('moment')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
diff --git a/services/sourcegraph/sourcegraph.service.js b/services/sourcegraph/sourcegraph.service.js
index 1b54d235a005e8e75fdae5c7c7482139ac1840e3..183207d9a97b12dbf8196bb42984bbea72612072 100644
--- a/services/sourcegraph/sourcegraph.service.js
+++ b/services/sourcegraph/sourcegraph.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const projectsCountRegex = /^\s[0-9]*(\.[0-9]k)?\sprojects$/
diff --git a/services/spack/spack.service.js b/services/spack/spack.service.js
index ed5ad36f1cfe63376c2ed4e98b7d057217300eee..9046e8f26c4cad815ec006cb1081ecd24ac2ca20 100644
--- a/services/spack/spack.service.js
+++ b/services/spack/spack.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 const schema = Joi.object({
diff --git a/services/spiget/spiget-base.js b/services/spiget/spiget-base.js
index ad4302d3d1dd8e842fc0c9ed09c9c55cb3382358..9a434fe40b7d26bfe608444fc52d61901e816833 100644
--- a/services/spiget/spiget-base.js
+++ b/services/spiget/spiget-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const resourceSchema = Joi.object({
diff --git a/services/spiget/spiget-latest-version.service.js b/services/spiget/spiget-latest-version.service.js
index da9717f5763d030318edef6189fed22c6acbbcb7..4cc81404d29d4916bdd09fca57b1a6c45473e410 100644
--- a/services/spiget/spiget-latest-version.service.js
+++ b/services/spiget/spiget-latest-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseSpigetService, documentation, keywords } = require('./spiget-base')
 
diff --git a/services/stackexchange/stackexchange-monthlyquestions.service.js b/services/stackexchange/stackexchange-monthlyquestions.service.js
index c0d92c1de58635b0d198969844d2441a796765d5..00b03eff19821156486aad8d7e3830afbe2ed967 100644
--- a/services/stackexchange/stackexchange-monthlyquestions.service.js
+++ b/services/stackexchange/stackexchange-monthlyquestions.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 const renderQuestionsBadge = require('./stackexchange-helpers')
diff --git a/services/stackexchange/stackexchange-reputation.service.js b/services/stackexchange/stackexchange-reputation.service.js
index 060b1f7577e4635f19a3771daf4faff61e92c3fa..9c2c43f502e5db206f1daadb4e2198ed4e8b7736 100644
--- a/services/stackexchange/stackexchange-reputation.service.js
+++ b/services/stackexchange/stackexchange-reputation.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/stackexchange/stackexchange-taginfo.service.js b/services/stackexchange/stackexchange-taginfo.service.js
index 1bc7f7a1e904f92a88ec2ce1a6650c9f75ea2d99..187d1a5c51860a47f40794e825b3f90e09d88589 100644
--- a/services/stackexchange/stackexchange-taginfo.service.js
+++ b/services/stackexchange/stackexchange-taginfo.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const renderQuestionsBadge = require('./stackexchange-helpers')
 
diff --git a/services/static-badge/query-string-static.service.js b/services/static-badge/query-string-static.service.js
index 185ed358784e3c22a7158e49b81ed6ac2f248e2c..a17eaf915dad16a0d387eed684f113b48e9802d5 100644
--- a/services/static-badge/query-string-static.service.js
+++ b/services/static-badge/query-string-static.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseStaticService } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/static-badge/static-badge.tester.js b/services/static-badge/static-badge.tester.js
index 1d3b4e25c4fc8804227110ee9b2bc2d890e3240f..ccbeccc14f33866ea0e8c7dfcbc30703ec261be3 100644
--- a/services/static-badge/static-badge.tester.js
+++ b/services/static-badge/static-badge.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Shields colorscheme color')
diff --git a/services/steam/steam-workshop.service.js b/services/steam/steam-workshop.service.js
index eb53f0d86a80703b36145a8965a56d448e428df0..c6a0db1736edd5eb2bb1e850a14c400217bee957 100644
--- a/services/steam/steam-workshop.service.js
+++ b/services/steam/steam-workshop.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { metric, formatDate } = require('../text-formatters')
 const { age: ageColor, downloadCount } = require('../color-formatters')
diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js
index 636ae1b80d9fbce46b5cf8efb466178c68e3a589..9c1a655cef27564ca414e0ae6243263c939792d7 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/symfony/symfony-insight-base.js b/services/symfony/symfony-insight-base.js
index 708acd0667f9b3703378a526fcb46353832c4ed3..8b19160a3476b7c16184915dd3c29c85c098707e 100644
--- a/services/symfony/symfony-insight-base.js
+++ b/services/symfony/symfony-insight-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseXmlService, NotFound } = require('..')
 
 const violationSchema = Joi.object({
diff --git a/services/symfony/symfony-insight-grade.tester.js b/services/symfony/symfony-insight-grade.tester.js
index 6b53c2d2a891bb59a4924ec0245b00dfc0f6db16..4c0a741b823bfc8bdb7b3d4dd9f8ffb6ec247464 100644
--- a/services/symfony/symfony-insight-grade.tester.js
+++ b/services/symfony/symfony-insight-grade.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { sampleProjectUuid, noSymfonyToken } = require('./symfony-test-helpers')
 
diff --git a/services/teamcity/teamcity-build.service.js b/services/teamcity/teamcity-build.service.js
index eba17ddd04ba9ddf57b35fbd5474ca892d95e752..991a35339e69a811a02043a8c9c7eabd318066f2 100644
--- a/services/teamcity/teamcity-build.service.js
+++ b/services/teamcity/teamcity-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const TeamCityBase = require('./teamcity-base')
 
diff --git a/services/teamcity/teamcity-build.tester.js b/services/teamcity/teamcity-build.tester.js
index 8ca8f74d5f475e9706c14b1d1a24ba220dc1b9b1..eecebed33225cc359732e9feffb38d164a080456 100644
--- a/services/teamcity/teamcity-build.tester.js
+++ b/services/teamcity/teamcity-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/teamcity/teamcity-coverage.service.js b/services/teamcity/teamcity-coverage.service.js
index 3d088b4a019505f9b39ea7c7f3dbd1e55286f883..dad4779b7fca3972a2de578c0a0291eaed5c50b7 100644
--- a/services/teamcity/teamcity-coverage.service.js
+++ b/services/teamcity/teamcity-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 const { InvalidResponse } = require('..')
diff --git a/services/test-results.js b/services/test-results.js
index eaa139f11d790edb9775d8f68db0690a5f946566..a46841939e65ac4cf0b98289e81261fc1bcb1a99 100644
--- a/services/test-results.js
+++ b/services/test-results.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const testResultQueryParamSchema = Joi.object({
   compact_message: Joi.equal(''),
diff --git a/services/test-validators.js b/services/test-validators.js
index c88aa6c3f7df181b76dfddeb191dc66d3a617605..9a57d79eb575170074ea4f2c99b5f9cc790eee77 100644
--- a/services/test-validators.js
+++ b/services/test-validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { semver: isSemver } = require('./validators')
 
 /*
diff --git a/services/tokei/tokei.service.js b/services/tokei/tokei.service.js
index 4de2b70af27acd1120e55d41a6991b478018d016..983791bbffe5004f98f9d7995150ec94202da3e3 100644
--- a/services/tokei/tokei.service.js
+++ b/services/tokei/tokei.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index 324f4cf81314b9b9162101fa823eca2bbe8d2370..054e32cc463b807d0135f80987bf0d7b63fa72c6 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 
diff --git a/services/travis/travis-build.tester.js b/services/travis/travis-build.tester.js
index a1a07f3b4516167504c0c74565480666727381b3..a7d6fcfef7e286621688cf2e131c8ddc443a7491 100644
--- a/services/travis/travis-build.tester.js
+++ b/services/travis/travis-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js
index 238746fc2bd05c7f2a5a2c10ceccea3c974fa59d..27881957a9a0c03f2ed5289182a5c831ae719cf2 100644
--- a/services/travis/travis-php-version.service.js
+++ b/services/travis/travis-php-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   minorVersion,
   versionReduction,
diff --git a/services/treeware/treeware-trees.service.js b/services/treeware/treeware-trees.service.js
index 7b4cefa542b591c3d7c0ebfe648d1eab8cd636f6..e8e5b799e99f4fbf6bad05a95f89f89943f17f41 100644
--- a/services/treeware/treeware-trees.service.js
+++ b/services/treeware/treeware-trees.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const crypto = require('crypto')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/twitch/twitch-base.js b/services/twitch/twitch-base.js
index 78664ce2692e78c81c05d42d50cb4c9f68d75bc2..3dad730dcab5390423bd3cb8c77df76d411b494e 100644
--- a/services/twitch/twitch-base.js
+++ b/services/twitch/twitch-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const tokenSchema = Joi.object({
diff --git a/services/twitch/twitch.service.js b/services/twitch/twitch.service.js
index 83ac000a5dc3d0679a169dbcaac619adb4ab8f7b..77499144d13332e49f7993534692f94d585a5798 100644
--- a/services/twitch/twitch.service.js
+++ b/services/twitch/twitch.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const TwitchBase = require('./twitch-base')
 
 const helixSchema = Joi.object({
diff --git a/services/twitch/twitch.tester.js b/services/twitch/twitch.tester.js
index 54d8cadb451d1ff23b1b539aceda99c17872eab4..53f3f68f5904cd646c63a39badda9ed4ba905250 100644
--- a/services/twitch/twitch.tester.js
+++ b/services/twitch/twitch.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { noToken } = require('../test-helpers')
 const noTwitchToken = noToken(require('./twitch.service'))
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index dd262729a39c224b5bfbb3475636afa59703d4bd..e7cc857c757fefe0f2443731ee7dbad9f86dbd11 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { optionalUrl } = require('../validators')
 const { BaseService, BaseJsonService, NotFound } = require('..')
diff --git a/services/ubuntu/ubuntu.service.js b/services/ubuntu/ubuntu.service.js
index 746b703558e07ba18e8c543ee91a98e21492df1b..0345ef7f9f8a7533fc1166eb428a87b5bf5200be 100644
--- a/services/ubuntu/ubuntu.service.js
+++ b/services/ubuntu/ubuntu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/ubuntu/ubuntu.tester.js b/services/ubuntu/ubuntu.tester.js
index 8b9371ec4c3749ed6b70c285629a771a155d9195..a20217c7416411047f30401c4fea0b56093e9702 100644
--- a/services/ubuntu/ubuntu.tester.js
+++ b/services/ubuntu/ubuntu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isUbuntuVersion = Joi.string().regex(
diff --git a/services/uptimerobot/uptimerobot-base.js b/services/uptimerobot/uptimerobot-base.js
index 739e51c6800b7c05fa271e4cbaebeb8e89418cea..c414227cdaf46dc306b131929561ffb5a0871caf 100644
--- a/services/uptimerobot/uptimerobot-base.js
+++ b/services/uptimerobot/uptimerobot-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, InvalidParameter, InvalidResponse } = require('..')
 
 // https://uptimerobot.com/api
diff --git a/services/uptimerobot/uptimerobot-status.tester.js b/services/uptimerobot/uptimerobot-status.tester.js
index cd5b6a91464bbd017cda33e62f5710ad2460cd05..319d4c0456166ffae2832f04b3088ed48f6e910a 100644
--- a/services/uptimerobot/uptimerobot-status.tester.js
+++ b/services/uptimerobot/uptimerobot-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { invalidJSON } = require('../response-fixtures')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-base.js b/services/vaadin-directory/vaadin-directory-base.js
index d312afbc788e2538db753f503d2dffdad3881ee3..fe05d0f1dd2aa98a7fae580943b00baa9dcf0a83 100644
--- a/services/vaadin-directory/vaadin-directory-base.js
+++ b/services/vaadin-directory/vaadin-directory-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/vaadin-directory/vaadin-directory-rating-count.tester.js b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
index 4ed7471a6dc289a7b00234d8b39f0e793945ae96..75942ed7862203624bc1d270cb72f904503c2718 100644
--- a/services/vaadin-directory/vaadin-directory-rating-count.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('rating count of component')
diff --git a/services/vaadin-directory/vaadin-directory-rating.tester.js b/services/vaadin-directory/vaadin-directory-rating.tester.js
index 3cbbe9401cd2de0eb37ade69347856fc7958bcd1..ae2466116d47808ee97a793ce3a26bdf43d5f843 100644
--- a/services/vaadin-directory/vaadin-directory-rating.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-status.tester.js b/services/vaadin-directory/vaadin-directory-status.tester.js
index 7faf476ea401c49de369758902c594145d3ceac6..770d35a97a21feb50c29780cce1fda8b5a8429b4 100644
--- a/services/vaadin-directory/vaadin-directory-status.tester.js
+++ b/services/vaadin-directory/vaadin-directory-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('publish status of the component')
diff --git a/services/validators.js b/services/validators.js
index ce64ea29df6f60d8c3d307573cb7d9f2878b5983..1017a9988445c2211a5083d0db12a5d4123fa49d 100644
--- a/services/validators.js
+++ b/services/validators.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { semver, semverRange } = require('joi-extension-semver')
-const Joi = require('@hapi/joi').extend(semver).extend(semverRange)
+const Joi = require('joi').extend(semver).extend(semverRange)
 
 const optionalNonNegativeInteger = Joi.number().integer().min(0)
 
diff --git a/services/visual-studio-app-center/visual-studio-app-center-builds.service.js b/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
index 0fd6a290b2c9dd8416134aee1b0ccd2e1964c6a0..9aad75b83806c2f9cc81f636edb40c1897bb50e8 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { NotFound } = require('..')
 const {
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
index af1dd7c8402c7f60d0a273eae58e2f41b307ee56..160b1ed17f814a2bfefcddec9d4754b9750ed401 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   BaseVisualStudioAppCenterService,
   keywords,
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
index fde5401cbf2e1d01c3b672aecdfa30662b600e2f..553bc9027150bb6a7d8da4b9acfd4541b9bcb137 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const {
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
index 9f6f067864e4310657b76b2012e9af85f91f9244..27e211ad29f1f56c6b1719f26ebbe966edee7856 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const {
   BaseVisualStudioAppCenterService,
diff --git a/services/visual-studio-marketplace/visual-studio-marketplace-base.js b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
index 416ad01b57a9ad70f3a8f6c01464a25c2232647d..a40cf4ba463b5fa6bbb5833c67ee41f5784e16ff 100644
--- a/services/visual-studio-marketplace/visual-studio-marketplace-base.js
+++ b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const validate = require('../../core/base-service/validate')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/w3c/w3c-validation.service.js b/services/w3c/w3c-validation.service.js
index 21a15d651703dfe6a736d187aa66d6613ca92acc..692d732575345e3f9501302d521a493d71260d65 100644
--- a/services/w3c/w3c-validation.service.js
+++ b/services/w3c/w3c-validation.service.js
@@ -1,5 +1,5 @@
 'use strict'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 const {
diff --git a/services/w3c/w3c-validation.tester.js b/services/w3c/w3c-validation.tester.js
index b2eff4457c3b4019c4f522e195948b535c08ab40..4dc93b6e0d76a8fcf7d557984c2fa8e5abe82d28 100644
--- a/services/w3c/w3c-validation.tester.js
+++ b/services/w3c/w3c-validation.tester.js
@@ -1,5 +1,5 @@
 'use strict'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isErrorOnly = Joi.string().regex(/^[0-9]+ errors?$/)
diff --git a/services/website-status.js b/services/website-status.js
index 1f36662ca4a5adb91ad63923ceed7617adac0fc6..c22cf690bde61599952afff479434627f23a4a20 100644
--- a/services/website-status.js
+++ b/services/website-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const queryParamSchema = Joi.object({
   up_message: Joi.string(),
diff --git a/services/website/website.service.js b/services/website/website.service.js
index 4848d753120a17e9688890323c9894da0943d79b..6439ae00561e8e08b5340dd4b06aebbd328aabf9 100644
--- a/services/website/website.service.js
+++ b/services/website/website.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const emojic = require('emojic')
 const { optionalUrl } = require('../validators')
 const {
diff --git a/services/wercker/wercker.service.js b/services/wercker/wercker.service.js
index cd25d2a94c086fe4211c93be6ae5c0f3c364b367..eabae01be21016a26dc53d4818c64b982f546ba5 100644
--- a/services/wercker/wercker.service.js
+++ b/services/wercker/wercker.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/wheelmap/wheelmap.service.js b/services/wheelmap/wheelmap.service.js
index e9158ad5d88de72b9d39afe65b6bfeb2d9883d5f..075e869ddd8c85f7c2b54c2f1057dcd808cca1b1 100644
--- a/services/wheelmap/wheelmap.service.js
+++ b/services/wheelmap/wheelmap.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js
index 407e9c16d70d892f36b0ec7895228f576a3ff1bb..f35993d0f6ab92a6f899d7e604fb016120a428e7 100644
--- a/services/wordpress/wordpress-base.js
+++ b/services/wordpress/wordpress-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index e1edfa0886fbafd7e700f69f5dc33799ed1a7584..efb0892ba39db1fb729658603f2580f379c32f93 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { NotFound } = require('..')
diff --git a/services/wordpress/wordpress-platform.tester.js b/services/wordpress/wordpress-platform.tester.js
index 940f6b83374eb078a57a3bb909de569d2d617231..f50f87d32e953ef0acb8895a22336f5ec2d1b3cf 100644
--- a/services/wordpress/wordpress-platform.tester.js
+++ b/services/wordpress/wordpress-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/youtube/youtube-base.js b/services/youtube/youtube-base.js
index b6e29ca12a7159aef0a08d49051fce9015b93035..298ef8038920e0141804bb2f1c5cacd053ec486f 100644
--- a/services/youtube/youtube-base.js
+++ b/services/youtube/youtube-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/youtube/youtube-likes.service.js b/services/youtube/youtube-likes.service.js
index 0087d45a4a7b6a58ebb98c3cc29a7c3a0930be06..09f35e9c3a9e713cd9c35ceb22e9ef9d638e0758 100644
--- a/services/youtube/youtube-likes.service.js
+++ b/services/youtube/youtube-likes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const YouTubeBase = require('./youtube-base')
 
diff --git a/services/youtube/youtube-likes.tester.js b/services/youtube/youtube-likes.tester.js
index 9c50d1a9b6cc02a81f6bfce9db1c4f8bdf0caf06..f123a30542bf74b04726aab87e66a1e7389ddc3a 100644
--- a/services/youtube/youtube-likes.tester.js
+++ b/services/youtube/youtube-likes.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { noToken } = require('../test-helpers')
 const { isMetric } = require('../test-validators')