diff --git a/credits_generator/.gitignore b/credits_generator/.gitignore
deleted file mode 100644
index 20efa436b5c..00000000000
--- a/credits_generator/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.token
diff --git a/credits_generator/README.md b/credits_generator/README.md
deleted file mode 100644
index e441f9917bb..00000000000
--- a/credits_generator/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-credits_generator
-=================
-
-This tool can be used to update the [Credits page for Home Assistant](https://home-assistant.io/developers/credits/).
-
-Setup
------
-
-Fetch the dependencies with `npm`.
-```bash
-$ cd credits_generator
-$ npm install
-```
-
-Usage
------
-Go to https://github.com/settings/tokens/new and generate a new GitHub personal access token.
-
-Give the token any name and select the `public_repo` and `read:user` scopes.
-
-Put the token in this repo in a file named `.token`.
-
-Run the script.
-
-```bash
-$ node update_credits.js
-```
-
-Commit the changes (depending on our setup).
-
-```bash
-$ git commit ../source/developers/credits.markdown
-$ git push upstream
-```
-
diff --git a/credits_generator/credits.mustache b/credits_generator/credits.mustache
deleted file mode 100644
index c2419f1c321..00000000000
--- a/credits_generator/credits.mustache
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: page
-title: "Credits"
-description: "Credits for the developers who contributed to Home Assistant."
-date: {{ headerDate }}
-sidebar: true
-comments: false
-sharing: true
-footer: true
----
-
-This page contains a list of people who have contributed in one way or another to Home Assistant. Hover over a username to see their contributions.
-
-### {% linkable_title Author %}
-
-- [{{fearlessLeader.info.name}} (@{{fearlessLeader.info.username}})](https://github.com/{{fearlessLeader.info.login}} "{{fearlessLeader.countString}}")
-
-### {% linkable_title Contributors %}
-
-(in alphabetical order)
-
-{{#allUsers}}- [{{info.name}} (@{{info.username}})](https://github.com/{{info.username}} "{{countString}}")
-{{/allUsers}}
-
-This page is irregularly updated using the [`credits_generator` tool](https://github.com/home-assistant/home-assistant.github.io/tree/next/credits_generator). If you think that you are missing, please let us know.
-
-This page was last updated {{ footerDate }}.
diff --git a/credits_generator/package-lock.json b/credits_generator/package-lock.json
deleted file mode 100644
index 51cc2098715..00000000000
--- a/credits_generator/package-lock.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
- "name": "credits_generator",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "agent-base": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
- "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
- "requires": {
- "extend": "3.0.2",
- "semver": "5.0.3"
- }
- },
- "async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
- "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
- "requires": {
- "lodash": "4.17.10"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "follow-redirects": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
- "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=",
- "requires": {
- "debug": "2.6.9",
- "stream-consume": "0.1.1"
- }
- },
- "github": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/github/-/github-8.2.1.tgz",
- "integrity": "sha1-YWsiEfvNHMhjFmmu1nZT5i61OBY=",
- "requires": {
- "follow-redirects": "0.0.7",
- "https-proxy-agent": "1.0.0",
- "mime": "1.6.0",
- "netrc": "0.1.4"
- }
- },
- "https-proxy-agent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
- "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
- "requires": {
- "agent-base": "2.1.1",
- "debug": "2.6.9",
- "extend": "3.0.2"
- }
- },
- "lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "moment": {
- "version": "2.22.2",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
- "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
- },
- "moment-timezone": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz",
- "integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==",
- "requires": {
- "moment": "2.22.2"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mu2": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/mu2/-/mu2-0.5.21.tgz",
- "integrity": "sha1-iIqPD9kOsc/anbgUdvbhmcyeWNM="
- },
- "netrc": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
- "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ="
- },
- "semver": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
- "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no="
- },
- "stream-consume": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
- "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg=="
- }
- }
-}
diff --git a/credits_generator/package.json b/credits_generator/package.json
deleted file mode 100644
index a7d7b76fe53..00000000000
--- a/credits_generator/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": "credits_generator",
- "version": "1.0.0",
- "private": true,
- "description": "A tool to generate the Home Assistant credits page",
- "main": "update_credits.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "Home Assistant Community",
- "license": "Apache-2.0",
- "dependencies": {
- "async": "^2.1.4",
- "github": "^8.1.0",
- "moment-timezone": "^0.5.11",
- "mu2": "^0.5.21"
- }
-}
diff --git a/credits_generator/update_credits.js b/credits_generator/update_credits.js
deleted file mode 100644
index 99e71743c0c..00000000000
--- a/credits_generator/update_credits.js
+++ /dev/null
@@ -1,164 +0,0 @@
-var fs = require('fs')
- , async = require('async')
- , GitHubApi = require('github')
- , mu = require('mu2')
- , moment = require('moment-timezone');
-
-let token;
-
-try {
- token = fs.readFileSync('.token', 'utf-8').trim();
-} catch (err) {
- console.error('You must create a .token file that contains a GitHub token.');
- return;
-}
-
-var organizationName = process.env.GITHUB_ORGANIZATION_NAME || 'home-assistant';
-
-mu.root = __dirname;
-
-var github = new GitHubApi({
- headers: { 'user-agent': 'Home Assistant Contributors List Updater ' }
-});
-
-github.authenticate({ type: 'oauth', token: token });
-
-var usersMap = {};
-
-github.repos.getForOrg({
- org: organizationName,
- type: 'public',
- per_page: 100
-}, function(err, repos){
- var headerSource = (err && err.headers) ? err.headers : repos.meta;
- var ratelimitLimit = Number(headerSource['x-ratelimit-limit']);
- var ratelimitRemaining = Number(headerSource['x-ratelimit-remaining']);
- console.log('Rate limits: '+ratelimitRemaining+'/'+ratelimitLimit, '(remaining/limit)');
- if(err) {
- if(err.code == 403 && ratelimitRemaining == 0) {
- var resetUnixTime = moment.unix(err.headers['x-ratelimit-reset']);
- var resetTimeFormatted = resetUnixTime.format();
- var resetAt = moment().to(resetUnixTime);
- console.error('Error when getting list of repos in org, because rate limits are exhausted. Rate limits reset', resetAt, 'from now ('+resetTimeFormatted+')');
- } else {
- console.error('Error when attempting to get a list of all repos in org...', err.message);
- }
- return;
- }
- async.each(repos, function(repo, cb){
- github.repos.getContributors({ owner: organizationName, repo: repo.name, per_page: 100 }, function(err, contributors){
- getContributors(err, contributors, repo, cb);
- });
- }, function(err){
- if(err){
- console.error('Error when iterating organization repos', err);
- return;
- }
- console.log('Done getting contributors for '+repos.length+' found organization repos...');
- async.each(Object.keys(usersMap), function(login, cb){
- github.users.getForUser({username: login}, function(err, userInfo){
- if(err){
- console.error('Got error when get user details for', login, err);
- cb(err);
- return;
- }
- if (userInfo.name) {
- userInfo.name = userInfo.name.replace(/^@/, '')
- .replace(//g, '>')
- .replace(/[\\`*_{}[\]()#+-.!~|]/g, '\\$&');
- }
- usersMap[login].info.name = userInfo.name || userInfo.login;
- usersMap[login].info.username = userInfo.login;
- cb();
- });
- }, function(err){
- if(err){
- console.error('Got error when running', err);
- return;
- } else {
- console.log('Building contributors!!!');
- buildContributors();
- }
- });
- });
-});
-
-function getContributors(err, res, repo, callback){
- if(err) {
- console.error('Error when getting contributors', err);
- callback(err);
- return
- } else {
- console.log('Processing the '+res.length+' contributors to '+repo.name);
- async.each(res, function(contributor, cb){
- if(!usersMap[contributor.login]) {
- usersMap[contributor.login] = {
- counts: {},
- info: {login: contributor.login, id: contributor.id}
- };
- }
- usersMap[contributor.login].counts[repo.name] = contributor.contributions;
- cb(null);
- }, function(){
- if (github.hasNextPage(res)) {
- github.getNextPage(res, function(newErr, newContributors){
- getContributors(newErr, newContributors, repo, callback);
- });
- } else {
- callback(null);
- }
- });
- }
-}
-
-function buildContributors(){
- var fearlessLeader = usersMap['balloob'];
- fearlessLeader.countString = buildCountString(fearlessLeader.counts);
- delete usersMap['balloob'];
- var users = Object.keys(usersMap).map(function (key) {
- var obj = usersMap[key];
- obj.countString = buildCountString(obj.counts);
- return obj;
- }).sort(function(a, b){
- var nameA = a.info.name.toLowerCase();
- var nameB = b.info.name.toLowerCase();
- if (nameA < nameB) { return -1; }
- if (nameA > nameB) { return 1; }
- return 0;
- });
- var headerDate = moment().tz('UTC').format('YYYY-MM-DD HH:mm:ss ZZ');
- var footerDate = moment().tz('UTC').format('dddd, MMMM Do YYYY, h:mm:ss a zz');
- var output = '';
- mu.compileAndRender('credits.mustache', {
- allUsers: users,
- fearlessLeader: fearlessLeader,
- headerDate: headerDate,
- footerDate: footerDate
- }).on('data', function (data) {
- output += data.toString();
- }).on('end', function(){
- fs.writeFile('../source/developers/credits.markdown', output, function (writeErr) {
- if (writeErr) {
- console.log('Error when writing credits.markdown', writeErr);
- } else {
- console.log('Done getting user info, wrote credits.markdown file!');
- }
- });
- });
-}
-
-function buildCountString(counts){
- var totalCommits = 0;
- var countStrings = [];
- Object.keys(counts).sort(function(a, b){
- return counts[b] - counts[a];
- }).forEach(function (countKey) {
- var count = counts[countKey];
- var word = (count > 1) ? 'commits' : 'commit';
- totalCommits = totalCommits+count;
- countStrings.push(count+' '+word+' to '+countKey);
- });
- countStrings.unshift(totalCommits+' total commits to the home-assistant organization');
- return countStrings.join(', ');
-}