diff --git a/blog.html b/blog.html
index 48fbbc3..7851239 100644
--- a/blog.html
+++ b/blog.html
@@ -20,6 +20,7 @@
   <script src="js/animate-in.js"></script>
   <link rel="stylesheet" href="css/animations.css">
   <link rel="stylesheet" href="css/wargames.css">
+  <link rel="stylesheet" href="css/style.css">
   <script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
   <script> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-7639560510014441", enable_page_level_ads: true }); </script>
 </head>
@@ -48,10 +49,10 @@
           <li class="nav-item mx-2">
             <a class="nav-link" href="bfor.html"><b><b>Non Profit</b></b></a>
           </li>
-		  <li class="nav-item mx-2">
+          <li class="nav-item mx-2">
             <a class="nav-link" href="blog.html"><b><b>Blog</b></b></a>
           </li>
-		  <li class="nav-item mx-2">
+          <li class="nav-item mx-2">
             <a class="nav-link" href="index.html#gear"><b><b>Gear</b></b></a>
           </li>
         </ul>
@@ -110,7 +111,7 @@
   <!-- Features -->
   <!-- Carousel reviews -->
   <!-- Call to action -->
-  <div class="py-5 text-center bg-dark">
+  <div class="py-5 text-center bg-dark" id="blog-040519">
     <div class="container">
       <div class="row">
         <div class="col-md-12">
@@ -120,8 +121,7 @@
       <div class="row">
         <div id="content" class="col-md-12 d-flex flex-grow-1 align-items-stretch justify-content-center w-75">
           <div id="wargames" class="d-flex flex-grow-1 align-items-center justify-content-center w-100">
-            <pre class="d-flex flex-grow-1 align-items-center justify-content-start w-100">
-			<code class="d-flex flex-grow-1 align-items-center justify-content-start w-100">
+            <pre class="d-flex flex-grow-1 align-items-center justify-content-start w-100">			<code class="d-flex flex-grow-1 align-items-center justify-content-start w-100">
 *********************************************
 __________.____    .___  _________ _________ 
 \______   \    |   |   |/   _____//   _____/ 
@@ -158,6 +158,23 @@
       </div>
     </div>
   </div>
+  <div class="py-5 bg-secondary" id="blog-050219">
+    <div class="container">
+      <div class="row">
+        <div class="col-md-12">
+          <h1 class="d-flex justify-content-center">Thursday - May 2nd, 2019</h1>
+        </div>
+      </div>
+      <div class="row">
+        <div class="px-5 col-md-8 text-center mx-auto">
+          <div id="wrap_a">
+            <h2 class="my-3">An adventure in Bliss development</h2>
+            <div id="output_a"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
   <div class="row" style=" margin-right: 15px; margin-left: 15px;">
     <div class="container">
       <div class="row">
@@ -357,6 +374,7 @@
   <script src="js/smooth-scroll.js"></script>
   <!-- <script src="https://bfintal.github.io/Counter-Up/jquery.counterup.min.js"></script> -->
   <script src="js/counter.js"></script>
+  <script src="js/adv.js"></script>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 0000000..bfb063e
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1,41 @@
+#wrap_a {
+  max-width: 800px;
+  margin: 0 auto;
+}
+
+#output_a {
+  margin: 2em 1em;
+  text-align: left;
+  /* font-family: monospace; */
+  font-size: 1.1em;
+  line-height: 1.5;
+  color: #fc9;
+}
+#output_a .title {
+  color: white;
+  text-align: center;
+}
+#output_a ul {
+  color: white;
+}
+#output_a ul li {
+  margin: 1em;
+}
+#output_a ul a {
+  color: lightblue;
+  text-decoration: none;
+}
+#output_a ul a.win {
+  color: limegreen;
+}
+#output_a ul a.lose {
+  color: red;
+}
+#output_a ul a:hover {
+  color: white;
+}
+#output_a .inv {
+  color: #ca9;
+  font-size: 0.8em;
+  padding-top: 2em;
+}
diff --git a/index.html b/index.html
index e9ca8ce..68b6825 100644
--- a/index.html
+++ b/index.html
@@ -18,7 +18,8 @@
   <!-- Script: Animated entrance -->
   <script src="js/animate-in.js"></script>
   <link rel="stylesheet" href="css/animations.css">
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-7639560510014441", enable_page_level_ads: true }); </script>
+  <script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+  <script> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-7639560510014441", enable_page_level_ads: true }); </script>
 </head>
 
 <body class="" style="">
@@ -44,7 +45,7 @@
           <li class="nav-item mx-2">
             <a class="nav-link" href="bfor.html"><b><b>Non Profit</b></b></a>
           </li>
-		  <li class="nav-item mx-2">
+          <li class="nav-item mx-2">
             <a class="nav-link" href="blog.html"><b><b>Blog</b></b></a>
           </li>
           <li class="nav-item mx-2">
@@ -384,16 +385,17 @@
                 <li>Tech Support Contract Included</li>
                 <li>Extra Kernel &amp; device options **</li>
                 <li>Full Source Code Available</li>
-                <li contenteditable="true">Extra Tools and Options Available</li>
+                <li>Extra Tools and Options Available</li>
               </ul>
-              <p class="my-3 d-inline-flex text-left justify-content-start align-items-start" style="	transform:  scale(.8);">* Per device rates starting with orders targeting 100,000 devices or more<br><br>** Custom kernel and device development is available at hourly rates</p>
+              <p class="d-inline-flex text-left justify-content-start align-items-start" style="	transform:  scale(.8);">* Per device rates starting with orders targeting 100,000 devices or more<br><br>** Custom kernel and device development is available at hourly rates</p>
               <a class="btn btn-primary mt-3 text-white" href="" data-target="#popup-modal3" data-toggle="modal">Contact Us</a>
               <div id="popup-modal3" class="modal fade justify-content-center align-items-center flex-grow-1">
                 <div class="modal-dialog">
                   <div class="modal-content">
                     <div class="modal-body px-3 bg-dark">
                       <h1 class="text-center" style=""> Thanks for your interest in Bliss ROM/OS Development</h1>
-                      <p class="text-center">Please Fill out the form below, leaving as much detail as possible about your target device and or opportunity and we will be in touch shortly. </p>
+                      <p class="text-center">Please Fill out the form below, leaving as much detail as possible about your target device* and or opportunity and we will be in touch shortly.<br></p>
+                      <p class="text-center" style="font-size:.75em;">* Inquiries requesting us to work on a single device, already on the consumer market will be ignored. This opportunity is for manufacturers and OEM's only. </p>
                       <form action="mailto:blissfamilyroms@gmail.com" method="GET" data-form-title="CONTACT US">
                         <div class="form-group"> <input type="email" class="form-control" id="form33" placeholder="Your Email" name="email"> </div>
                         <div class="form-group"> <input type="text" class="form-control" id="form34" placeholder="Subject" name="name"> </div>
@@ -766,7 +768,6 @@
   <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
   <!-- Script: Smooth scrolling between anchors in the same page -->
   <script src="js/smooth-scroll.js"></script>
-
 </body>
 
-</html>
+</html>
\ No newline at end of file
diff --git a/js/adv.js b/js/adv.js
new file mode 100644
index 0000000..c9d8243
--- /dev/null
+++ b/js/adv.js
@@ -0,0 +1,548 @@
+console.clear();
+
+/**
+ * Choose Your Own Adventure-style data structure.
+ *
+ * Works on the principle of 'entries'/'chapters', like the oldschool 'turn to 100'
+ * style Fighting Fantasy gamebooks - this is *not* a proper text adventure engine 
+ * with full location, inventory and state management. It could probably be adapted
+ * to that quite easily, though.
+ *
+ * Definition format:
+ *
+ * Content:
+ * - id: unique string ID for use in 'goto'/'next'.
+ * - text: body text for this entry.
+ * - extra: array of additional paragraphs:
+ *      - text: text for this paragraph
+ *      - requires: string/array of item(s) required for this paragraph
+ *                  to be included.  Use '!itemname' to invert logic.
+ *
+ * Inventory / state:
+ * - gives: string/array of item(s) gained when entry is visited
+ * - takes: string/array of item(s) lost when entry is visited
+ * - gameover: if 'win' or 'lose', changes game state when entry is visited
+ *
+ * Navigation (ONE of the following):
+ * - next: id of next entry (will convert to a single 'Continue...' option)
+ * - options: array of options for this entry:
+ *      - text: text used for option
+ *      - goto: id of entry this option leads to
+ *      - requires: string/array of item(s) required for this option
+ *                  to be available.  Use '!itemname' to invert logic.
+ * 
+ **/
+
+var ENTRIES = [{
+        // Recreation room
+        id: 'e_recroom',
+        text: 'You are in a small-ish room with a computer in front of you ' +
+            'The computer screen shows a terminal, and on the terminal ' +
+            'error showing that you need to repo init before running repo ' +
+            'sync. What do you do',
+        extra: [{
+            text: 'You have the BlissROMs thread for a different device ' +
+				'open on a second screen.',
+        }],
+        options: [{
+            text: 'Examine the webpage for the GitHub link',
+			goto: 'e_github'
+        }, {
+            text: 'Search Google for your answer',
+			goto: 'e_google'
+        }],
+        start: true
+    }, {
+        // Look at the plushie
+        id: 'e_github',
+        text: 'Upon closer inspection, the webpage has a section for Sources, Links, and ' +
+            'Social Media. You scan through them quickly to see if anything could be useful ' +
+            'What section do you decide on',
+        options: [{
+            text: 'Copy the link for the BlissROMs github',
+			goto: 'e_got_github_link'
+        }, {
+            text: 'Open a new tab and go to Google Search instead',
+			goto: 'e_google'
+        }]
+    }, {
+        // Get the mask off the plushie
+        id: 'e_got_github_link',
+        text: 'You grab the link to the BlissROMs GitHub page, and paste it into a new tab. It loads and shows  ' +
+            'a list of repo links is shown, and you are a little overwhelmed by the amount of choices available. ' +
+            'You copy the link to the manifest repo, but are unsure. So you decide to head to Google instead ',
+        next: 'e_google'
+    }, {
+        // Main atrium
+        id: 'e_google',
+        text: 'You sit there, staring at the Google Search page. ' +
+            'As you type in BlissROMs repo init, the page results spit out you notice a few things in the  ' +
+            'list that look familiar. The top result is for the manifest link, while the second result is for ' +
+            'a how-to unlock and root any device. The third link shown is for a YouTube video on building ' +
+			'Android ROMs, and the fourth link down leads to the BlissROMs webpage ',
+        options: [{
+			text: 'Follow the think to the BlissROMs Manifest.',
+			goto: 'e_link_manifest'
+		}, {
+			text: 'Follow the link to unlock and root your device',
+			goto: 'e_link_droid'
+		}, {
+			text: 'Head to YouTube for the video on building Android ROMs',
+			goto: 'e_link_youtube'
+		}, {
+			text: 'Head over to the BlissROMs webpage',
+			goto: 'e_link_blissroms'
+		}],
+    }, {
+        // Manifest link
+        id: 'e_link_manifest',
+        text: 'You head to the manifest page and it shows a few files on the top, followed by a descriptive ' +
+            'readme detailing all the steps needed to install dependencies, repo init, repo sync and even  ' +
+            'steps to build the ROM, GSI, EFI & x86. You remember that you were looking for the init link ' +
+			'so you copy that text snippet. ',
+        next: 'e_back_to_terminal'
+    }, {
+        // Killed by malware
+        id: 'e_link_droid',
+        text: 'You follow the link to unlock and root your device. Upon loading the page, a pop-up dialog shows ' +
+            'and mentioned that you need to click OK in order to root your device. You click it, and the screen ' +
+            'displays a ton of terminal windows opening and closing. You smell smoke from the PC, and before you ' +
+            'can reach the power button, the machine shuts off. smoke is still pouring from the case. ' +
+			' You have failed, go back to your iPhone looser',
+        gameover: 'lose'
+	}, {		
+        // Killed by youtube
+        id: 'e_link_youtube',
+        text: 'You follow the link to watch the YouTube video on building Android, and start to soak up all the ' +
+            'info provided. At the one hour mark, you remember that you left the meatloaf in the oven, and you ' +
+            'are starting to smell a combination of burnt BBQ sauce and beef. You rush to the kitchen to find ' +
+            'half the kitchen on fire already. You reach for a fire extinguisher and try to use it. There was no ' +
+			'pressure in the extinguisher. You then remember seeing a YouTube video on extinguishing a fire with ' +
+			'water, so you quickly throw a bowl of water on the flames. ' +
+			'The flames quickly grow because you threw water on a grease fire and you die. Dont believe everything ' +
+			'you see on youtube ',
+        gameover: 'lose'
+    }, {
+        // BlissROMs link
+        id: 'e_link_blissroms',
+        text: 'You load the BlissROMs page, and scroll through it. At the bottom, you notice the BlissROMs github ' +
+            'link from earlier. You follow it and are shown a list of repos. ',
+        extra: [{
+				text: 'You study your options and notice there are a few repos pinned to the top for manifest, ' +
+					'frameworks/base, vendor/bliss, etc. ',
+			}],
+        options: [{
+				text: 'Check out the manifest repo',
+				goto: 'e_link_manifest'
+			}, {
+				text: 'Check out frameworks/base repo.',
+				goto: 'e_link_fwb'
+			}, {
+				text: 'Check out the vendor/bliss repo',
+				goto: 'e_vendor_bliss'
+			}]
+    }, {
+        // Link fwb
+        id: 'e_link_fwb',
+        text: 'You click the link to frameworks/base, and are presented with a page of source files. and code. None of ' +
+            'this looks like something you are looking for. So you decide to go back to the main repo page' ,
+        next: 'e_link_github_again'
+    }, {
+        // Link vendor/bliss
+        id: 'e_vendor_bliss',
+        text: 'You click the link to vendor/bliss, and are presented with a page of source files. and code. None of ' +
+            'this looks like something you are looking for. So you decide to go back to the main repo page' ,
+        next: 'e_link_github_again'
+    }, {
+        // GitHub again
+        id: 'e_link_github_again',
+        text: 'You head back to the BlissROMs github link from earlier. You see the same list of repos. ',
+        extra: [{
+				text: 'You study your options and notice there are a few repos pinned to the top for manifest, ' +
+					'frameworks/base, vendor/bliss, etc. ',
+			}],
+        options: [{
+				text: 'Check out the manifest repo',
+				goto: 'e_link_manifest'
+			}, {
+				text: 'Check out frameworks/base repo.',
+				goto: 'e_link_fwb'
+			}, {
+				text: 'Check out the vendor/bliss repo',
+				goto: 'e_vendor_bliss'
+			}]
+    }, {
+		// Back to terminal
+        id: 'e_back_to_terminal',
+        text: 'In the terminal window, you take the text snippet you grabbed and paste it into the terminal ' +
+            'window, then hit Return. It spits out a bunch of text and presents you with a message that reads ' +
+			'Repo has been successfully initiated. ',
+        options: [{
+                text: 'View the Github manifest page for the next step',
+                goto: 'e_manifest_next'
+            }, {
+                text: 'Enter repo sync into the terminal',
+                goto: 'e_repo_sync'
+            }, {
+                text: 'Search Google for an answer',
+                goto: 'e_google_2'
+            }, {
+                text: 'Search Youtube for an answer',
+                goto: 'e_link_youtube'
+            }]
+    }, {
+		// Google again
+        id: 'e_google_2',
+        text: 'You head back to google to find out what you do next, so you search for blissroms repo init and ' +
+			'are presented a few options. The top two links lead to the BlissROMs github page, so you follow that ',
+        next: 'e_link_github_again'
+    },{
+      // manifest
+        id: 'e_manifest_next',
+        text: 'You return to the manifest repo, and scroll down to the list of instructions. Once there, you notice ' +
+                ' that the next item after the repo init part are about repo sync.  ' +
+                'What do you decide to do',
+        options: [{
+                text: 'Copy the command for repo sync',
+                goto: 'e_repo_sync'
+            }, {
+                text: 'Give up and go watch some TV',
+                goto: 'e_go_watch_tv'
+            }, {
+                text: 'Leave and go outside.',
+                goto: 'e_outside'
+            }]
+    }, {
+      // repo sync
+        id: 'e_repo_sync',
+        text: 'You head back to the terminal and enter the repo sync command into it, and press return ' +
+            'The screen lights up with hundreds of lines of text scrolling past the screen endlessly.  ' +
+            'After about 30 min, the repo sync finishes and you are presented with a blinking cursor. ' +
+			'What do you do now',
+        options: [{
+                text: 'Head back to the Bliss manifest page to see whats next',
+                goto: 'e_go_build'
+            }, {
+                text: 'Give up and go watch some TV',
+                goto: 'e_go_watch_tv'
+            }, {
+                text: 'Leave and go outside',
+                goto: 'e_outside'
+            }]
+    },{
+        // build
+        id: 'e_go_build',
+        text: 'You head back to the Bliss manifest repo and follow the instructions a little further until ' +
+            'you find the section for building. ' +
+            'After finding the section, you see a code snippet to initiate the lunch command and build.' +
+			'What do you do now',
+        options: [{
+                text: 'Leave and go outside',
+                goto: 'e_outside'
+            }, {
+                text: 'Copy the code to the terminal window and press enter',
+                goto: 'e_go_compile'
+            }, {
+                text: 'Give up and go watch some TV',
+                goto: 'e_go_watch_tv'
+            }]
+    }, {
+      // Die outside
+        id: 'e_outside',
+        text: 'You decide to give up for now and go outside. Once there, you are confronted with a huge thunderstorm ' +
+            ' and lightning clashes and catches your house on fire.' ,
+        gameover: 'lose'
+    }, {
+        // Die watching TV
+        id: 'e_go_watch_tv',
+        text: 'You decide to give up for now and go watch some TV. Once the TV is turned on, an alien mothership enters ' +
+            'earths atmosphere and takes over all TV broadcasts. They state that the people of earth have 30 seconds to ' +
+            'say their prayers before they git the reset button on human life. You waste the last 30 seconds of your life ' +
+			'by flipping through Facebook on your phone. ',
+        gameover: 'lose'
+    },
+    {
+      // WINNING
+        id: 'e_go_compile',
+        text: 'You copy the lunch command into the terminal, then press return, and select the number representing your ' +
+		'device. The build launches and you safely go watch TV for a bit while things are compiling ',
+        gameover: 'win',
+    },
+               
+];
+
+/**
+ * Parser module for the data format.
+ * Reads the data object format and creates an internal copy with required 
+ * transformations and parsing. Exposes methods to start/reset the game,
+ * advance the game via choices/actions, and read the currently active entry.
+ *
+ * The module is just data-driven, and returns objects from its methods; it
+ * does no handling of game display or user input directly.  It needs a frontend
+ * written for it in order for a player to interact with it.
+ **/
+var CYOA = (function() {
+
+    var ENTRY_DATA,
+        currentEntryId, currentEntryData,
+        inventory;
+
+    function _init(entryData) {
+        // clear state
+        ENTRY_DATA = {};
+        currentEntryId = null;
+        currentEntryData = {};
+        inventory = [];
+
+        var startEntryId = null;
+
+        // Parse entry data into internal object
+        entryData.forEach(function(entry) {
+            ENTRY_DATA[entry.id] = Object.create(entry);
+
+            // Track the starting entry and warn of duplicates
+            if (entry.start === true) {
+                if (startEntryId !== null) {
+                    console.error('More than one starting state defined:', startEntryId, entry.id);
+                } else {
+                    startEntryId = entry.id;
+                }
+            }
+
+            // Process extra paragraphs if present
+            if (entry.extra) {
+                entry.extra.forEach(function(ext) {
+                    // convert string options to single-item arrays for easier parsing
+                    if (ext.requires && (typeof ext.requires === 'string')) {
+                        ext.requires = [ext.requires];
+                    }
+                });
+            }
+
+            // 'Next' overrides all other options
+            if (entry.next) {
+                entry.options = [{
+                    text: 'Continue...',
+                    goto: entry.next
+                }];
+            }
+            // Process and validate options
+            if (entry.options) {
+                entry.options.forEach(function(opt) {
+                    // options must have a 'goto'
+                    if (!opt.goto) console.error('Entry', entry.id, ' has option without a goto: ', opt.text);
+                    // convert string options to single-item arrays for easier parsing
+                    if (opt.requires && (typeof opt.requires === 'string')) {
+                        opt.requires = [opt.requires];
+                    }
+                });
+            }
+        });
+
+        // Set initial state from starting entry
+        if (startEntryId === null) console.error('No start entry found');
+        _setEntry(startEntryId);
+    }
+
+    // Inventory methods (accept string or array)
+
+    function _addToInventory(items) {
+        if (typeof items === 'string') items = [items];
+        inventory = inventory.concat(items);
+    }
+
+    function _takeFromInventory(items) {
+        if (typeof items === 'string') items = [items];
+        var newInv = [];
+        inventory.forEach(function(item) {
+            if (items.indexOf(item) === -1) newInv.push(item);
+        });
+        inventory = newInv;
+    }
+
+    function _checkInventory(item) {
+        return (inventory.indexOf(item) > -1);
+    }
+
+    // Utility method to check a 'requires'-format array against the current inventory
+    function _hasRequirements(opt) {
+        var isAvailable = true;
+        if (opt.requires) {
+            opt.requires.forEach(function(req) {
+                if (req.charAt(0) === '!' && _checkInventory(req.substr(1))) isAvailable = false;
+                if (req.charAt(0) !== '!' && !_checkInventory(req)) isAvailable = false;
+            });
+        }
+        return isAvailable;
+    }
+
+    // Updates the current entry data to the given entry ID.
+    // Composes the current entry data based on conditionals set in the entry data,
+    // including required inventory to display options, etc.
+    // Also makes changes to inventory and state based on the definition data.
+    function _setEntry(id) {
+        if (!id in ENTRY_DATA) console.error('Unable to change entry: invalid entry id', id);
+        currentEntryId = id;
+
+        var data = ENTRY_DATA[id];
+        currentEntryData = {
+            id: data.id,
+            text: data.text,
+            extra: []
+        };
+
+        // Add/remove inventory items in this entry
+        if (data.gives) _addToInventory(data.gives);
+        if (data.takes) _takeFromInventory(data.takes);
+
+        // Update text with extras
+        if (data.extra) {
+            data.extra.forEach(function(ext) {
+                if (_hasRequirements(ext)) currentEntryData.extra.push(ext.text);
+            });
+        }
+
+        // State modifiers
+        // TODO: make this more definitive and mutate options accordingly
+        if (data.gameover) currentEntryData.gameover = data.gameover;
+
+        // Define available options based on inventory requirements
+        if (data.options) {
+            currentEntryData.options = [];
+            data.options.forEach(function(opt, idx) {
+                if (_hasRequirements(opt)) {
+                    currentEntryData.options.push({
+                        text: opt.text,
+                        goto: opt.goto
+                    });
+                }
+            });
+        }
+        return currentEntryData;
+    }
+
+    function startGame(data) {
+        _init(data);
+    }
+
+    function getCurrentEntry() {
+        if (currentEntryData === {}) console.error('No current entry; has the game started?');
+        return currentEntryData;
+    }
+
+    function getInventory() {
+        return inventory;
+    }
+
+    // Changes the active entry according to the numeric ID of the option passed in,
+    // if it is present in the current entry.
+    function doOption(idx) {
+        if (!currentEntryData.options) console.error('Can not complete option', idx);
+        var opt = currentEntryData.options[idx];
+        var newEntryId = opt.goto;
+        if (!newEntryId in ENTRY_DATA) console.error('Cannot do option: invalid goto id', newEntryId);
+        return _setEntry(newEntryId);
+    }
+
+    return {
+        startGame: startGame,
+        getCurrentEntry: getCurrentEntry,
+        getInventory: getInventory,
+        doOption: doOption
+    };
+})();
+
+/**
+ * Some simple jQuery DOM logic for demo purposes.
+ * This could easily be expanded for better presentation,
+ * per-location graphics, all kinds of stuff.
+ **/
+var Game = (function() {
+
+    var DATA;
+
+    // Container element to render into
+    var $el = $('#output_a');
+
+    // Text for game over scenarios
+    var endMsgs = {
+        win: 'You won! Play again...',
+        lose: 'You failed.  Restart...'
+    };
+
+    // Reads the current entry data and puts DOM nodes
+    // in the container to display the text and options
+    function render(isStart) {
+        var d = CYOA.getCurrentEntry();
+
+        // Clear the container and write the body text
+        $el.html('');
+        if (isStart) $el.append('<p class="title">*** Build BlissROM ***</p>');
+        $el.append('<p>' + d.text + '</p>');
+
+        d.extra.forEach(function(ext) {
+            $el.append('<p>' + ext + '</p>');
+        });
+
+        // Write out a list of option or restart links in a list
+        // (click handlers bound in init() will handle these)
+        var $opts = $('<ul/>');
+        if (d.gameover) {
+            var $action = $('<li><a class="opt gameover ' + d.gameover + '" href="#">' +
+                endMsgs[d.gameover] + '</a></li>');
+            $opts.append($action);
+        }
+        if (d.options) {
+            d.options.forEach(function(opt, idx) {
+                var $opt = $('<li><a class="opt action" href="#" data-opt="' + idx + '">' +
+                    opt.text + '</a></li>');
+                $opts.append($opt);
+            });
+        }
+        $el.append($opts);
+
+        // Show current inventory
+        if (!d.gameover) {
+            var inv = CYOA.getInventory();
+            if (inv.length) {
+                $el.append('<p class="inv">You are carrying: ' + inv.join(', ') + '</p>');
+            }
+        }
+    }
+
+    function init(entryData) {
+
+        DATA = entryData;
+
+        // Click handlers for option links.  Bound to the document
+        // as we destroy and rebuild the links per-entry.
+        $(document).on('click', '.action', function(e) {
+            e.preventDefault();
+            var opt = $(this).attr('data-opt');
+            console.log('do option', opt);
+            if (CYOA.doOption(opt)) render();
+        });
+
+        // As above but for win/lose links.  Restart the game when used
+        $(document).on('click', '.gameover', function(e) {
+            e.preventDefault();
+            _start();
+        });
+
+        _start();
+    }
+
+    function _start() {
+        // Init the game and render the first entry
+        CYOA.startGame(DATA);
+        render(true);
+    }
+
+    return {
+        init: init
+    }
+
+})();
+
+// Kick off 
+Game.init(ENTRIES);
\ No newline at end of file
diff --git a/json/converter.py b/json/converter.py
new file mode 100644
index 0000000..007e36d
--- /dev/null
+++ b/json/converter.py
@@ -0,0 +1,38 @@
+import json
+
+# Previous/new JSON file here
+old_file_name = "profile.json"
+new_file_name = "profile_new.json"
+
+# Read previous JSON
+with open(old_file_name, "r") as read_json:
+	old_data = json.load(read_json)
+	print("JSON loaded successfully. Beginning conversion...")
+
+# Initialize new dictionary
+user_list = []
+
+# Conversion
+index = 0
+for i in old_data["Name"]:
+	user = {}
+	user["name"] = i
+	user["email"] = old_data["Email"][index][7:]
+	user["avatar"] = old_data["Avatar"][index]
+	user["description"] = old_data["Description"][index]
+	user["github"] = old_data["Github"][index]
+	user["xda"] = old_data["XDA"][index]
+	user["facebook"] = old_data["Facebook"][index]
+	user["twitter"] = old_data["Twitter"][index]
+	user["instagram"] = old_data["Instagram"][index]
+	user["googleplus"] = old_data["GooglePlus"][index]
+	user_list.append(user)
+	index += 1
+	
+# Verify each user
+for i in user_list:
+	print(i)
+
+# Write new JSON
+with open(new_file_name, "w") as write_json:
+	json.dump(user_list, write_json, indent=4)
\ No newline at end of file
diff --git a/json/maintainers.json b/json/maintainers.json
new file mode 100644
index 0000000..d09998f
--- /dev/null
+++ b/json/maintainers.json
@@ -0,0 +1,26 @@
+{
+  "ID": [
+    ""
+  ],
+  "Avatar": [
+    ""
+  ],
+  "Name": [
+    ""
+  ],
+  "XDAUsername": [
+    ""
+  ],
+  "HangoutsUsername": [
+    ""
+  ],
+  "Email": [
+    ""
+  ],
+  "TelegramUsername": [
+    ""
+  ],
+  "Github_Username": [
+    ""
+  ]
+}
