diff --git a/blog.html b/blog.html
index 48fbbc3..bd290e3 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>
@@ -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">
+    <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/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
