diff --git a/.circleci/config.yml b/.circleci/config.yml
index 9132a89033071c3373adfee2f65e3600dab685bb..f1605619faa6c0e4c4269611389d71ad9f193fb2 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -53,6 +53,11 @@ jobs:
           when: always
           command: npm run test:integration
 
+      - run:
+          name: Tests for gh-badges package
+          when: always
+          command: npm run test:js:package
+
       - run:
           name: 'Prettier check (quick fix: `npm run prettier`)'
           when: always
@@ -89,6 +94,11 @@ jobs:
           when: always
           command: npm run test:integration
 
+      - run:
+          name: Tests for gh-badges package
+          when: always
+          command: npm run test:js:package
+
       - run:
           name: 'Prettier check (quick fix: `npm run prettier`)'
           when: always
diff --git a/.gitignore b/.gitignore
index 1a6cd4d5502db860434233db4dfcdaf6ff1a9a72..d472d817804f690e7dc3b61dcad1a792acdc64e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
 /private
 /index.html
 /shields.env
+gh-badges/package-lock.json
 
 # Folder view configuration files
 .DS_Store
diff --git a/Makefile b/Makefile
index 30ff010882dd10e8832eaef561f11319e88f2fce..d21ff444cacda8018af8a4fa0e7a24203176be15 100644
--- a/Makefile
+++ b/Makefile
@@ -8,11 +8,7 @@ FRONTEND_TMP=${TMPDIR}shields-frontend-deploy
 # pushing secrets to GitHub, this branch is configured to reject pushes.
 WORKING_BRANCH=server-deploy-working-branch
 
-all: website favicon test
-
-favicon:
-	# This isn't working right now. See https://github.com/badges/shields/issues/1788
-	node lib/badge-cli.js '' '' '#bada55' .png > favicon.png
+all: website test
 
 website:
 	LONG_CACHE=false npm run build
@@ -86,4 +82,4 @@ deploy-heroku:
 test:
 	npm test
 
-.PHONY: all favicon website deploy prepare-server-deploy clean-server-deploy deploy-s0 deploy-s1 deploy-s2 push-s0 push-s1 push-s2 deploy-gh-pages deploy-gh-pages-clean deploy-heroku setup redis test
+.PHONY: all website deploy prepare-server-deploy clean-server-deploy deploy-s0 deploy-s1 deploy-s2 push-s0 push-s1 push-s2 deploy-gh-pages deploy-gh-pages-clean deploy-heroku setup redis test
diff --git a/README.md b/README.md
index 75d384c066d3c693fa6c66817b8c7dec8a59f967..30b2521ac259806cbbc1f286e5e2e69e15e5e321 100644
--- a/README.md
+++ b/README.md
@@ -31,12 +31,20 @@ continuous integration services, package registries, distributions, app
 stores, social networks, code coverage services, and code analysis services.
 Every month it serves over 470 million images.
 
-In addition to hosting the shields.io frontend and server code, this monorepo
-hosts an [NPM library for generating badges][gh-badges], and the badge design
-specification.
+This repo hosts:
+
+* The [Shields.io][shields.io] frontend and server code
+* An [NPM library for generating badges][gh-badges]
+    * [documentation][gh-badges-docs]
+    * [changelog][gh-badges-changelog]
+* The [badge design specification][badge-spec]
+
 
 [shields.io]: https://shields.io/
 [gh-badges]: https://www.npmjs.com/package/gh-badges
+[badge-spec]: https://github.com/badges/shields/tree/master/spec
+[gh-badges-docs]: https://github.com/badges/shields/tree/master/gh-badges/README.md
+[gh-badges-changelog]: https://github.com/badges/shields/tree/master/gh-badges/CHANGELOG.md
 
 
 Examples
@@ -81,35 +89,6 @@ You can read a [tutorial on how to add a badge][tutorial].
 [contributing]: CONTRIBUTING.md
 
 
-Using the badge library
------------------------
-
-```sh
-npm install -g gh-badges
-badge build passed :green .png > mybadge.png
-```
-
-```js
-const { BadgeFactory } = require('gh-badges')
-
-const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' })
-
-const format = {
-  text: ['build', 'passed'],
-  colorscheme: 'green',
-  template: 'flat',
-}
-
-const svg = bf.create(format)
-```
-
-View the [documentation for gh-badges][gh-badges doc].
-
-[![npm version](http://img.shields.io/npm/v/gh-badges.svg)](https://npmjs.org/package/gh-badges)
-
-[gh-badges doc]: https://github.com/badges/shields/blob/master/doc/gh-badges.md
-
-
 Development
 -----------
 
diff --git a/gh-badges/.npmignore b/gh-badges/.npmignore
new file mode 100644
index 0000000000000000000000000000000000000000..e31b519306080e12af5441c6678814eb5f79d0b5
--- /dev/null
+++ b/gh-badges/.npmignore
@@ -0,0 +1,2 @@
+lib/make-badge-test-helpers.js
+lib/**/*.spec.js
diff --git a/gh-badges/CHANGELOG.md b/gh-badges/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..26d639ad36be316251b0c57e32ea564bd670c2e8
--- /dev/null
+++ b/gh-badges/CHANGELOG.md
@@ -0,0 +1,74 @@
+# Changelog
+
+## 2.0.0 - 2018-11-09
+
+gh-badges v2.0.0 declares a new public interface which is synchronous.
+If your version 1.3.0 code looked like this:
+
+```js
+const badge = require('gh-badges')
+
+const format = {
+  text: ['build', 'passed'],
+  colorscheme: 'green',
+  template: 'flat',
+}
+
+badge.loadFont('/path/to/Verdana.ttf', err => {
+  badge(format, (svg, err) => {
+    // svg is a string containing your badge
+  })
+})
+```
+
+To upgrade to version 2.0.0, refactor you code to:
+
+```js
+const { BadgeFactory } = require('gh-badges')
+
+const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' })
+
+const format = {
+  text: ['build', 'passed'],
+  colorscheme: 'green',
+  template: 'flat',
+}
+
+const svg = bf.create(format)
+```
+
+You can generate badges without a copy of Verdana, however font width computation is approximate and badges may be distorted.
+
+```js
+const bf = new BadgeFactory({ fallbackFontPath: 'Helvetica' })
+```
+
+
+## 1.3.0 - 2016-09-07
+
+Add support for optionally specifying the path to `Verdana.ttf`. In earlier versions, the file needed to be in the directory containing Shields.
+
+Without font path:
+
+```js
+const badge = require('gh-badges')
+
+badge({ text: [ 'build', 'passed' ], colorscheme: 'green' },
+  (svg, err) => {
+    // svg is a string containing your badge
+  })
+```
+
+With font path:
+
+```js
+const badge = require('gh-badges')
+
+// Optional step, to have accurate text width computation.
+badge.loadFont('/path/to/Verdana.ttf', err => {
+  badge({ text: ['build', 'passed'], colorscheme: 'green', template: 'flat' },
+    (svg, err) => {
+      // svg is a string containing your badge
+    })
+})
+```
diff --git a/gh-badges/LICENSE b/gh-badges/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..670154e3538863b2d9891fd5483160fbdfc89164
--- /dev/null
+++ b/gh-badges/LICENSE
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display, communicate,
+  and translate a Work;
+
+  ii. moral rights retained by the original author(s) and/or performer(s);
+
+  iii. publicity and privacy rights pertaining to a person's image or likeness
+  depicted in a Work;
+
+  iv. rights protecting against unfair competition in regards to a Work,
+  subject to the limitations in paragraph 4(a), below;
+
+  v. rights protecting the extraction, dissemination, use and reuse of data in
+  a Work;
+
+  vi. database rights (such as those arising under Directive 96/9/EC of the
+  European Parliament and of the Council of 11 March 1996 on the legal
+  protection of databases, and under any national implementation thereof,
+  including any amended or successor version of such directive); and
+
+  vii. other similar, equivalent or corresponding rights throughout the world
+  based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+  a. No trademark or patent rights held by Affirmer are waived, abandoned,
+  surrendered, licensed or otherwise affected by this document.
+
+  b. Affirmer offers the Work as-is and makes no representations or warranties
+  of any kind concerning the Work, express, implied, statutory or otherwise,
+  including without limitation warranties of title, merchantability, fitness
+  for a particular purpose, non infringement, or the absence of latent or
+  other defects, accuracy, or the present or absence of errors, whether or not
+  discoverable, all to the greatest extent permissible under applicable law.
+
+  c. Affirmer disclaims responsibility for clearing rights of other persons
+  that may apply to the Work or any use thereof, including without limitation
+  any person's Copyright and Related Rights in the Work. Further, Affirmer
+  disclaims responsibility for obtaining any necessary consents, permissions
+  or other rights required for any use of the Work.
+
+  d. Affirmer understands and acknowledges that Creative Commons is not a
+  party to this document and has no duty or obligation with respect to this
+  CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
diff --git a/doc/gh-badges.md b/gh-badges/README.md
similarity index 66%
rename from doc/gh-badges.md
rename to gh-badges/README.md
index f650e861a91d418431919d2204c6525ce171f168..0150bc090b7b6f7e7950b089e62da5266d607756 100644
--- a/doc/gh-badges.md
+++ b/gh-badges/README.md
@@ -1,5 +1,40 @@
-Format
-------
+# gh-badges
+
+[![npm version](https://img.shields.io/npm/v/gh-badges.svg)](https://npmjs.org/package/gh-badges)
+[![npm license](https://img.shields.io/npm/l/gh-badges.svg)](https://npmjs.org/package/gh-badges)
+
+## Installation
+
+```sh
+npm install gh-badges
+```
+
+## Usage
+
+### On the console
+
+```sh
+npm install -g gh-badges
+badge build passed :green .png > mybadge.png
+```
+
+### As a library
+
+```js
+const { BadgeFactory } = require('gh-badges')
+
+const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' })
+
+const format = {
+  text: ['build', 'passed'],
+  colorscheme: 'green',
+  template: 'flat',
+}
+
+const svg = bf.create(format)
+```
+
+## Format
 
 The format is the following:
 
@@ -22,14 +57,13 @@ The format is the following:
 
 ### See also
 
-- [colorscheme.json](../lib/colorscheme.json) for the `colorscheme` option
-- [templates/](../templates) for the `template` option
+- [colorscheme.json](./lib/colorscheme.json) for the `colorscheme` option
+- [templates/](./templates) for the `template` option
 
 
-Defaults
---------
+## Defaults
 
-If you want to add a colorscheme, head to `lib/colorscheme.json`. Each scheme
+If you want to use a colorscheme, head to `lib/colorscheme.json`. Each scheme
 has a name and a [CSS/SVG color][] for the color used in the first box (for the
 first piece of text, field `colorA`) and for the one used in the second box
 (field `colorB`).
@@ -50,8 +84,7 @@ You can also use the `"colorA"` and `"colorB"` fields directly in the badges if
 you don't want to make a color scheme for it. In that case, remove the
 `"colorscheme"` field altogether.
 
-Text Width Computation
-----------------------
+## Text Width Computation
 
 `BadgeFactory`'s constructor takes an optional boolean
 `precomputeWidths` parameter which defaults to `false`.
diff --git a/lib/badge-cli.js b/gh-badges/lib/badge-cli.js
similarity index 100%
rename from lib/badge-cli.js
rename to gh-badges/lib/badge-cli.js
diff --git a/lib/badge-cli.spec.js b/gh-badges/lib/badge-cli.spec.js
similarity index 85%
rename from lib/badge-cli.spec.js
rename to gh-badges/lib/badge-cli.spec.js
index 8464633e8e94e005a0df6314946d86726d1bdf93..8f9225ef05a8ac5fae43c0a5521cd4763a165dac 100644
--- a/lib/badge-cli.spec.js
+++ b/gh-badges/lib/badge-cli.spec.js
@@ -1,15 +1,18 @@
 'use strict'
 
-const { expect } = require('chai')
+const path = require('path')
 const isPng = require('is-png')
 const isSvg = require('is-svg')
 const { spawn } = require('child-process-promise')
 
-// https://github.com/badges/shields/pull/1419#discussion_r159957055
-require('./register-chai-plugins.spec')
+const { expect, use } = require('chai')
+use(require('chai-string'))
+use(require('sinon-chai'))
 
 function runCli(args) {
-  return spawn('node', ['lib/badge-cli.js', ...args], { capture: ['stdout'] })
+  return spawn('node', [path.join(__dirname, 'badge-cli.js'), ...args], {
+    capture: ['stdout'],
+  })
 }
 
 describe('The CLI', function() {
diff --git a/lib/colorscheme.json b/gh-badges/lib/colorscheme.json
similarity index 100%
rename from lib/colorscheme.json
rename to gh-badges/lib/colorscheme.json
diff --git a/lib/defaults.js b/gh-badges/lib/defaults.js
similarity index 100%
rename from lib/defaults.js
rename to gh-badges/lib/defaults.js
diff --git a/lib/gh-badges.js b/gh-badges/lib/index.js
similarity index 91%
rename from lib/gh-badges.js
rename to gh-badges/lib/index.js
index d60218663c1e537766db1c00a9bacb1e6f6231dd..c0ed0bec570346deef9545d4a596e56b4350fc0c 100644
--- a/lib/gh-badges.js
+++ b/gh-badges/lib/index.js
@@ -21,7 +21,7 @@ class BadgeFactory {
    * @param {string} format.format
    * @param {string} format.template
    * @return {string} Badge in SVG or JSON format
-   * @see https://github.com/badges/shields/blob/master/doc/gh-badges.md
+   * @see https://github.com/badges/shields/tree/master/gh-badges/README.md
    */
   create(format) {
     return makeBadge(this.measurer, format)
diff --git a/lib/lru-cache.js b/gh-badges/lib/lru-cache.js
similarity index 100%
rename from lib/lru-cache.js
rename to gh-badges/lib/lru-cache.js
diff --git a/lib/lru-cache.spec.js b/gh-badges/lib/lru-cache.spec.js
similarity index 100%
rename from lib/lru-cache.spec.js
rename to gh-badges/lib/lru-cache.spec.js
diff --git a/lib/make-badge-test-helpers.js b/gh-badges/lib/make-badge-test-helpers.js
similarity index 97%
rename from lib/make-badge-test-helpers.js
rename to gh-badges/lib/make-badge-test-helpers.js
index a2a87b5c31505d5378a804717bdb0c19791a7a25..6b54dfda6ec9ce8a850a9f35f341f6f49ddff012 100644
--- a/lib/make-badge-test-helpers.js
+++ b/gh-badges/lib/make-badge-test-helpers.js
@@ -9,6 +9,7 @@ module.exports = {
     path: path.join(
       __dirname,
       '..',
+      '..',
       'node_modules',
       'dejavu-fonts-ttf',
       'ttf',
diff --git a/lib/make-badge.js b/gh-badges/lib/make-badge.js
similarity index 100%
rename from lib/make-badge.js
rename to gh-badges/lib/make-badge.js
diff --git a/lib/make-badge.spec.js b/gh-badges/lib/make-badge.spec.js
similarity index 100%
rename from lib/make-badge.spec.js
rename to gh-badges/lib/make-badge.spec.js
diff --git a/lib/svg-to-img.js b/gh-badges/lib/svg-to-img.js
similarity index 100%
rename from lib/svg-to-img.js
rename to gh-badges/lib/svg-to-img.js
diff --git a/lib/svg-to-img.spec.js b/gh-badges/lib/svg-to-img.spec.js
similarity index 100%
rename from lib/svg-to-img.spec.js
rename to gh-badges/lib/svg-to-img.spec.js
diff --git a/lib/text-measurer.js b/gh-badges/lib/text-measurer.js
similarity index 100%
rename from lib/text-measurer.js
rename to gh-badges/lib/text-measurer.js
diff --git a/lib/text-measurer.spec.js b/gh-badges/lib/text-measurer.spec.js
similarity index 97%
rename from lib/text-measurer.spec.js
rename to gh-badges/lib/text-measurer.spec.js
index 2ea684aef9d727f2694f59d52f22af6c50927758..93241f60fb98222f62a3ba4766fb49374aa26bc1 100644
--- a/lib/text-measurer.spec.js
+++ b/gh-badges/lib/text-measurer.spec.js
@@ -5,7 +5,6 @@ const path = require('path')
 const fs = require('fs')
 const sinon = require('sinon')
 const { PDFKitTextMeasurer, QuickTextMeasurer } = require('./text-measurer')
-const { starRating } = require('./text-formatters')
 const defaults = require('./defaults')
 const testHelpers = require('./make-badge-test-helpers')
 const almostEqual = require('almost-equal')
@@ -120,7 +119,7 @@ function registerTests(fontPath, skip) {
     })
 
     context('when given non-ASCII strings', function() {
-      const strings = [starRating(3.5), '\u2026']
+      const strings = ['★★★½☆', '\u2026']
 
       strings.forEach(str => {
         it(`should measure '${str}' in parity with PDFKit`, function() {
diff --git a/gh-badges/package.json b/gh-badges/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..1814dbdcde7356c547d396b5dc4a8a1e7d829ec7
--- /dev/null
+++ b/gh-badges/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "gh-badges",
+  "version": "2.0.0",
+  "description": "Shields.io badge library",
+  "keywords": [
+    "GitHub",
+    "badge",
+    "SVG",
+    "image",
+    "shields.io"
+  ],
+  "main": "lib/index.js",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/badges/shields.git"
+  },
+  "author": "Thaddée Tyl <thaddee.tyl@gmail.com>",
+  "license": "CC0-1.0",
+  "bugs": {
+    "url": "https://github.com/badges/shields/issues"
+  },
+  "homepage": "http://shields.io",
+  "bin": {
+    "badge": "lib/badge-cli.js"
+  },
+  "engines": {
+    "node": ">= 8",
+    "npm": ">= 5"
+  },
+  "collective": {
+    "type": "opencollective",
+    "url": "https://opencollective.com/shields",
+    "logo": "https://opencollective.com/opencollective/logo.txt"
+  },
+  "dependencies": {
+    "dot": "~1.1.2",
+    "gm": "^1.23.0",
+    "is-css-color": "^1.0.0",
+    "pdfkit": "~0.8.0",
+    "svgo": "~1.1.1"
+  },
+  "scripts": {
+    "test": "echo 'Run tests from parent dir'; false"
+  }
+}
diff --git a/templates/_shields_test-template.json b/gh-badges/templates/_shields_test-template.json
similarity index 100%
rename from templates/_shields_test-template.json
rename to gh-badges/templates/_shields_test-template.json
diff --git a/templates/default-template.json b/gh-badges/templates/default-template.json
similarity index 100%
rename from templates/default-template.json
rename to gh-badges/templates/default-template.json
diff --git a/templates/flat-square-template.svg b/gh-badges/templates/flat-square-template.svg
similarity index 100%
rename from templates/flat-square-template.svg
rename to gh-badges/templates/flat-square-template.svg
diff --git a/templates/flat-template.svg b/gh-badges/templates/flat-template.svg
similarity index 100%
rename from templates/flat-template.svg
rename to gh-badges/templates/flat-template.svg
diff --git a/templates/for-the-badge-template.svg b/gh-badges/templates/for-the-badge-template.svg
similarity index 100%
rename from templates/for-the-badge-template.svg
rename to gh-badges/templates/for-the-badge-template.svg
diff --git a/templates/plastic-template.svg b/gh-badges/templates/plastic-template.svg
similarity index 100%
rename from templates/plastic-template.svg
rename to gh-badges/templates/plastic-template.svg
diff --git a/templates/popout-square-template.svg b/gh-badges/templates/popout-square-template.svg
similarity index 100%
rename from templates/popout-square-template.svg
rename to gh-badges/templates/popout-square-template.svg
diff --git a/templates/popout-template.svg b/gh-badges/templates/popout-template.svg
similarity index 100%
rename from templates/popout-template.svg
rename to gh-badges/templates/popout-template.svg
diff --git a/templates/social-template.svg b/gh-badges/templates/social-template.svg
similarity index 100%
rename from templates/social-template.svg
rename to gh-badges/templates/social-template.svg
diff --git a/lib/badge-data.js b/lib/badge-data.js
index 4a6954ed17af8aef97c7c45ef8e203402d077674..ddb2fb1ecce0245ddaf7b8e066391529b0cb7724 100644
--- a/lib/badge-data.js
+++ b/lib/badge-data.js
@@ -4,7 +4,7 @@ const isCSSColor = require('is-css-color')
 const logos = require('./load-logos')()
 const simpleIcons = require('./load-simple-icons')()
 const { svg2base64, isDataUri } = require('./logo-helper')
-const colorschemes = require('./colorscheme.json')
+const colorschemes = require('../gh-badges/lib/colorscheme.json')
 
 function toArray(val) {
   if (val === undefined) {
diff --git a/lib/refactoring-cli.js b/lib/refactoring-cli.js
index 46c587fddbc5e73f76dc6434599a83dce1912e3d..14217cbc247234f86dfae17e3527a0daf37b37e1 100644
--- a/lib/refactoring-cli.js
+++ b/lib/refactoring-cli.js
@@ -3,7 +3,7 @@
 const chalk = require('chalk')
 const mapValues = require('lodash.mapvalues')
 
-const colorscheme = require('../lib/colorscheme.json')
+const colorscheme = require('../gh-badges/lib/colorscheme.json')
 const colorsMap = mapValues(colorscheme, 'colorB')
 const { floorCount } = require('./color-formatters')
 const { loadServiceClasses } = require('../services')
diff --git a/lib/request-handler.js b/lib/request-handler.js
index 5cc5d28e7879d1047f8f51447b10bab245ccf8da..47c0a4f3c7ecf6a59c25f39c5d30500626cdda04 100644
--- a/lib/request-handler.js
+++ b/lib/request-handler.js
@@ -5,7 +5,7 @@ const domain = require('domain')
 const request = require('request')
 const { makeBadgeData: getBadgeData } = require('./badge-data')
 const log = require('./log')
-const LruCache = require('./lru-cache')
+const LruCache = require('../gh-badges/lib/lru-cache')
 const analytics = require('./analytics')
 const { makeSend } = require('./result-sender')
 const queryString = require('query-string')
diff --git a/lib/request-handler.spec.js b/lib/request-handler.spec.js
index 1adba41078891100486606b6624194bdd6956e70..31053b4119dff9c0170da249cbdfcaf1ec060204 100644
--- a/lib/request-handler.spec.js
+++ b/lib/request-handler.spec.js
@@ -13,7 +13,7 @@ const {
   _requestCache,
   getBadgeMaxAge,
 } = require('./request-handler')
-const testHelpers = require('./make-badge-test-helpers')
+const testHelpers = require('../gh-badges/lib/make-badge-test-helpers')
 
 const handleRequest = makeHandleRequestFn(testHelpers.makeBadge())
 
diff --git a/lib/result-sender.js b/lib/result-sender.js
index 875f1be48a05568d2ffb87371bfa0843464c44c0..36e09859ba6d63c3c0e4a88318153745194cda7b 100644
--- a/lib/result-sender.js
+++ b/lib/result-sender.js
@@ -2,7 +2,7 @@
 
 const stream = require('stream')
 const log = require('./log')
-const svg2img = require('./svg-to-img')
+const svg2img = require('../gh-badges/lib/svg-to-img')
 
 function streamFromString(str) {
   const newStream = new stream.Readable()
diff --git a/lib/server-config.js b/lib/server-config.js
index 90ebec8fb26588a9d6a2e177298ce74da9fcfa51..87aad29a0a001d5afd334b7a724e4b0b246f0fb1 100644
--- a/lib/server-config.js
+++ b/lib/server-config.js
@@ -5,7 +5,7 @@
 
 const url = require('url')
 const envFlag = require('node-env-flag')
-const defaults = require('./defaults')
+const defaults = require('../gh-badges/lib/defaults')
 
 function envArray(envVar, defaultValue, delimiter) {
   delimiter = delimiter || ','
diff --git a/now.json b/now.json
index 1cec99659cabeb2337ca11527986de4652b74397..a767168cc4320547da8e556b18178143fdc2a21f 100644
--- a/now.json
+++ b/now.json
@@ -7,6 +7,7 @@
     "package-lock.json",
     "build/",
     "frontend/",
+    "gh-badges/",
     "lib/",
     "logo/",
     "pages/",
diff --git a/package-lock.json b/package-lock.json
index 6bc5f8cfabb00c0431a5f1e590f2a64bce09bd64..be20a4a0941207f0614837e278842b9a3cdaf1d2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
-  "name": "gh-badges",
-  "version": "2.0.0",
+  "name": "shields.io",
+  "version": "0.0.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -6198,6 +6198,16 @@
         "assert-plus": "^1.0.0"
       }
     },
+    "gh-badges": {
+      "version": "file:gh-badges",
+      "requires": {
+        "dot": "~1.1.2",
+        "gm": "^1.23.0",
+        "is-css-color": "^1.0.0",
+        "pdfkit": "~0.8.0",
+        "svgo": "~1.1.1"
+      }
+    },
     "git-config-path": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz",
diff --git a/package.json b/package.json
index ee4135c12c0d8cc087503af9808e78836d5bd95d..73b8280e3e0ab69dc252d6440405042fb2d511b1 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,8 @@
 {
-  "name": "gh-badges",
-  "version": "2.0.0",
-  "description": "Official Shields.io badge library.",
+  "name": "shields.io",
+  "version": "0.0.0",
+  "description": "Shields.io server and frontend",
+  "private": true,
   "keywords": [
     "GitHub",
     "badge",
@@ -16,7 +17,6 @@
   },
   "license": "CC0-1.0",
   "author": "Thaddée Tyl <thaddee.tyl@gmail.com>",
-  "main": "lib/gh-badges.js",
   "repository": {
     "type": "git",
     "url": "https://github.com/badges/shields"
@@ -26,13 +26,12 @@
     "chalk": "^2.4.1",
     "check-node-version": "^3.1.0",
     "chrome-web-store-item-property": "~1.1.2",
-    "dot": "~1.1.2",
     "emojic": "^1.1.14",
     "escape-string-regexp": "^1.0.5",
     "fast-xml-parser": "^3.12.0",
     "fsos": "^1.1.3",
+    "gh-badges": "file:gh-badges",
     "glob": "^7.1.1",
-    "gm": "^1.23.0",
     "is-css-color": "^1.0.0",
     "joi": "14.0.4",
     "js-yaml": "^3.11.0",
@@ -45,7 +44,6 @@
     "moment": "^2.19.3",
     "node-env-flag": "^0.1.0",
     "path-to-regexp": "^2.4.0",
-    "pdfkit": "~0.8.0",
     "pretty-bytes": "^5.0.0",
     "priorityqueuejs": "^1.0.0",
     "prom-client": "^11.1.2",
@@ -55,13 +53,12 @@
     "request": "~2.88.0",
     "semver": "~5.6.0",
     "simple-icons": "1.9.13",
-    "svgo": "~1.1.1",
     "xml2js": "~0.4.16",
     "xmldom": "~0.1.27",
     "xpath": "~0.0.27"
   },
   "scripts": {
-    "coverage:test:server": "HANDLE_INTERNAL_ERRORS=false nyc node_modules/mocha/bin/_mocha \"*.spec.js\" \"lib/**/*.spec.js\" \"services/**/*.spec.js\"",
+    "coverage:test:server": "HANDLE_INTERNAL_ERRORS=false nyc node_modules/mocha/bin/_mocha \"*.spec.js\" \"lib/**/*.spec.js\" \"gh-badges/**/*.spec.js\" \"services/**/*.spec.js\"",
     "coverage:test:frontend": "NODE_ENV=mocha nyc node_modules/mocha/bin/_mocha --require @babel/polyfill --require @babel/register \"frontend/**/*.spec.js\"",
     "coverage:test:integration": "nyc node_modules/mocha/bin/_mocha \"lib/**/*.integration.js\" \"services/**/*.integration.js\"",
     "coverage:test:services": "nyc node_modules/mocha/bin/_mocha --delay lib/service-test-runner/cli.js",
@@ -75,13 +72,14 @@
     "danger": "danger",
     "test:js:frontend": "NODE_ENV=mocha mocha --require @babel/polyfill --require @babel/register \"frontend/**/*.spec.js\"",
     "test:js:server": "HANDLE_INTERNAL_ERRORS=false mocha \"*.spec.js\" \"lib/**/*.spec.js\" \"services/**/*.spec.js\"",
+    "test:js:package": "HANDLE_INTERNAL_ERRORS=false mocha \"gh-badges/**/*.spec.js\"",
     "test:integration": "mocha \"lib/**/*.integration.js\" \"services/**/*.integration.js\"",
     "test:services": "HANDLE_INTERNAL_ERRORS=false mocha --delay lib/service-test-runner/cli.js",
     "test:services:trace": "TRACE_SERVICES=true npm run test:services -- $*",
     "test:services:pr:prepare": "node lib/service-test-runner/pull-request-services-cli.js > pull-request-services.log",
     "test:services:pr:run": "HANDLE_INTERNAL_ERRORS=false mocha --delay lib/service-test-runner/cli.js --stdin < pull-request-services.log",
     "test:services:pr": "npm run test:services:pr:prepare && npm run test:services:pr:run",
-    "test": "npm run lint && npm run test:js:frontend && npm run test:js:server",
+    "test": "npm run lint && npm run test:js:frontend && npm run test:js:package && npm run test:js:server",
     "circle-images:build": "docker build -t shieldsio/shields-ci-node-8:${IMAGE_TAG} -f .circleci/images/node-8/Dockerfile . && docker build -t shieldsio/shields-ci-node-latest:${IMAGE_TAG} -f .circleci/images/node-latest/Dockerfile .",
     "circle-images:push": "docker push shieldsio/shields-ci-node-8:${IMAGE_TAG} && docker push shieldsio/shields-ci-node-latest:${IMAGE_TAG}",
     "depcheck": "check-node-version --node \">= 8.0\"",
@@ -105,21 +103,6 @@
       "git add"
     ]
   },
-  "bin": {
-    "badge": "lib/badge-cli.js"
-  },
-  "files": [
-    "README.md",
-    "lib/badge-cli.js",
-    "lib/make-badge.js",
-    "lib/colorscheme.json",
-    "lib/lru-cache.js",
-    "lib/text-measurer.js",
-    "lib/svg-to-img.js",
-    "lib/defaults.js",
-    "templates",
-    "logo"
-  ],
   "devDependencies": {
     "@babel/core": "^7.1.0",
     "@babel/plugin-proposal-class-properties": "^7.1.0",
diff --git a/server.js b/server.js
index 7aac2a71b5dec95e7490f08fe98d21d2edde4173..bd6ab288eac1287ac68d5e559d48ea7486a50e65 100644
--- a/server.js
+++ b/server.js
@@ -19,8 +19,8 @@ const GithubConstellation = require('./services/github/github-constellation')
 const PrometheusMetrics = require('./lib/sys/prometheus-metrics')
 const sysMonitor = require('./lib/sys/monitor')
 const log = require('./lib/log')
-const { makeMakeBadgeFn } = require('./lib/make-badge')
-const { QuickTextMeasurer } = require('./lib/text-measurer')
+const { makeMakeBadgeFn } = require('./gh-badges/lib/make-badge')
+const { QuickTextMeasurer } = require('./gh-badges/lib/text-measurer')
 const suggest = require('./lib/suggest')
 const {
   makeColorB,
diff --git a/server.spec.js b/server.spec.js
index a54982cb3e2d4b7456a35c1987584a3b1e3096ef..ca84f25937afb7c622f68b357f93dd5d48bcb315 100644
--- a/server.spec.js
+++ b/server.spec.js
@@ -9,7 +9,7 @@ const isSvg = require('is-svg')
 const path = require('path')
 const serverHelpers = require('./lib/in-process-server-test-helpers')
 const sinon = require('sinon')
-const svg2img = require('./lib/svg-to-img')
+const svg2img = require('./gh-badges/lib/svg-to-img')
 
 describe('The server', function() {
   const baseUri = `http://127.0.0.1:${config.port}`
diff --git a/services/base-svg-scraping.spec.js b/services/base-svg-scraping.spec.js
index 2a1f87feda97de99bf419541c0eb89dcd42a9f89..64a30646d3f454d45a8b37422e54bf04ade3293d 100644
--- a/services/base-svg-scraping.spec.js
+++ b/services/base-svg-scraping.spec.js
@@ -5,7 +5,7 @@ const { expect } = require('chai')
 const sinon = require('sinon')
 const Joi = require('joi')
 const { makeBadgeData } = require('../lib/badge-data')
-const testHelpers = require('../lib/make-badge-test-helpers')
+const testHelpers = require('../gh-badges/lib/make-badge-test-helpers')
 const BaseSvgScrapingService = require('./base-svg-scraping')
 
 chai.use(require('chai-as-promised'))
diff --git a/services/chocolatey/chocolatey.tester.js b/services/chocolatey/chocolatey.tester.js
index a795dd1bb992be8bb7547c6b313a675dfa37853c..b4086cb36d3830a464389163a8d59f5f5f87ff58 100644
--- a/services/chocolatey/chocolatey.tester.js
+++ b/services/chocolatey/chocolatey.tester.js
@@ -7,7 +7,7 @@ const {
   isVPlusDottedVersionNClauses,
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme } = require('../test-helpers')
 const {
   nuGetV2VersionJsonWithDash,
   nuGetV2VersionJsonFirstCharZero,
@@ -72,7 +72,7 @@ t.create('version (mocked, yellow badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (mocked, orange badge)')
@@ -87,7 +87,7 @@ t.create('version (mocked, orange badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (mocked, blue badge)')
@@ -102,7 +102,7 @@ t.create('version (mocked, blue badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (not found)')
@@ -148,7 +148,7 @@ t.create('version (pre) (mocked, yellow badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (pre) (mocked, orange badge)')
@@ -163,7 +163,7 @@ t.create('version (pre) (mocked, orange badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (pre) (mocked, blue badge)')
@@ -178,7 +178,7 @@ t.create('version (pre) (mocked, blue badge)')
   .expectJSON({
     name: 'chocolatey',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (pre) (not found)')
diff --git a/services/dub/dub.tester.js b/services/dub/dub.tester.js
index 966b1b54d617a29caa9660b5009626036bd19441..a1629c230de390c4c4c2380bbd3a1361e4c8699d 100644
--- a/services/dub/dub.tester.js
+++ b/services/dub/dub.tester.js
@@ -4,7 +4,7 @@ const Joi = require('joi')
 const ServiceTester = require('../service-tester')
 
 const { invalidJSON } = require('../response-fixtures')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme } = require('../test-helpers')
 
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
@@ -12,11 +12,11 @@ const {
   isMetricOverTimePeriod,
 } = require('../test-validators')
 const isVersionColor = Joi.equal(
-  colorscheme.red.colorB,
-  colorscheme.yellow.colorB,
-  colorscheme.yellowgreen.colorB,
-  colorscheme.green.colorB,
-  colorscheme.brightgreen.colorB
+  colorScheme.red,
+  colorScheme.yellow,
+  colorScheme.yellowgreen,
+  colorScheme.green,
+  colorScheme.brightgreen
 )
 
 const t = new ServiceTester({ id: 'dub', title: 'Dub' })
@@ -111,7 +111,7 @@ t.create('version (valid)')
     Joi.object().keys({
       name: 'dub',
       value: isVPlusDottedVersionNClausesWithOptionalSuffix,
-      colorB: Joi.equal(colorscheme.blue.colorB, colorscheme.orange.colorB),
+      colorB: Joi.equal(colorScheme.blue, colorScheme.orange),
     })
   )
 
@@ -140,7 +140,7 @@ t.create('license (valid)')
   .expectJSON({
     name: 'license',
     value: 'MIT',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('license (not found)')
diff --git a/services/github/github.tester.js b/services/github/github.tester.js
index 5d8b9083bbd5a48eb0f048b305450063da4e56d9..469637d4c6b821f12b0335ea24f1d2b7c851a680 100644
--- a/services/github/github.tester.js
+++ b/services/github/github.tester.js
@@ -11,15 +11,13 @@ const {
   isVPlusDottedVersionAtLeastOne,
   isSemver,
 } = require('../test-validators')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme: colorsB } = require('../test-helpers')
 const { licenseToColor } = require('../../lib/licenses')
 const { makeColor } = require('../../lib/badge-data')
-const mapValues = require('lodash.mapvalues')
 const { invalidJSON } = require('../response-fixtures')
 
 const t = new ServiceTester({ id: 'github', title: 'Github' })
 module.exports = t
-const colorsB = mapValues(colorscheme, 'colorB')
 const publicDomainLicenseColor = makeColor(licenseToColor('CC0-1.0'))
 const permissiveLicenseColor = colorsB[licenseToColor('MIT')]
 const copyleftLicenseColor = colorsB[licenseToColor('GPL-3.0')]
diff --git a/services/myget/myget.tester.js b/services/myget/myget.tester.js
index 24ac71a48fb1b41550b51343b314758be0dfdcb6..27a2b375607a3b335fe272fe020957382f6b8144 100644
--- a/services/myget/myget.tester.js
+++ b/services/myget/myget.tester.js
@@ -6,7 +6,7 @@ const {
   isMetric,
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme } = require('../test-helpers')
 const {
   queryIndex,
   nuGetV3VersionJsonWithDash,
@@ -117,7 +117,7 @@ t.create('version (mocked, yellow badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (mocked, orange badge)')
@@ -137,7 +137,7 @@ t.create('version (mocked, orange badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (mocked, blue badge)')
@@ -157,7 +157,7 @@ t.create('version (mocked, blue badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (not found)')
@@ -208,7 +208,7 @@ t.create('version (pre) (mocked, yellow badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (pre) (mocked, orange badge)')
@@ -228,7 +228,7 @@ t.create('version (pre) (mocked, orange badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (pre) (mocked, blue badge)')
@@ -248,7 +248,7 @@ t.create('version (pre) (mocked, blue badge)')
   .expectJSON({
     name: 'mongodb',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (pre) (not found)')
diff --git a/services/nuget/nuget.tester.js b/services/nuget/nuget.tester.js
index 414c9098c524904d242f196d21e71bbcb4302356..68ccc450bcfbf2662693265f76057b5c46060132 100644
--- a/services/nuget/nuget.tester.js
+++ b/services/nuget/nuget.tester.js
@@ -7,7 +7,7 @@ const {
   isVPlusDottedVersionNClauses,
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme } = require('../test-helpers')
 const {
   queryIndex,
   nuGetV3VersionJsonWithDash,
@@ -78,7 +78,7 @@ t.create('version (mocked, yellow badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (mocked, orange badge)')
@@ -98,7 +98,7 @@ t.create('version (mocked, orange badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (mocked, blue badge)')
@@ -118,7 +118,7 @@ t.create('version (mocked, blue badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (not found)')
@@ -169,7 +169,7 @@ t.create('version (pre) (mocked, yellow badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (pre) (mocked, orange badge)')
@@ -189,7 +189,7 @@ t.create('version (pre) (mocked, orange badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (pre) (mocked, blue badge)')
@@ -209,7 +209,7 @@ t.create('version (pre) (mocked, blue badge)')
   .expectJSON({
     name: 'nuget',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (pre) (not found)')
diff --git a/services/resharper/resharper.tester.js b/services/resharper/resharper.tester.js
index b4223a4cbeb8aca9a8f774dd69f9f34131e41f24..e82ea2e256cd43aeb4c6c7c8edfa61212aeca6c2 100644
--- a/services/resharper/resharper.tester.js
+++ b/services/resharper/resharper.tester.js
@@ -7,7 +7,7 @@ const {
   isVPlusDottedVersionNClauses,
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
-const colorscheme = require('../../lib/colorscheme.json')
+const { colorScheme } = require('../test-helpers')
 const {
   nuGetV2VersionJsonWithDash,
   nuGetV2VersionJsonFirstCharZero,
@@ -72,7 +72,7 @@ t.create('version (mocked, yellow badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (mocked, orange badge)')
@@ -87,7 +87,7 @@ t.create('version (mocked, orange badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (mocked, blue badge)')
@@ -102,7 +102,7 @@ t.create('version (mocked, blue badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (not found)')
@@ -148,7 +148,7 @@ t.create('version (pre) (mocked, yellow badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v1.2-beta',
-    colorB: colorscheme.yellow.colorB,
+    colorB: colorScheme.yellow,
   })
 
 t.create('version (pre) (mocked, orange badge)')
@@ -163,7 +163,7 @@ t.create('version (pre) (mocked, orange badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v0.35',
-    colorB: colorscheme.orange.colorB,
+    colorB: colorScheme.orange,
   })
 
 t.create('version (pre) (mocked, blue badge)')
@@ -178,7 +178,7 @@ t.create('version (pre) (mocked, blue badge)')
   .expectJSON({
     name: 'resharper',
     value: 'v1.2.7',
-    colorB: colorscheme.blue.colorB,
+    colorB: colorScheme.blue,
   })
 
 t.create('version (pre) (not found)')
diff --git a/services/test-helpers.js b/services/test-helpers.js
index 723fac2896cbc7b58dcbe0704869d8b9e5ef3fdc..f0661368e1cb0a9f07b4b7da26d49df0acd2ffae 100644
--- a/services/test-helpers.js
+++ b/services/test-helpers.js
@@ -1,5 +1,5 @@
 'use strict'
-const colorscheme = require('../lib/colorscheme.json')
+const colorscheme = require('../gh-badges/lib/colorscheme.json')
 const mapValues = require('lodash.mapvalues')
 
 module.exports = {