+A new updated version of James Peret's landing page, portfolio and blog. Before there was only a landing page and a separete blog. Now everything is one system.
+
+Based on [Hexo](http://hexo.io) for building the static website.
+
+### To Do's
+
+- [ ] Website Tasks
+
+ - [ ] Better home page posts
+
+ - [ ] Projects page header
+
+ - [ ] Projects page list view
+
+ - [ ] Featured projects button
+
+ - [ ] About page content
+
+ - [ ] Add anv links to home page header
+
+ - [ ] Filter projects using URL parameters
+
+ - [ ] Project action links button in card and list view
+
+ - [ ] Disqus comments
+
+ - [ ] Syntax highlight
+
+ - [ ] Tags and category links
+
+ - [ ] Tag list filter button in projects page
+
+- [ ] System Tasks
+
+ - [ ] Thumbnail and hero images are stored in project folder
+ * Return the first index at which a loosely equal value can be
+ * found in the array (if value is a plain object, the array must
+ * contain an object of the same shape), or -1 if it is not present.
+ */
+ function looseIndexOf (arr, val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (looseEqual(arr[i], val)) { return i }
+ }
+ return -1
+ }
+
+ /**
+ * Ensure a function is called only once.
+ */
+ function once (fn) {
+ var called = false;
+ return function () {
+ if (!called) {
+ called = true;
+ fn.apply(this, arguments);
+ }
+ }
+ }
+
+ var SSR_ATTR = 'data-server-rendered';
+
+ var ASSET_TYPES = [
+ 'component',
+ 'directive',
+ 'filter'
+ ];
+
+ var LIFECYCLE_HOOKS = [
+ 'beforeCreate',
+ 'created',
+ 'beforeMount',
+ 'mounted',
+ 'beforeUpdate',
+ 'updated',
+ 'beforeDestroy',
+ 'destroyed',
+ 'activated',
+ 'deactivated',
+ 'errorCaptured',
+ 'serverPrefetch'
+ ];
+
+ /* */
+
+
+
+ var config = ({
+ /**
+ * Option merge strategies (used in core/util/options)
+ */
+ // $flow-disable-line
+ optionMergeStrategies: Object.create(null),
+
+ /**
+ * Whether to suppress warnings.
+ */
+ silent: false,
+
+ /**
+ * Show production mode tip message on boot?
+ */
+ productionTip: "development" !== 'production',
+
+ /**
+ * Whether to enable devtools
+ */
+ devtools: "development" !== 'production',
+
+ /**
+ * Whether to record perf
+ */
+ performance: false,
+
+ /**
+ * Error handler for watcher errors
+ */
+ errorHandler: null,
+
+ /**
+ * Warn handler for watcher warns
+ */
+ warnHandler: null,
+
+ /**
+ * Ignore certain custom elements
+ */
+ ignoredElements: [],
+
+ /**
+ * Custom user key aliases for v-on
+ */
+ // $flow-disable-line
+ keyCodes: Object.create(null),
+
+ /**
+ * Check if a tag is reserved so that it cannot be registered as a
+ * component. This is platform-dependent and may be overwritten.
+ */
+ isReservedTag: no,
+
+ /**
+ * Check if an attribute is reserved so that it cannot be used as a component
+ * prop. This is platform-dependent and may be overwritten.
+ */
+ isReservedAttr: no,
+
+ /**
+ * Check if a tag is an unknown element.
+ * Platform-dependent.
+ */
+ isUnknownElement: no,
+
+ /**
+ * Get the namespace of an element
+ */
+ getTagNamespace: noop,
+
+ /**
+ * Parse the real tag name for the specific platform.
+ */
+ parsePlatformTagName: identity,
+
+ /**
+ * Check if an attribute must be bound using property, e.g. value
+ * Platform-dependent.
+ */
+ mustUseProp: no,
+
+ /**
+ * Perform updates asynchronously. Intended to be used by Vue Test Utils
+ * This will significantly reduce performance if set to false.
+ */
+ async: true,
+
+ /**
+ * Exposed for legacy reasons
+ */
+ _lifecycleHooks: LIFECYCLE_HOOKS
+ });
+
+ /* */
+
+ /**
+ * unicode letters used for parsing html tags, component names and property paths.
+ * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
+ * skipping \u10000-\uEFFFF due to it freezing up PhantomJS
+ */
+ var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
+
+ /**
+ * Check if a string starts with $ or _
+ */
+ function isReserved (str) {
+ var c = (str + '').charCodeAt(0);
+ return c === 0x24 || c === 0x5F
+ }
+
+ /**
+ * Define a property.
+ */
+ function def (obj, key, val, enumerable) {
+ Object.defineProperty(obj, key, {
+ value: val,
+ enumerable: !!enumerable,
+ writable: true,
+ configurable: true
+ });
+ }
+
+ /**
+ * Parse simple path.
+ */
+ var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
+ function parsePath (path) {
+ if (bailRE.test(path)) {
+ return
+ }
+ var segments = path.split('.');
+ return function (obj) {
+ for (var i = 0; i < segments.length; i++) {
+ if (!obj) { return }
+ obj = obj[segments[i]];
+ }
+ return obj
+ }
+ }
+
+ /* */
+
+ // can we use __proto__?
+ var hasProto = '__proto__' in {};
+
+ // Browser environment sniffing
+ var inBrowser = typeof window !== 'undefined';
+ var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+ var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
+ var UA = inBrowser && window.navigator.userAgent.toLowerCase();