diff --git a/.tmp/site-assets/main.css b/.tmp/site-assets/main.css
new file mode 100644
index 0000000000..fa7270a86c
--- /dev/null
+++ b/.tmp/site-assets/main.css
@@ -0,0 +1,434 @@
+html,
+body {
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font: 16px 'Helvetica Neue', Helvetica, Arial;
+ font-weight: 300;
+ line-height: 1.5;
+ width: auto;
+ background: #fafafa;
+ color: #353535;
+ font-smoothing: antialiased;
+}
+body.learn-page{
+ max-width: 1600px;
+ margin: 0 auto;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-weight: 400;
+ line-height: 1.2;
+ color: #000;
+}
+
+h2 {
+ margin: 10px 0;
+ font-size: 24px;
+}
+
+a,
+.link {
+ color: #9f3c3c;
+ font-weight: 500;
+ cursor: pointer;
+}
+
+
+a:hover,
+.link:hover {
+ color: #431919;
+ text-decoration: underline;
+}
+
+p {
+ font-size: 16px;
+ line-height: 1.5;
+ font-weight: 300;
+}
+
+var {
+ font-style: normal;
+}
+
+header p {
+ font-size: 30px;
+ line-height: 1.2;
+ margin-top: 10px;
+}
+
+header nav {
+ margin-top: 20px;
+ font-size: 20px;
+}
+
+header nav a {
+ font-weight: 200;
+}
+
+header nav a:not(:last-child) {
+ margin-right: 5px;
+ margin-bottom: 5px;
+}
+
+.logo {
+ margin-top: 70px;
+}
+
+.logo-icon {
+ display: none;
+}
+
+.row {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+.screenshot {
+ width: 100%;
+ height: auto;
+ max-width: 558px;
+ margin-top: 12px;
+ float: right;
+}
+
+.tagline2 {
+ font-size: 21px;
+ font-style: italic;
+ margin-top: 40px;
+}
+
+.container {
+ margin-top: 10px;
+ margin-bottom: 20px;
+}
+
+.whats-new li {
+ position: relative;
+ margin: 15px 0;
+ list-style: none;
+}
+
+.whats-new li:before {
+ content: '✔';
+ position: absolute;
+ left: -20px;
+}
+
+.app-lists {
+ overflow: hidden;
+}
+
+.applist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ font-size: 17px;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+
+.applist li {
+ padding: 10px 0;
+ width: 160px;
+}
+
+.applist a {
+ position: relative; /* popover */
+}
+
+.applist-intro {
+ margin: 10px 0 10px;
+ font-style: italic;
+}
+
+.applist .routing::after,
+.applist .label,
+.legend .label {
+ content: 'R';
+ position: relative;
+ top: -3px;
+ font-size: 9px;
+ padding: 1px 3px 1px;
+ background-color: rgba(0, 0, 0, .1);
+ border-radius: 3px;
+ font-weight: bold;
+ line-height: 13px;
+ color: #777;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.applist .labs a,
+.labs-example {
+ color: #582C42;
+}
+
+.applist a:hover .label {
+ text-decoration: none !important;
+ color: red;
+}
+
+.legend {
+ margin-top: 20px;
+ margin-left: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+.legend li {
+ margin-bottom: 0.5em;
+}
+
+.legend li:last-child {
+ margin-bottom: 0;
+}
+
+.collapsed {
+ overflow: hidden;
+ max-height: 0;
+ transition: max-height 0.7s ease-out;
+}
+
+#news-expander {
+ display: none;
+}
+
+#news-expander:checked ~ .collapsed {
+ max-height: 999px;
+ transition: max-height 0.7s ease-in;
+}
+
+.credit {
+ text-align: center;
+}
+
+.credit a {
+ margin: 5px;
+ white-space: nowrap;
+}
+
+.credit a img {
+ border-radius: 3px;
+ margin-right: 5px;
+}
+
+.popover {
+ margin: 0;
+ cursor: default;
+ color: #333;
+ white-space: normal;
+ z-index: 999;
+}
+
+.popover-title {
+ padding: 9px 70px 9px 15px;
+}
+
+.popover-title a {
+ font-size: 13px;
+ position: absolute;
+ right: 20px;
+}
+
+.quote {
+ border: none;
+ margin: 20px 0 70px 0;
+}
+
+.quote p {
+ font-size: 17px;
+ line-height: 1.3;
+ font-style: italic;
+}
+
+.quote p:before {
+ content: '“';
+ font-size: 50px;
+ opacity: .15;
+ position: absolute;
+ top: -20px;
+ left: 3px;
+}
+
+.quote p:after {
+ content: '”';
+ font-size: 50px;
+ opacity: .15;
+ position: absolute;
+ bottom: -42px;
+ right: 3px;
+}
+
+.quote footer {
+ position: absolute;
+ bottom: -60px;
+ left: 12px;
+}
+
+.quote footer img {
+ border-radius: 3px;
+}
+
+.quote footer a {
+ margin-left: 5px;
+ vertical-align: middle;
+}
+
+.speech-bubble {
+ position: relative;
+ padding: 10px;
+ background: rgba(0, 0, 0, .04);
+ border-radius: 5px;
+}
+
+.speech-bubble:after {
+ content: '';
+ position: absolute;
+ top: 100%;
+ left: 20px;
+ border: 13px solid transparent;
+ border-top-color: rgba(0, 0, 0, .04);
+}
+
+.zocial.red {
+ background-color: #b12d2b;
+}
+
+.zocial.gray {
+ background-color: rgba(0, 0, 0, .5);
+}
+
+.zocial.ltgray {
+ color: inherit;
+ text-shadow: none;
+}
+
+.zocial.ltgray strong {
+ color: #B83F45;
+}
+
+.zocial.small {
+ font-size: 12px;
+ padding: 2px 10px;
+}
+
+.zocial,
+a.zocial {
+ background: #f4f4f4;
+ border: 1px solid #777;
+ border-color: rgba(0, 0, 0, 0.2);
+ border-bottom-color: #333;
+ border-bottom-color: rgba(0, 0, 0, 0.4);
+ color: white;
+ cursor: pointer;
+ display: inline-block;
+ padding: 6px 10px;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ position: relative;
+ border-radius: .3em;
+}
+
+@media (max-width: 480px) {
+ .credit a {
+ display: block;
+ }
+}
+
+@media (max-width: 770px) {
+ h2 {
+ margin-top: 20px;
+ }
+
+ .row,
+ .credit {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+
+ .logo {
+ max-width: 100%;
+ margin-top: 0;
+ }
+
+ .container {
+ margin: auto;
+ }
+}
+
+@media (min-width: 992px) {
+ .logo-icon {
+ display: block;
+ }
+}
+
+hr {
+ margin: 20px 0;
+ border: 0;
+ border-top: 1px dashed #c5c5c5;
+ border-bottom: 1px dashed #f7f7f7;
+}
+
+/* Learn page specifics*/
+.learn-page > .learn {
+ position: fixed;
+ height: 100%;
+ width: 272px;
+ top: 0px;
+ left: -300px;
+ overflow-y: auto;
+ padding: 0px;
+ background-color: rgba(255, 255, 255, .6);
+ transition-property: left;
+ transition-duration: 500ms;
+ line-height: 36px;
+ text-indent: 20px;
+}
+.learn-page nav a {
+ display: block;
+}
+
+.learn nav a:hover, .learn-page nav a.selected {
+ background-color: #b83f45;
+ color: #ffffff;
+}
+
+.learn .content {
+ padding: 15px;
+}
+.learn-page header {
+ width: 100%;
+}
+
+div.learn {
+ margin: 50px 20px 20px 20px;
+ padding: 20px;
+ background: #eee;
+}
+
+@media (min-width: 899px) {
+ .learn-page {
+ width: auto;
+ padding-left: 300px;
+ }
+
+ .learn-page > .learn {
+ left: 8px;
+ }
+}
\ No newline at end of file
diff --git a/cypress/support/index.js b/cypress/support/index.js
index 8edffddd85..6dc130452f 100644
--- a/cypress/support/index.js
+++ b/cypress/support/index.js
@@ -1,3 +1,9 @@
import { createTodoCommands } from './commands'
export default createTodoCommands
+
+// Cypress.on('uncaught:exception', (err, runnable) => {
+// // returning false here prevents Cypress from
+// // failing the test
+// return false
+// });
diff --git a/examples/prest-lib/.editorconfig b/examples/prest-lib/.editorconfig
new file mode 100644
index 0000000000..b3f2acdb37
--- /dev/null
+++ b/examples/prest-lib/.editorconfig
@@ -0,0 +1,16 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[package.json]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/examples/prest-lib/.gitattributes b/examples/prest-lib/.gitattributes
new file mode 100644
index 0000000000..176a458f94
--- /dev/null
+++ b/examples/prest-lib/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/examples/prest-lib/.gitignore b/examples/prest-lib/.gitignore
new file mode 100644
index 0000000000..3c3629e647
--- /dev/null
+++ b/examples/prest-lib/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/examples/prest-lib/app-spec.md b/examples/prest-lib/app-spec.md
new file mode 100644
index 0000000000..0c2c6a8307
--- /dev/null
+++ b/examples/prest-lib/app-spec.md
@@ -0,0 +1,122 @@
+# Application Specification
+
+We have created this short spec to help you create awesome and consistent todo apps. Make sure to not only read it but to understand it as well.
+
+## Template Application
+
+Our [template](https://github.com/tastejs/todomvc-app-template/) should be used as the base when implementing a todo app. Before implementing, we recommend that you interact with some of the other apps to see how they're built and how they behave. Check out the [Backbone app](http://todomvc.com/examples/backbone) if you need a reference implementation. If something is unclear or could be improved, [let us know](https://github.com/tastejs/todomvc/issues).
+
+## Structure
+
+### Directory Structure
+
+Recommended file structure:
+
+```sh
+index.html
+package.json
+node_modules/
+css
+└── app.css
+js/
+├── app.js
+├── controllers/
+└── models/
+readme.md
+```
+
+Try to follow this structure as close as possible while still keeping to the framework’s best practices.
+
+Components should be split up into separate files and placed into folders where it makes the most sense.
+
+Example:
+
+```sh
+js/
+├── app.js
+├── controllers/
+│ └── todos.js
+└── models/
+ └── todo.js
+```
+
+Keep in mind that the framework’s best practices on how to structure your app come first.
+
+### README
+
+All examples must include a README describing the framework, the general implementation, and the build process if required. There is an [example readme](https://github.com/tastejs/todomvc-app-template/blob/master/app-readme.md) included in the [template](https://github.com/tastejs/todomvc-app-template).
+
+### Dependency Management
+
+Unless it conflicts with the project's best practices, your example should use [npm](https://npmjs.com) for package management. Specify your dependencies in a `package.json` file in the root directory of your app. The file must include `todomvc-common` and `todomvc-app-css` as dependencies. An example `package.json` could look like this:
+
+```json
+{
+ "private": true,
+ "dependencies": {
+ "backbone": "^1.1.2",
+ "todomvc-app-css": "^1.0.0",
+ "todomvc-common": "^1.0.1"
+ }
+}
+```
+
+You should `.gitignore` everything in `node_modules` except the files actually used by your example. That means that documentation, READMEs and tests should not be included in the pull request.
+
+### Code
+
+Please try to keep the HTML as close to the template as possible. Remove the comments from the HTML when you are finished. The `base.css` file should be referenced from the assets folder and should not be touched. If you need to change some styles, use the `app.css` file, but try to keep changes to a minimum. Remember to update the relative paths when using the template.
+
+Make sure to follow these:
+
+- Follow our [code style](contributing.md#code-style).
+- Use double-quotes in HTML and single-quotes in JS and CSS.
+- Use npm packages for your third-party dependencies and manually remove files that aren't required for your app to run.
+- Use a constant instead of the keyCode directly: `var ENTER_KEY = 13;`
+- Apps should be written without any preprocessors (Sass/CoffeeScript/..) to reach the largest audience.
+- To make it easy to compare frameworks, the app should look and behave exactly like the template and the other examples.
+- We require apps to work in every browser we [support](contributing.md#browser-compatibility).
+
+## Functionality
+
+### No todos
+
+When there are no todos, `#main` and `#footer` should be hidden.
+
+### New todo
+
+New todos are entered in the input at the top of the app. The input element should be focused when the page is loaded, preferably by using the `autofocus` input attribute. Pressing Enter creates the todo, appends it to the todo list, and clears the input. Make sure to `.trim()` the input and then check that it's not empty before creating a new todo.
+
+### Mark all as complete
+
+This checkbox toggles all the todos to the same state as itself. Make sure to clear the checked state after the "Clear completed" button is clicked. The "Mark all as complete" checkbox should also be updated when single todo items are checked/unchecked. Eg. When all the todos are checked it should also get checked.
+
+### Item
+
+A todo item has three possible interactions:
+
+1. Clicking the checkbox marks the todo as complete by updating its `completed` value and toggling the class `completed` on its parent `
`
+
+2. Double-clicking the `