diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index 8eb5c350c464ba39527172b9360226d1dc7bccff..0e277690fb61fb377037691e2962b615df07c4cf 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -1,27 +1,28 @@
 'use strict'
 
-const LegacyService = require('../legacy-service')
-const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
-const { makeLogo: getLogo } = require('../../lib/logos')
+const Joi = require('joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
-const {
-  documentation,
-  checkErrorResponse: githubCheckErrorResponse,
-} = require('./github-helpers')
-
+const { GithubAuthService } = require('./github-auth-service')
+const { documentation, errorMessagesFor } = require('./github-helpers')
 const commonExampleAttrs = {
   keywords: ['activity', 'latest'],
   documentation,
 }
 
-// This legacy service should be rewritten to use e.g. BaseJsonService.
-//
-// Tips for rewriting:
-// https://github.com/badges/shields/blob/master/doc/rewriting-services.md
-//
-// Do not base new services on this code.
-module.exports = class GithubLastCommit extends LegacyService {
+const schema = Joi.array()
+  .items(
+    Joi.object({
+      commit: Joi.object({
+        author: Joi.object({
+          date: Joi.string().required(),
+        }).required(),
+      }).required(),
+    }).required()
+  )
+  .required()
+
+module.exports = class GithubLastCommit extends GithubAuthService {
   static get category() {
     return 'activity'
   }
@@ -42,11 +43,7 @@ module.exports = class GithubLastCommit extends LegacyService {
           user: 'google',
           repo: 'skia',
         },
-        staticPreview: {
-          label: 'last commit',
-          message: 'today',
-          color: 'brightgreen',
-        },
+        staticPreview: this.render({ commitDate: '2013-07-31T20:01:41Z' }),
         ...commonExampleAttrs,
       },
       {
@@ -57,50 +54,36 @@ module.exports = class GithubLastCommit extends LegacyService {
           repo: 'skia',
           branch: 'infra/config',
         },
-        staticPreview: {
-          label: 'last commit',
-          message: 'april 2018',
-          color: 'yellow',
-        },
+        staticPreview: this.render({ commitDate: '2013-07-31T20:01:41Z' }),
         ...commonExampleAttrs,
       },
     ]
   }
 
-  static registerLegacyRouteHandler({ camp, cache, githubApiProvider }) {
-    camp.route(
-      /^\/github\/last-commit\/([^/]+)\/([^/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
-      cache((data, match, sendBadge, request) => {
-        const user = match[1] // eg, mashape
-        const repo = match[2] // eg, apistatus
-        const branch = match[3]
-        const format = match[4]
-        let apiUrl = `/repos/${user}/${repo}/commits`
-        if (branch) {
-          apiUrl += `?sha=${branch}`
-        }
-        const badgeData = getBadgeData('last commit', data)
-        if (badgeData.template === 'social') {
-          badgeData.logo = getLogo('github', data)
-          badgeData.links = [`https://github.com/${user}/${repo}`]
-        }
-        githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
-          if (githubCheckErrorResponse(badgeData, err, res)) {
-            sendBadge(format, badgeData)
-            return
-          }
-          try {
-            const parsedData = JSON.parse(buffer)
-            const commitDate = parsedData[0].commit.author.date
-            badgeData.text[1] = formatDate(commitDate)
-            badgeData.colorscheme = ageColor(Date.parse(commitDate))
-            sendBadge(format, badgeData)
-          } catch (e) {
-            badgeData.text[1] = 'invalid'
-            sendBadge(format, badgeData)
-          }
-        })
-      })
-    )
+  static get defaultBadgeData() {
+    return {
+      label: 'last commit',
+    }
+  }
+
+  static render({ commitDate }) {
+    return {
+      message: formatDate(commitDate),
+      color: ageColor(Date.parse(commitDate)),
+    }
+  }
+
+  async fetch({ user, repo, branch }) {
+    return this._requestJson({
+      url: `/repos/${user}/${repo}/commits`,
+      options: { qs: { sha: branch } },
+      schema,
+      errorMessages: errorMessagesFor(),
+    })
+  }
+
+  async handle({ user, repo, branch }) {
+    const body = await this.fetch({ user, repo, branch })
+    return this.constructor.render({ commitDate: body[0].commit.author.date })
   }
 }