diff --git a/.circleci/images/prepare-container.sh b/.circleci/images/prepare-container.sh
index 4b702627918b1db92a004b6610e8bfcefa3a7bdf..60bae5fec938108d5e36f44570223fda42a7b435 100755
--- a/.circleci/images/prepare-container.sh
+++ b/.circleci/images/prepare-container.sh
@@ -3,7 +3,6 @@
 set -eo pipefail
 
 apt-get -y update
-apt-get install -y --no-install-recommends fonts-dejavu-core
 apt-get clean
 rm -rf /var/lib/apt/lists/*
 
diff --git a/Dockerfile b/Dockerfile
index 1f6b4e51f29dee0bc8e28296d40cef07aa7c819e..411f7589090ad137d5c6168164a72a342fc53646 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,6 @@
 FROM node:8.9.4-alpine
 
 RUN apk add --no-cache gettext imagemagick librsvg ttf-dejavu git
-ENV FONT_PATH /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf
 
 RUN mkdir -p /usr/src/app
 RUN mkdir /usr/src/app/private
diff --git a/__snapshots__/make-badge.spec.js b/__snapshots__/make-badge.spec.js
index 964b16a9dbb58b0a79ab0bf560f7135251c575b0..1809cb5d145374fa4c32b88e7b5fbb91c4a77566 100644
--- a/__snapshots__/make-badge.spec.js
+++ b/__snapshots__/make-badge.spec.js
@@ -1,5 +1,5 @@
 exports['The badge generator SVG should always produce the same SVG (unless we have changed something!) 1'] = `
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="88" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="88" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h45v20H0z"/><path fill="#4c1" d="M45 0h43v20H45z"/><path fill="url(#b)" d="M0 0h88v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="235" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">cactus</text><text x="235" y="140" transform="scale(.1)" textLength="350">cactus</text><text x="655" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">grown</text><text x="655" y="140" transform="scale(.1)" textLength="330">grown</text></g> </svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="90" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h45v20H0z"/><path fill="#4c1" d="M45 0h45v20H45z"/><path fill="url(#b)" d="M0 0h90v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="235" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">cactus</text><text x="235" y="140" transform="scale(.1)" textLength="350">cactus</text><text x="665" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">grown</text><text x="665" y="140" transform="scale(.1)" textLength="350">grown</text></g> </svg>
 `
 
 exports['The badge generator JSON should always produce the same JSON (unless we have changed something!) 1'] = `
diff --git a/gh-badges/README.md b/gh-badges/README.md
index 0150bc090b7b6f7e7950b089e62da5266d607756..9f3dd8a2e030c18285d7dccda86e4f062d8ad1ee 100644
--- a/gh-badges/README.md
+++ b/gh-badges/README.md
@@ -23,7 +23,7 @@ badge build passed :green .png > mybadge.png
 ```js
 const { BadgeFactory } = require('gh-badges')
 
-const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' })
+const bf = new BadgeFactory()
 
 const format = {
   text: ['build', 'passed'],
@@ -84,28 +84,3 @@ 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
-
-`BadgeFactory`'s constructor takes an optional boolean
-`precomputeWidths` parameter which defaults to `false`.
-
-Pre-computing the font width table adds some overhead to constructing the
-`BadgeFactory` object (so will slow down generation of a single image),
-but will speed up each badge generation if you are creating a lot of images.
-As a rule of thumb:
-
-If you are generating just one image, use:
-
-```js
-const bf = new BadgeFactory(
-    { fontPath: '/path/to/Verdana.ttf' }
-)
-```
-
-If you are generating many images with a single instance of `BadgeFactory`:
-
-```js
-const bf = new BadgeFactory(
-    { fontPath: '/path/to/Verdana.ttf', precomputeWidths: true }
-)
-```
diff --git a/gh-badges/lib/badge-cli.js b/gh-badges/lib/badge-cli.js
index 13c20198960ea024b82c9af2f8dd252f686bf578..719bed9a17ce7c73807528007ae211af73a60e64 100755
--- a/gh-badges/lib/badge-cli.js
+++ b/gh-badges/lib/badge-cli.js
@@ -2,11 +2,9 @@
 
 'use strict'
 
-const { PDFKitTextMeasurer } = require('./text-measurer')
-const { makeBadge } = require('./make-badge')
+const makeBadge = require('./make-badge')
 const svg2img = require('./svg-to-img')
 const colorscheme = require('./colorscheme.json')
-const defaults = require('./defaults')
 
 if (process.argv.length < 4) {
   console.log('Usage: badge subject status [:colorscheme] [.output] [@style]')
@@ -27,8 +25,6 @@ if (process.argv.length < 4) {
   process.exit()
 }
 
-const fontPath = process.env.FONT_PATH || defaults.font.path
-
 // Find a format specifier.
 let format = 'svg'
 let style = ''
@@ -71,10 +67,7 @@ if (color[0] === ':') {
 }
 
 async function main() {
-  // The widths are going to be off if Helvetica-Bold is used, though this
-  // should print a warning.
-  const measurer = new PDFKitTextMeasurer(fontPath, 'Helvetica-Bold')
-  const svg = makeBadge(measurer, badgeData)
+  const svg = makeBadge(badgeData)
 
   if (/png|jpg|gif/.test(format)) {
     const data = await svg2img(svg, format)
diff --git a/gh-badges/lib/defaults.js b/gh-badges/lib/defaults.js
deleted file mode 100644
index 5f7f7a1c37ebd2b03832ca0ae7be258bce63d821..0000000000000000000000000000000000000000
--- a/gh-badges/lib/defaults.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict'
-
-const path = require('path')
-
-module.exports = {
-  font: {
-    // i.e. Verdana.ttf in the root of the project.
-    path: path.join(__dirname, '..', 'Verdana.ttf'),
-  },
-}
diff --git a/gh-badges/lib/index.js b/gh-badges/lib/index.js
index c0ed0bec570346deef9545d4a596e56b4350fc0c..92f03bfc35d0d1099c9a62c6316bfaf4075bdf2f 100644
--- a/gh-badges/lib/index.js
+++ b/gh-badges/lib/index.js
@@ -1,13 +1,14 @@
 'use strict'
 
-const { makeBadge } = require('./make-badge')
-const { PDFKitTextMeasurer, QuickTextMeasurer } = require('./text-measurer')
+const makeBadge = require('./make-badge')
 
 class BadgeFactory {
-  constructor({ fontPath, fallbackFontPath, precomputeWidths = false }) {
-    this.measurer = precomputeWidths
-      ? new QuickTextMeasurer(fontPath, fallbackFontPath)
-      : new PDFKitTextMeasurer(fontPath, fallbackFontPath)
+  constructor(options) {
+    if (options !== undefined) {
+      console.error(
+        'BadgeFactory: Constructor options are deprecated and will be ignored'
+      )
+    }
   }
 
   /**
@@ -24,7 +25,7 @@ class BadgeFactory {
    * @see https://github.com/badges/shields/tree/master/gh-badges/README.md
    */
   create(format) {
-    return makeBadge(this.measurer, format)
+    return makeBadge(format)
   }
 }
 
diff --git a/gh-badges/lib/make-badge-test-helpers.js b/gh-badges/lib/make-badge-test-helpers.js
deleted file mode 100644
index 6b54dfda6ec9ce8a850a9f35f341f6f49ddff012..0000000000000000000000000000000000000000
--- a/gh-badges/lib/make-badge-test-helpers.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict'
-
-const path = require('path')
-const { PDFKitTextMeasurer } = require('./text-measurer')
-const { makeMakeBadgeFn } = require('./make-badge')
-
-module.exports = {
-  font: {
-    path: path.join(
-      __dirname,
-      '..',
-      '..',
-      'node_modules',
-      'dejavu-fonts-ttf',
-      'ttf',
-      'DejaVuSans.ttf'
-    ),
-  },
-  measurer() {
-    return new PDFKitTextMeasurer(this.font.path)
-  },
-  makeBadge() {
-    return makeMakeBadgeFn(this.measurer())
-  },
-}
diff --git a/gh-badges/lib/make-badge.js b/gh-badges/lib/make-badge.js
index fcc7662a0235f88ce958daa8c2d8909553fd0406..a86622a096f853f7073d7c6b0194cfc07d0f51be 100644
--- a/gh-badges/lib/make-badge.js
+++ b/gh-badges/lib/make-badge.js
@@ -4,12 +4,9 @@ const fs = require('fs')
 const path = require('path')
 const SVGO = require('svgo')
 const dot = require('dot')
-const LruCache = require('./lru-cache')
+const anafanafo = require('anafanafo')
 const isCSSColor = require('is-css-color')
 
-// Holds widths of badge keys (left hand side of badge).
-const badgeKeyWidthCache = new LruCache(1000)
-
 // cache templates.
 const templates = {}
 const templateFiles = fs.readdirSync(path.join(__dirname, '..', 'templates'))
@@ -109,21 +106,18 @@ function assignColor(color = '', colorschemeType = 'colorB') {
 const definedColorschemes = require(path.join(__dirname, 'colorscheme.json'))
 
 // Inject the measurer to avoid placing any persistent state in this module.
-function makeBadge(
-  measurer,
-  {
-    format,
-    template,
-    text,
-    colorscheme,
-    colorA,
-    colorB,
-    logo,
-    logoPosition,
-    logoWidth,
-    links = ['', ''],
-  }
-) {
+function makeBadge({
+  format,
+  template,
+  text,
+  colorscheme,
+  colorA,
+  colorB,
+  logo,
+  logoPosition,
+  logoWidth,
+  links = ['', ''],
+}) {
   // String coercion.
   text = text.map(value => `${value}`)
 
@@ -156,16 +150,12 @@ function makeBadge(
   colorB = assignColor(colorB, 'colorB')
 
   const [left, right] = text
-  let leftWidth = badgeKeyWidthCache.get(left)
-  if (leftWidth === undefined) {
-    leftWidth = measurer.widthOf(left) | 0
-    // Increase chances of pixel grid alignment.
-    if (leftWidth % 2 === 0) {
-      leftWidth++
-    }
-    badgeKeyWidthCache.set(left, leftWidth)
+  let leftWidth = (anafanafo(left) / 10) | 0
+  // Increase chances of pixel grid alignment.
+  if (leftWidth % 2 === 0) {
+    leftWidth++
   }
-  let rightWidth = measurer.widthOf(right) | 0
+  let rightWidth = (anafanafo(right) / 10) | 0
   // Increase chances of pixel grid alignment.
   if (rightWidth % 2 === 0) {
     rightWidth++
@@ -200,9 +190,4 @@ function makeBadge(
   return templateFn(context)
 }
 
-module.exports = {
-  makeBadge,
-  makeMakeBadgeFn: measurer => data => makeBadge(measurer, data),
-  // Expose for testing.
-  _badgeKeyWidthCache: badgeKeyWidthCache,
-}
+module.exports = makeBadge
diff --git a/gh-badges/lib/make-badge.spec.js b/gh-badges/lib/make-badge.spec.js
index 135e64e6205979a1a72f5ce970fe05b1a8e6b525..63442cbb115ee772ad1c73e1991b235a36695423 100644
--- a/gh-badges/lib/make-badge.spec.js
+++ b/gh-badges/lib/make-badge.spec.js
@@ -4,13 +4,10 @@ const { test, given, forCases } = require('sazerac')
 const { expect } = require('chai')
 const snapshot = require('snap-shot-it')
 const eol = require('eol')
-const { _badgeKeyWidthCache } = require('./make-badge')
 const isSvg = require('is-svg')
-const testHelpers = require('./make-badge-test-helpers')
+const makeBadge = require('./make-badge')
 const colorschemes = require('./colorscheme.json')
 
-const makeBadge = testHelpers.makeBadge()
-
 function testColor(color = '') {
   return JSON.parse(
     makeBadge({
@@ -23,10 +20,6 @@ function testColor(color = '') {
 }
 
 describe('The badge generator', function() {
-  beforeEach(function() {
-    _badgeKeyWidthCache.clear()
-  })
-
   describe('color test', function() {
     test(testColor, () => {
       // valid hex
@@ -82,11 +75,6 @@ describe('The badge generator', function() {
       const svg = makeBadge({ text: ['cactus', 'grown'], format: 'svg' })
       snapshot(svg)
     })
-
-    it('should cache width of badge key', function() {
-      makeBadge({ text: ['cached', 'not-cached'], format: 'svg' })
-      expect(_badgeKeyWidthCache.cache).to.have.keys('cached')
-    })
   })
 
   describe('JSON', function() {
diff --git a/gh-badges/lib/svg-to-img.spec.js b/gh-badges/lib/svg-to-img.spec.js
index d87f9370b346b39b48ec0b083951280e47765307..3406d19db01bac5b0ac7f9060bcb7d6a34e1c656 100644
--- a/gh-badges/lib/svg-to-img.spec.js
+++ b/gh-badges/lib/svg-to-img.spec.js
@@ -4,9 +4,7 @@ const { expect } = require('chai')
 const isPng = require('is-png')
 const sinon = require('sinon')
 const svg2img = require('./svg-to-img')
-const testHelpers = require('./make-badge-test-helpers')
-
-const makeBadge = testHelpers.makeBadge()
+const makeBadge = require('./make-badge')
 
 describe('The rasterizer', function() {
   let cacheGet
diff --git a/gh-badges/lib/text-measurer.js b/gh-badges/lib/text-measurer.js
deleted file mode 100644
index dae729a6a581c434495de4bf5effb6c3faf7da99..0000000000000000000000000000000000000000
--- a/gh-badges/lib/text-measurer.js
+++ /dev/null
@@ -1,94 +0,0 @@
-'use strict'
-
-const PDFDocument = require('pdfkit')
-
-class PDFKitTextMeasurer {
-  constructor(fontPath, fallbackFontPath) {
-    this.document = new PDFDocument({
-      size: 'A4',
-      layout: 'landscape',
-    }).fontSize(11)
-    try {
-      this.document.font(fontPath)
-    } catch (e) {
-      if (fallbackFontPath) {
-        console.error(
-          `Text-width computation may be incorrect. Unable to load font at ${fontPath}. Using fallback font ${fallbackFontPath} instead.`
-        )
-        this.document.font(fallbackFontPath)
-      } else {
-        console.error('No fallback font set.')
-        throw e
-      }
-    }
-  }
-
-  widthOf(str) {
-    return this.document.widthOfString(str)
-  }
-}
-
-class QuickTextMeasurer {
-  constructor(fontPath, fallbackFontPath) {
-    this.baseMeasurer = new PDFKitTextMeasurer(fontPath, fallbackFontPath)
-
-    // This will be a Map of characters -> numbers.
-    this.characterWidths = new Map()
-    // This will be Map of Maps of characters -> numbers.
-    this.kerningPairs = new Map()
-    this._prepare()
-  }
-
-  static printableAsciiCharacters() {
-    const printableRange = [32, 126]
-    const length = printableRange[1] - printableRange[0] + 1
-    return Array.from({ length }, (value, i) => printableRange[0] + i).map(
-      charCode => String.fromCharCode(charCode)
-    )
-  }
-
-  _prepare() {
-    const charactersToCache = this.constructor.printableAsciiCharacters()
-
-    charactersToCache.forEach(char => {
-      this.characterWidths.set(char, this.baseMeasurer.widthOf(char))
-      this.kerningPairs.set(char, new Map())
-    })
-
-    charactersToCache.forEach(first => {
-      charactersToCache.forEach(second => {
-        const individually =
-          this.characterWidths.get(first) + this.characterWidths.get(second)
-        const asPair = this.baseMeasurer.widthOf(`${first}${second}`)
-        const kerningAdjustment = asPair - individually
-        this.kerningPairs.get(first).set(second, kerningAdjustment)
-      })
-    })
-  }
-
-  widthOf(str) {
-    const { characterWidths, kerningPairs } = this
-
-    let result = 0
-    let previous = null
-    for (const character of str) {
-      if (!characterWidths.has(character)) {
-        // Bail.
-        return this.baseMeasurer.widthOf(str)
-      }
-
-      result += characterWidths.get(character)
-      if (previous !== null) {
-        result += kerningPairs.get(previous).get(character)
-      }
-
-      previous = character
-    }
-    return result
-  }
-}
-
-module.exports = {
-  PDFKitTextMeasurer,
-  QuickTextMeasurer,
-}
diff --git a/gh-badges/lib/text-measurer.spec.js b/gh-badges/lib/text-measurer.spec.js
deleted file mode 100644
index 93241f60fb98222f62a3ba4766fb49374aa26bc1..0000000000000000000000000000000000000000
--- a/gh-badges/lib/text-measurer.spec.js
+++ /dev/null
@@ -1,153 +0,0 @@
-'use strict'
-
-const { expect } = require('chai')
-const path = require('path')
-const fs = require('fs')
-const sinon = require('sinon')
-const { PDFKitTextMeasurer, QuickTextMeasurer } = require('./text-measurer')
-const defaults = require('./defaults')
-const testHelpers = require('./make-badge-test-helpers')
-const almostEqual = require('almost-equal')
-
-const EPSILON_PIXELS = 1e-3
-
-describe('PDFKitTextMeasurer with DejaVu Sans', function() {
-  it('should produce the same length as before', function() {
-    const measurer = new PDFKitTextMeasurer(testHelpers.font.path)
-    expect(
-      measurer.widthOf('This is the dawning of the Age of Aquariums')
-    ).to.equal(243.546875)
-  })
-})
-
-function registerTests(fontPath, skip) {
-  // Invoke `.skip()` within the `it`'s so we get logging of the skipped tests.
-  const displayName = path.basename(fontPath, path.extname(fontPath))
-
-  describe(`QuickTextMeasurer with ${displayName}`, function() {
-    let quickMeasurer
-    if (!skip) {
-      before(function() {
-        // Since this is slow, share it across all tests.
-        quickMeasurer = new QuickTextMeasurer(fontPath)
-      })
-    }
-
-    let sandbox
-    let pdfKitWidthOf
-    let pdfKitMeasurer
-    if (!skip) {
-      // Boo, the sandbox doesn't get cleaned up after a skipped test.
-      beforeEach(function() {
-        // This often times out: https://circleci.com/gh/badges/shields/2786
-        this.timeout(5000)
-        sandbox = sinon.createSandbox()
-        pdfKitWidthOf = sandbox.spy(PDFKitTextMeasurer.prototype, 'widthOf')
-        pdfKitMeasurer = new PDFKitTextMeasurer(fontPath)
-      })
-
-      afterEach(function() {
-        if (sandbox) {
-          sandbox.restore()
-          sandbox = null
-        }
-      })
-    }
-
-    context('when given ASCII strings', function() {
-      const strings = [
-        'This is the dawning of the Age of Aquariums',
-        'v1.2.511',
-        '5 passed, 2 failed, 1 skipped',
-        '[prismic "1.1"]',
-      ]
-
-      strings.forEach(str => {
-        it(`should measure '${str}' in parity with PDFKit`, function() {
-          if (skip) {
-            this.skip()
-          }
-          expect(quickMeasurer.widthOf(str)).to.be.closeTo(
-            pdfKitMeasurer.widthOf(str),
-            EPSILON_PIXELS
-          )
-        })
-      })
-
-      strings.forEach(str => {
-        it(`should measure '${str}' without invoking PDFKit`, function() {
-          if (skip) {
-            this.skip()
-          }
-          quickMeasurer.widthOf(str)
-          expect(pdfKitWidthOf).not.to.have.been.called
-        })
-      })
-
-      context('when the font includes a kerning pair', function() {
-        const stringsWithKerningPairs = [
-          'Q-tips', // In DejaVu, Q- is a kerning pair.
-          'B-flat', // In Verdana, B- is a kerning pair.
-        ]
-
-        function widthByMeasuringCharacters(str) {
-          let result = 0
-          for (const char of str) {
-            result += pdfKitMeasurer.widthOf(char)
-          }
-          return result
-        }
-
-        it(`should apply a width correction`, function() {
-          if (skip) {
-            this.skip()
-          }
-
-          const adjustedStrings = []
-
-          stringsWithKerningPairs.forEach(str => {
-            const actual = quickMeasurer.widthOf(str)
-            const unadjusted = widthByMeasuringCharacters(str)
-            if (!almostEqual(actual, unadjusted, EPSILON_PIXELS)) {
-              adjustedStrings.push(str)
-            }
-          })
-
-          expect(adjustedStrings).to.be.an('array').that.is.not.empty
-        })
-      })
-    })
-
-    context('when given non-ASCII strings', function() {
-      const strings = ['★★★½☆', '\u2026']
-
-      strings.forEach(str => {
-        it(`should measure '${str}' in parity with PDFKit`, function() {
-          if (skip) {
-            this.skip()
-          }
-          expect(quickMeasurer.widthOf(str)).to.be.closeTo(
-            pdfKitMeasurer.widthOf(str),
-            EPSILON_PIXELS
-          )
-        })
-      })
-
-      strings.forEach(str => {
-        it(`should invoke the base when measuring '${str}'`, function() {
-          if (skip) {
-            this.skip()
-          }
-          quickMeasurer.widthOf(str)
-          expect(pdfKitWidthOf).to.have.been.called
-        })
-      })
-    })
-  })
-}
-
-// i.e. Verdana
-registerTests(defaults.font.path, !fs.existsSync(defaults.font.path))
-
-// i.e. DejaVu Sans
-registerTests(testHelpers.font.path)
diff --git a/gh-badges/package.json b/gh-badges/package.json
index 1814dbdcde7356c547d396b5dc4a8a1e7d829ec7..b94a66bb807eee659be4b04937fdca3fce648a6f 100644
--- a/gh-badges/package.json
+++ b/gh-badges/package.json
@@ -33,6 +33,7 @@
     "logo": "https://opencollective.com/opencollective/logo.txt"
   },
   "dependencies": {
+    "anafanafo": "^0.1.0",
     "dot": "~1.1.2",
     "gm": "^1.23.0",
     "is-css-color": "^1.0.0",
diff --git a/lib/request-handler.js b/lib/request-handler.js
index 47c0a4f3c7ecf6a59c25f39c5d30500626cdda04..cfca8780e229b9db1040ddc094eae70f95dae17b 100644
--- a/lib/request-handler.js
+++ b/lib/request-handler.js
@@ -6,6 +6,7 @@ const request = require('request')
 const { makeBadgeData: getBadgeData } = require('./badge-data')
 const log = require('./log')
 const LruCache = require('../gh-badges/lib/lru-cache')
+const makeBadge = require('../gh-badges/lib/make-badge')
 const analytics = require('./analytics')
 const { makeSend } = require('./result-sender')
 const queryString = require('query-string')
@@ -88,9 +89,7 @@ function getBadgeMaxAge(handlerOptions, queryParams) {
 // (undesirable and hard to debug).
 //
 // Pass just the handler function as shorthand.
-//
-// Inject `makeBadge` as a dependency.
-function handleRequest(makeBadge, handlerOptions) {
+function handleRequest(handlerOptions) {
   if (typeof handlerOptions === 'function') {
     handlerOptions = { handler: handlerOptions }
   }
@@ -276,8 +275,6 @@ function isInt(number) {
 
 module.exports = {
   handleRequest,
-  makeHandleRequestFn: makeBadge => handlerOptions =>
-    handleRequest(makeBadge, handlerOptions),
   clearRequestCache,
   // Expose for testing.
   _requestCache: requestCache,
diff --git a/lib/request-handler.spec.js b/lib/request-handler.spec.js
index 31053b4119dff9c0170da249cbdfcaf1ec060204..26b46e3e528508e3e31aec603f339f73cd131adb 100644
--- a/lib/request-handler.spec.js
+++ b/lib/request-handler.spec.js
@@ -8,14 +8,11 @@ const Camp = require('camp')
 const analytics = require('./analytics')
 const { makeBadgeData: getBadgeData } = require('./badge-data')
 const {
-  makeHandleRequestFn,
+  handleRequest,
   clearRequestCache,
   _requestCache,
   getBadgeMaxAge,
 } = require('./request-handler')
-const testHelpers = require('../gh-badges/lib/make-badge-test-helpers')
-
-const handleRequest = makeHandleRequestFn(testHelpers.makeBadge())
 
 const baseUri = `http://127.0.0.1:${config.port}`
 
diff --git a/lib/server-config.js b/lib/server-config.js
index 87aad29a0a001d5afd334b7a724e4b0b246f0fb1..01832d822cbad8e45b34ccb11470c95b34e91a9d 100644
--- a/lib/server-config.js
+++ b/lib/server-config.js
@@ -5,7 +5,6 @@
 
 const url = require('url')
 const envFlag = require('node-env-flag')
-const defaults = require('../gh-badges/lib/defaults')
 
 function envArray(envVar, defaultValue, delimiter) {
   delimiter = delimiter || ','
@@ -69,10 +68,6 @@ const config = {
     },
     trace: envFlag(process.env.TRACE_SERVICES),
   },
-  font: {
-    path: process.env.FONT_PATH || defaults.font.path,
-    fallbackPath: process.env.FALLBACK_FONT_PATH,
-  },
   profiling: {
     makeBadge: envFlag(process.env.PROFILE_MAKE_BADGE),
   },
@@ -80,8 +75,4 @@ const config = {
   handleInternalErrors: envFlag(process.env.HANDLE_INTERNAL_ERRORS, true),
 }
 
-if (config.font.fallbackPath) {
-  console.log('FALLBACK_FONT_PATH is deprecated. Please use FONT_PATH.')
-}
-
 module.exports = config
diff --git a/package-lock.json b/package-lock.json
index be20a4a0941207f0614837e278842b9a3cdaf1d2..94da22e64a3ddb9f4279116e26fb49c72bb9f30c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -932,7 +932,7 @@
       "dependencies": {
         "core-js": {
           "version": "2.5.7",
-          "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
           "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
           "dev": true
         },
@@ -1032,7 +1032,7 @@
       "dependencies": {
         "core-js": {
           "version": "2.5.7",
-          "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
           "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
           "dev": true
         }
@@ -1050,7 +1050,7 @@
       "dependencies": {
         "core-js": {
           "version": "2.5.7",
-          "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
           "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
           "dev": true
         },
@@ -1296,8 +1296,7 @@
     "acorn": {
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
-      "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
-      "optional": true
+      "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
     },
     "acorn-dynamic-import": {
       "version": "2.0.2",
@@ -1411,6 +1410,14 @@
       "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
       "optional": true
     },
+    "anafanafo": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-0.1.0.tgz",
+      "integrity": "sha512-Uh4dXx3/DHxLF/sfpl627VPRKi6AM7Z9bsIzAjZZG8ywe6vEppms0B9kdHr320IrNznf8W4THsiLe00qjTp4dg==",
+      "requires": {
+        "char-width-table-consumer": "^0.2.0"
+      }
+    },
     "ansi-escapes": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
@@ -1599,7 +1606,7 @@
         },
         "util": {
           "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
           "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
           "dev": true,
           "requires": {
@@ -1763,13 +1770,13 @@
     },
     "babel-plugin-react-require": {
       "version": "3.0.0",
-      "resolved": "http://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz",
       "integrity": "sha1-Lk57RJa5OmVKHIAEInbeTk7rIOM=",
       "dev": true
     },
     "babel-plugin-syntax-jsx": {
       "version": "6.18.0",
-      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
       "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
       "dev": true
     },
@@ -1906,6 +1913,11 @@
       "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
       "dev": true
     },
+    "binary-search": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz",
+      "integrity": "sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg=="
+    },
     "bintrees": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz",
@@ -2144,7 +2156,7 @@
     },
     "browserify-rsa": {
       "version": "4.0.1",
-      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
       "dev": true,
       "requires": {
@@ -2203,7 +2215,7 @@
     },
     "buffer": {
       "version": "4.9.1",
-      "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
@@ -2536,6 +2548,14 @@
         }
       }
     },
+    "char-width-table-consumer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/char-width-table-consumer/-/char-width-table-consumer-0.2.0.tgz",
+      "integrity": "sha512-XMaaBnOH/xkBRoq1VXMc5yWaSztfi9uWceRizXUEqU6dHti431K5CG8Racgk+KrwIvzzHTqVzDZDEkqWf9WKVA==",
+      "requires": {
+        "binary-search": "^1.3.4"
+      }
+    },
     "chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@@ -3308,7 +3328,7 @@
     },
     "core-js": {
       "version": "2.5.1",
-      "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
       "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs="
     },
     "core-util-is": {
@@ -3474,8 +3494,7 @@
     "cssom": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
-      "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
-      "optional": true
+      "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs="
     },
     "cssstyle": {
       "version": "0.2.37",
@@ -3503,7 +3522,7 @@
     },
     "d": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
       "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
       "dev": true,
       "requires": {
@@ -3567,7 +3586,7 @@
         },
         "json5": {
           "version": "2.1.0",
-          "resolved": "http://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
           "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
           "dev": true,
           "requires": {
@@ -3729,12 +3748,6 @@
         }
       }
     },
-    "dejavu-fonts-ttf": {
-      "version": "2.37.3",
-      "resolved": "https://registry.npmjs.org/dejavu-fonts-ttf/-/dejavu-fonts-ttf-2.37.3.tgz",
-      "integrity": "sha1-I/K/WvWUyiqKOlMiQiSwNGem4Lg=",
-      "dev": true
-    },
     "del": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
@@ -3929,7 +3942,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -4862,7 +4875,7 @@
     },
     "events": {
       "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
       "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
       "dev": true
     },
@@ -5197,7 +5210,7 @@
       "dependencies": {
         "core-js": {
           "version": "1.2.7",
-          "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
           "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=",
           "dev": true
         },
@@ -5366,7 +5379,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -5531,7 +5544,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -5607,8 +5620,7 @@
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "aproba": {
           "version": "1.2.0",
@@ -5629,14 +5641,12 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -5651,20 +5661,17 @@
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -5781,8 +5788,7 @@
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "ini": {
           "version": "1.3.5",
@@ -5794,7 +5800,6 @@
           "version": "1.0.0",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -5809,7 +5814,6 @@
           "version": "3.0.4",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
@@ -5817,14 +5821,12 @@
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "minipass": {
           "version": "2.2.4",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.1",
             "yallist": "^3.0.0"
@@ -5843,7 +5845,6 @@
           "version": "0.5.1",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -5924,8 +5925,7 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -5937,7 +5937,6 @@
           "version": "1.4.0",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -6023,8 +6022,7 @@
         "safe-buffer": {
           "version": "5.1.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "safer-buffer": {
           "version": "2.1.2",
@@ -6060,7 +6058,6 @@
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -6080,7 +6077,6 @@
           "version": "3.0.1",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -6124,14 +6120,12 @@
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "yallist": {
           "version": "3.0.2",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         }
       }
     },
@@ -6201,6 +6195,7 @@
     "gh-badges": {
       "version": "file:gh-badges",
       "requires": {
+        "anafanafo": "^0.1.0",
         "dot": "~1.1.2",
         "gm": "^1.23.0",
         "is-css-color": "^1.0.0",
@@ -6612,7 +6607,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "requires": {
             "core-util-is": "~1.0.0",
@@ -6648,7 +6643,7 @@
     },
     "htmlescape": {
       "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
       "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
       "dev": true
     },
@@ -7719,7 +7714,7 @@
     },
     "json5": {
       "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
       "dev": true
     },
@@ -8034,7 +8029,7 @@
       "dependencies": {
         "chalk": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -8092,7 +8087,7 @@
       "dependencies": {
         "chalk": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -8124,7 +8119,7 @@
         },
         "onetime": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
           "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
           "dev": true
         },
@@ -8379,7 +8374,7 @@
         },
         "onetime": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
           "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
           "dev": true
         },
@@ -8589,7 +8584,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -10254,7 +10249,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -10448,7 +10443,6 @@
           "resolved": false,
           "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
           "dev": true,
-          "optional": true,
           "requires": {
             "kind-of": "^3.0.2",
             "longest": "^1.0.1",
@@ -10587,7 +10581,7 @@
         },
         "convert-source-map": {
           "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+          "resolved": false,
           "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
           "dev": true,
           "requires": {
@@ -10606,7 +10600,7 @@
         },
         "debug": {
           "version": "3.1.0",
-          "resolved": false,
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "dev": true,
           "requires": {
@@ -10727,7 +10721,7 @@
         },
         "glob": {
           "version": "7.1.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "resolved": false,
           "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
           "dev": true,
           "requires": {
@@ -10818,8 +10812,7 @@
           "version": "1.1.6",
           "resolved": false,
           "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "is-builtin-module": {
           "version": "1.0.0",
@@ -10865,7 +10858,7 @@
         },
         "istanbul-lib-report": {
           "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz",
+          "resolved": false,
           "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==",
           "dev": true,
           "requires": {
@@ -10897,7 +10890,7 @@
         },
         "istanbul-reports": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz",
+          "resolved": false,
           "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==",
           "dev": true,
           "requires": {
@@ -10915,7 +10908,6 @@
           "resolved": false,
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
-          "optional": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -10968,8 +10960,7 @@
           "version": "1.0.1",
           "resolved": false,
           "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "lru-cache": {
           "version": "4.1.3",
@@ -11071,7 +11062,7 @@
         },
         "ms": {
           "version": "2.0.0",
-          "resolved": false,
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         },
@@ -11272,8 +11263,7 @@
           "version": "1.6.1",
           "resolved": false,
           "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "require-directory": {
           "version": "2.1.1",
@@ -11314,7 +11304,7 @@
         },
         "safe-buffer": {
           "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "resolved": false,
           "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
           "dev": true
         },
@@ -12029,7 +12019,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -12981,7 +12971,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -14147,7 +14137,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "requires": {
             "core-util-is": "~1.0.0",
@@ -14359,7 +14349,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
@@ -14420,7 +14410,7 @@
         },
         "readable-stream": {
           "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
           "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
diff --git a/package.json b/package.json
index 73b8280e3e0ab69dc252d6440405042fb2d511b1..f83d87ae960fb707b654a9a0ca2e5c44f3fe7da4 100644
--- a/package.json
+++ b/package.json
@@ -123,7 +123,6 @@
     "concurrently": "^4.0.1",
     "danger": "^6.0.5",
     "danger-plugin-no-test-shortcuts": "^2.0.0",
-    "dejavu-fonts-ttf": "^2.37.3",
     "eol": "^0.9.1",
     "eslint": "^5.0.1",
     "eslint-config-prettier": "^3.0.1",
diff --git a/server.js b/server.js
index bd6ab288eac1287ac68d5e559d48ea7486a50e65..d386545070a743314641ff514480928a0c487a4d 100644
--- a/server.js
+++ b/server.js
@@ -19,8 +19,7 @@ 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('./gh-badges/lib/make-badge')
-const { QuickTextMeasurer } = require('./gh-badges/lib/text-measurer')
+const makeBadge = require('./gh-badges/lib/make-badge')
 const suggest = require('./lib/suggest')
 const {
   makeColorB,
@@ -29,7 +28,7 @@ const {
   setBadgeColor,
 } = require('./lib/badge-data')
 const {
-  makeHandleRequestFn,
+  handleRequest: cache,
   clearRequestCache,
 } = require('./lib/request-handler')
 const { clearRegularUpdateCache } = require('./lib/regular-update')
@@ -75,16 +74,6 @@ module.exports = {
 
 log(`Server is starting up: ${config.baseUri}`)
 
-let measurer
-try {
-  measurer = new QuickTextMeasurer(config.font.path, config.font.fallbackPath)
-} catch (e) {
-  console.log(`Unable to load fallback font. Using Helvetica-Bold instead.`)
-  measurer = new QuickTextMeasurer('Helvetica')
-}
-const makeBadge = makeMakeBadgeFn(measurer)
-const cache = makeHandleRequestFn(makeBadge)
-
 analytics.load()
 analytics.scheduleAutosaving()
 analytics.setRoutes(camp)
diff --git a/services/base-svg-scraping.spec.js b/services/base-svg-scraping.spec.js
index 64a30646d3f454d45a8b37422e54bf04ade3293d..f234dc166a35ebf4fa088623c18806b76c1a0ec1 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('../gh-badges/lib/make-badge-test-helpers')
+const makeBadge = require('../gh-badges/lib/make-badge')
 const BaseSvgScrapingService = require('./base-svg-scraping')
 
 chai.use(require('chai-as-promised'))
@@ -13,7 +13,7 @@ chai.use(require('chai-as-promised'))
 function makeExampleSvg({ label, message }) {
   const badgeData = makeBadgeData('this is the label', {})
   badgeData.text[1] = 'this is the result!'
-  return testHelpers.makeBadge()(badgeData)
+  return makeBadge(badgeData)
 }
 
 const schema = Joi.object({