diff --git a/board-report/README.md b/board-report/README.md
deleted file mode 100644
index 9709935..0000000
--- a/board-report/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# generate-report
-
-## Usage
-
-```shell
-npm i -g
-generate-report <daterange> | --help
-```
-
-If you are reporting for February 2014, for instance,
-set the date range to: `201311-201402`.
diff --git a/board-report/generate-report b/board-report/generate-report
deleted file mode 100755
index 79c9fa8..0000000
--- a/board-report/generate-report
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env node
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-const crawler = require('./lib/index.js'),
-      argument = require('./lib/argument.js');
-
-const arg = process.argv[2];
-const template = '{{count}} {{messages}} since end of {{month}} ' +
-  '({{diff}} change)';
-
-if (arg === '-h' || arg === '--help') {
-  return printUsage();
-}
-
-if (!argument.validArg(arg)) {
-  console.error('Error: format is YYYYMM - see ' +
-    "'generate-report --help'");
-  process.exit(1);
-  return;
-}
-
-var monthsForDiff = 3
-const queryParams = argument.prepareQueryParams(arg);
-crawler(queryParams, monthsForDiff, function (err, data) {
-  if (err) {
-    logLine('Error:');
-    console.error(err);
-    process.exit(1);
-    return;
-  }
-
-  logLine('Your message counts:');
-  Object.keys(data).forEach(function (el) {
-    const month = argument.getMonthAsWordFromNow(arg, monthsForDiff + 1),
-          messageCount = data[el].curr,
-          message = messageCount > 1 ? 'messages' : 'message',
-          wikitext = template
-            .replace('{{count}}', messageCount)
-            .replace('{{month}}', month)
-            .replace('{{messages}}', message)
-            .replace('{{diff}}', data[el].diff);
-
-    console.log(el + ':');
-    logLine(wikitext);
-  });
-  console.log('Happy reporting! :)');
-});
-
-function logLine (line) {
-  console.log(line + '\n');
-}
-
-function printUsage () {
-  logLine('usage: generate-report <date> | --help');
-  console.log('If you are reporting for February 2014, for instance,');
-  logLine('set the date to: 201402');
-  console.log('guide:');
-  console.log('https://cwiki.apache.org/confluence/display' +
-    '/COUCHDB/Guide');
-  console.log('template:');
-  console.log('https://cwiki.apache.org/confluence/display' +
-    '/COUCHDB/Template');
-}
diff --git a/board-report/lib/argument.js b/board-report/lib/argument.js
deleted file mode 100644
index a75e460..0000000
--- a/board-report/lib/argument.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-const moment = require('moment');
-
-exports.prepareQueryParams = prepareQueryParams;
-function prepareQueryParams (arg) {
-  console.log(arg)
-  const startEnd = getStartEndDates(arg, 3);
-        startAsString = startEnd[0].format('YYYYMM'),
-        diffStartEnd = getStartEndDates(startAsString, 3);
-
-  return {
-    queryCurr: formatQuery(startEnd),
-    queryDiff: formatQuery(diffStartEnd)
-  };
-}
-
-exports.validArg = validArg;
-function validArg (arg) {
-  if (!arg) {
-    return false;
-  }
-
-  if (arg.length !== 6) {
-    return false;
-  }
-
-  if (Number.isNaN(+arg)) {
-    return false;
-  }
-
-  return moment(arg, 'YYYYMM').isValid();
-}
-
-exports.getMonthAsWordFromNow = getMonthAsWordFromNow;
-function getMonthAsWordFromNow (reportEnd, time) {
-  const inter = moment(reportEnd, 'YYYYMM')
-    .subtract(time, 'months')
-    .format('YYYYMM');
-
-  return moment(inter, 'YYYYMM').format('MMMM');
-}
-
-exports.getMonthAsWord = getMonthAsWord;
-function getMonthAsWord (reportEnd) {
-  return moment(reportEnd, 'YYYYMM').format('MMMM');
-}
-
-function formatQuery (startEnd) {
-  return startEnd[0].format('YYYYMM') + '-' +
-    startEnd[1].format('YYYYMM');
-}
-
-function getStartEndDates (arg, time) {
-  const end = moment(arg, 'YYYYMM').subtract(1, 'month'),
-        start = moment(arg, 'YYYYMM').subtract(time, 'months');
-  return [start, end];
-}
diff --git a/board-report/lib/index.js b/board-report/lib/index.js
deleted file mode 100644
index d1e783c..0000000
--- a/board-report/lib/index.js
+++ /dev/null
@@ -1,141 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-const async = require('async'),
-      request = require('request'),
-      cheerio = require('cheerio'),
-      assert = require('assert'),
-      argument = require('./argument.js');
-
-const urlPrefix = 'http://markmail.org/search/?q=list%3Aorg.apache.';
-const urlTemplate = urlPrefix + '{{listname}}%20date%3A{{date}}';
-
-
-const lists = [
-  'couchdb-announce',
-  'couchdb-user',
-  'couchdb-erlang',
-  'couchdb-dev',
-  'couchdb-commits',
-  'couchdb-l10n',
-  'couchdb-replication',
-  'couchdb-marketing'
-];
-
-function api (queryParams, timeframe, cb) {
-  assert.ok(queryParams.queryCurr, 'queryParams must be defined');
-  assert.ok(queryParams.queryDiff, 'queryParams must be defined');
-  assert.equal(typeof timeframe, 'number',
-    'timeframe must be a number');
-  assert.equal(typeof cb, 'function', 'callback must a a function');
-
-  const listUrlsCurr = getUrls(queryParams.queryCurr),
-        listUrlsDiff = getUrls(queryParams.queryDiff);
-
-  async.parallel({
-    current: function (cb) {
-      getMessageCounts(listUrlsCurr, cb);
-    },
-    diff: function (cb) {
-      getMessageCounts(listUrlsDiff, cb);
-    }
-  },
-  function (err, res) {
-    const data = joinDiffWithCurrent(res);
-    cb(null, data);
-  });
-}
-
-function joinDiffWithCurrent (structure) {
-  const curr = structure.current,
-        diff = structure.diff;
-
-  return curr.reduce(function (acc, el) {
-    const name = el[0],
-          count = el[1],
-          countOld = pick(name, diff);
-
-    acc[name] = {
-      curr: normalize(count),
-      old: normalize(countOld),
-      diff: getDiffString(count, countOld)
-    };
-
-    return acc;
-  }, {});
-}
-
-function pick (element, structure) {
-  return structure.reduce(function (acc, row) {
-    if (row[0] === element) {
-      acc = acc + row[1];
-    }
-    return acc;
-  }, 0);
-}
-
-function getDiffString (count, countOld) {
-  const result = normalize(count) - normalize(countOld);
-
-  if (result >= 0) {
-    return '+' + result;
-  }
-  return '' + result;
-}
-
-function normalize (string) {
-  if (!string) {
-    string = '0';
-  }
-  return parseInt(string.replace(',', ''), 10);
-}
-
-function getUrls (date) {
-  return lists.map(function (list) {
-    return urlTemplate
-      .replace('{{date}}', date)
-      .replace('{{listname}}', list);
-  });
-}
-
-function requestWithOptions (url, cb) {
-  request({
-    uri: url,
-    pool: {
-      maxSockets: Infinity
-    }
-  }, function (err, res, body) {
-    cb(err, [url, body]);
-  })
-}
-
-function normalizeListName (list) {
-  return list.replace(urlPrefix, '').split('%20date')[0];
-}
-
-function getMessageCounts (urlList, cb) {
-  async.map(urlList, requestWithOptions, function (err, results) {
-    if (err) {
-      return cb(err);
-    }
-    const res = results.map(function (element) {
-      const $ = cheerio.load(element[1]),
-            count = $('#lists .count').text(),
-            list = normalizeListName(element[0]);
-      return [list, count];
-    });
-
-    return cb(null, res);
-  });
-}
-
-module.exports = api;
diff --git a/board-report/package.json b/board-report/package.json
deleted file mode 100644
index 41c680d..0000000
--- a/board-report/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name": "generate-report",
-  "version": "1.0.0",
-  "private": true,
-  "description": "I'm helping to prepare board reports",
-  "main": "lib/index.js",
-  "bin": "./generate-report",
-  "scripts": {
-    "test": "mocha -R spec"
-  },
-  "author": "Robert Kowalski <rok@kowalski.gd>",
-  "license": "Apache License, Version 2.0",
-  "dependencies": {
-    "async": "0.9.0",
-    "cheerio": "0.18.0",
-    "moment": "2.8.3",
-    "request": "2.48.0"
-  },
-  "devDependencies": {
-    "mocha": "~2.0.1"
-  }
-}
diff --git a/board-report/test/argument.js b/board-report/test/argument.js
deleted file mode 100644
index b3dad7e..0000000
--- a/board-report/test/argument.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-const assert = require('assert'),
-      argument = require('../lib/argument.js');
-
-describe('arguments', function () {
-
-  it('validates arguments', function () {
-    assert.ok(argument.validArg('201401'));
-    assert.equal(argument.validArg('2ente'), false);
-    assert.equal(argument.validArg('2014123'), false);
-  });
-
-   it('has a method for getting names of months', function () {
-    assert.equal(argument.getMonthAsWord('201401'), 'January');
-    assert.equal(argument.getMonthAsWord('201412'), 'December');
-  });
-
-  it('prepares query parameters', function () {
-    const queryParams = argument.prepareQueryParams('201411');
-
-    assert.equal(queryParams.queryCurr, '201408-201410');
-    assert.equal(queryParams.queryDiff, '201405-201407');
-  });
-
-  it('prepares urls for the current and the diff', function () {
-    const queryParams = argument.prepareQueryParams('201411');
-
-    assert.equal(queryParams.queryCurr, '201408-201410');
-    assert.equal(queryParams.queryDiff, '201405-201407');
-  });
-});
