first commit - seedlinux - Torrent indexing tool opensource torrents with share ratio's etc.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit ae7071ce130a7c4060c471515a90e9deb2d886c4
 (HTM) Author: Jay Scott <jay@jayscott.co.uk>
       Date:   Sun, 25 Jun 2017 16:45:20 +0100
       
       first commit
       
       Diffstat:
         A .gitignore                          |      58 ++++++++++++++++++++++++++++++
         A README.md                           |      32 +++++++++++++++++++++++++++++++
         A app.js                              |      57 +++++++++++++++++++++++++++++++
         A bin/www                             |      90 +++++++++++++++++++++++++++++++
         A package-lock.json                   |     452 +++++++++++++++++++++++++++++++
         A package.json                        |      20 ++++++++++++++++++++
         A public/images/logo.png              |       0 
         A public/stylesheets/style.css        |     109 +++++++++++++++++++++++++++++++
         A routes/index.js                     |       9 +++++++++
         A routes/torrents.js                  |       9 +++++++++
         A views/error.twig                    |       7 +++++++
         A views/index.twig                    |       6 ++++++
         A views/layout.twig                   |      53 ++++++++++++++++++++++++++++++
       
       13 files changed, 902 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/.gitignore b/.gitignore
       @@ -0,0 +1,58 @@
       +# Logs
       +logs
       +*.log
       +npm-debug.log*
       +yarn-debug.log*
       +yarn-error.log*
       +
       +# Runtime data
       +pids
       +*.pid
       +*.seed
       +*.pid.lock
       +
       +# Directory for instrumented libs generated by jscoverage/JSCover
       +lib-cov
       +
       +# Coverage directory used by tools like istanbul
       +coverage
       +
       +# nyc test coverage
       +.nyc_output
       +
       +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
       +.grunt
       +
       +# Bower dependency directory (https://bower.io/)
       +bower_components
       +
       +# node-waf configuration
       +.lock-wscript
       +
       +# Compiled binary addons (http://nodejs.org/api/addons.html)
       +build/Release
       +
       +# Dependency directories
       +node_modules/
       +jspm_packages/
       +
       +# Typescript v1 declaration files
       +typings/
       +
       +# Optional npm cache directory
       +.npm
       +
       +# Optional eslint cache
       +.eslintcache
       +
       +# Optional REPL history
       +.node_repl_history
       +
       +# Output of 'npm pack'
       +*.tgz
       +
       +# Yarn Integrity file
       +.yarn-integrity
       +
       +# dotenv environment variables file
       +.env
 (DIR) diff --git a/README.md b/README.md
       @@ -0,0 +1,32 @@
       +# Seed Linux
       +
       +Seedlinux is a WIP application to list open source torrents that need help with seeders. 
       +
       +### Data import
       +
       +If you are using MongoDB directly installed on your local machine or else where then skip the docker commands and go straight for the the import command. 
       +
       +
       +Pull the latest MongoDB docker image. 
       +
       +```bash
       +docker pull mongo
       +``` 
       +Run the docker image in a throw away container. 
       +
       +```bash
       +docker run -p 27017:27017 -ti --rm mongo`
       +```
       +Seed the data using mongo-import tool. 
       +
       +```bash
       +mongoimport --db seedlinux --collection torrents --drop --file ./data/dataset.json`
       +```
       +
       +### Stuff used to make this:
       +
       +  * [Docker](https://hub.docker.com/_/mongo/) image for MongoDB.
       +  * [MongoDB import](https://docs.mongodb.com/getting-started/shell/import-data/) tool.
       +  * [ExpressJS](https://expressjs.com) web framework. 
       +  * [Bulma](http://bulma.io/) CSS framework.
       +
 (DIR) diff --git a/app.js b/app.js
       @@ -0,0 +1,57 @@
       +var express = require('express');
       +var path = require('path');
       +var favicon = require('serve-favicon');
       +var logger = require('morgan');
       +var cookieParser = require('cookie-parser');
       +var bodyParser = require('body-parser');
       +
       +var index = require('./routes/index');
       +var torrents = require('./routes/torrents');
       +
       +// MongoDB
       +var mongo = require('mongodb');
       +var monk = require('monk');
       +var db = monk('localhost:27017/seedlinux');
       +
       +var app = express();
       +
       +// view engine setup
       +app.set('views', path.join(__dirname, 'views'));
       +app.set('view engine', 'twig');
       +
       +// uncomment after placing your favicon in /public
       +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
       +app.use(logger('dev'));
       +app.use(bodyParser.json());
       +app.use(bodyParser.urlencoded({ extended: false }));
       +app.use(cookieParser());
       +app.use(express.static(path.join(__dirname, 'public')));
       +
       +// db access
       +app.use(function(req,res,next){
       +    req.db = db;
       +    next();
       +});
       +
       +app.use('/', index);
       +app.use('/torrents', torrents);
       +
       +// catch 404 and forward to error handler
       +app.use(function(req, res, next) {
       +  var err = new Error('Not Found');
       +  err.status = 404;
       +  next(err);
       +});
       +
       +// error handler
       +app.use(function(err, req, res, next) {
       +  // set locals, only providing error in development
       +  res.locals.message = err.message;
       +  res.locals.error = req.app.get('env') === 'development' ? err : {};
       +
       +  // render the error page
       +  res.status(err.status || 500);
       +  res.render('error');
       +});
       +
       +module.exports = app;
 (DIR) diff --git a/bin/www b/bin/www
       @@ -0,0 +1,90 @@
       +#!/usr/bin/env node
       +
       +/**
       + * Module dependencies.
       + */
       +
       +var app = require('../app');
       +var debug = require('debug')('seedlinux:server');
       +var http = require('http');
       +
       +/**
       + * Get port from environment and store in Express.
       + */
       +
       +var port = normalizePort(process.env.PORT || '3000');
       +app.set('port', port);
       +
       +/**
       + * Create HTTP server.
       + */
       +
       +var server = http.createServer(app);
       +
       +/**
       + * Listen on provided port, on all network interfaces.
       + */
       +
       +server.listen(port);
       +server.on('error', onError);
       +server.on('listening', onListening);
       +
       +/**
       + * Normalize a port into a number, string, or false.
       + */
       +
       +function normalizePort(val) {
       +  var port = parseInt(val, 10);
       +
       +  if (isNaN(port)) {
       +    // named pipe
       +    return val;
       +  }
       +
       +  if (port >= 0) {
       +    // port number
       +    return port;
       +  }
       +
       +  return false;
       +}
       +
       +/**
       + * Event listener for HTTP server "error" event.
       + */
       +
       +function onError(error) {
       +  if (error.syscall !== 'listen') {
       +    throw error;
       +  }
       +
       +  var bind = typeof port === 'string'
       +    ? 'Pipe ' + port
       +    : 'Port ' + port;
       +
       +  // handle specific listen errors with friendly messages
       +  switch (error.code) {
       +    case 'EACCES':
       +      console.error(bind + ' requires elevated privileges');
       +      process.exit(1);
       +      break;
       +    case 'EADDRINUSE':
       +      console.error(bind + ' is already in use');
       +      process.exit(1);
       +      break;
       +    default:
       +      throw error;
       +  }
       +}
       +
       +/**
       + * Event listener for HTTP server "listening" event.
       + */
       +
       +function onListening() {
       +  var addr = server.address();
       +  var bind = typeof addr === 'string'
       +    ? 'pipe ' + addr
       +    : 'port ' + addr.port;
       +  debug('Listening on ' + bind);
       +}
 (DIR) diff --git a/package-lock.json b/package-lock.json
       @@ -0,0 +1,452 @@
       +{
       +  "name": "seedlinux",
       +  "version": "0.0.1",
       +  "lockfileVersion": 1,
       +  "dependencies": {
       +    "accepts": {
       +      "version": "1.3.3",
       +      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
       +      "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo="
       +    },
       +    "array-flatten": {
       +      "version": "1.1.1",
       +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       +      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
       +    },
       +    "balanced-match": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       +      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
       +    },
       +    "basic-auth": {
       +      "version": "1.1.0",
       +      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
       +      "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ="
       +    },
       +    "body-parser": {
       +      "version": "1.17.2",
       +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
       +      "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
       +      "dependencies": {
       +        "debug": {
       +          "version": "2.6.7",
       +          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
       +          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
       +        }
       +      }
       +    },
       +    "brace-expansion": {
       +      "version": "1.1.8",
       +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
       +      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI="
       +    },
       +    "bson": {
       +      "version": "1.0.4",
       +      "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz",
       +      "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw="
       +    },
       +    "buffer-shims": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
       +      "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
       +    },
       +    "bytes": {
       +      "version": "2.4.0",
       +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
       +      "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
       +    },
       +    "concat-map": {
       +      "version": "0.0.1",
       +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       +      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
       +    },
       +    "content-disposition": {
       +      "version": "0.5.2",
       +      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
       +      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
       +    },
       +    "content-type": {
       +      "version": "1.0.2",
       +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
       +      "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
       +    },
       +    "cookie": {
       +      "version": "0.3.1",
       +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
       +      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
       +    },
       +    "cookie-parser": {
       +      "version": "1.4.3",
       +      "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
       +      "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU="
       +    },
       +    "cookie-signature": {
       +      "version": "1.0.6",
       +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       +      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
       +    },
       +    "core-util-is": {
       +      "version": "1.0.2",
       +      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
       +      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
       +    },
       +    "debug": {
       +      "version": "2.6.8",
       +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
       +      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw="
       +    },
       +    "depd": {
       +      "version": "1.1.0",
       +      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
       +      "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM="
       +    },
       +    "destroy": {
       +      "version": "1.0.4",
       +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
       +      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
       +    },
       +    "ee-first": {
       +      "version": "1.1.1",
       +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
       +      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
       +    },
       +    "encodeurl": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
       +      "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA="
       +    },
       +    "es6-promise": {
       +      "version": "3.2.1",
       +      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz",
       +      "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q="
       +    },
       +    "escape-html": {
       +      "version": "1.0.3",
       +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       +      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
       +    },
       +    "etag": {
       +      "version": "1.8.0",
       +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
       +      "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
       +    },
       +    "express": {
       +      "version": "4.15.3",
       +      "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
       +      "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=",
       +      "dependencies": {
       +        "debug": {
       +          "version": "2.6.7",
       +          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
       +          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
       +        }
       +      }
       +    },
       +    "finalhandler": {
       +      "version": "1.0.3",
       +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
       +      "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=",
       +      "dependencies": {
       +        "debug": {
       +          "version": "2.6.7",
       +          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
       +          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
       +        }
       +      }
       +    },
       +    "foreachasync": {
       +      "version": "3.0.0",
       +      "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
       +      "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
       +    },
       +    "forwarded": {
       +      "version": "0.1.0",
       +      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
       +      "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
       +    },
       +    "fresh": {
       +      "version": "0.5.0",
       +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
       +      "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
       +    },
       +    "http-errors": {
       +      "version": "1.6.1",
       +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
       +      "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc="
       +    },
       +    "iconv-lite": {
       +      "version": "0.4.15",
       +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
       +      "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
       +    },
       +    "inherits": {
       +      "version": "2.0.3",
       +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
       +      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
       +    },
       +    "ipaddr.js": {
       +      "version": "1.3.0",
       +      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz",
       +      "integrity": "sha1-HgOlL9rYOou7KyXL9JmLTP/NPew="
       +    },
       +    "isarray": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       +      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
       +    },
       +    "locutus": {
       +      "version": "2.0.9",
       +      "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.9.tgz",
       +      "integrity": "sha1-4mWvHoX9GRc+dDhjc4iFYHg6Avw="
       +    },
       +    "media-typer": {
       +      "version": "0.3.0",
       +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       +      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
       +    },
       +    "merge-descriptors": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       +      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
       +    },
       +    "methods": {
       +      "version": "1.1.2",
       +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
       +      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
       +    },
       +    "mime": {
       +      "version": "1.3.4",
       +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
       +      "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
       +    },
       +    "mime-db": {
       +      "version": "1.27.0",
       +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
       +      "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE="
       +    },
       +    "mime-types": {
       +      "version": "2.1.15",
       +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
       +      "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0="
       +    },
       +    "minimatch": {
       +      "version": "3.0.4",
       +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       +      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
       +    },
       +    "mongodb": {
       +      "version": "2.2.29",
       +      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.29.tgz",
       +      "integrity": "sha512-MrQvIsN6zN80I4hdFo8w46w51cIqD2FJBGsUfApX9GmjXA1aCclEAJbOHaQWjCtabeWq57S3ECzqEKg/9bdBhA=="
       +    },
       +    "mongodb-core": {
       +      "version": "2.1.13",
       +      "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.13.tgz",
       +      "integrity": "sha512-mbcvqLLZwVcpTrsfBDY3hRNk2SDNJWOvKKxFJSc0pnUBhYojymBc/L0THfQsWwKJrkb2nIXSjfFll1mG/I5OqQ=="
       +    },
       +    "monk": {
       +      "version": "6.0.1",
       +      "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.1.tgz",
       +      "integrity": "sha512-R3fD134A/Y5kx2TPs3knFJxLc8b5kTs4Cqo3N3P/dsZjx5JMJpLHQtlEiy0CO2NPRHjH4lGBc+WziEqeyzjtiA=="
       +    },
       +    "monk-middleware-cast-ids": {
       +      "version": "0.2.1",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz",
       +      "integrity": "sha1-QMQOWmyzPM7cKJIglDJ17ohhxSk="
       +    },
       +    "monk-middleware-fields": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz",
       +      "integrity": "sha1-/2N6819ZSIecyyvhWpE2CRG+psE="
       +    },
       +    "monk-middleware-handle-callback": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.0.tgz",
       +      "integrity": "sha1-+r+TduzfAMnjbImwWuoIEri4Ohw="
       +    },
       +    "monk-middleware-options": {
       +      "version": "0.2.1",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz",
       +      "integrity": "sha1-WNrhxRjUZjbr3/UG+t/Hc7tEKIY="
       +    },
       +    "monk-middleware-query": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz",
       +      "integrity": "sha1-qSbGd9SlYgxiFRsKVtDAwVFnWHQ="
       +    },
       +    "monk-middleware-wait-for-connection": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz",
       +      "integrity": "sha1-MSlY0w5Yi1fQl1TdfJe0hDMWg1o="
       +    },
       +    "morgan": {
       +      "version": "1.8.2",
       +      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz",
       +      "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc="
       +    },
       +    "ms": {
       +      "version": "2.0.0",
       +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       +      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
       +    },
       +    "negotiator": {
       +      "version": "0.6.1",
       +      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
       +      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
       +    },
       +    "object-assign": {
       +      "version": "4.1.1",
       +      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       +      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
       +    },
       +    "on-finished": {
       +      "version": "2.3.0",
       +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
       +      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
       +    },
       +    "on-headers": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
       +      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
       +    },
       +    "parseurl": {
       +      "version": "1.3.1",
       +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
       +      "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY="
       +    },
       +    "path-to-regexp": {
       +      "version": "0.1.7",
       +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
       +      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
       +    },
       +    "process-nextick-args": {
       +      "version": "1.0.7",
       +      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
       +      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
       +    },
       +    "proxy-addr": {
       +      "version": "1.1.4",
       +      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz",
       +      "integrity": "sha1-J+VF9pYKRKYn2bREZ+NcG2tM4vM="
       +    },
       +    "qs": {
       +      "version": "6.4.0",
       +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
       +      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
       +    },
       +    "range-parser": {
       +      "version": "1.2.0",
       +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
       +      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
       +    },
       +    "raw-body": {
       +      "version": "2.2.0",
       +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
       +      "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y="
       +    },
       +    "readable-stream": {
       +      "version": "2.2.7",
       +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
       +      "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE="
       +    },
       +    "require_optional": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
       +      "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g=="
       +    },
       +    "resolve-from": {
       +      "version": "2.0.0",
       +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
       +      "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
       +    },
       +    "safe-buffer": {
       +      "version": "5.0.1",
       +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
       +      "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c="
       +    },
       +    "semver": {
       +      "version": "5.3.0",
       +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
       +      "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
       +    },
       +    "send": {
       +      "version": "0.15.3",
       +      "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz",
       +      "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=",
       +      "dependencies": {
       +        "debug": {
       +          "version": "2.6.7",
       +          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
       +          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
       +        }
       +      }
       +    },
       +    "serve-favicon": {
       +      "version": "2.4.3",
       +      "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.3.tgz",
       +      "integrity": "sha1-WYaxewUCZCtkHCH4GLGszjICXSM="
       +    },
       +    "serve-static": {
       +      "version": "1.12.3",
       +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz",
       +      "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI="
       +    },
       +    "setprototypeof": {
       +      "version": "1.0.3",
       +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
       +      "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
       +    },
       +    "statuses": {
       +      "version": "1.3.1",
       +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
       +      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
       +    },
       +    "string_decoder": {
       +      "version": "1.0.3",
       +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
       +      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
       +      "dependencies": {
       +        "safe-buffer": {
       +          "version": "5.1.1",
       +          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
       +          "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
       +        }
       +      }
       +    },
       +    "twig": {
       +      "version": "0.10.3",
       +      "resolved": "https://registry.npmjs.org/twig/-/twig-0.10.3.tgz",
       +      "integrity": "sha1-Z2BOCOGSDr8vr4CpAeJWGJyKPGc="
       +    },
       +    "type-is": {
       +      "version": "1.6.15",
       +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
       +      "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA="
       +    },
       +    "unpipe": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       +      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
       +    },
       +    "util-deprecate": {
       +      "version": "1.0.2",
       +      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
       +      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
       +    },
       +    "utils-merge": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
       +      "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
       +    },
       +    "vary": {
       +      "version": "1.1.1",
       +      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz",
       +      "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc="
       +    },
       +    "walk": {
       +      "version": "2.3.9",
       +      "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz",
       +      "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins="
       +    }
       +  }
       +}
 (DIR) diff --git a/package.json b/package.json
       @@ -0,0 +1,20 @@
       +{
       +  "name": "seedlinux",
       +  "version": "0.0.1",
       +  "description": "Linux torrent information",
       +  "private": true,
       +  "scripts": {
       +    "start": "node ./bin/www"
       +  },
       +  "dependencies": {
       +    "body-parser": "~1.17.1",
       +    "cookie-parser": "~1.4.3",
       +    "debug": "~2.6.3",
       +    "express": "~4.15.2",
       +    "mongodb": "^2.2.29",
       +    "monk": "^6.0.1",
       +    "morgan": "~1.8.1",
       +    "serve-favicon": "~2.4.2",
       +    "twig": "~0.10.3"
       +  }
       +}
 (DIR) diff --git a/public/images/logo.png b/public/images/logo.png
       Binary files differ.
 (DIR) diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css
       @@ -0,0 +1,109 @@
       +body {
       +  font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
       +}
       +.logo {
       +
       +}
       +.logo img {
       +  width:120px;
       +}
       +.container {
       +  padding-top:50px;
       +  max-width: 968px;
       +}
       +.section {
       +  margin-top:40px;
       +  border: 1px solid #efefef;
       +  border-radius: 5px;
       +}
       +.status-header {
       +  padding: 40px 40px 80px 40px;
       +}
       +.status-header .indicator {
       +  display: inline-block;
       +  width: 15px;
       +  height: 15px;
       +  border-radius: 100%;
       +  margin-right: 20px;
       +  background: #17d766;
       +  background: -moz-linear-gradient(top,  #17d766 0%, #17d766 50%, #16cf62 51%, #16cf62 100%);
       +  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#17d766), color-stop(50%,#17d766), color-stop(51%,#16cf62), color-stop(100%,#16cf62));
       +  background: -webkit-linear-gradient(top,  #17d766 0%,#17d766 50%,#16cf62 51%,#16cf62 100%);
       +  background: -ms-linear-gradient(top,  #17d766 0%,#17d766 50%,#16cf62 51%,#16cf62 100%);
       +  background: linear-gradient(to bottom,  #17d766 0%,#17d766 50%,#16cf62 51%,#16cf62 100%);
       +  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#17d766', endColorsGradientType=0);
       +  opacity: 0.8;
       +  filter:alpha(opacity=80);
       +}
       +.status-header .title {
       +  display: inline-block;
       +}
       +.status-header .subtitle {
       +  display: block;
       +  margin-left: 35px;
       +}
       +.status-uptime {
       +  border-top: 1px solid #efefef;
       +  border-bottom: 1px solid #efefef;
       +  padding: 15px 95px 0 95px;
       +  margin: 0 -20px -20px -20px;
       +}
       +.status-uptime .title {
       +  display: inline-block;
       +  font-size: 14px;
       +  color: #bbb;
       +}
       +.status-uptime .uptime {
       +  display: inline-block;
       +  margin-left: 60px;
       +  font-size: 14px;
       +  color: #bbb;
       +}
       +.status-list {
       +  padding:95px;
       +}
       +.status-list .label {
       +  font-size: 16px;
       +  font-weight: bold;
       +}
       +.status-list .amount {
       +  font-size: 16px;
       +  font-weight: bold;
       +  color: #bbb;
       +}
       +.status-tweets {
       +}
       +.status-tweets .twitter {
       +  padding: 0 15px 15px 15px;
       +  margin: -20px -20px 50px -20px;
       +  border-bottom: 1px solid #efefef;
       +}
       +.status-tweets .icon {
       +  display: inline-block;
       +  padding-left:20px;
       +  color: #11bff2;
       +}
       +.status-tweets .username {
       +  display: inline-block;
       +  padding-left: 30px;
       +}
       +.status-tweets .updates {
       +  padding: 0 40px 40px 40px;
       +}
       +.status-tweets .update {
       +  padding-top: 40px;
       +}
       +.status-tweets .update .timestamp {
       +  font-weight: bold;
       +  color: #bbb;
       +}
       +.status-tweets .updates .event {
       +  font-size: 16px;
       +  line-height: 1.6;
       +}
       +.status-footer {
       +  padding-left: 20px;
       +}
       +.status-footer a {
       +  padding: 0 10px;
       +}
 (DIR) diff --git a/routes/index.js b/routes/index.js
       @@ -0,0 +1,9 @@
       +var express = require('express');
       +var router = express.Router();
       +
       +/* GET home page. */
       +router.get('/', function(req, res, next) {
       +  res.render('index', { title: 'Express' });
       +});
       +
       +module.exports = router;
 (DIR) diff --git a/routes/torrents.js b/routes/torrents.js
       @@ -0,0 +1,9 @@
       +var express = require('express');
       +var router = express.Router();
       +
       +/* GET torrents listing. */
       +router.get('/', function(req, res, next) {
       +  res.send('List of all torrents');
       +});
       +
       +module.exports = router;
 (DIR) diff --git a/views/error.twig b/views/error.twig
       @@ -0,0 +1,7 @@
       +{% extends 'layout.twig' %}
       +
       +{% block body %}
       +  <h1>{{message}}</h1>
       +  <h2>{{error.status}}</h2>
       +  <pre>{{error.stack}}</pre>
       +{% endblock %}
 (DIR) diff --git a/views/index.twig b/views/index.twig
       @@ -0,0 +1,6 @@
       +{% extends 'layout.twig' %}
       +
       +{% block body %}
       +  <h1>{{title}}</h1>
       +  <p>Welcome to {{title}}</p>
       +{% endblock %}
 (DIR) diff --git a/views/layout.twig b/views/layout.twig
       @@ -0,0 +1,53 @@
       +<!DOCTYPE html>
       +<html>
       +
       +<head>
       +  <meta charset="utf-8">
       +  <meta http-equiv="X-UA-Compatible" content="IE=edge">
       +  <meta name="viewport" content="width=device-width, initial-scale=1">
       +  <title>{{ title }}</title>
       +  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.1.0/css/bulma.min.css">
       +  <link rel='stylesheet' href='/stylesheets/style.css' />
       +</head>
       +
       +<body>
       +  <div class="container">
       +
       +    <div class="logo">
       +      <a href="/">
       +        <img src="/images/logo.png">
       +      </a>
       +    </div>
       +
       +    <div class="section">
       +        <table class="table">
       +          <thead>
       +            <tr>
       +              <th><abbr title="Position">Pos</abbr></th>
       +              <th>Name</th>
       +              <th><abbr title="Seeders">S</abbr></th>
       +              <th><abbr title="Leachers">L</abbr></th>
       +              <th>Description</th>
       +            </tr>
       +          </thead>
       +          <tbody>
       +            <tr>
       +              <th>1</th>
       +              <td>Ubuntu 17.04 <strong>(C)</strong></td>
       +              <td>190</td>
       +              <td>23</td>
       +              <td>Qualification for the yada yda ydayydaydaydya</td>
       +            </tr>
       +            <tr>
       +              <th>2</th>
       +              <td>Void Linux 22062017</td>
       +              <td>38</td>
       +              <td>20</td>
       +              <td>Qualification for the yada yda ydayydaydaydya</td>
       +            </tr>
       +          </tbody>
       +        </table>
       +    </div>
       +  </div>
       +</body>
       +</html>