From 83ac6ff1b3cd182555c6561c7ba74cfcd8e6feb7 Mon Sep 17 00:00:00 2001
From: Paul Melnikow <github@paulmelnikow.com>
Date: Fri, 2 Nov 2018 17:11:44 -0400
Subject: [PATCH] Enforce use of template literals (#2242)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is consistent with what we're pretty much already doing, and saves us from making the request during code review.

These were all autofixed and most of them seem easier to read. Some in the legacy services should be rewritten in more legible forms during refactor (ie using intermediate variables, or using request’s qs option). There are some in helper functions and elsewhere that should get rewritten separately. I don't want to change them in this PR because the changes will get lost in this diff, though we could identify them here and fix them before or just after.
---
 .eslintrc.yml                                 |  1 +
 frontend/components/badge-examples.js         |  2 +-
 frontend/components/search-results.js         |  2 +-
 lib/badge-cli.js                              |  4 +-
 lib/badge-data.js                             | 15 ++++----
 lib/color-formatters.js                       |  2 +-
 lib/github-auth.js                            | 10 ++---
 lib/load-logos.js                             |  2 +-
 lib/log.js                                    |  2 +-
 lib/logo-helper.js                            |  2 +-
 lib/lru-cache.js                              |  2 +-
 lib/make-badge.js                             | 10 ++---
 lib/php-version.js                            |  6 +--
 lib/request-handler.js                        |  2 +-
 lib/result-sender.js                          |  2 +-
 lib/service-test-runner/runner.js             |  2 +-
 lib/suggest.js                                |  2 +-
 lib/text-formatters.js                        |  8 ++--
 lib/version.js                                |  4 +-
 server.js                                     |  6 +--
 services/amo/amo.service.js                   |  5 +--
 services/base.js                              |  2 +-
 services/beerpay/beerpay.service.js           |  5 +--
 services/bintray/bintray.service.js           |  3 +-
 .../bitbucket/bitbucket-issues.service.js     |  7 +---
 .../bitbucket/bitbucket-pipelines.service.js  | 15 ++++----
 .../bitbucket-pull-request.service.js         |  9 ++---
 services/bitrise/bitrise.service.js           |  8 +---
 services/bountysource/bountysource.service.js |  2 +-
 services/bugzilla/bugzilla.service.js         |  4 +-
 services/buildkite/buildkite.service.js       |  3 +-
 .../chrome-web-store.service.js               |  9 ++---
 services/clojars/clojars-version.service.js   |  2 +-
 services/cocoapods/cocoapods-apps.service.js  |  4 +-
 .../cocoapods/cocoapods-downloads.service.js  |  6 +--
 .../cocoapods/cocoapods-metrics.service.js    |  4 +-
 services/cocoapods/cocoapods.service.js       |  3 +-
 services/codacy/codacy-coverage.service.js    |  6 +--
 services/codacy/codacy-grade.service.js       |  6 +--
 services/codeclimate/codeclimate.service.js   |  6 +--
 services/codecov/codecov.service.js           |  4 +-
 services/codeship/codeship.service.js         |  8 ++--
 services/codetally/codetally.service.js       |  8 ++--
 services/conda/conda.service.js               |  3 +-
 .../continuousphp/continuousphp.service.js    | 13 ++-----
 services/cookbook/cookbook.service.js         |  5 +--
 services/coveralls/coveralls.service.js       |  4 +-
 .../coverity/coverity-on-demand.service.js    |  7 +---
 services/coverity/coverity-scan.service.js    |  3 +-
 services/cpan/cpan.service.js                 |  2 +-
 services/cran/cran.service.js                 |  2 +-
 services/crates/crates.service.js             |  8 ++--
 services/david/david.service.js               | 13 +++----
 services/discourse/discourse.service.js       | 14 +++----
 services/docker/docker.service.js             | 20 ++++------
 services/dub/dub-download.service.js          | 12 +++---
 services/dub/dub-license-version.service.js   |  2 +-
 services/gem/gem-downloads.service.js         |  2 +-
 .../github/github-commits-since.service.js    |  4 +-
 services/github/github-downloads.service.js   |  4 +-
 services/github/github-forks.service.js       |  4 +-
 services/github/github-issues.service.js      | 17 +++------
 services/github/github-languages.service.js   |  5 ++-
 .../github/github-manifest-version.service.js | 11 +-----
 services/github/github-release.service.js     |  2 +-
 services/github/github-search.service.js      |  4 +-
 services/github/github-stars.service.js       |  4 +-
 services/github/github-watchers.service.js    |  4 +-
 services/hackage/hackage-deps.service.js      |  6 +--
 services/hackage/hackage-version.service.js   |  3 +-
 services/homebrew/homebrew.service.js         |  2 +-
 services/imagelayers/imagelayers.service.js   |  4 +-
 services/itunes/itunes.service.js             |  2 +-
 services/jenkins/jenkins-build.service.js     |  5 +--
 .../jenkins-plugin-installs.service.js        |  2 +-
 services/jenkins/jenkins-tests.service.js     | 24 ++++--------
 services/jetbrains/jetbrains.service.js       |  3 +-
 services/jira/jira-issue.service.js           |  9 ++---
 services/jira/jira-sprint.service.js          | 13 ++-----
 services/jitpack/jitpack.service.js           |  6 +--
 services/lgtm/lgtm-alerts.service.js          |  3 +-
 services/lgtm/lgtm-grade.service.js           |  5 +--
 services/liberapay/liberapay.service.js       |  2 +-
 .../librariesio-dependencies.service.js       |  9 ++---
 services/luarocks/luarocks.service.js         |  3 +-
 services/maintenance/maintenance.service.js   |  6 +--
 services/maintenance/maintenance.tester.js    |  8 ++--
 .../maven-central/maven-central.service.js    | 12 +++---
 services/nexus/nexus.service.js               | 23 +++--------
 services/nuget/nuget.service.js               | 38 +++++++++----------
 services/osstracker/osstracker.service.js     |  8 ++--
 .../packagecontrol/packagecontrol.service.js  |  9 ++---
 .../packagist/packagist-downloads.service.js  |  6 +--
 .../packagist/packagist-license.service.js    |  2 +-
 .../packagist-php-version.service.js          |  6 +--
 .../packagist/packagist-version.service.js    |  2 +-
 services/php-eye/php-eye-hhvm.service.js      |  2 +-
 .../php-eye/php-eye-php-version.service.js    |  6 +--
 services/pub/pub.service.js                   |  2 +-
 .../puppetforge-modules.service.js            |  5 +--
 .../puppetforge/puppetforge-users.service.js  |  2 +-
 services/redmine/redmine.service.js           |  4 +-
 services/scrutinizer/scrutinizer.service.js   |  2 +-
 services/sensiolabs/sensiolabs.service.js     |  2 +-
 services/shippable/shippable.service.js       |  3 +-
 services/sonarqube/sonarqube.service.js       | 27 +++++--------
 services/sourceforge/sourceforge.service.js   | 15 ++------
 services/sourcegraph/sourcegraph.service.js   |  3 +-
 .../stackexchange/stackexchange.service.js    |  8 ++--
 services/suggest/suggest.tester.js            | 10 ++---
 services/teamcity/teamcity-build.service.js   |  4 +-
 .../teamcity/teamcity-coverage.service.js     |  7 +---
 services/travis/travis-build.service.js       |  7 +---
 services/travis/travis-php-version.service.js |  2 +-
 services/twitter/twitter.service.js           | 16 ++++----
 .../vaadin-directory.service.js               |  8 ++--
 .../vscode-marketplace.service.js             |  2 +-
 services/waffle/waffle.service.js             |  2 +-
 services/website/website.service.js           |  2 +-
 services/wheelmap/wheelmap.service.js         |  2 +-
 120 files changed, 305 insertions(+), 443 deletions(-)

diff --git a/.eslintrc.yml b/.eslintrc.yml
index 09c32d7415..4c9e3ab9ab 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -36,6 +36,7 @@ rules:
   arrow-body-style: ["error", "as-needed"]
   no-extension-in-require/main: "error"
   object-shorthand: ["error", "properties"]
+  prefer-template: "error"
 
   # Mocha-related.
   mocha/no-exclusive-tests: "error"
diff --git a/frontend/components/badge-examples.js b/frontend/components/badge-examples.js
index bf6311c2a7..049ea2b608 100644
--- a/frontend/components/badge-examples.js
+++ b/frontend/components/badge-examples.js
@@ -83,7 +83,7 @@ const Category = ({ category, examples, baseUrl, longCache, onClick }) => {
   }
   return (
     <div>
-      <Link to={'/examples/' + category.id}>
+      <Link to={`/examples/${category.id}`}>
         <h3 id={category.id}>{category.name}</h3>
       </Link>
       <table className="badge">
diff --git a/frontend/components/search-results.js b/frontend/components/search-results.js
index c13e26f456..a1a601a978 100644
--- a/frontend/components/search-results.js
+++ b/frontend/components/search-results.js
@@ -33,7 +33,7 @@ export default class SearchResults extends React.Component {
 
   renderCategoryHeadings() {
     return this.preparedExamples.map((category, i) => (
-      <Link to={'/examples/' + category.category.id} key={category.category.id}>
+      <Link to={`/examples/${category.category.id}`} key={category.category.id}>
         <h3 id={category.category.id}>{category.category.name}</h3>
       </Link>
     ))
diff --git a/lib/badge-cli.js b/lib/badge-cli.js
index 946b8de087..13c2019896 100755
--- a/lib/badge-cli.js
+++ b/lib/badge-cli.js
@@ -14,9 +14,7 @@ if (process.argv.length < 4) {
     'Or:    badge subject status right-color [left-color] [.output] [@style]'
   )
   console.log()
-  console.log(
-    '  colorscheme: one of ' + Object.keys(colorscheme).join(', ') + '.'
-  )
+  console.log(`  colorscheme: one of ${Object.keys(colorscheme).join(', ')}.`)
   console.log('  left-color, right-color:')
   console.log('    #xxx (three hex digits)')
   console.log('    #xxxxxx (six hex digits)')
diff --git a/lib/badge-data.js b/lib/badge-data.js
index 7bff1e6b93..4a6954ed17 100644
--- a/lib/badge-data.js
+++ b/lib/badge-data.js
@@ -21,7 +21,7 @@ function prependPrefix(s, prefix) {
     return undefined
   }
 
-  s = '' + s
+  s = `${s}`
 
   if (s.startsWith(prefix)) {
     return s
@@ -36,7 +36,7 @@ function isHexColor(s = '') {
 
 function makeColor(color) {
   if (isHexColor(color)) {
-    return '#' + color
+    return `#${color}`
   } else if (colorschemes[color] !== undefined) {
     return colorschemes[color].colorB
   } else if (isCSSColor(color)) {
@@ -52,7 +52,7 @@ function makeColorB(defaultColor, overrides) {
 
 function setBadgeColor(badgeData, color) {
   if (isHexColor(color)) {
-    badgeData.colorB = '#' + color
+    badgeData.colorB = `#${color}`
     delete badgeData.colorscheme
   } else if (colorschemes[color] !== undefined) {
     badgeData.colorscheme = color
@@ -68,12 +68,11 @@ function setBadgeColor(badgeData, color) {
 }
 
 function makeLabel(defaultLabel, overrides) {
-  return (
-    '' +
-    (overrides.label === undefined
+  return `${
+    overrides.label === undefined
       ? (defaultLabel || '').toLowerCase()
-      : overrides.label)
-  )
+      : overrides.label
+  }`
 }
 
 function getShieldsIcon(icon = '', color = '') {
diff --git a/lib/color-formatters.js b/lib/color-formatters.js
index 16b417fc5b..479cf7447f 100644
--- a/lib/color-formatters.js
+++ b/lib/color-formatters.js
@@ -10,7 +10,7 @@ function version(version) {
   if (typeof version !== 'string' && typeof version !== 'number') {
     throw new Error(`Can't generate a version color for ${version}`)
   }
-  version = '' + version
+  version = `${version}`
   let first = version[0]
   if (first === 'v') {
     first = version[1]
diff --git a/lib/github-auth.js b/lib/github-auth.js
index 81f3a63587..36a576f3d5 100644
--- a/lib/github-auth.js
+++ b/lib/github-auth.js
@@ -34,12 +34,12 @@ function setRoutes(server) {
     }
     const query = queryString.stringify({
       client_id: serverSecrets.gh_client_id,
-      redirect_uri: baseUrl + '/github-auth/done',
+      redirect_uri: `${baseUrl}/github-auth/done`,
     })
     ask.res.statusCode = 302 // Found.
     ask.res.setHeader(
       'Location',
-      'https://github.com/login/oauth/authorize?' + query
+      `https://github.com/login/oauth/authorize?${query}`
     )
     end('')
   })
@@ -125,7 +125,7 @@ function sendTokenToAllServers(token) {
       ip =>
         new Promise((resolve, reject) => {
           const options = {
-            url: 'https://' + ip + '/github-auth/add-token',
+            url: `https://${ip}/github-auth/add-token`,
             method: 'POST',
             form: {
               shieldsSecret: serverSecrets.shieldsSecret,
@@ -298,7 +298,7 @@ function githubRequest(request, url, query, cb) {
 
   if (githubToken != null) {
     // Typically, GitHub user tokens grants us 12500 req/hour.
-    headers['Authorization'] = 'token ' + githubToken
+    headers['Authorization'] = `token ${githubToken}`
   } else if (serverSecrets && serverSecrets.gh_client_id) {
     // Using our OAuth App secret grants us 5000 req/hour
     // instead of the standard 60 req/hour.
@@ -308,7 +308,7 @@ function githubRequest(request, url, query, cb) {
 
   const qs = queryString.stringify(query)
   if (qs) {
-    url += '?' + qs
+    url += `?${qs}`
   }
 
   request(url, { headers }, (err, res, buffer) => {
diff --git a/lib/load-logos.js b/lib/load-logos.js
index b44eb4c5f5..f812de8fc3 100644
--- a/lib/load-logos.js
+++ b/lib/load-logos.js
@@ -14,7 +14,7 @@ function loadLogos() {
       return
     }
     // filename is eg, github.svg
-    const svg = fs.readFileSync(logoDir + '/' + filename).toString()
+    const svg = fs.readFileSync(`${logoDir}/${filename}`).toString()
     const base64 = svg2base64(svg)
 
     // eg, github
diff --git a/lib/log.js b/lib/log.js
index 46fa4ee5b3..b94768b9e0 100644
--- a/lib/log.js
+++ b/lib/log.js
@@ -8,7 +8,7 @@ const listeners = []
 // eg. 4 becomes 04 but 17 stays 17.
 function pad(string) {
   string = String(string)
-  return string.length < 2 ? '0' + string : string
+  return string.length < 2 ? `0${string}` : string
 }
 
 // Compact date representation.
diff --git a/lib/logo-helper.js b/lib/logo-helper.js
index bcec10cc61..b31f15814a 100644
--- a/lib/logo-helper.js
+++ b/lib/logo-helper.js
@@ -11,7 +11,7 @@ function svg2base64(svg) {
   // Check if logo is already base64
   return isDataUri(svg)
     ? svg
-    : 'data:image/svg+xml;base64,' + Buffer.from(svg).toString('base64')
+    : `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`
 }
 
 module.exports = {
diff --git a/lib/lru-cache.js b/lib/lru-cache.js
index 2ed2942152..20b52bc175 100644
--- a/lib/lru-cache.js
+++ b/lib/lru-cache.js
@@ -107,7 +107,7 @@ Cache.prototype = {
         return 0
       }
     } else {
-      console.error("Unknown heuristic '" + this.type + "' for LRU cache.")
+      console.error(`Unknown heuristic '${this.type}' for LRU cache.`)
       return 1
     }
   },
diff --git a/lib/make-badge.js b/lib/make-badge.js
index 656b4341e0..fcc7662a02 100644
--- a/lib/make-badge.js
+++ b/lib/make-badge.js
@@ -22,16 +22,16 @@ templateFiles.forEach(async filename => {
     .readFileSync(path.join(__dirname, '..', 'templates', filename))
     .toString()
   const extension = path.extname(filename).slice(1)
-  const style = filename.slice(0, -('-template.' + extension).length)
+  const style = filename.slice(0, -`-template.${extension}`.length)
   // Compile the template. Necessary to always have a working template.
-  templates[style + '-' + extension] = dot.template(templateData)
+  templates[`${style}-${extension}`] = dot.template(templateData)
   if (extension === 'svg') {
     // Substitute dot code.
     const mapping = new Map()
     let mappingIndex = 1
     const untemplatedSvg = templateData.replace(/{{.*?}}/g, match => {
       // Weird substitution that currently works for all templates.
-      const mapKey = '99999990' + mappingIndex + '.1'
+      const mapKey = `99999990${mappingIndex}.1`
       mappingIndex++
       mapping.set(mapKey, match)
       return mapKey
@@ -74,7 +74,7 @@ templateFiles.forEach(async filename => {
       return
     }
 
-    templates[style + '-' + extension] = dot.template(svg)
+    templates[`${style}-${extension}`] = dot.template(svg)
   }
 })
 
@@ -125,7 +125,7 @@ function makeBadge(
   }
 ) {
   // String coercion.
-  text = text.map(value => '' + value)
+  text = text.map(value => `${value}`)
 
   if (format !== 'json') {
     format = 'svg'
diff --git a/lib/php-version.js b/lib/php-version.js
index 534a1ec6d6..9aaed19da5 100644
--- a/lib/php-version.js
+++ b/lib/php-version.js
@@ -184,7 +184,7 @@ function minorVersion(version) {
     return ''
   }
 
-  return result[1] + '.' + (result[2] ? result[2] : '0')
+  return `${result[1]}.${result[2] ? result[2] : '0'}`
 }
 
 function versionReduction(versions, phpReleases) {
@@ -208,10 +208,10 @@ function versionReduction(versions, phpReleases) {
   // no missed versions
   if (first + versions.length - 1 === last) {
     if (last === phpReleases.length - 1) {
-      return '>= ' + (versions[0][2] === '0' ? versions[0][0] : versions[0]) // 7.0 -> 7
+      return `>= ${versions[0][2] === '0' ? versions[0][0] : versions[0]}` // 7.0 -> 7
     }
 
-    return versions[0] + ' - ' + versions[versions.length - 1]
+    return `${versions[0]} - ${versions[versions.length - 1]}`
   }
 
   return versions.join(', ')
diff --git a/lib/request-handler.js b/lib/request-handler.js
index e4d6e4ca9f..5cc5d28e78 100644
--- a/lib/request-handler.js
+++ b/lib/request-handler.js
@@ -107,7 +107,7 @@ function handleRequest(makeBadge, handlerOptions) {
       ask.res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
       ask.res.setHeader('Expires', reqTime.toGMTString())
     } else {
-      ask.res.setHeader('Cache-Control', 'max-age=' + maxAge)
+      ask.res.setHeader('Cache-Control', `max-age=${maxAge}`)
       ask.res.setHeader(
         'Expires',
         new Date(+reqTime + maxAge * 1000).toGMTString()
diff --git a/lib/result-sender.js b/lib/result-sender.js
index 3aeed28907..6a6f397dbf 100644
--- a/lib/result-sender.js
+++ b/lib/result-sender.js
@@ -29,7 +29,7 @@ function sendSVG(res, askres, end) {
 }
 
 function sendOther(format, res, askres, end) {
-  askres.setHeader('Content-Type', 'image/' + format)
+  askres.setHeader('Content-Type', `image/${format}`)
   svg2img(res, format)
     .then(data => {
       end(null, { template: streamFromString(data) })
diff --git a/lib/service-test-runner/runner.js b/lib/service-test-runner/runner.js
index ecffe0a7d9..49694d30a0 100644
--- a/lib/service-test-runner/runner.js
+++ b/lib/service-test-runner/runner.js
@@ -51,7 +51,7 @@ class Runner {
 
     // Throw at the end, to provide a better error message.
     if (missingServices.length > 0) {
-      throw Error('Unknown services: ' + missingServices.join(', '))
+      throw Error(`Unknown services: ${missingServices.join(', ')}`)
     }
   }
 
diff --git a/lib/suggest.js b/lib/suggest.js
index 933f353205..c04b4c01c2 100644
--- a/lib/suggest.js
+++ b/lib/suggest.js
@@ -123,7 +123,7 @@ function setRoutes(allowedOrigin, githubApiProvider, server) {
     try {
       url = nodeUrl.parse(data.url)
     } catch (e) {
-      end({ err: '' + e })
+      end({ err: `${e}` })
       return
     }
 
diff --git a/lib/text-formatters.js b/lib/text-formatters.js
index da320d91d6..b585f30d3d 100644
--- a/lib/text-formatters.js
+++ b/lib/text-formatters.js
@@ -57,13 +57,13 @@ function metric(n) {
     if (n >= limit) {
       n = Math.round(n / limit)
       if (n < 1000) {
-        return '' + n + metricPrefix[i]
+        return `${n}${metricPrefix[i]}`
       } else {
-        return '1' + metricPrefix[i + 1]
+        return `1${metricPrefix[i + 1]}`
       }
     }
   }
-  return '' + n
+  return `${n}`
 }
 
 // Remove the starting v in a string.
@@ -79,7 +79,7 @@ function omitv(version) {
 // - it is a date (yyyy-mm-dd)
 const ignoredVersionPatterns = /^[^0-9]|[0-9]{4}-[0-9]{2}-[0-9]{2}/
 function addv(version) {
-  version = '' + version
+  version = `${version}`
   if (version.startsWith('v') || ignoredVersionPatterns.test(version)) {
     return version
   } else {
diff --git a/lib/version.js b/lib/version.js
index b217658008..94afc8cfc7 100644
--- a/lib/version.js
+++ b/lib/version.js
@@ -30,8 +30,8 @@ function latest(versions, { pre = false } = {}) {
     // coerce to string then lowercase otherwise alpha > RC
     version = versions.sort((a, b) =>
       semver.rcompare(
-        ('' + a).toLowerCase(),
-        ('' + b).toLowerCase(),
+        `${a}`.toLowerCase(),
+        `${b}`.toLowerCase(),
         /* loose */ true
       )
     )[0]
diff --git a/server.js b/server.js
index 82ace6906c..e72cbebd8f 100644
--- a/server.js
+++ b/server.js
@@ -248,7 +248,7 @@ camp.route(
 
     // Cache management - the badge is constant.
     const cacheDuration = (3600 * 24 * 1) | 0 // 1 day.
-    ask.res.setHeader('Cache-Control', 'max-age=' + cacheDuration)
+    ask.res.setHeader('Cache-Control', `max-age=${cacheDuration}`)
     if (+new Date(ask.req.headers['if-modified-since']) >= +serverStartTime) {
       ask.res.statusCode = 304
       ask.res.end() // not modified.
@@ -286,7 +286,7 @@ camp.route(
 let bitFlip = false
 camp.route(/^\/flip\.svg$/, (data, match, end, ask) => {
   const cacheSecs = 60
-  ask.res.setHeader('Cache-Control', 'max-age=' + cacheSecs)
+  ask.res.setHeader('Cache-Control', `max-age=${cacheSecs}`)
   const reqTime = new Date()
   const date = new Date(+reqTime + cacheSecs * 1000).toGMTString()
   ask.res.setHeader('Expires', date)
@@ -306,7 +306,7 @@ camp.route(/^\/([^/]+)\/(.+).png$/, (data, match, end, ask) => {
 
   // Cache management - the badge is constant.
   const cacheDuration = (3600 * 24 * 1) | 0 // 1 day.
-  ask.res.setHeader('Cache-Control', 'max-age=' + cacheDuration)
+  ask.res.setHeader('Cache-Control', `max-age=${cacheDuration}`)
   if (+new Date(ask.req.headers['if-modified-since']) >= +serverStartTime) {
     ask.res.statusCode = 304
     ask.res.end() // not modified.
diff --git a/services/amo/amo.service.js b/services/amo/amo.service.js
index 6d932f53bd..7a78ac12ea 100644
--- a/services/amo/amo.service.js
+++ b/services/amo/amo.service.js
@@ -26,8 +26,7 @@ module.exports = class Amo extends LegacyService {
         const addonId = match[2]
         const format = match[3]
         const badgeData = getBadgeData('mozilla add-on', queryData)
-        const url =
-          'https://services.addons.mozilla.org/api/1.5/addon/' + addonId
+        const url = `https://services.addons.mozilla.org/api/1.5/addon/${addonId}`
 
         request(url, (err, res, buffer) => {
           if (err) {
@@ -62,7 +61,7 @@ module.exports = class Amo extends LegacyService {
                 case 'rating':
                   rating = parseInt(data.addon.rating, 10)
                   badgeData.text[0] = getLabel('rating', queryData)
-                  badgeData.text[1] = rating + '/5'
+                  badgeData.text[1] = `${rating}/5`
                   badgeData.colorscheme = floorCountColor(rating, 2, 3, 4)
                   break
                 case 'stars':
diff --git a/services/base.js b/services/base.js
index 4479a3fb5d..93e423f552 100644
--- a/services/base.js
+++ b/services/base.js
@@ -84,7 +84,7 @@ class BaseService {
   }
 
   static _makeFullUrl(partialUrl) {
-    return '/' + [this.url.base, partialUrl].filter(Boolean).join('/')
+    return `/${[this.url.base, partialUrl].filter(Boolean).join('/')}`
   }
 
   static _makeStaticExampleUrl(serviceData) {
diff --git a/services/beerpay/beerpay.service.js b/services/beerpay/beerpay.service.js
index b67200705f..aaeaa176a5 100644
--- a/services/beerpay/beerpay.service.js
+++ b/services/beerpay/beerpay.service.js
@@ -32,8 +32,7 @@ module.exports = class Beerpay extends LegacyService {
         const project = match[2] // eg, beerpay.io
         const format = match[3]
 
-        const apiUrl =
-          'https://beerpay.io/api/v1/' + user + '/projects/' + project
+        const apiUrl = `https://beerpay.io/api/v1/${user}/projects/${project}`
         const badgeData = getBadgeData('beerpay', data)
 
         request(apiUrl, (err, res, buffer) => {
@@ -45,7 +44,7 @@ module.exports = class Beerpay extends LegacyService {
 
           try {
             const data = JSON.parse(buffer)
-            badgeData.text[1] = '$' + (data.total_amount || 0)
+            badgeData.text[1] = `$${data.total_amount || 0}`
             badgeData.colorscheme = 'red'
             sendBadge(format, badgeData)
           } catch (e) {
diff --git a/services/bintray/bintray.service.js b/services/bintray/bintray.service.js
index bc49756dfb..cd74dca331 100644
--- a/services/bintray/bintray.service.js
+++ b/services/bintray/bintray.service.js
@@ -33,8 +33,7 @@ module.exports = class Bintray extends LegacyService {
 
         const options = {
           method: 'GET',
-          uri:
-            'https://bintray.com/api/v1/packages/' + path + '/versions/_latest',
+          uri: `https://bintray.com/api/v1/packages/${path}/versions/_latest`,
           headers: {
             Accept: 'application/json',
           },
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index f55ab1c646..e1ec60c280 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -37,12 +37,7 @@ module.exports = class BitbucketIssues extends LegacyService {
         const user = match[2] // eg, atlassian
         const repo = match[3] // eg, python-bitbucket
         const format = match[4]
-        const apiUrl =
-          'https://bitbucket.org/api/1.0/repositories/' +
-          user +
-          '/' +
-          repo +
-          '/issues/?limit=0&status=new&status=open'
+        const apiUrl = `https://bitbucket.org/api/1.0/repositories/${user}/${repo}/issues/?limit=0&status=new&status=open`
 
         const badgeData = getBadgeData('issues', data)
         request(apiUrl, (err, res, buffer) => {
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index 4fdce0b0e5..748242c489 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -37,13 +37,14 @@ module.exports = class BitbucketPipelines extends LegacyService {
         const branch = match[3] || 'master' // eg, development
         const format = match[4]
         const apiUrl =
-          'https://api.bitbucket.org/2.0/repositories/' +
-          encodeURIComponent(user) +
-          '/' +
-          encodeURIComponent(repo) +
-          '/pipelines/?fields=values.state&page=1&pagelen=2&sort=-created_on' +
-          '&target.ref_type=BRANCH&target.ref_name=' +
-          encodeURIComponent(branch)
+          `https://api.bitbucket.org/2.0/repositories/${encodeURIComponent(
+            user
+          )}/${encodeURIComponent(
+            repo
+          )}/pipelines/?fields=values.state&page=1&pagelen=2&sort=-created_on` +
+          `&target.ref_type=BRANCH&target.ref_name=${encodeURIComponent(
+            branch
+          )}`
 
         const badgeData = getBadgeData('build', data)
 
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index e21ce2e581..c0f183d2c2 100644
--- a/services/bitbucket/bitbucket-pull-request.service.js
+++ b/services/bitbucket/bitbucket-pull-request.service.js
@@ -37,12 +37,9 @@ module.exports = class BitbucketPullRequest extends LegacyService {
         const user = match[2] // eg, atlassian
         const repo = match[3] // eg, python-bitbucket
         const format = match[4]
-        const apiUrl =
-          'https://bitbucket.org/api/2.0/repositories/' +
-          encodeURI(user) +
-          '/' +
-          encodeURI(repo) +
-          '/pullrequests/?limit=0&state=OPEN'
+        const apiUrl = `https://bitbucket.org/api/2.0/repositories/${encodeURI(
+          user
+        )}/${encodeURI(repo)}/pullrequests/?limit=0&state=OPEN`
 
         const badgeData = getBadgeData('pull requests', data)
         request(apiUrl, (err, res, buffer) => {
diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js
index 4fc22f508f..0fecd9204e 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -36,13 +36,9 @@ module.exports = class Bitrise extends LegacyService {
           const format = match[3]
           const token = data.token
           const badgeData = getBadgeData('bitrise', data)
-          let apiUrl =
-            'https://app.bitrise.io/app/' +
-            appId +
-            '/status.json?token=' +
-            token
+          let apiUrl = `https://app.bitrise.io/app/${appId}/status.json?token=${token}`
           if (typeof branch !== 'undefined') {
-            apiUrl += '&branch=' + branch
+            apiUrl += `&branch=${branch}`
           }
 
           const statusColorScheme = {
diff --git a/services/bountysource/bountysource.service.js b/services/bountysource/bountysource.service.js
index 704243c520..f7b1507bf2 100644
--- a/services/bountysource/bountysource.service.js
+++ b/services/bountysource/bountysource.service.js
@@ -29,7 +29,7 @@ module.exports = class Bountysource extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const team = match[1] // eg, `mozilla-core`.
         const format = match[2]
-        const url = 'https://api.bountysource.com/teams/' + team
+        const url = `https://api.bountysource.com/teams/${team}`
         const options = {
           headers: { Accept: 'application/vnd.bountysource+json; version=2' },
         }
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index cbdfe723d6..bd4395a815 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -41,9 +41,9 @@ module.exports = class Bugzilla extends LegacyService {
         const options = {
           method: 'GET',
           json: true,
-          uri: 'https://bugzilla.mozilla.org/rest/bug/' + bugNumber,
+          uri: `https://bugzilla.mozilla.org/rest/bug/${bugNumber}`,
         }
-        const badgeData = getBadgeData('bug ' + bugNumber, data)
+        const badgeData = getBadgeData(`bug ${bugNumber}`, data)
         request(options, (err, res, json) => {
           if (checkErrorResponse(badgeData, err, res)) {
             sendBadge(format, badgeData)
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index 55681c79a1..d32648262a 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -32,8 +32,7 @@ module.exports = class Buildkite extends LegacyService {
         const branch = match[2] || 'master' // Defaults to master if not specified
         const format = match[3]
 
-        const url =
-          'https://badge.buildkite.com/' + identifier + '.json?branch=' + branch
+        const url = `https://badge.buildkite.com/${identifier}.json?branch=${branch}`
         const badgeData = getBadgeData('build', data)
 
         request(url, (err, res, buffer) => {
diff --git a/services/chrome-web-store/chrome-web-store.service.js b/services/chrome-web-store/chrome-web-store.service.js
index 97f380cfdd..9c97a0c86a 100644
--- a/services/chrome-web-store/chrome-web-store.service.js
+++ b/services/chrome-web-store/chrome-web-store.service.js
@@ -25,10 +25,7 @@ module.exports = class ChromeWebStore extends LegacyService {
         const storeId = match[2] // eg, nimelepbpejjlbmoobocpfnjhihnpked
         const format = match[3]
         const badgeData = getBadgeData('chrome web store', data)
-        const url =
-          'https://chrome.google.com/webstore/detail/' +
-          storeId +
-          '?hl=en&gl=US'
+        const url = `https://chrome.google.com/webstore/detail/${storeId}?hl=en&gl=US`
         const chromeWebStore = require('chrome-web-store-item-property')
         request(url, (err, res, buffer) => {
           if (err != null) {
@@ -62,7 +59,7 @@ module.exports = class ChromeWebStore extends LegacyService {
                 case 'rating':
                   rating = Math.round(value.ratingValue * 100) / 100
                   badgeData.text[0] = getLabel('rating', data)
-                  badgeData.text[1] = rating + '/5'
+                  badgeData.text[1] = `${rating}/5`
                   badgeData.colorscheme = floorCountColor(rating, 2, 3, 4)
                   break
                 case 'stars':
@@ -74,7 +71,7 @@ module.exports = class ChromeWebStore extends LegacyService {
                 case 'rating-count': {
                   const ratingCount = value.ratingCount
                   badgeData.text[0] = getLabel('rating count', data)
-                  badgeData.text[1] = metric(ratingCount) + ' total'
+                  badgeData.text[1] = `${metric(ratingCount)} total`
                   badgeData.colorscheme = floorCountColor(
                     ratingCount,
                     5,
diff --git a/services/clojars/clojars-version.service.js b/services/clojars/clojars-version.service.js
index b35c609abe..4742022731 100644
--- a/services/clojars/clojars-version.service.js
+++ b/services/clojars/clojars-version.service.js
@@ -21,7 +21,7 @@ module.exports = class Clojars extends BaseJsonService {
 
   static render({ clojar, version }) {
     return {
-      message: '[' + clojar + ' "' + version + '"]',
+      message: `[${clojar} "${version}"]`,
       color: versionColor(version),
     }
   }
diff --git a/services/cocoapods/cocoapods-apps.service.js b/services/cocoapods/cocoapods-apps.service.js
index 2a0554f9d4..6cf457be9c 100644
--- a/services/cocoapods/cocoapods-apps.service.js
+++ b/services/cocoapods/cocoapods-apps.service.js
@@ -39,7 +39,7 @@ module.exports = class CocoapodsApps extends LegacyService {
         const info = match[1] // One of these: "aw", "at"
         const spec = match[2] // eg, AFNetworking
         const format = match[3]
-        const apiUrl = 'https://metrics.cocoapods.org/api/v1/pods/' + spec
+        const apiUrl = `https://metrics.cocoapods.org/api/v1/pods/${spec}`
         const badgeData = getBadgeData('apps', data)
         request(apiUrl, (err, res, buffer) => {
           if (checkErrorResponse(badgeData, err, res)) {
@@ -52,7 +52,7 @@ module.exports = class CocoapodsApps extends LegacyService {
             switch (info.charAt(1)) {
               case 'w':
                 apps = data.stats.app_week
-                badgeData.text[1] = metric(apps) + '/week'
+                badgeData.text[1] = `${metric(apps)}/week`
                 break
               case 't':
                 apps = data.stats.app_total
diff --git a/services/cocoapods/cocoapods-downloads.service.js b/services/cocoapods/cocoapods-downloads.service.js
index ea4690d09c..92191b1491 100644
--- a/services/cocoapods/cocoapods-downloads.service.js
+++ b/services/cocoapods/cocoapods-downloads.service.js
@@ -43,7 +43,7 @@ module.exports = class CocoapodsDownloads extends LegacyService {
         const info = match[1] // One of these: "dm", "dw", "dt"
         const spec = match[2] // eg, AFNetworking
         const format = match[3]
-        const apiUrl = 'https://metrics.cocoapods.org/api/v1/pods/' + spec
+        const apiUrl = `https://metrics.cocoapods.org/api/v1/pods/${spec}`
         const badgeData = getBadgeData('downloads', data)
         request(apiUrl, (err, res, buffer) => {
           if (checkErrorResponse(badgeData, err, res)) {
@@ -56,11 +56,11 @@ module.exports = class CocoapodsDownloads extends LegacyService {
             switch (info.charAt(1)) {
               case 'm':
                 downloads = data.stats.download_month
-                badgeData.text[1] = metric(downloads) + '/month'
+                badgeData.text[1] = `${metric(downloads)}/month`
                 break
               case 'w':
                 downloads = data.stats.download_week
-                badgeData.text[1] = metric(downloads) + '/week'
+                badgeData.text[1] = `${metric(downloads)}/week`
                 break
               case 't':
                 downloads = data.stats.download_total
diff --git a/services/cocoapods/cocoapods-metrics.service.js b/services/cocoapods/cocoapods-metrics.service.js
index 653eca2cd0..6d8def2498 100644
--- a/services/cocoapods/cocoapods-metrics.service.js
+++ b/services/cocoapods/cocoapods-metrics.service.js
@@ -33,7 +33,7 @@ module.exports = class CocoapodsMetrics extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const spec = match[1] // eg, AFNetworking
         const format = match[2]
-        const apiUrl = 'https://metrics.cocoapods.org/api/v1/pods/' + spec
+        const apiUrl = `https://metrics.cocoapods.org/api/v1/pods/${spec}`
         const badgeData = getBadgeData('docs', data)
         request(apiUrl, (err, res, buffer) => {
           if (checkErrorResponse(badgeData, err, res)) {
@@ -47,7 +47,7 @@ module.exports = class CocoapodsMetrics extends LegacyService {
               percentage = 0
             }
             badgeData.colorscheme = coveragePercentageColor(percentage)
-            badgeData.text[1] = percentage + '%'
+            badgeData.text[1] = `${percentage}%`
             sendBadge(format, badgeData)
           } catch (e) {
             badgeData.text[1] = 'invalid'
diff --git a/services/cocoapods/cocoapods.service.js b/services/cocoapods/cocoapods.service.js
index c0601ef834..c8fff7913c 100644
--- a/services/cocoapods/cocoapods.service.js
+++ b/services/cocoapods/cocoapods.service.js
@@ -14,8 +14,7 @@ module.exports = class CocoapodsVersionPlatformLicense extends LegacyService {
         const type = match[1]
         const spec = match[2] // eg, AFNetworking
         const format = match[3]
-        const apiUrl =
-          'https://trunk.cocoapods.org/api/v1/pods/' + spec + '/specs/latest'
+        const apiUrl = `https://trunk.cocoapods.org/api/v1/pods/${spec}/specs/latest`
         const typeToLabel = { v: 'pod', p: 'platform', l: 'license' }
         const badgeData = getBadgeData(typeToLabel[type], data)
         badgeData.colorscheme = null
diff --git a/services/codacy/codacy-coverage.service.js b/services/codacy/codacy-coverage.service.js
index e9570b4d25..afc9c10a38 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -45,11 +45,7 @@ module.exports = class CodacyCoverage extends LegacyService {
           queryParams.branch = branch
         }
         const query = queryString.stringify(queryParams)
-        const url =
-          'https://api.codacy.com/project/badge/coverage/' +
-          projectId +
-          '?' +
-          query
+        const url = `https://api.codacy.com/project/badge/coverage/${projectId}?${query}`
         const badgeData = getBadgeData('coverage', data)
         fetchFromSvg(
           request,
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index 93eb2c5184..cc760b3fce 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -42,11 +42,7 @@ module.exports = class CodacyGrade extends LegacyService {
           queryParams.branch = branch
         }
         const query = queryString.stringify(queryParams)
-        const url =
-          'https://api.codacy.com/project/badge/grade/' +
-          projectId +
-          '?' +
-          query
+        const url = `https://api.codacy.com/project/badge/grade/${projectId}?${query}`
         const badgeData = getBadgeData('code quality', data)
         fetchFromSvg(
           request,
diff --git a/services/codeclimate/codeclimate.service.js b/services/codeclimate/codeclimate.service.js
index 52b9fe0e23..9d015d1403 100644
--- a/services/codeclimate/codeclimate.service.js
+++ b/services/codeclimate/codeclimate.service.js
@@ -81,7 +81,7 @@ module.exports = class Codeclimate extends LegacyService {
                     const percentage = parseFloat(
                       parsedData.data.attributes.covered_percent
                     )
-                    badgeData.text[1] = percentage.toFixed(0) + '%'
+                    badgeData.text[1] = `${percentage.toFixed(0)}%`
                     badgeData.colorscheme = coveragePercentageColor(percentage)
                   } else if (type === 'issues') {
                     const count = parsedData.data.meta.issues_count
@@ -94,7 +94,7 @@ module.exports = class Codeclimate extends LegacyService {
                     const percentage = parseFloat(
                       parsedData.data.attributes.ratings[0].measure.value
                     )
-                    badgeData.text[1] = percentage.toFixed(0) + '%'
+                    badgeData.text[1] = `${percentage.toFixed(0)}%`
                     badgeData.colorscheme = colorScale(
                       [5, 10, 20, 50],
                       ['brightgreen', 'green', 'yellowgreen', 'yellow', 'red']
@@ -109,7 +109,7 @@ module.exports = class Codeclimate extends LegacyService {
                       parseFloat(
                         parsedData.data.attributes.ratings[0].measure.value
                       )
-                    badgeData.text[1] = percentage.toFixed(0) + '%'
+                    badgeData.text[1] = `${percentage.toFixed(0)}%`
                     badgeData.colorscheme = colorScale(
                       [50, 80, 90, 95],
                       ['red', 'yellow', 'yellowgreen', 'green', 'brightgreen']
diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js
index 6bbc5d5bdd..a7184c2bad 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -52,7 +52,7 @@ module.exports = class Codecov extends LegacyService {
           apiUrl = `https://codecov.io/${userRepo}/graphs/badge.txt`
         }
         if (token) {
-          apiUrl += '?' + queryString.stringify({ token })
+          apiUrl += `?${queryString.stringify({ token })}`
         }
         const badgeData = getBadgeData('coverage', data)
         request(apiUrl, (err, res, body) => {
@@ -69,7 +69,7 @@ module.exports = class Codecov extends LegacyService {
               sendBadge(format, badgeData)
               return
             }
-            badgeData.text[1] = coverage + '%'
+            badgeData.text[1] = `${coverage}%`
             badgeData.colorscheme = coveragePercentageColor(coverage)
             sendBadge(format, badgeData)
           } catch (e) {
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index 99697c9316..2a5eea75e2 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -36,11 +36,9 @@ module.exports = class Codeship extends LegacyService {
         const branch = match[2]
         const options = {
           method: 'GET',
-          uri:
-            'https://codeship.com/projects/' +
-            projectId +
-            '/status' +
-            (branch != null ? '?branch=' + branch : ''),
+          uri: `https://codeship.com/projects/${projectId}/status${
+            branch != null ? `?branch=${branch}` : ''
+          }`,
         }
         const badgeData = getBadgeData('build', data)
         request(options, (err, res) => {
diff --git a/services/codetally/codetally.service.js b/services/codetally/codetally.service.js
index a88fef50fc..768f36babe 100644
--- a/services/codetally/codetally.service.js
+++ b/services/codetally/codetally.service.js
@@ -30,8 +30,7 @@ module.exports = class Codetally extends LegacyService {
         const owner = match[1] // eg, triggerman722.
         const repo = match[2] // eg, colorstrap
         const format = match[3]
-        const apiUrl =
-          'http://www.codetally.com/formattedshield/' + owner + '/' + repo
+        const apiUrl = `http://www.codetally.com/formattedshield/${owner}/${repo}`
         const badgeData = getBadgeData('codetally', data)
         request(apiUrl, (err, res, buffer) => {
           if (err != null) {
@@ -41,8 +40,9 @@ module.exports = class Codetally extends LegacyService {
           }
           try {
             const data = JSON.parse(buffer)
-            badgeData.text[1] =
-              ' ' + data.currency_sign + data.amount + ' ' + data.multiplier
+            badgeData.text[1] = ` ${data.currency_sign}${data.amount} ${
+              data.multiplier
+            }`
             badgeData.colorscheme = null
             badgeData.colorB = '#2E8B57'
             sendBadge(format, badgeData)
diff --git a/services/conda/conda.service.js b/services/conda/conda.service.js
index 0d70c838af..5da4b423cb 100644
--- a/services/conda/conda.service.js
+++ b/services/conda/conda.service.js
@@ -21,8 +21,7 @@ module.exports = class Conda extends LegacyService {
         const channel = match[2]
         const pkgname = match[3]
         const format = match[4]
-        const url =
-          'https://api.anaconda.org/package/' + channel + '/' + pkgname
+        const url = `https://api.anaconda.org/package/${channel}/${pkgname}`
         const labels = {
           d: 'downloads',
           p: 'platform',
diff --git a/services/continuousphp/continuousphp.service.js b/services/continuousphp/continuousphp.service.js
index 9d6e800c6a..ec1c16e3f3 100644
--- a/services/continuousphp/continuousphp.service.js
+++ b/services/continuousphp/continuousphp.service.js
@@ -32,27 +32,22 @@ module.exports = class ContinuousPhp extends LegacyService {
 
         const options = {
           method: 'GET',
-          uri:
-            'https://status.continuousphp.com/' +
-            provider +
-            '/' +
-            userRepo +
-            '/status-info',
+          uri: `https://status.continuousphp.com/${provider}/${userRepo}/status-info`,
           headers: {
             Accept: 'application/json',
           },
         }
 
         if (branch != null) {
-          options.uri += '?branch=' + branch
+          options.uri += `?branch=${branch}`
         }
 
         const badgeData = getBadgeData('build', data)
         request(options, (err, res) => {
           if (err != null) {
-            console.error('continuousphp error: ' + err.stack)
+            console.error(`continuousphp error: ${err.stack}`)
             if (res) {
-              console.error('' + res)
+              console.error(`${res}`)
             }
 
             badgeData.text[1] = 'invalid'
diff --git a/services/cookbook/cookbook.service.js b/services/cookbook/cookbook.service.js
index 6c29d53382..def3fb7b7e 100644
--- a/services/cookbook/cookbook.service.js
+++ b/services/cookbook/cookbook.service.js
@@ -30,10 +30,7 @@ module.exports = class Cookbook extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const cookbook = match[1] // eg, chef-sugar
         const format = match[2]
-        const apiUrl =
-          'https://supermarket.getchef.com/api/v1/cookbooks/' +
-          cookbook +
-          '/versions/latest'
+        const apiUrl = `https://supermarket.getchef.com/api/v1/cookbooks/${cookbook}/versions/latest`
         const badgeData = getBadgeData('cookbook', data)
 
         request(apiUrl, (err, res, buffer) => {
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index cd48263084..f5b283fbf0 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -52,7 +52,7 @@ module.exports = class Coveralls extends LegacyService {
           method: 'HEAD',
         }
         if (branch) {
-          apiUrl.url += '?branch=' + branch
+          apiUrl.url += `?branch=${branch}`
         }
         const badgeData = getBadgeData('coverage', data)
         request(apiUrl, (err, res) => {
@@ -76,7 +76,7 @@ module.exports = class Coveralls extends LegacyService {
               sendBadge(format, badgeData)
               return
             }
-            badgeData.text[1] = score + '%'
+            badgeData.text[1] = `${score}%`
             badgeData.colorscheme = coveragePercentageColor(percentage)
             sendBadge(format, badgeData)
           } catch (e) {
diff --git a/services/coverity/coverity-on-demand.service.js b/services/coverity/coverity-on-demand.service.js
index cc3f3dea28..adc1f1a2d8 100644
--- a/services/coverity/coverity-on-demand.service.js
+++ b/services/coverity/coverity-on-demand.service.js
@@ -55,12 +55,7 @@ module.exports = class CoverityOnDemand extends LegacyService {
           // https://api.ondemand.coverity.com/streams/44b25sjc9l3ntc2ngfi29tngro/badge
           // https://api.ondemand.coverity.com/jobs/p4tmm8031t4i971r0im4s7lckk/badge
           //
-          const url =
-            'https://api.ondemand.coverity.com/' +
-            badgeType +
-            '/' +
-            badgeTypeId +
-            '/badge'
+          const url = `https://api.ondemand.coverity.com/${badgeType}/${badgeTypeId}/badge`
           request(url, (err, res, buffer) => {
             if (err != null) {
               badgeData.text[1] = 'inaccessible'
diff --git a/services/coverity/coverity-scan.service.js b/services/coverity/coverity-scan.service.js
index c72142470c..8d1034af4a 100644
--- a/services/coverity/coverity-scan.service.js
+++ b/services/coverity/coverity-scan.service.js
@@ -29,8 +29,7 @@ module.exports = class CoverityScan extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const projectId = match[1] // eg, `3997`
         const format = match[2]
-        const url =
-          'https://scan.coverity.com/projects/' + projectId + '/badge.json'
+        const url = `https://scan.coverity.com/projects/${projectId}/badge.json`
         const badgeData = getBadgeData('coverity', data)
         request(url, (err, res, buffer) => {
           if (err != null) {
diff --git a/services/cpan/cpan.service.js b/services/cpan/cpan.service.js
index 510bc77da1..1c94d6e138 100644
--- a/services/cpan/cpan.service.js
+++ b/services/cpan/cpan.service.js
@@ -17,7 +17,7 @@ module.exports = class Cpan extends LegacyService {
         const pkg = match[2] // eg, Config-Augeas
         const format = match[3]
         const badgeData = getBadgeData('cpan', data)
-        const url = 'https://fastapi.metacpan.org/v1/release/' + pkg
+        const url = `https://fastapi.metacpan.org/v1/release/${pkg}`
         request(url, (err, res, buffer) => {
           if (err != null) {
             badgeData.text[1] = 'inaccessible'
diff --git a/services/cran/cran.service.js b/services/cran/cran.service.js
index 609f7e0fef..d85ed12dd3 100644
--- a/services/cran/cran.service.js
+++ b/services/cran/cran.service.js
@@ -17,7 +17,7 @@ module.exports = class Cran extends LegacyService {
         const info = match[1] // either `v` or `l`
         const pkg = match[2] // eg, devtools
         const format = match[3]
-        const url = 'http://crandb.r-pkg.org/' + pkg
+        const url = `http://crandb.r-pkg.org/${pkg}`
         const badgeData = getBadgeData('cran', queryParams)
         request(url, (err, res, buffer) => {
           if (err != null) {
diff --git a/services/crates/crates.service.js b/services/crates/crates.service.js
index 4b4406b9b9..3804792385 100644
--- a/services/crates/crates.service.js
+++ b/services/crates/crates.service.js
@@ -27,7 +27,7 @@ module.exports = class Crates extends LegacyService {
                 : data.version.downloads
               version = data.version && data.version.num
               badgeData.text[1] =
-                metric(downloads) + (version ? ' version ' + version : '')
+                metric(downloads) + (version ? ` version ${version}` : '')
               badgeData.colorscheme = downloadCountColor(downloads)
             },
           },
@@ -41,7 +41,7 @@ module.exports = class Crates extends LegacyService {
               version = data.version && data.version.num
               badgeData.text[1] =
                 metric(downloads) +
-                (version ? ' version ' + version : ' latest version')
+                (version ? ` version ${version}` : ' latest version')
               badgeData.colorscheme = downloadCountColor(downloads)
             },
           },
@@ -64,9 +64,9 @@ module.exports = class Crates extends LegacyService {
           },
         }
         const behavior = modes[mode]
-        let apiUrl = 'https://crates.io/api/v1/crates/' + crate
+        let apiUrl = `https://crates.io/api/v1/crates/${crate}`
         if (version != null && behavior.version) {
-          apiUrl += '/' + version
+          apiUrl += `/${version}`
         }
 
         const badgeData = getBadgeData(behavior.name, data)
diff --git a/services/david/david.service.js b/services/david/david.service.js
index ca04cb582a..d70dfd3c8d 100644
--- a/services/david/david.service.js
+++ b/services/david/david.service.js
@@ -53,18 +53,15 @@ module.exports = class David extends LegacyService {
           // eg, `expressjs/express`, `webcomponents/generator-element`.
           const userRepo = match[2]
           const format = match[3]
-          let options =
-            'https://david-dm.org/' +
-            userRepo +
-            '/' +
-            (dev ? dev + '-' : '') +
-            'info.json'
+          let options = `https://david-dm.org/${userRepo}/${
+            dev ? `${dev}-` : ''
+          }info.json`
           if (data.path) {
             // path can be used to specify the package.json location, useful for monorepos
-            options += '?path=' + data.path
+            options += `?path=${data.path}`
           }
           const badgeData = getBadgeData(
-            (dev ? dev + ' ' : '') + 'dependencies',
+            `${dev ? `${dev} ` : ''}dependencies`,
             data
           )
           request(options, (err, res, buffer) => {
diff --git a/services/discourse/discourse.service.js b/services/discourse/discourse.service.js
index 329ca19ac1..b6cef20adf 100644
--- a/services/discourse/discourse.service.js
+++ b/services/discourse/discourse.service.js
@@ -48,7 +48,7 @@ module.exports = class Discourse extends LegacyService {
         const host = match[2] // eg, meta.discourse.org
         const stat = match[3] // eg, user_count
         const format = match[4]
-        const url = scheme + '://' + host + '/site/statistics.json'
+        const url = `${scheme}://${host}/site/statistics.json`
 
         const options = {
           method: 'GET',
@@ -62,7 +62,7 @@ module.exports = class Discourse extends LegacyService {
         request(options, (err, res) => {
           if (err != null) {
             if (res) {
-              console.error('' + res)
+              console.error(`${res}`)
             }
 
             badgeData.text[1] = 'inaccessible'
@@ -86,19 +86,19 @@ module.exports = class Discourse extends LegacyService {
             switch (stat) {
               case 'topics':
                 statCount = data.topic_count
-                badgeData.text[1] = metric(statCount) + ' topics'
+                badgeData.text[1] = `${metric(statCount)} topics`
                 break
               case 'posts':
                 statCount = data.post_count
-                badgeData.text[1] = metric(statCount) + ' posts'
+                badgeData.text[1] = `${metric(statCount)} posts`
                 break
               case 'users':
                 statCount = data.user_count
-                badgeData.text[1] = metric(statCount) + ' users'
+                badgeData.text[1] = `${metric(statCount)} users`
                 break
               case 'likes':
                 statCount = data.like_count
-                badgeData.text[1] = metric(statCount) + ' likes'
+                badgeData.text[1] = `${metric(statCount)} likes`
                 break
               case 'status':
                 badgeData.text[1] = 'online'
@@ -111,7 +111,7 @@ module.exports = class Discourse extends LegacyService {
 
             sendBadge(format, badgeData)
           } catch (e) {
-            console.error('' + e.stack)
+            console.error(`${e.stack}`)
             badgeData.colorscheme = 'yellow'
             badgeData.text[1] = 'invalid'
             sendBadge(format, badgeData)
diff --git a/services/docker/docker.service.js b/services/docker/docker.service.js
index 00a2342a1d..4f5aab215a 100644
--- a/services/docker/docker.service.js
+++ b/services/docker/docker.service.js
@@ -39,9 +39,8 @@ class DockerStars extends LegacyService {
         if (user === '_') {
           user = 'library'
         }
-        const path = user + '/' + repo
-        const url =
-          'https://hub.docker.com/v2/repositories/' + path + '/stars/count/'
+        const path = `${user}/${repo}`
+        const url = `https://hub.docker.com/v2/repositories/${path}/stars/count/`
         const badgeData = getBadgeData('docker stars', data)
         request(url, (err, res, buffer) => {
           if (
@@ -99,8 +98,8 @@ class DockerPulls extends LegacyService {
         if (user === '_') {
           user = 'library'
         }
-        const path = user + '/' + repo
-        const url = 'https://hub.docker.com/v2/repositories/' + path
+        const path = `${user}/${repo}`
+        const url = `https://hub.docker.com/v2/repositories/${path}`
         const badgeData = getBadgeData('docker pulls', data)
         request(url, (err, res, buffer) => {
           if (
@@ -161,11 +160,8 @@ class DockerBuild extends LegacyService {
         if (user === '_') {
           user = 'library'
         }
-        const path = user + '/' + repo
-        const url =
-          'https://registry.hub.docker.com/v2/repositories/' +
-          path +
-          '/buildhistory'
+        const path = `${user}/${repo}`
+        const url = `https://registry.hub.docker.com/v2/repositories/${path}/buildhistory`
         const badgeData = getBadgeData('docker build', data)
         request(url, (err, res, buffer) => {
           if (
@@ -206,8 +202,8 @@ class DockerBuild extends LegacyService {
         if (user === '_') {
           user = 'library'
         }
-        const path = user + '/' + repo
-        const url = 'https://registry.hub.docker.com/v2/repositories/' + path
+        const path = `${user}/${repo}`
+        const url = `https://registry.hub.docker.com/v2/repositories/${path}`
         const badgeData = getBadgeData('docker build', data)
         request(url, (err, res, buffer) => {
           if (
diff --git a/services/dub/dub-download.service.js b/services/dub/dub-download.service.js
index 4c50075369..abb044ef43 100644
--- a/services/dub/dub-download.service.js
+++ b/services/dub/dub-download.service.js
@@ -52,9 +52,9 @@ module.exports = class DubDownload extends LegacyService {
         const pkg = match[2] // package name, e.g. vibe-d
         const version = match[3] // version (1.2.3 or latest)
         const format = match[4]
-        let apiUrl = 'https://code.dlang.org/api/packages/' + pkg
+        let apiUrl = `https://code.dlang.org/api/packages/${pkg}`
         if (version) {
-          apiUrl += '/' + version
+          apiUrl += `/${version}`
         }
         apiUrl += '/stats'
         const badgeData = getBadgeData('dub', data)
@@ -71,15 +71,15 @@ module.exports = class DubDownload extends LegacyService {
               switch (info.charAt(1)) {
                 case 'm':
                   downloads = parsedData.downloads.monthly
-                  badgeData.text[1] = metric(downloads) + '/month'
+                  badgeData.text[1] = `${metric(downloads)}/month`
                   break
                 case 'w':
                   downloads = parsedData.downloads.weekly
-                  badgeData.text[1] = metric(downloads) + '/week'
+                  badgeData.text[1] = `${metric(downloads)}/week`
                   break
                 case 'd':
                   downloads = parsedData.downloads.daily
-                  badgeData.text[1] = metric(downloads) + '/day'
+                  badgeData.text[1] = `${metric(downloads)}/day`
                   break
                 case 't':
                   downloads = parsedData.downloads.total
@@ -87,7 +87,7 @@ module.exports = class DubDownload extends LegacyService {
                   break
               }
               if (version) {
-                badgeData.text[1] += ' ' + versionText(version)
+                badgeData.text[1] += ` ${versionText(version)}`
               }
               badgeData.colorscheme = downloadCountColor(downloads)
               sendBadge(format, badgeData)
diff --git a/services/dub/dub-license-version.service.js b/services/dub/dub-license-version.service.js
index 568c2a3432..bf2b7505be 100644
--- a/services/dub/dub-license-version.service.js
+++ b/services/dub/dub-license-version.service.js
@@ -17,7 +17,7 @@ module.exports = class DubLicenseVersion extends LegacyService {
         const info = match[1] // (v - version, l - license)
         const pkg = match[2] // package name, e.g. vibe-d
         const format = match[3]
-        let apiUrl = 'https://code.dlang.org/api/packages/' + pkg
+        let apiUrl = `https://code.dlang.org/api/packages/${pkg}`
         if (info === 'v') {
           apiUrl += '/latest'
         } else if (info === 'l') {
diff --git a/services/gem/gem-downloads.service.js b/services/gem/gem-downloads.service.js
index 7cde3e714d..c81527bc4f 100644
--- a/services/gem/gem-downloads.service.js
+++ b/services/gem/gem-downloads.service.js
@@ -49,7 +49,7 @@ module.exports = class GemDownloads extends BaseJsonService {
 
   static _getLabel(version, info) {
     if (version) {
-      return 'downloads@' + version
+      return `downloads@${version}`
     } else {
       if (info === 'dtv') {
         return 'downloads@latest'
diff --git a/services/github/github-commits-since.service.js b/services/github/github-commits-since.service.js
index ee05d10482..2414496aad 100644
--- a/services/github/github-commits-since.service.js
+++ b/services/github/github-commits-since.service.js
@@ -16,7 +16,7 @@ module.exports = class GithubCommitsSince extends LegacyService {
         const repo = match[2] // eg, subtitleedit
         const version = match[3] // eg, 3.4.7 or latest
         const format = match[4]
-        const badgeData = getBadgeData('commits since ' + version, data)
+        const badgeData = getBadgeData(`commits since ${version}`, data)
 
         function setCommitsSinceBadge(user, repo, version) {
           const apiUrl = `/repos/${user}/${repo}/compare/${version}...master`
@@ -34,7 +34,7 @@ module.exports = class GithubCommitsSince extends LegacyService {
               const result = JSON.parse(buffer)
               badgeData.text[1] = result.ahead_by
               badgeData.colorscheme = 'blue'
-              badgeData.text[0] = getLabel('commits since ' + version, data)
+              badgeData.text[0] = getLabel(`commits since ${version}`, data)
               sendBadge(format, badgeData)
             } catch (e) {
               badgeData.text[1] = 'invalid'
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index 213ea50d2d..65c4f1e5be 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -39,9 +39,9 @@ module.exports = class GithubDownloads extends LegacyService {
               ? type === 'downloads'
                 ? 'latest'
                 : ''
-              : 'tags/' + tag
+              : `tags/${tag}`
           if (releasePath) {
-            apiUrl = apiUrl + '/' + releasePath
+            apiUrl = `${apiUrl}/${releasePath}`
           }
         }
         const badgeData = getBadgeData('downloads', data)
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 3359779872..17ff0ac0e9 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -22,8 +22,8 @@ module.exports = class GithubForks extends LegacyService {
         if (badgeData.template === 'social') {
           badgeData.logo = getLogo('github', data)
           badgeData.links = [
-            'https://github.com/' + user + '/' + repo + '/fork',
-            'https://github.com/' + user + '/' + repo + '/network',
+            `https://github.com/${user}/${repo}/fork`,
+            `https://github.com/${user}/${repo}/network`,
           ]
         }
         githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js
index 62f247aae0..c3b3453a44 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -25,21 +25,16 @@ module.exports = class GithubIssues extends LegacyService {
         const query = {}
         const hasLabel = ghLabel !== undefined
 
-        query.q =
-          'repo:' +
-          user +
-          '/' +
-          repo +
-          (isPR ? ' is:pr' : ' is:issue') +
-          (isClosed ? ' is:closed' : ' is:open') +
-          (hasLabel ? ` label:"${ghLabel}"` : '')
+        query.q = `repo:${user}/${repo}${isPR ? ' is:pr' : ' is:issue'}${
+          isClosed ? ' is:closed' : ' is:open'
+        }${hasLabel ? ` label:"${ghLabel}"` : ''}`
 
         const classText = isClosed ? 'closed' : 'open'
-        const leftClassText = isRaw ? classText + ' ' : ''
-        const rightClassText = !isRaw ? ' ' + classText : ''
+        const leftClassText = isRaw ? `${classText} ` : ''
+        const rightClassText = !isRaw ? ` ${classText}` : ''
         const isGhLabelMultiWord = hasLabel && ghLabel.includes(' ')
         const labelText = hasLabel
-          ? (isGhLabelMultiWord ? `"${ghLabel}"` : ghLabel) + ' '
+          ? `${isGhLabelMultiWord ? `"${ghLabel}"` : ghLabel} `
           : ''
         const targetText = isPR ? 'pull requests' : 'issues'
         const badgeData = getBadgeData(
diff --git a/services/github/github-languages.service.js b/services/github/github-languages.service.js
index 2f1725cbd5..a857cb238f 100644
--- a/services/github/github-languages.service.js
+++ b/services/github/github-languages.service.js
@@ -51,8 +51,9 @@ module.exports = class GithubLanguages extends LegacyService {
                   badgeData.text[1] = 'none'
                   badgeData.colorscheme = 'blue'
                 } else {
-                  badgeData.text[1] =
-                    ((maxBytes / sumBytes) * 100).toFixed(1) + '%' // eg, 9.1%
+                  badgeData.text[1] = `${((maxBytes / sumBytes) * 100).toFixed(
+                    1
+                  )}%` // eg, 9.1%
                 }
                 break
               }
diff --git a/services/github/github-manifest-version.service.js b/services/github/github-manifest-version.service.js
index 1f7ea17ffd..6f48e28267 100644
--- a/services/github/github-manifest-version.service.js
+++ b/services/github/github-manifest-version.service.js
@@ -23,16 +23,7 @@ module.exports = class GithubManifestVersion extends LegacyService {
         const repo = match[4]
         const branch = match[5] || 'master'
         const format = match[6]
-        const apiUrl =
-          'https://raw.githubusercontent.com/' +
-          user +
-          '/' +
-          repo +
-          '/' +
-          branch +
-          '/' +
-          type +
-          '.json'
+        const apiUrl = `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${type}.json`
         const badgeData = getBadgeData(type, queryData)
         request(apiUrl, (err, res, buffer) => {
           if (githubCheckErrorResponse(badgeData, err, res)) {
diff --git a/services/github/github-release.service.js b/services/github/github-release.service.js
index f7211d2cf1..29b896b36b 100644
--- a/services/github/github-release.service.js
+++ b/services/github/github-release.service.js
@@ -20,7 +20,7 @@ module.exports = class GithubRelease extends LegacyService {
         const format = match[4]
         let apiUrl = `/repos/${userRepo}/releases`
         if (!includePre) {
-          apiUrl = apiUrl + '/latest'
+          apiUrl = `${apiUrl}/latest`
         }
         const badgeData = getBadgeData('release', data)
         if (badgeData.template === 'social') {
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index f6b8d416ba..c00ac644e3 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -17,8 +17,8 @@ module.exports = class GithubSearch extends LegacyService {
         const repo = match[2]
         const search = match[3]
         const format = match[4]
-        const query = { q: search + ' repo:' + user + '/' + repo }
-        const badgeData = getBadgeData(search + ' counter', data)
+        const query = { q: `${search} repo:${user}/${repo}` }
+        const badgeData = getBadgeData(`${search} counter`, data)
         githubApiProvider.request(
           request,
           '/search/code',
diff --git a/services/github/github-stars.service.js b/services/github/github-stars.service.js
index 6a91d6dd45..011a947fd4 100644
--- a/services/github/github-stars.service.js
+++ b/services/github/github-stars.service.js
@@ -23,8 +23,8 @@ module.exports = class GithubStars extends LegacyService {
         if (badgeData.template === 'social') {
           badgeData.logo = getLogo('github', data)
           badgeData.links = [
-            'https://github.com/' + user + '/' + repo,
-            'https://github.com/' + user + '/' + repo + '/stargazers',
+            `https://github.com/${user}/${repo}`,
+            `https://github.com/${user}/${repo}/stargazers`,
           ]
         }
         githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
diff --git a/services/github/github-watchers.service.js b/services/github/github-watchers.service.js
index f2f832d48d..a073ec14ae 100644
--- a/services/github/github-watchers.service.js
+++ b/services/github/github-watchers.service.js
@@ -22,8 +22,8 @@ module.exports = class GithubWatchers extends LegacyService {
         if (badgeData.template === 'social') {
           badgeData.logo = getLogo('github', data)
           badgeData.links = [
-            'https://github.com/' + user + '/' + repo,
-            'https://github.com/' + user + '/' + repo + '/watchers',
+            `https://github.com/${user}/${repo}`,
+            `https://github.com/${user}/${repo}/watchers`,
           ]
         }
         githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
diff --git a/services/hackage/hackage-deps.service.js b/services/hackage/hackage-deps.service.js
index bf40eea3d5..c5b89a723d 100644
--- a/services/hackage/hackage-deps.service.js
+++ b/services/hackage/hackage-deps.service.js
@@ -30,8 +30,8 @@ module.exports = class HackageDeps extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const repo = match[1] // eg, `lens`.
         const format = match[2]
-        const reverseUrl = 'http://packdeps.haskellers.com/licenses/' + repo
-        const feedUrl = 'http://packdeps.haskellers.com/feed/' + repo
+        const reverseUrl = `http://packdeps.haskellers.com/licenses/${repo}`
+        const feedUrl = `http://packdeps.haskellers.com/feed/${repo}`
         const badgeData = getBadgeData('dependencies', data)
 
         // first call /reverse to check if the package exists
@@ -51,7 +51,7 @@ module.exports = class HackageDeps extends LegacyService {
             }
 
             try {
-              const outdatedStr = 'Outdated dependencies for ' + repo + ' '
+              const outdatedStr = `Outdated dependencies for ${repo} `
               if (buffer.indexOf(outdatedStr) >= 0) {
                 badgeData.text[1] = 'outdated'
                 badgeData.colorscheme = 'orange'
diff --git a/services/hackage/hackage-version.service.js b/services/hackage/hackage-version.service.js
index 3597549737..4503d9e562 100644
--- a/services/hackage/hackage-version.service.js
+++ b/services/hackage/hackage-version.service.js
@@ -13,8 +13,7 @@ module.exports = class HackageVersion extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const repo = match[1] // eg, `lens`.
         const format = match[2]
-        const apiUrl =
-          'https://hackage.haskell.org/package/' + repo + '/' + repo + '.cabal'
+        const apiUrl = `https://hackage.haskell.org/package/${repo}/${repo}.cabal`
         const badgeData = getBadgeData('hackage', data)
         request(apiUrl, (err, res, buffer) => {
           if (checkErrorResponse(badgeData, err, res)) {
diff --git a/services/homebrew/homebrew.service.js b/services/homebrew/homebrew.service.js
index 5e6798426a..75046d33a9 100644
--- a/services/homebrew/homebrew.service.js
+++ b/services/homebrew/homebrew.service.js
@@ -32,7 +32,7 @@ module.exports = class Homebrew extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const pkg = match[1] // eg. cake
         const format = match[2]
-        const apiUrl = 'https://formulae.brew.sh/api/formula/' + pkg + '.json'
+        const apiUrl = `https://formulae.brew.sh/api/formula/${pkg}.json`
 
         const badgeData = getBadgeData('homebrew', data)
         request(
diff --git a/services/imagelayers/imagelayers.service.js b/services/imagelayers/imagelayers.service.js
index 10b37cc831..f8fbdbae59 100644
--- a/services/imagelayers/imagelayers.service.js
+++ b/services/imagelayers/imagelayers.service.js
@@ -43,7 +43,7 @@ module.exports = class Imagelayers extends LegacyService {
         if (user === '_') {
           user = 'library'
         }
-        const path = user + '/' + repo
+        const path = `${user}/${repo}`
         const badgeData = getBadgeData(type, data)
         const options = {
           method: 'POST',
@@ -61,7 +61,7 @@ module.exports = class Imagelayers extends LegacyService {
           }
           try {
             if (type === 'image-size') {
-              const size = metric(buffer[0].repo.size) + 'B'
+              const size = `${metric(buffer[0].repo.size)}B`
               badgeData.text[0] = getLabel('image size', data)
               badgeData.text[1] = size
             } else if (type === 'layers') {
diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js
index 6cf84cf6fd..30942f292e 100644
--- a/services/itunes/itunes.service.js
+++ b/services/itunes/itunes.service.js
@@ -33,7 +33,7 @@ module.exports = class Itunes extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const bundleId = match[1] // eg, `324684580`
         const format = match[2]
-        const apiUrl = 'https://itunes.apple.com/lookup?id=' + bundleId
+        const apiUrl = `https://itunes.apple.com/lookup?id=${bundleId}`
         const badgeData = getBadgeData('itunes app store', data)
         request(apiUrl, (err, res, buffer) => {
           if (err !== null) {
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index 2950528fff..c964f7fccb 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -35,11 +35,10 @@ module.exports = class JenkinsBuild extends LegacyService {
         const format = match[4]
         const options = {
           json: true,
-          uri: scheme + '://' + host + '/job/' + job + '/api/json?tree=color',
+          uri: `${scheme}://${host}/job/${job}/api/json?tree=color`,
         }
         if (job.indexOf('/') > -1) {
-          options.uri =
-            scheme + '://' + host + '/' + job + '/api/json?tree=color'
+          options.uri = `${scheme}://${host}/${job}/api/json?tree=color`
         }
 
         if (serverSecrets && serverSecrets.jenkins_user) {
diff --git a/services/jenkins/jenkins-plugin-installs.service.js b/services/jenkins/jenkins-plugin-installs.service.js
index 6115a156a0..b864f7aa06 100644
--- a/services/jenkins/jenkins-plugin-installs.service.js
+++ b/services/jenkins/jenkins-plugin-installs.service.js
@@ -59,7 +59,7 @@ class JenkinsPluginInstalls extends BaseJsonService {
 
   static _getLabel(version) {
     if (version) {
-      return 'installs@' + version
+      return `installs@${version}`
     } else {
       return 'installs'
     }
diff --git a/services/jenkins/jenkins-tests.service.js b/services/jenkins/jenkins-tests.service.js
index b370c7229b..3579caad16 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -35,24 +35,14 @@ module.exports = class JenkinsTests extends LegacyService {
         const format = match[4]
         const options = {
           json: true,
-          uri:
-            scheme +
-            '://' +
-            host +
-            '/job/' +
-            job +
-            '/lastBuild/api/json?tree=' +
-            encodeURIComponent('actions[failCount,skipCount,totalCount]'),
+          uri: `${scheme}://${host}/job/${job}/lastBuild/api/json?tree=${encodeURIComponent(
+            'actions[failCount,skipCount,totalCount]'
+          )}`,
         }
         if (job.indexOf('/') > -1) {
-          options.uri =
-            scheme +
-            '://' +
-            host +
-            '/' +
-            job +
-            '/lastBuild/api/json?tree=' +
-            encodeURIComponent('actions[failCount,skipCount,totalCount]')
+          options.uri = `${scheme}://${host}/${job}/lastBuild/api/json?tree=${encodeURIComponent(
+            'actions[failCount,skipCount,totalCount]'
+          )}`
         }
 
         if (serverSecrets && serverSecrets.jenkins_user) {
@@ -83,7 +73,7 @@ module.exports = class JenkinsTests extends LegacyService {
               testsObject.totalCount -
               (testsObject.failCount + testsObject.skipCount)
             const percent = successfulTests / testsObject.totalCount
-            badgeData.text[1] = successfulTests + ' / ' + testsObject.totalCount
+            badgeData.text[1] = `${successfulTests} / ${testsObject.totalCount}`
             if (percent === 1) {
               badgeData.colorscheme = 'brightgreen'
             } else if (percent === 0) {
diff --git a/services/jetbrains/jetbrains.service.js b/services/jetbrains/jetbrains.service.js
index 6104db35a1..a72b5c35dc 100644
--- a/services/jetbrains/jetbrains.service.js
+++ b/services/jetbrains/jetbrains.service.js
@@ -21,8 +21,7 @@ module.exports = class JetBrains extends LegacyService {
         const format = match[3]
         const leftText = type === 'v' ? 'jetbrains plugin' : 'downloads'
         const badgeData = getBadgeData(leftText, data)
-        const url =
-          'https://plugins.jetbrains.com/plugins/list?pluginId=' + pluginId
+        const url = `https://plugins.jetbrains.com/plugins/list?pluginId=${pluginId}`
 
         request(url, (err, res, buffer) => {
           if (err || res.statusCode !== 200) {
diff --git a/services/jira/jira-issue.service.js b/services/jira/jira-issue.service.js
index b522a45798..9443b8ae4c 100644
--- a/services/jira/jira-issue.service.js
+++ b/services/jira/jira-issue.service.js
@@ -36,12 +36,9 @@ module.exports = class JiraIssue extends LegacyService {
         const options = {
           method: 'GET',
           json: true,
-          uri:
-            protocol +
-            '://' +
-            host +
-            '/rest/api/2/issue/' +
-            encodeURIComponent(issueKey),
+          uri: `${protocol}://${host}/rest/api/2/issue/${encodeURIComponent(
+            issueKey
+          )}`,
         }
         if (serverSecrets && serverSecrets.jira_username) {
           options.auth = {
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index bd8ce279c1..0fe1c0aac1 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -45,13 +45,7 @@ module.exports = class JiraSprint extends LegacyService {
         const options = {
           method: 'GET',
           json: true,
-          uri:
-            protocol +
-            '://' +
-            host +
-            '/rest/api/2/search?jql=sprint=' +
-            sprintId +
-            '%20AND%20type%20IN%20(Bug,Improvement,Story,"Technical%20task")&fields=resolution&maxResults=500',
+          uri: `${protocol}://${host}/rest/api/2/search?jql=sprint=${sprintId}%20AND%20type%20IN%20(Bug,Improvement,Story,"Technical%20task")&fields=resolution&maxResults=500`,
         }
         if (serverSecrets && serverSecrets.jira_username) {
           options.auth = {
@@ -74,8 +68,9 @@ module.exports = class JiraSprint extends LegacyService {
                   return el.fields.resolution.name !== 'Unresolved'
                 }
               }).length
-              badgeData.text[1] =
-                Math.round((issuesDone * 100) / json.total) + '%'
+              badgeData.text[1] = `${Math.round(
+                (issuesDone * 100) / json.total
+              )}%`
               switch (issuesDone) {
                 case 0:
                   badgeData.colorscheme = 'red'
diff --git a/services/jitpack/jitpack.service.js b/services/jitpack/jitpack.service.js
index 5e6aac4c6f..a851e62864 100644
--- a/services/jitpack/jitpack.service.js
+++ b/services/jitpack/jitpack.service.js
@@ -30,12 +30,12 @@ module.exports = class Jitpack extends LegacyService {
     camp.route(
       /^\/jitpack\/v\/([^/]*)\/([^/]*)\.(svg|png|gif|jpg|json)$/,
       cache((data, match, sendBadge, request) => {
-        const groupId = 'com.github.' + match[1] // github user
+        const groupId = `com.github.${match[1]}` // github user
         const artifactId = match[2] // the project's name
         const format = match[3] // "svg"
 
-        const pkg = groupId + '/' + artifactId + '/latest'
-        const apiUrl = 'https://jitpack.io/api/builds/' + pkg
+        const pkg = `${groupId}/${artifactId}/latest`
+        const apiUrl = `https://jitpack.io/api/builds/${pkg}`
 
         const badgeData = getBadgeData('jitpack', data)
 
diff --git a/services/lgtm/lgtm-alerts.service.js b/services/lgtm/lgtm-alerts.service.js
index 697ad837db..99b7138ac7 100644
--- a/services/lgtm/lgtm-alerts.service.js
+++ b/services/lgtm/lgtm-alerts.service.js
@@ -31,8 +31,7 @@ module.exports = class LgtmAlerts extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const projectId = match[1] // eg, `g/apache/cloudstack`
         const format = match[2]
-        const url =
-          'https://lgtm.com/api/v0.1/project/' + projectId + '/details'
+        const url = `https://lgtm.com/api/v0.1/project/${projectId}/details`
         const badgeData = getBadgeData('lgtm', data)
         request(url, (err, res, buffer) => {
           if (
diff --git a/services/lgtm/lgtm-grade.service.js b/services/lgtm/lgtm-grade.service.js
index b7011db3a8..c51c3c54b2 100644
--- a/services/lgtm/lgtm-grade.service.js
+++ b/services/lgtm/lgtm-grade.service.js
@@ -31,8 +31,7 @@ module.exports = class LgtmGrade extends LegacyService {
         const language = match[1] // eg, `java`
         const projectId = match[2] // eg, `g/apache/cloudstack`
         const format = match[3]
-        const url =
-          'https://lgtm.com/api/v0.1/project/' + projectId + '/details'
+        const url = `https://lgtm.com/api/v0.1/project/${projectId}/details`
         const languageLabel = (() => {
           switch (language) {
             case 'cpp':
@@ -46,7 +45,7 @@ module.exports = class LgtmGrade extends LegacyService {
               return language
           }
         })()
-        const badgeData = getBadgeData('code quality: ' + languageLabel, data)
+        const badgeData = getBadgeData(`code quality: ${languageLabel}`, data)
         request(url, (err, res, buffer) => {
           if (
             checkErrorResponse(badgeData, err, res, {
diff --git a/services/liberapay/liberapay.service.js b/services/liberapay/liberapay.service.js
index 708800ffbb..842ea61770 100644
--- a/services/liberapay/liberapay.service.js
+++ b/services/liberapay/liberapay.service.js
@@ -45,7 +45,7 @@ module.exports = class Liberapay extends LegacyService {
         const type = match[1] // e.g., 'gives'
         const entity = match[2] // e.g., 'Changaco'
         const format = match[3]
-        const apiUrl = 'https://liberapay.com/' + entity + '/public.json'
+        const apiUrl = `https://liberapay.com/${entity}/public.json`
         // Lock down type
         const label = {
           receives: 'receives',
diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js
index e9ded30b94..63cf1c1050 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -40,13 +40,12 @@ module.exports = class LibrariesioDependencies extends LegacyService {
         let uri
         switch (resource) {
           case 'github': {
-            uri = 'https://libraries.io/api/github/' + project + '/dependencies'
+            uri = `https://libraries.io/api/github/${project}/dependencies`
             break
           }
           case 'release': {
             const v = version || 'latest'
-            uri =
-              'https://libraries.io/api/' + project + '/' + v + '/dependencies'
+            uri = `https://libraries.io/api/${project}/${v}/dependencies`
             break
           }
         }
@@ -70,14 +69,14 @@ module.exports = class LibrariesioDependencies extends LegacyService {
             // Deprecated dependencies are really bad
             if (deprecated.length > 0) {
               badgeData.colorscheme = 'red'
-              badgeData.text[1] = deprecated.length + ' deprecated'
+              badgeData.text[1] = `${deprecated.length} deprecated`
               return sendBadge(format, badgeData)
             }
 
             // Out of date dependencies are pretty bad
             if (outofdate.length > 0) {
               badgeData.colorscheme = 'orange'
-              badgeData.text[1] = outofdate.length + ' out of date'
+              badgeData.text[1] = `${outofdate.length} out of date`
               return sendBadge(format, badgeData)
             }
 
diff --git a/services/luarocks/luarocks.service.js b/services/luarocks/luarocks.service.js
index 91d125dee7..96d024a552 100644
--- a/services/luarocks/luarocks.service.js
+++ b/services/luarocks/luarocks.service.js
@@ -16,8 +16,7 @@ module.exports = class Luarocks extends LegacyService {
         const user = match[1] // eg, `leafo`.
         const moduleName = match[2] // eg, `lapis`.
         const format = match[4]
-        const apiUrl =
-          'https://luarocks.org/manifests/' + user + '/manifest.json'
+        const apiUrl = `https://luarocks.org/manifests/${user}/manifest.json`
         const badgeData = getBadgeData('luarocks', data)
         let version = match[3] // you can explicitly specify a version
         request(apiUrl, (err, res, buffer) => {
diff --git a/services/maintenance/maintenance.service.js b/services/maintenance/maintenance.service.js
index 166e09c8bb..fc73e480ba 100644
--- a/services/maintenance/maintenance.service.js
+++ b/services/maintenance/maintenance.service.js
@@ -37,15 +37,15 @@ module.exports = class Maintenance extends LegacyService {
           const cy = now.getUTCFullYear() // current year.
           const m = now.getUTCMonth() // month.
           if (status === 'no') {
-            badgeData.text[1] = 'no! (as of ' + year + ')'
+            badgeData.text[1] = `no! (as of ${year})`
             badgeData.colorscheme = 'red'
           } else if (cy <= year) {
             badgeData.text[1] = status
             badgeData.colorscheme = 'brightgreen'
           } else if (cy === year + 1 && m < 3) {
-            badgeData.text[1] = 'stale (as of ' + cy + ')'
+            badgeData.text[1] = `stale (as of ${cy})`
           } else {
-            badgeData.text[1] = 'no! (as of ' + year + ')'
+            badgeData.text[1] = `no! (as of ${year})`
             badgeData.colorscheme = 'red'
           }
           sendBadge(format, badgeData)
diff --git a/services/maintenance/maintenance.tester.js b/services/maintenance/maintenance.tester.js
index 9f3a9edac3..ce1c981151 100644
--- a/services/maintenance/maintenance.tester.js
+++ b/services/maintenance/maintenance.tester.js
@@ -16,9 +16,9 @@ t.create('no longer maintained 2017 (no)')
   .expectJSON({ name: 'maintained', value: 'no! (as of 2017)' })
 
 t.create('yes this year (yes)')
-  .get('/yes/' + currentYear + '.json')
+  .get(`/yes/${currentYear}.json`)
   .expectJSON({ name: 'maintained', value: 'yes' })
 
-t.create('until end of ' + currentYear + ' (yes)')
-  .get('/until end of ' + currentYear + '/' + currentYear + '.json')
-  .expectJSON({ name: 'maintained', value: 'until end of ' + currentYear })
+t.create(`until end of ${currentYear} (yes)`)
+  .get(`/until end of ${currentYear}/${currentYear}.json`)
+  .expectJSON({ name: 'maintained', value: `until end of ${currentYear}` })
diff --git a/services/maven-central/maven-central.service.js b/services/maven-central/maven-central.service.js
index 5a753c9e16..58765a3ae2 100644
--- a/services/maven-central/maven-central.service.js
+++ b/services/maven-central/maven-central.service.js
@@ -39,13 +39,11 @@ module.exports = class MavenCentral extends LegacyService {
         const artifactId = match[2] // eg, `guice`
         const versionPrefix = match[3] || '' // eg, `1.`
         const format = match[4] || 'gif' // eg, `svg`
-        const metadataUrl =
-          'http://repo1.maven.org/maven2' +
-          '/' +
-          encodeURIComponent(groupId).replace(/\./g, '/') +
-          '/' +
-          encodeURIComponent(artifactId) +
-          '/maven-metadata.xml'
+        const metadataUrl = `${'http://repo1.maven.org/maven2' +
+          '/'}${encodeURIComponent(groupId).replace(
+          /\./g,
+          '/'
+        )}/${encodeURIComponent(artifactId)}/maven-metadata.xml`
         const badgeData = getBadgeData('maven-central', data)
         request(
           metadataUrl,
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 0f0a9bc546..3b944f6985 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -26,24 +26,11 @@ module.exports = class Nexus extends LegacyService {
 
         const badgeData = getBadgeData('nexus', data)
 
-        const apiUrl =
-          scheme +
-          '://' +
-          host +
-          (repo === 'r' || repo === 's'
-            ? '/service/local/lucene/search?g=' +
-              groupId +
-              '&a=' +
-              artifactId +
-              queryOpt
-            : '/service/local/artifact/maven/resolve?r=' +
-              repo +
-              '&g=' +
-              groupId +
-              '&a=' +
-              artifactId +
-              '&v=LATEST' +
-              queryOpt)
+        const apiUrl = `${scheme}://${host}${
+          repo === 'r' || repo === 's'
+            ? `/service/local/lucene/search?g=${groupId}&a=${artifactId}${queryOpt}`
+            : `/service/local/artifact/maven/resolve?r=${repo}&g=${groupId}&a=${artifactId}&v=LATEST${queryOpt}`
+        }`
 
         request(
           apiUrl,
diff --git a/services/nuget/nuget.service.js b/services/nuget/nuget.service.js
index d0c05e7454..d6b4228a8e 100644
--- a/services/nuget/nuget.service.js
+++ b/services/nuget/nuget.service.js
@@ -10,20 +10,20 @@ const { regularUpdate } = require('../../lib/regular-update')
 
 function mapNugetFeedv2({ camp, cache }, pattern, offset, getInfo) {
   const vRegex = new RegExp(
-    '^\\/' + pattern + '\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
   const vPreRegex = new RegExp(
-    '^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
   const dtRegex = new RegExp(
-    '^\\/' + pattern + '\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
 
   function getNugetPackage(apiUrl, id, includePre, request, done) {
     const filter = includePre
-      ? "Id eq '" + id + "' and IsAbsoluteLatestVersion eq true"
-      : "Id eq '" + id + "' and IsLatestVersion eq true"
-    const reqUrl = apiUrl + '/Packages()?$filter=' + encodeURIComponent(filter)
+      ? `Id eq '${id}' and IsAbsoluteLatestVersion eq true`
+      : `Id eq '${id}' and IsLatestVersion eq true`
+    const reqUrl = `${apiUrl}/Packages()?$filter=${encodeURIComponent(filter)}`
     request(
       reqUrl,
       { headers: { Accept: 'application/atom+json,application/json' } },
@@ -68,7 +68,7 @@ function mapNugetFeedv2({ camp, cache }, pattern, offset, getInfo) {
           return
         }
         const version = data.NormalizedVersion || data.Version
-        badgeData.text[1] = 'v' + version
+        badgeData.text[1] = `v${version}`
         if (version.indexOf('-') !== -1) {
           badgeData.colorscheme = 'yellow'
         } else if (version[0] === '0') {
@@ -97,7 +97,7 @@ function mapNugetFeedv2({ camp, cache }, pattern, offset, getInfo) {
           return
         }
         const version = data.NormalizedVersion || data.Version
-        badgeData.text[1] = 'v' + version
+        badgeData.text[1] = `v${version}`
         if (version.indexOf('-') !== -1) {
           badgeData.colorscheme = 'yellow'
         } else if (version[0] === '0') {
@@ -135,13 +135,13 @@ function mapNugetFeedv2({ camp, cache }, pattern, offset, getInfo) {
 
 function mapNugetFeed({ camp, cache }, pattern, offset, getInfo) {
   const vRegex = new RegExp(
-    '^\\/' + pattern + '\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
   const vPreRegex = new RegExp(
-    '^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
   const dtRegex = new RegExp(
-    '^\\/' + pattern + '\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$'
+    `^\\/${pattern}\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$`
   )
 
   function getNugetData(apiUrl, id, request, done) {
@@ -149,7 +149,7 @@ function mapNugetFeed({ camp, cache }, pattern, offset, getInfo) {
 
     regularUpdate(
       {
-        url: apiUrl + '/index.json',
+        url: `${apiUrl}/index.json`,
         // The endpoint changes once per year (ie, a period of n = 1 year).
         // We minimize the users' waiting time for information.
         // With l = latency to fetch the endpoint and x = endpoint update period
@@ -179,11 +179,9 @@ function mapNugetFeed({ camp, cache }, pattern, offset, getInfo) {
             Math.random() * searchQueryResources.length
           )
           const reqUrl =
-            searchQueryResources[randomEndpointIdx]['@id'] +
-            '?q=packageid:' +
-            encodeURIComponent(id.toLowerCase()) + // NuGet package id (lowercase)
-            '&prerelease=true' + // Include prerelease versions?
-            '&semVerLevel=2' // Include packages with SemVer 2 version numbers
+            `${searchQueryResources[randomEndpointIdx]['@id']}?q=packageid:${
+              encodeURIComponent(id.toLowerCase()) // NuGet package id (lowercase)
+            }&prerelease=true` + `&semVerLevel=2` // Include prerelease versions? // Include packages with SemVer 2 version numbers
 
           request(reqUrl, (err, res, buffer) => {
             if (err != null) {
@@ -246,7 +244,7 @@ function mapNugetFeed({ camp, cache }, pattern, offset, getInfo) {
           return
         }
         try {
-          badgeData.text[1] = 'v' + version
+          badgeData.text[1] = `v${version}`
           if (version.indexOf('-') !== -1) {
             badgeData.colorscheme = 'yellow'
           } else if (version[0] === '0') {
@@ -279,7 +277,7 @@ function mapNugetFeed({ camp, cache }, pattern, offset, getInfo) {
           return
         }
         try {
-          badgeData.text[1] = 'v' + version
+          badgeData.text[1] = `v${version}`
           if (version.indexOf('-') !== -1) {
             badgeData.colorscheme = 'yellow'
           } else if (version[0] === '0') {
@@ -359,7 +357,7 @@ module.exports = class Nuget extends LegacyService {
       const feed = match[2]
       return {
         site: feed,
-        feed: 'https://' + tenant + 'myget.org/F/' + feed + '/api/v3',
+        feed: `https://${tenant}myget.org/F/${feed}/api/v3`,
       }
     })
   }
diff --git a/services/osstracker/osstracker.service.js b/services/osstracker/osstracker.service.js
index 280f5cd007..4bed5021ba 100644
--- a/services/osstracker/osstracker.service.js
+++ b/services/osstracker/osstracker.service.js
@@ -32,9 +32,9 @@ module.exports = class OssTracker extends LegacyService {
         const orgOrUserAndRepo = match[1]
         const branch = match[2]
         const format = match[3]
-        let url = 'https://raw.githubusercontent.com/' + orgOrUserAndRepo
+        let url = `https://raw.githubusercontent.com/${orgOrUserAndRepo}`
         if (branch != null) {
-          url += '/' + branch + '/OSSMETADATA'
+          url += `/${branch}/OSSMETADATA`
         } else {
           url += '/master/OSSMETADATA'
         }
@@ -45,9 +45,9 @@ module.exports = class OssTracker extends LegacyService {
         const badgeData = getBadgeData('oss lifecycle', data)
         request(options, (err, res, body) => {
           if (err != null) {
-            log.error('NetflixOSS error: ' + err.stack)
+            log.error(`NetflixOSS error: ${err.stack}`)
             if (res) {
-              log.error('' + res)
+              log.error(`${res}`)
             }
             badgeData.text[1] = 'invalid'
             sendBadge(format, badgeData)
diff --git a/services/packagecontrol/packagecontrol.service.js b/services/packagecontrol/packagecontrol.service.js
index ae545254ee..edc7756d9d 100644
--- a/services/packagecontrol/packagecontrol.service.js
+++ b/services/packagecontrol/packagecontrol.service.js
@@ -50,8 +50,7 @@ module.exports = class PackageControl extends LegacyService {
         const info = match[1] // either `dm`, `dw`, `dd` or dt`.
         const userRepo = match[2] // eg, `Package%20Control`.
         const format = match[3]
-        const apiUrl =
-          'https://packagecontrol.io/packages/' + userRepo + '.json'
+        const apiUrl = `https://packagecontrol.io/packages/${userRepo}.json`
         const badgeData = getBadgeData('downloads', data)
         request(apiUrl, (err, res, buffer) => {
           if (err != null) {
@@ -74,7 +73,7 @@ module.exports = class PackageControl extends LegacyService {
                     downloads += platform.totals[i]
                   }
                 })
-                badgeData.text[1] = metric(downloads) + '/month'
+                badgeData.text[1] = `${metric(downloads)}/month`
                 break
               case 'w':
                 // daily downloads are separated by Operating System
@@ -86,7 +85,7 @@ module.exports = class PackageControl extends LegacyService {
                     downloads += platform.totals[i]
                   }
                 })
-                badgeData.text[1] = metric(downloads) + '/week'
+                badgeData.text[1] = `${metric(downloads)}/week`
                 break
               case 'd':
                 // daily downloads are separated by Operating System
@@ -95,7 +94,7 @@ module.exports = class PackageControl extends LegacyService {
                   // use the downloads from yesterday
                   downloads += platform.totals[1]
                 })
-                badgeData.text[1] = metric(downloads) + '/day'
+                badgeData.text[1] = `${metric(downloads)}/day`
                 break
               case 't':
                 // all-time downloads are already compiled
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index 6729e7f710..87a4f3ff33 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -45,7 +45,7 @@ module.exports = class PackagistDownloads extends LegacyService {
         const info = match[1] // either `dm` or dt`.
         const userRepo = match[2] // eg, `doctrine/orm`.
         const format = match[3]
-        const apiUrl = 'https://packagist.org/packages/' + userRepo + '.json'
+        const apiUrl = `https://packagist.org/packages/${userRepo}.json`
         const badgeData = getBadgeData('downloads', data)
         if (userRepo.substr(-14) === '/:package_name') {
           badgeData.text[1] = 'invalid'
@@ -63,11 +63,11 @@ module.exports = class PackagistDownloads extends LegacyService {
             switch (info.charAt(1)) {
               case 'm':
                 downloads = data.package.downloads.monthly
-                badgeData.text[1] = metric(downloads) + '/month'
+                badgeData.text[1] = `${metric(downloads)}/month`
                 break
               case 'd':
                 downloads = data.package.downloads.daily
-                badgeData.text[1] = metric(downloads) + '/day'
+                badgeData.text[1] = `${metric(downloads)}/day`
                 break
               case 't':
                 downloads = data.package.downloads.total
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index 373859f861..95ee869913 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -10,7 +10,7 @@ module.exports = class PackagistLicense extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const userRepo = match[1]
         const format = match[2]
-        const apiUrl = 'https://packagist.org/packages/' + userRepo + '.json'
+        const apiUrl = `https://packagist.org/packages/${userRepo}.json`
         const badgeData = getBadgeData('license', data)
         if (userRepo.substr(-14) === '/:package_name') {
           badgeData.text[1] = 'invalid'
diff --git a/services/packagist/packagist-php-version.service.js b/services/packagist/packagist-php-version.service.js
index cd2728ac7c..0d6bcc3b8f 100644
--- a/services/packagist/packagist-php-version.service.js
+++ b/services/packagist/packagist-php-version.service.js
@@ -33,14 +33,14 @@ module.exports = class PackagistPhpVersion extends LegacyService {
         const format = match[3]
         const options = {
           method: 'GET',
-          uri: 'https://packagist.org/p/' + userRepo + '.json',
+          uri: `https://packagist.org/p/${userRepo}.json`,
         }
         const badgeData = getBadgeData('php', data)
         request(options, (err, res, buffer) => {
           if (err !== null) {
-            log.error('Packagist error: ' + err.stack)
+            log.error(`Packagist error: ${err.stack}`)
             if (res) {
-              log.error('' + res)
+              log.error(`${res}`)
             }
             badgeData.text[1] = 'invalid'
             sendBadge(format, badgeData)
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index 6ca7f8591a..9aaa7b0ce0 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -18,7 +18,7 @@ module.exports = class PackagistVersion extends LegacyService {
         const info = match[1] // either `v` or `vpre`.
         const userRepo = match[2] // eg, `doctrine/orm`.
         const format = match[3]
-        const apiUrl = 'https://packagist.org/packages/' + userRepo + '.json'
+        const apiUrl = `https://packagist.org/packages/${userRepo}.json`
         const badgeData = getBadgeData('packagist', data)
         if (userRepo.substr(-14) === '/:package_name') {
           badgeData.text[1] = 'invalid'
diff --git a/services/php-eye/php-eye-hhvm.service.js b/services/php-eye/php-eye-hhvm.service.js
index df620c6a2a..92355dfa2a 100644
--- a/services/php-eye/php-eye-hhvm.service.js
+++ b/services/php-eye/php-eye-hhvm.service.js
@@ -36,7 +36,7 @@ module.exports = class PhpeyeHhvm extends LegacyService {
         const user = match[1] // eg, `symfony/symfony`.
         let branch = match[2] ? omitv(match[2]) : 'dev-master'
         const format = match[3]
-        const apiUrl = 'https://php-eye.com/api/v1/package/' + user + '.json'
+        const apiUrl = `https://php-eye.com/api/v1/package/${user}.json`
         const badgeData = getBadgeData('hhvm', data)
         if (branch === 'master') {
           branch = 'dev-master'
diff --git a/services/php-eye/php-eye-php-version.service.js b/services/php-eye/php-eye-php-version.service.js
index 4f2c61cb46..5f657e2251 100644
--- a/services/php-eye/php-eye-php-version.service.js
+++ b/services/php-eye/php-eye-php-version.service.js
@@ -37,16 +37,16 @@ module.exports = class PhpEyePhpVersion extends LegacyService {
         const format = match[3]
         const options = {
           method: 'GET',
-          uri: 'https://php-eye.com/api/v1/package/' + userRepo + '.json',
+          uri: `https://php-eye.com/api/v1/package/${userRepo}.json`,
         }
         const badgeData = getBadgeData('php tested', data)
         getPhpReleases(githubApiProvider)
           .then(phpReleases => {
             request(options, (err, res, buffer) => {
               if (err !== null) {
-                log.error('PHP-Eye error: ' + err.stack)
+                log.error(`PHP-Eye error: ${err.stack}`)
                 if (res) {
-                  log.error('' + res)
+                  log.error(`${res}`)
                 }
                 badgeData.text[1] = 'invalid'
                 sendBadge(format, badgeData)
diff --git a/services/pub/pub.service.js b/services/pub/pub.service.js
index f0b78a2f76..755e8e0801 100644
--- a/services/pub/pub.service.js
+++ b/services/pub/pub.service.js
@@ -34,7 +34,7 @@ module.exports = class Pub extends LegacyService {
         const includePre = Boolean(match[1])
         const userRepo = match[2] // eg, "box2d"
         const format = match[3]
-        const apiUrl = 'https://pub.dartlang.org/packages/' + userRepo + '.json'
+        const apiUrl = `https://pub.dartlang.org/packages/${userRepo}.json`
         const badgeData = getBadgeData('pub', data)
         request(apiUrl, (err, res, buffer) => {
           if (err != null) {
diff --git a/services/puppetforge/puppetforge-modules.service.js b/services/puppetforge/puppetforge-modules.service.js
index 2601c1f318..d3f81230f4 100644
--- a/services/puppetforge/puppetforge-modules.service.js
+++ b/services/puppetforge/puppetforge-modules.service.js
@@ -23,8 +23,7 @@ module.exports = class PuppetforgeModules extends LegacyService {
         const format = match[4]
         const options = {
           json: true,
-          uri:
-            'https://forgeapi.puppetlabs.com/v3/modules/' + user + '-' + module,
+          uri: `https://forgeapi.puppetlabs.com/v3/modules/${user}-${module}`,
         }
         const badgeData = getBadgeData('puppetforge', data)
         request(options, (err, res, json) => {
@@ -67,7 +66,7 @@ module.exports = class PuppetforgeModules extends LegacyService {
               const feedback = json.feedback_score
               badgeData.text[0] = getLabel('score', data)
               if (feedback != null) {
-                badgeData.text[1] = feedback + '%'
+                badgeData.text[1] = `${feedback}%`
                 badgeData.colorscheme = coveragePercentageColor(feedback)
               } else {
                 badgeData.text[1] = 'unknown'
diff --git a/services/puppetforge/puppetforge-users.service.js b/services/puppetforge/puppetforge-users.service.js
index cab8abf23f..3e2bfb36af 100644
--- a/services/puppetforge/puppetforge-users.service.js
+++ b/services/puppetforge/puppetforge-users.service.js
@@ -18,7 +18,7 @@ module.exports = class PuppetforgeUsers extends LegacyService {
         const format = match[3]
         const options = {
           json: true,
-          uri: 'https://forgeapi.puppetlabs.com/v3/users/' + user,
+          uri: `https://forgeapi.puppetlabs.com/v3/users/${user}`,
         }
         const badgeData = getBadgeData('puppetforge', data)
         request(options, (err, res, json) => {
diff --git a/services/redmine/redmine.service.js b/services/redmine/redmine.service.js
index 67024b77a1..2b53587810 100644
--- a/services/redmine/redmine.service.js
+++ b/services/redmine/redmine.service.js
@@ -16,7 +16,7 @@ module.exports = class Redmine extends LegacyService {
         const format = match[3]
         const options = {
           method: 'GET',
-          uri: 'https://www.redmine.org/plugins/' + plugin + '.xml',
+          uri: `https://www.redmine.org/plugins/${plugin}.xml`,
         }
 
         const badgeData = getBadgeData(type, data)
@@ -35,7 +35,7 @@ module.exports = class Redmine extends LegacyService {
 
               switch (type) {
                 case 'rating':
-                  badgeData.text[1] = rating + '/5.0'
+                  badgeData.text[1] = `${rating}/5.0`
                   break
                 case 'stars':
                   badgeData.text[1] = starRating(Math.round(rating))
diff --git a/services/scrutinizer/scrutinizer.service.js b/services/scrutinizer/scrutinizer.service.js
index 7878936da8..493f512a02 100644
--- a/services/scrutinizer/scrutinizer.service.js
+++ b/services/scrutinizer/scrutinizer.service.js
@@ -72,7 +72,7 @@ module.exports = class Scrutinizer extends LegacyService {
                 badgeData.text[1] = 'unknown'
                 badgeData.colorscheme = 'gray'
               } else {
-                badgeData.text[1] = percentage.toFixed(0) + '%'
+                badgeData.text[1] = `${percentage.toFixed(0)}%`
                 badgeData.colorscheme = coveragePercentageColor(percentage)
               }
             } else if (type === 'build') {
diff --git a/services/sensiolabs/sensiolabs.service.js b/services/sensiolabs/sensiolabs.service.js
index ff0bfdbe61..3a1965f367 100644
--- a/services/sensiolabs/sensiolabs.service.js
+++ b/services/sensiolabs/sensiolabs.service.js
@@ -32,7 +32,7 @@ module.exports = class Sensiolabs extends LegacyService {
         const format = match[2]
         const options = {
           method: 'GET',
-          uri: 'https://insight.sensiolabs.com/api/projects/' + projectUuid,
+          uri: `https://insight.sensiolabs.com/api/projects/${projectUuid}`,
           headers: {
             Accept: 'application/vnd.com.sensiolabs.insight+xml',
           },
diff --git a/services/shippable/shippable.service.js b/services/shippable/shippable.service.js
index bc451bd2d5..f8b9fb055d 100644
--- a/services/shippable/shippable.service.js
+++ b/services/shippable/shippable.service.js
@@ -56,8 +56,7 @@ module.exports = class Shippable extends LegacyService {
           targetBranch = 'master'
         }
         const format = match[3]
-        const url =
-          'https://api.shippable.com/projects/' + projectId + '/branchRunStatus'
+        const url = `https://api.shippable.com/projects/${projectId}/branchRunStatus`
         const options = {
           method: 'GET',
           uri: url,
diff --git a/services/sonarqube/sonarqube.service.js b/services/sonarqube/sonarqube.service.js
index 19f5f577bc..b491c2405b 100644
--- a/services/sonarqube/sonarqube.service.js
+++ b/services/sonarqube/sonarqube.service.js
@@ -64,21 +64,12 @@ module.exports = class Sonarqube extends LegacyService {
         const useLegacyApi = !!version && version < 5.4
 
         const uri = useLegacyApi
-          ? scheme +
-            '://' +
-            serverUrl +
-            '/api/resources?resource=' +
-            buildType +
-            '&depth=0&metrics=' +
-            encodeURIComponent(sonarMetricName) +
-            '&includetrends=true'
-          : scheme +
-            '://' +
-            serverUrl +
-            '/api/measures/component?componentKey=' +
-            buildType +
-            '&metricKeys=' +
-            encodeURIComponent(sonarMetricName)
+          ? `${scheme}://${serverUrl}/api/resources?resource=${buildType}&depth=0&metrics=${encodeURIComponent(
+              sonarMetricName
+            )}&includetrends=true`
+          : `${scheme}://${serverUrl}/api/measures/component?componentKey=${buildType}&metricKeys=${encodeURIComponent(
+              sonarMetricName
+            )}`
 
         const options = {
           uri,
@@ -116,7 +107,7 @@ module.exports = class Sonarqube extends LegacyService {
             }
 
             if (metricName.indexOf('coverage') !== -1) {
-              badgeData.text[1] = value.toFixed(0) + '%'
+              badgeData.text[1] = `${value.toFixed(0)}%`
               badgeData.colorscheme = coveragePercentageColor(value)
             } else if (/^\w+_violations$/.test(metricName)) {
               badgeData.text[1] = value
@@ -135,7 +126,7 @@ module.exports = class Sonarqube extends LegacyService {
                 }
               }
             } else if (metricName === 'fortify-security-rating') {
-              badgeData.text[1] = value + '/5'
+              badgeData.text[1] = `${value}/5`
 
               if (value === 0) {
                 badgeData.colorscheme = 'red'
@@ -168,7 +159,7 @@ module.exports = class Sonarqube extends LegacyService {
                 //Some metrics higher % is better
                 colorValue = 100 - value
               }
-              badgeData.text[1] = value + '%'
+              badgeData.text[1] = `${value}%`
               if (colorValue >= 100) {
                 badgeData.colorscheme = 'red'
               } else if (colorValue >= 50) {
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index a9acb00a0f..24422a99b5 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -55,12 +55,7 @@ module.exports = class Sourceforge extends LegacyService {
         const project = match[2] // eg, 'sevenzip`.
         const folder = match[3]
         const format = match[4]
-        let apiUrl =
-          'http://sourceforge.net/projects/' +
-          project +
-          '/files/' +
-          folder +
-          '/stats/json'
+        let apiUrl = `http://sourceforge.net/projects/${project}/files/${folder}/stats/json`
         const badgeData = getBadgeData('sourceforge', data)
         let timePeriod, startDate
         badgeData.text[0] = getLabel('downloads', data)
@@ -84,11 +79,9 @@ module.exports = class Sourceforge extends LegacyService {
             timePeriod = ''
             break
         }
-        apiUrl +=
-          '?start_date=' +
-          startDate.format('YYYY-MM-DD') +
-          '&end_date=' +
-          endDate.format('YYYY-MM-DD')
+        apiUrl += `?start_date=${startDate.format(
+          'YYYY-MM-DD'
+        )}&end_date=${endDate.format('YYYY-MM-DD')}`
         request(apiUrl, (err, res, buffer) => {
           if (err != null) {
             badgeData.text[1] = 'inaccessible'
diff --git a/services/sourcegraph/sourcegraph.service.js b/services/sourcegraph/sourcegraph.service.js
index 20eac25283..e1b95e75ff 100644
--- a/services/sourcegraph/sourcegraph.service.js
+++ b/services/sourcegraph/sourcegraph.service.js
@@ -29,8 +29,7 @@ module.exports = class Sourcegraph extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const repo = match[1]
         const format = match[2]
-        const apiUrl =
-          'https://sourcegraph.com/.api/repos/' + repo + '/-/shield'
+        const apiUrl = `https://sourcegraph.com/.api/repos/${repo}/-/shield`
         const badgeData = getBadgeData('used by', data)
         request(apiUrl, (err, res, buffer) => {
           if (err != null) {
diff --git a/services/stackexchange/stackexchange.service.js b/services/stackexchange/stackexchange.service.js
index b7b8dace01..25a28d2047 100644
--- a/services/stackexchange/stackexchange.service.js
+++ b/services/stackexchange/stackexchange.service.js
@@ -19,13 +19,13 @@ module.exports = class StackExchange extends LegacyService {
         const format = match[4]
         let path
         if (info === 'r') {
-          path = 'users/' + item
+          path = `users/${item}`
         } else if (info === 't') {
-          path = 'tags/' + item + '/info'
+          path = `tags/${item}/info`
         }
         const options = {
           method: 'GET',
-          uri: 'https://api.stackexchange.com/2.2/' + path + '?site=' + site,
+          uri: `https://api.stackexchange.com/2.2/${path}?site=${site}`,
           gzip: true,
         }
         const badgeData = getBadgeData(site, data)
@@ -45,7 +45,7 @@ module.exports = class StackExchange extends LegacyService {
 
             if (info === 'r') {
               const reputation = parsedData.items[0].reputation
-              badgeData.text[0] = getLabel(site + ' reputation', data)
+              badgeData.text[0] = getLabel(`${site} reputation`, data)
               badgeData.text[1] = metric(reputation)
               badgeData.colorscheme = floorCountColor(1000, 10000, 20000)
             } else if (info === 't') {
diff --git a/services/suggest/suggest.tester.js b/services/suggest/suggest.tester.js
index fbac8b5937..71d2177168 100644
--- a/services/suggest/suggest.tester.js
+++ b/services/suggest/suggest.tester.js
@@ -14,7 +14,7 @@ const t = new ServiceTester({
 module.exports = t
 
 t.create('issues, forks, stars and twitter')
-  .get('/v1?url=' + encodeURIComponent('https://github.com/atom/atom'))
+  .get(`/v1?url=${encodeURIComponent('https://github.com/atom/atom')}`)
   // suggest resource requires this header value
   .expectJSON('badges.?', {
     name: 'GitHub issues',
@@ -40,7 +40,7 @@ t.create('issues, forks, stars and twitter')
   })
 
 t.create('license')
-  .get('/v1?url=' + encodeURIComponent('https://github.com/atom/atom'))
+  .get(`/v1?url=${encodeURIComponent('https://github.com/atom/atom')}`)
   .expectJSON('badges.?', {
     name: 'GitHub license',
     link: 'https://github.com/atom/atom/blob/master/LICENSE.md',
@@ -48,7 +48,7 @@ t.create('license')
   })
 
 t.create('license for non-existing project')
-  .get('/v1?url=' + encodeURIComponent('https://github.com/atom/atom'))
+  .get(`/v1?url=${encodeURIComponent('https://github.com/atom/atom')}`)
   .intercept(nock =>
     nock('https://api.github.com')
       .get(/\/repos\/atom\/atom\/license/)
@@ -61,7 +61,7 @@ t.create('license for non-existing project')
   })
 
 t.create('license when json response is invalid')
-  .get('/v1?url=' + encodeURIComponent('https://github.com/atom/atom'))
+  .get(`/v1?url=${encodeURIComponent('https://github.com/atom/atom')}`)
   .intercept(nock =>
     nock('https://api.github.com')
       .get(/\/repos\/atom\/atom\/license/)
@@ -74,7 +74,7 @@ t.create('license when json response is invalid')
   })
 
 t.create('license when html_url not found in GitHub api response')
-  .get('/v1?url=' + encodeURIComponent('https://github.com/atom/atom'))
+  .get(`/v1?url=${encodeURIComponent('https://github.com/atom/atom')}`)
   .intercept(nock =>
     nock('https://api.github.com')
       .get(/\/repos\/atom\/atom\/license/)
diff --git a/services/teamcity/teamcity-build.service.js b/services/teamcity/teamcity-build.service.js
index 044f5d0e10..5fff43b7e0 100644
--- a/services/teamcity/teamcity-build.service.js
+++ b/services/teamcity/teamcity-build.service.js
@@ -12,7 +12,7 @@ function teamcityBadge(
   sendBadge,
   request
 ) {
-  const apiUrl = url + '/app/rest/builds/buildType:(id:' + buildId + ')?guest=1'
+  const apiUrl = `${url}/app/rest/builds/buildType:(id:${buildId})?guest=1`
   const badgeData = getBadgeData('build', data)
   request(
     apiUrl,
@@ -104,7 +104,7 @@ module.exports = class TeamcityBuild extends LegacyService {
         const buildType = match[4] // eg, `bt428`.
         const format = match[5]
         teamcityBadge(
-          scheme + '://' + serverUrl,
+          `${scheme}://${serverUrl}`,
           buildType,
           advanced,
           format,
diff --git a/services/teamcity/teamcity-coverage.service.js b/services/teamcity/teamcity-coverage.service.js
index f9220da5cf..9cc22b5acf 100644
--- a/services/teamcity/teamcity-coverage.service.js
+++ b/services/teamcity/teamcity-coverage.service.js
@@ -33,10 +33,7 @@ module.exports = class TeamcityCoverage extends LegacyService {
       cache((data, match, sendBadge, request) => {
         const buildType = match[1] // eg, `bt428`.
         const format = match[2]
-        const apiUrl =
-          'http://teamcity.codebetter.com/app/rest/builds/buildType:(id:' +
-          buildType +
-          ')/statistics?guest=1'
+        const apiUrl = `http://teamcity.codebetter.com/app/rest/builds/buildType:(id:${buildType})/statistics?guest=1`
         const badgeData = getBadgeData('coverage', data)
         request(
           apiUrl,
@@ -67,7 +64,7 @@ module.exports = class TeamcityCoverage extends LegacyService {
               }
 
               const percentage = (covered / total) * 100
-              badgeData.text[1] = percentage.toFixed(0) + '%'
+              badgeData.text[1] = `${percentage.toFixed(0)}%`
               badgeData.colorscheme = coveragePercentageColor(percentage)
               sendBadge(format, badgeData)
             } catch (e) {
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index 828471b03d..9eeff263cb 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -65,13 +65,10 @@ module.exports = class TravisBuild extends LegacyService {
         request(options, (err, res) => {
           if (err != null) {
             log.error(
-              'Travis error: data:' +
-                JSON.stringify(data) +
-                '\nStack: ' +
-                err.stack
+              `Travis error: data:${JSON.stringify(data)}\nStack: ${err.stack}`
             )
             if (res) {
-              log.error('' + res)
+              log.error(`${res}`)
             }
           }
           if (checkErrorResponse(badgeData, err, res)) {
diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js
index 0f8f660070..57b1795e5f 100644
--- a/services/travis/travis-php-version.service.js
+++ b/services/travis/travis-php-version.service.js
@@ -47,7 +47,7 @@ module.exports = class TravisPhpVersion extends LegacyService {
               if (err !== null) {
                 log.error(`Travis CI error: ${err.stack}`)
                 if (res) {
-                  log.error('' + res)
+                  log.error(`${res}`)
                 }
                 badgeData.text[1] = 'invalid'
                 sendBadge(format, badgeData)
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index a19593e4f8..6680dd31d6 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -35,15 +35,15 @@ class TwitterUrl extends LegacyService {
         const scheme = match[1] // eg, https
         const path = match[2] // eg, shields.io
         const format = match[3]
-        const page = encodeURIComponent(scheme + '://' + path)
+        const page = encodeURIComponent(`${scheme}://${path}`)
         // The URL API died: #568.
         //var url = 'http://cdn.api.twitter.com/1/urls/count.json?url=' + page;
         const badgeData = getBadgeData('tweet', data)
         if (badgeData.template === 'social') {
           badgeData.logo = getLogo('twitter', data)
           badgeData.links = [
-            'https://twitter.com/intent/tweet?text=Wow:&url=' + page,
-            'https://twitter.com/search?q=' + page,
+            `https://twitter.com/intent/tweet?text=Wow:&url=${page}`,
+            `https://twitter.com/search?q=${page}`,
           ]
         }
         badgeData.text[1] = ''
@@ -83,11 +83,9 @@ class TwitterFollow extends LegacyService {
         const user = match[1] // eg, shields_io
         const format = match[2]
         const options = {
-          url:
-            'http://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=' +
-            user,
+          url: `http://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=${user}`,
         }
-        const badgeData = getBadgeData('follow @' + user, data)
+        const badgeData = getBadgeData(`follow @${user}`, data)
 
         badgeData.colorscheme = null
         badgeData.colorB = '#55ACEE'
@@ -95,8 +93,8 @@ class TwitterFollow extends LegacyService {
           badgeData.logo = getLogo('twitter', data)
         }
         badgeData.links = [
-          'https://twitter.com/intent/follow?screen_name=' + user,
-          'https://twitter.com/' + user + '/followers',
+          `https://twitter.com/intent/follow?screen_name=${user}`,
+          `https://twitter.com/${user}/followers`,
         ]
         badgeData.text[1] = ''
         request(options, (err, res, buffer) => {
diff --git a/services/vaadin-directory/vaadin-directory.service.js b/services/vaadin-directory/vaadin-directory.service.js
index cf344f56d8..7b08172e8e 100644
--- a/services/vaadin-directory/vaadin-directory.service.js
+++ b/services/vaadin-directory/vaadin-directory.service.js
@@ -21,9 +21,7 @@ module.exports = class VaadinDirectory extends LegacyService {
         const urlIdentifier = match[2] // Name of repository
         const format = match[3] // Format
         // API URL which contains also authentication info
-        const apiUrl =
-          'https://vaadin.com/vaadincom/directory-service/components/search/findByUrlIdentifier?projection=summary&urlIdentifier=' +
-          urlIdentifier
+        const apiUrl = `https://vaadin.com/vaadincom/directory-service/components/search/findByUrlIdentifier?projection=summary&urlIdentifier=${urlIdentifier}`
 
         // Set left-side text to 'Vaadin-Directory' by default
         const badgeData = getBadgeData('vaadin directory', data)
@@ -63,7 +61,7 @@ module.exports = class VaadinDirectory extends LegacyService {
               case 'rating': // rating
                 badgeData.text[0] = getLabel('rating', data)
                 if (!isNaN(rating)) {
-                  badgeData.text[1] = rating + '/5'
+                  badgeData.text[1] = `${rating}/5`
                   badgeData.colorscheme = floorCountColor(rating, 2, 3, 4)
                 }
                 break
@@ -71,7 +69,7 @@ module.exports = class VaadinDirectory extends LegacyService {
               case 'rating-count':
                 badgeData.text[0] = getLabel('rating count', data)
                 if (ratingCount && ratingCount !== 0) {
-                  badgeData.text[1] = metric(data.ratingCount) + ' total'
+                  badgeData.text[1] = `${metric(data.ratingCount)} total`
                   badgeData.colorscheme = floorCountColor(
                     data.ratingCount,
                     5,
diff --git a/services/vscode-marketplace/vscode-marketplace.service.js b/services/vscode-marketplace/vscode-marketplace.service.js
index 31ad511001..61302e1608 100644
--- a/services/vscode-marketplace/vscode-marketplace.service.js
+++ b/services/vscode-marketplace/vscode-marketplace.service.js
@@ -83,7 +83,7 @@ module.exports = class VscodeMarketplace extends LegacyService {
                   'averagerating'
                 ).toFixed(2)
                 const totalrate = getVscodeStatistic(buffer, 'ratingcount')
-                badgeData.text[1] = rate + '/5 (' + totalrate + ')'
+                badgeData.text[1] = `${rate}/5 (${totalrate})`
                 badgeData.colorscheme = floorCountColor(rate, 2, 3, 4)
                 break
               }
diff --git a/services/waffle/waffle.service.js b/services/waffle/waffle.service.js
index 4996542c1f..db3eb1c4a6 100644
--- a/services/waffle/waffle.service.js
+++ b/services/waffle/waffle.service.js
@@ -63,7 +63,7 @@ module.exports = class Waffle extends LegacyService {
               }
             }
             badgeData.text[0] = getLabel(ghLabel, data)
-            badgeData.text[1] = '' + count
+            badgeData.text[1] = `${count}`
             badgeData.colorscheme = null
             badgeData.colorB = makeColorB(color, data)
             sendBadge(format, badgeData)
diff --git a/services/website/website.service.js b/services/website/website.service.js
index b2ec5131e2..7be5035710 100644
--- a/services/website/website.service.js
+++ b/services/website/website.service.js
@@ -110,7 +110,7 @@ module.exports = class Website extends LegacyService {
         const userProtocol = match[11]
         const userURI = match[12]
         const format = match[13]
-        const withProtocolURI = userProtocol + '://' + userURI
+        const withProtocolURI = `${userProtocol}://${userURI}`
         const options = {
           method: 'HEAD',
           uri: withProtocolURI,
diff --git a/services/wheelmap/wheelmap.service.js b/services/wheelmap/wheelmap.service.js
index e6f25361ff..82937b45ae 100644
--- a/services/wheelmap/wheelmap.service.js
+++ b/services/wheelmap/wheelmap.service.js
@@ -32,7 +32,7 @@ module.exports = class Wheelmap extends LegacyService {
         const options = {
           method: 'GET',
           json: true,
-          uri: 'http://wheelmap.org/nodes/' + nodeId + '.json',
+          uri: `http://wheelmap.org/nodes/${nodeId}.json`,
         }
         const badgeData = getBadgeData('wheelmap', data)
         // eslint-disable-next-line handle-callback-err
-- 
GitLab