var GitHubAPI = require( "node-github" ),
    moment = require( "moment" ),
    github = new GitHubAPI({
      version: "3.0.0",
      timeout: "5000"
    }),
    repos = github.getReposApi();

var components = [
  "webmaker.org",
  "popcorn.webmaker.org",
  "thimble.webmaker.org",
  "goggles.webmaker.org",
  "login.webmaker.org",
  "makeapi",
  "makeapi-client",
  "make-valet",
  "webmaker-suite",
  "webmaker-profile",
  "webmaker-profile-service",
  "webmaker-ui",
  "node-webmaker-i18n",
  "node-webmaker-loginapi",
  "node-webmaker-postalservice"
];

// TODO: These only return the first page of the results. To do this correctly
//       we would have to be able to specify the page as well. We can do this
//       through using the paging API in node-github.

function tags ( repo, callback ) {
  repos.getTags({
    user: "mozilla",
    repo: repo
  }, callback );
}

function commits( repo, callback ) {
  repos.getCommits({
    user: "mozilla",
    repo: repo
  }, callback );
}

function tagsFromDate( repo, date, callback ) {
  tags( repo, function( err, tags ) {
    if ( err ) {
      callback( err );
      return;
    }
    commits( repo, function( err, commits ) {
      if ( err ) {
        callback( err );
        return;
      }
      var resTags = [],
          fromDate = moment( date, "YYYY-MM-DD" );
      for ( var i = 0; i < commits.length; i++ ) {
        var commitDate = moment( commits[ i ].commit.committer.date, "YYYY-MM-DD" );
        if ( fromDate.diff( commitDate, "days") > 0 ) {
          break;
        }
        for ( var x = 0; x < tags.length; x++ ) {
          if ( tags[ x ].commit.sha === commits[ i ].sha ) {
            resTags.push( tags[ x ] );
          }
        }
      }
      callback( undefined, resTags );
    });
  });
}

function contributors( repo, callback ) {
  repos.getContributors({
    user: "mozilla",
    repo: repo
  }, callback );
}

function contributorCounts( index, callback ) {
  if ( index === components.length ) {
    callback( null, {} );
    return;
  }
  contributors( components[ index ], function( err, contributors ) {
    if ( err ) {
      callback( err );
      return;
    }
    contributorCounts( index + 1, function( err, counts ) {
      if ( err ) {
        callback( err );
        return;
      }
      counts[ components[ index ] ] = contributors.length;
      callback( null, counts );
    });
  });
}

module.exports = {
  tags: tags,
  tagsFromDate: tagsFromDate,
  commits: commits,
  contributors: contributors,
  contributorCounts: contributorCounts
};

@@ -71,22 +71,48 @@
 t%22 )
-,%0A    github =
+;%0A%0Afunction createGitHubAPI() %7B%0A  return
  new
@@ -176,32 +176,65 @@
 %22%0A  
-  %7D),%0A    repos = gith
+%7D);%0A%7D%0A%0Afunction getRepoApi() %7B%0A  return createGitH
 ub
+API()
 .get
@@ -244,16 +244,18 @@
 osApi();
+%0A%7D
 %0A%0Avar co
@@ -858,29 +858,36 @@
 lback ) %7B%0A  
-repos
+getRepoApi()
 .getTags(%7B%0A 
@@ -976,29 +976,36 @@
 lback ) %7B%0A  
-repos
+getRepoApi()
 .getCommits(
@@ -1899,13 +1899,20 @@
 %7B%0A  
-repos
+getRepoApi()
 .get

Update lib/github.js to create new client's per request.