diff --git a/KatchUp/app.js b/KatchUp/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..662bcc927286516b7bbcf9c9009630b78b533ca7
--- /dev/null
+++ b/KatchUp/app.js
@@ -0,0 +1,41 @@
+var createError = require('http-errors');
+var express = require('express');
+var path = require('path');
+var cookieParser = require('cookie-parser');
+var logger = require('morgan');
+
+var indexRouter = require('./routes/index');
+var usersRouter = require('./routes/users');
+
+var app = express();
+
+// view engine setup
+app.set('views', path.join(__dirname, 'views'));
+app.set('view engine', 'jade');
+
+app.use(logger('dev'));
+app.use(express.json());
+app.use(express.urlencoded({ extended: false }));
+app.use(cookieParser());
+app.use(express.static(path.join(__dirname, 'public')));
+
+app.use('/', indexRouter);
+app.use('/users', usersRouter);
+
+// catch 404 and forward to error handler
+app.use(function(req, res, next) {
+  next(createError(404));
+});
+
+// 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;
diff --git a/KatchUp/bin/www b/KatchUp/bin/www
new file mode 100644
index 0000000000000000000000000000000000000000..0e2801b6b7bac5b3e7782a72170bab2a8cbcb49b
--- /dev/null
+++ b/KatchUp/bin/www
@@ -0,0 +1,90 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var app = require('../app');
+var debug = require('debug')('katchup: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);
+}
diff --git a/KatchUp/package.json b/KatchUp/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..9ad53d978a8bb5b9fa2c50b832b58142774ac7a7
--- /dev/null
+++ b/KatchUp/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "katchup",
+  "version": "0.0.0",
+  "private": true,
+  "scripts": {
+    "start": "node ./bin/www"
+  },
+  "dependencies": {
+    "cookie-parser": "~1.4.3",
+    "debug": "~2.6.9",
+    "express": "~4.16.0",
+    "http-errors": "~1.6.2",
+    "jade": "~1.11.0",
+    "morgan": "~1.9.0"
+  }
+}
diff --git a/KatchUp/public/stylesheets/style.css b/KatchUp/public/stylesheets/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..9453385b9916ce9bc5e88d2f5d8cd8a554223590
--- /dev/null
+++ b/KatchUp/public/stylesheets/style.css
@@ -0,0 +1,8 @@
+body {
+  padding: 50px;
+  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+a {
+  color: #00B7FF;
+}
diff --git a/KatchUp/routes/index.js b/KatchUp/routes/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..ecca96a56b309a315ddf6399155fd2f953031d3b
--- /dev/null
+++ b/KatchUp/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;
diff --git a/KatchUp/routes/users.js b/KatchUp/routes/users.js
new file mode 100644
index 0000000000000000000000000000000000000000..623e4302bee32ccc080d1c83ee2e55a426c9bac8
--- /dev/null
+++ b/KatchUp/routes/users.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET users listing. */
+router.get('/', function(req, res, next) {
+  res.send('respond with a resource');
+});
+
+module.exports = router;
diff --git a/KatchUp/views/error.jade b/KatchUp/views/error.jade
new file mode 100644
index 0000000000000000000000000000000000000000..51ec12c6a26323d9f5bc51fb98cb1324a739ea4c
--- /dev/null
+++ b/KatchUp/views/error.jade
@@ -0,0 +1,6 @@
+extends layout
+
+block content
+  h1= message
+  h2= error.status
+  pre #{error.stack}
diff --git a/KatchUp/views/index.jade b/KatchUp/views/index.jade
new file mode 100644
index 0000000000000000000000000000000000000000..3d63b9a044a859b59259d5e23dd4e68ec8e1f2be
--- /dev/null
+++ b/KatchUp/views/index.jade
@@ -0,0 +1,5 @@
+extends layout
+
+block content
+  h1= title
+  p Welcome to #{title}
diff --git a/KatchUp/views/layout.jade b/KatchUp/views/layout.jade
new file mode 100644
index 0000000000000000000000000000000000000000..15af079bf7c34e638ba14844efd979ac9111628b
--- /dev/null
+++ b/KatchUp/views/layout.jade
@@ -0,0 +1,7 @@
+doctype html
+html
+  head
+    title= title
+    link(rel='stylesheet', href='/stylesheets/style.css')
+  body
+    block content