{"action":"created","issue":{"url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/4","labels_url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/4/labels{/name}","comments_url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/4/comments","events_url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/4/events","html_url":"https://github.com/ericelliott/universal-react-boilerplate/issues/4","id":57088728,"number":4,"title":"Roadmap","user":{"login":"ericelliott","id":364727,"avatar_url":"https://avatars.githubusercontent.com/u/364727?v=3","gravatar_id":"","url":"https://api.github.com/users/ericelliott","html_url":"https://github.com/ericelliott","followers_url":"https://api.github.com/users/ericelliott/followers","following_url":"https://api.github.com/users/ericelliott/following{/other_user}","gists_url":"https://api.github.com/users/ericelliott/gists{/gist_id}","starred_url":"https://api.github.com/users/ericelliott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericelliott/subscriptions","organizations_url":"https://api.github.com/users/ericelliott/orgs","repos_url":"https://api.github.com/users/ericelliott/repos","events_url":"https://api.github.com/users/ericelliott/events{/privacy}","received_events_url":"https://api.github.com/users/ericelliott/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/labels/enhancement","name":"enhancement","color":"84b6eb"},{"url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/labels/help%20wanted","name":"help wanted","color":"159818"}],"state":"open","locked":false,"assignee":{"login":"ericelliott","id":364727,"avatar_url":"https://avatars.githubusercontent.com/u/364727?v=3","gravatar_id":"","url":"https://api.github.com/users/ericelliott","html_url":"https://github.com/ericelliott","followers_url":"https://api.github.com/users/ericelliott/followers","following_url":"https://api.github.com/users/ericelliott/following{/other_user}","gists_url":"https://api.github.com/users/ericelliott/gists{/gist_id}","starred_url":"https://api.github.com/users/ericelliott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericelliott/subscriptions","organizations_url":"https://api.github.com/users/ericelliott/orgs","repos_url":"https://api.github.com/users/ericelliott/repos","events_url":"https://api.github.com/users/ericelliott/events{/privacy}","received_events_url":"https://api.github.com/users/ericelliott/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/milestones/2","html_url":"https://github.com/ericelliott/universal-react-boilerplate/milestones/1.x%20mvp","labels_url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/milestones/2/labels","id":972547,"number":2,"title":"1.x mvp","description":"","creator":{"login":"ericelliott","id":364727,"avatar_url":"https://avatars.githubusercontent.com/u/364727?v=3","gravatar_id":"","url":"https://api.github.com/users/ericelliott","html_url":"https://github.com/ericelliott","followers_url":"https://api.github.com/users/ericelliott/followers","following_url":"https://api.github.com/users/ericelliott/following{/other_user}","gists_url":"https://api.github.com/users/ericelliott/gists{/gist_id}","starred_url":"https://api.github.com/users/ericelliott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericelliott/subscriptions","organizations_url":"https://api.github.com/users/ericelliott/orgs","repos_url":"https://api.github.com/users/ericelliott/repos","events_url":"https://api.github.com/users/ericelliott/events{/privacy}","received_events_url":"https://api.github.com/users/ericelliott/received_events","type":"User","site_admin":false},"open_issues":9,"closed_issues":1,"state":"open","created_at":"2015-02-09T20:57:57Z","updated_at":"2015-06-19T23:03:43Z","due_on":null,"closed_at":null},"comments":24,"created_at":"2015-02-09T20:57:57Z","updated_at":"2015-06-20T01:32:56Z","closed_at":null,"body":"# Universal React Boilerplate\r\n\r\nA node app that says, \"Hello, world!\"\r\n\r\nThis is a universal JavaScript application boilerplate using Express 4.x.\r\n\r\n\r\n## Learn JavaScript with Eric Elliott\r\n\r\nThe Universal React Boilerplate was written for the [\"Learn JavaScript with Eric Elliott\" courses](https://ericelliottjs.com/). A series of courses to teach people how to build great JavaScript apps for production. Don't just learn JavaScript. Learn how to build amazing things.\r\n\r\n## Universal JavaScript\r\n\r\nUniversal (aka *\"isomorphic\"*) means that it's designed to run a lot of the same code on both the client and the server. Typically that includes a lot of rendering and domain logic.\r\n\r\nThere are many advantages to building apps this way, but the primary advantages are:\r\n\r\n* Cross-functional teams. Since everything is written in JavaScript, it's easier to build teams who know how to work on both the client and server sides of the app.\r\n* Write once, run everywhere. With the exception of a few library substitutions and browser polyfills, the code is shared, which means you have to write about half the code you'd write working on a non-universal app.\r\n* More productive developers. Since the app is more consistent across the stack, there's no context switching when you need to maintain application behavior on both sides of the stack. Write the behavior once, and you're done. Context switching slows developers down significantly.\r\n\r\n## Roadmap\r\n\r\nI'm planning to put a lot of love into this and make it an essential resource for anybody interested in building production Node and Universal JavaScript applications. It's already very useful as-is, but we've been rewriting a lot of these things over and over again for every app, or searching through the haystack that is `npm` and spending too much time on tech selection instead of knowing what the best, most well-tested solutions are and running with them.\r\n\r\nThis boilerplate will eventually demonstrate a very simple production ready application, (basically \"Hello, world!\" including:\r\n\r\n* [x] Unit tests with [tape](https://github.com/substack/tape) & [faucet](https://github.com/substack/faucet)\r\n* [ ] Route and render with [react-engine](https://github.com/paypal/react-engine)\r\n* [ ] State management and time-travel debugging with [cerebral](https://github.com/christianalfoni/cerebral)\r\n* [ ] Client bundling with browserify.\r\n* [ ] Client unit tests also need to be validated cross-browser. [smokestack](https://github.com/hughsk/smokestack) with [Sauce Labs](https://github.com/hughsk/smokestack#sauce-labs)\r\n* [ ] Functional testing with [selenium-sauce](https://github.com/alexbrombal/selenium-sauce) on [Sauce Labs](http://saucelabs.com)\r\n* [x] Logging with [bunyan-request-logger](https://github.com/ericelliott/bunyan-request-logger)\r\n* [ ] Configuration management with [qconf](https://github.com/ericelliott/qconf)\r\n* [ ] Error handling with [express-error-handler](https://github.com/ericelliott/express-error-handler/)\r\n* [ ] User sign-in flows with multi-factor auth and robust password hashing using [Credential](https://github.com/ericelliott/credential)\r\n* [ ] Multi-factor auth (passwords are obsolete)\r\n* [ ] Auth tokens with [json web tokens](https://github.com/auth0/node-jsonwebtoken)\r\n* [ ] User authorization for requested functionality\r\n* [ ] Command manager (routes will trigger commands rather than kicking off rendering directly)\r\n* [ ] i18n\r\n* [ ] Data modeling\r\n* [ ] Data model validation\r\n* [ ] Robust feature toggling with multivariate testing support\r\n* [ ] HTML5 form validation using [h5v2](https://github.com/ericelliott/h5v2)\r\n* [ ] Automatic hypermedia API route creation with [siren-resource](https://github.com/ericelliott/siren-resource) - Since all entities are root entities, siren-resource can auto-generate typed routes via `entityType`\r\n* [ ] CORS\r\n* [ ] XSS prevention with [Lusca](https://github.com/krakenjs/lusca)\r\n* [ ] Security audit built-into automatic build validation\r\n* [ ] Full-featured build system via [prod-module-boilerplate](https://github.com/ericelliott/prod-module-boilerplate)\r\n\r\nIn other words, everything you'd want to reuse in most production-ready applications -- all done for you using years worth of tried and true best practices.\r\n\r\n## Help wanted\r\n\r\nLet me know in the comments if you'd like to help with any of these items.\r\n\r\n\r\n## Courses\r\n\r\nStudents will get a series of short videos, lots of interactive lessons explaining concepts in-depth, the ability to help and learn from each other, and a lot more.\r\n\r\nHere's a sneak peek at our members-only site:\r\n\r\n![Course homepage](https://cloud.githubusercontent.com/assets/364727/6434012/b3ff7a04-c03b-11e4-9b33-51889c74036f.png)\r\n\r\n![Student profile](https://cloud.githubusercontent.com/assets/364727/6434016/c7a0b802-c03b-11e4-9f4b-867464bd88c6.png)\r\n\r\n\r\n# [Learn JavaScript](https://ericelliottjs.com/)"},"comment":{"url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/comments/113692825","html_url":"https://github.com/ericelliott/universal-react-boilerplate/issues/4#issuecomment-113692825","issue_url":"https://api.github.com/repos/ericelliott/universal-react-boilerplate/issues/4","id":113692825,"user":{"login":"nkbt","id":175264,"avatar_url":"https://avatars.githubusercontent.com/u/175264?v=3","gravatar_id":"","url":"https://api.github.com/users/nkbt","html_url":"https://github.com/nkbt","followers_url":"https://api.github.com/users/nkbt/followers","following_url":"https://api.github.com/users/nkbt/following{/other_user}","gists_url":"https://api.github.com/users/nkbt/gists{/gist_id}","starred_url":"https://api.github.com/users/nkbt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nkbt/subscriptions","organizations_url":"https://api.github.com/users/nkbt/orgs","repos_url":"https://api.github.com/users/nkbt/repos","events_url":"https://api.github.com/users/nkbt/events{/privacy}","received_events_url":"https://api.github.com/users/nkbt/received_events","type":"User","site_admin":false},"created_at":"2015-06-20T01:32:56Z","updated_at":"2015-06-20T01:32:56Z","body":"Sure thing. Check Redux by Dan Abramov, please\n"}}