{"componentChunkName":"component---src-templates-blog-post-js","path":"/sojourn-fare/","result":{"data":{"site":{"siteMetadata":{"title":"Justin is a Maker","author":"Justin Smith"}},"mdx":{"id":"8ee157c3-0ef9-5ea4-9ccd-3533004a2b1c","frontmatter":{"title":"Sojourn Fare","date":"September 02, 2018","externalLink":"http://sojournfare.com","teaser":"Growing gourmet mushrooms can be hard, but it gets easier when you have a data-heavy AgTech startup doing it for you."},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Sojourn Fare\",\n  \"date\": \"2018-09-02T00:00:00-0500\",\n  \"teaser\": \"Growing gourmet mushrooms can be hard, but it gets easier when you have a data-heavy AgTech startup doing it for you.\",\n  \"featuredImage\": \"sojourn.jpg\",\n  \"externalLink\": \"http://sojournfare.com\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Sojourn Fare was an AgTech startup that I co-founded in 2016. The company produced IoT environmental control units that helped make mushroom cultivation approachable and reliable. While growing most mushrooms isn\\u2019t very hard on its own, there are lots of things that can go wrong during the growth cycle that will completely ruin a crop. Those bumps in the road are why Roman Titus, my co-founder, came to seek out my help. Roman had a batch of Pleurotus ostreatus, more commonly known as oyster mushrooms, growing in his apartment. He lost an entire container of oysters to trichoderma mold after leaving on some last-minute travel for a few days, and had a hunch that technology may be able to help prevent that from happening again. We set out to create a more user-friendly system that did a lot of the hard work of mushroom cultivation for you.\"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1080px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/26c92316fc042649d76b0cbcfe9b1cc0/47311/sojourn-2.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"47.66666666666667%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABbvyWEZJD/8QAGxABAAICAwAAAAAAAAAAAAAAAQISAAMEITH/2gAIAQEAAQUCK4nbtiPGWslrt9//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAeEAABAwQDAAAAAAAAAAAAAAAAAQIRAxIxcUJhkv/aAAgBAQAGPwKxG+Tj0Q5ySZKmhNH/xAAcEAEBAQADAAMAAAAAAAAAAAABEQAhMUFhgZH/2gAIAQEAAT8hVVI99j7zopXmbijfiY0iOX3IorBP3DT/2gAMAwEAAgADAAAAEMQf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8QZ//EAB8QAQEAAQIHAAAAAAAAAAAAAAERACExUWFxgZGh0f/aAAgBAQABPxAKkux5Bp2uDIyy3aa35jLZxBTyi+8PDlEEXFRxqWx4MJVBU6vVz//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Pleurotus ostreatus growing in one of the first prototype units\",\n    \"title\": \"Pleurotus ostreatus growing in one of the first prototype units\",\n    \"src\": \"/static/26c92316fc042649d76b0cbcfe9b1cc0/47311/sojourn-2.jpg\",\n    \"srcSet\": [\"/static/26c92316fc042649d76b0cbcfe9b1cc0/f93b5/sojourn-2.jpg 300w\", \"/static/26c92316fc042649d76b0cbcfe9b1cc0/b4294/sojourn-2.jpg 600w\", \"/static/26c92316fc042649d76b0cbcfe9b1cc0/47311/sojourn-2.jpg 1080w\"],\n    \"sizes\": \"(max-width: 1080px) 100vw, 1080px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"Pleurotus ostreatus growing in one of the first prototype units\")), mdx(\"p\", null, \"Our initial prototypes consisted of an Arduino-controlled timing system that ran a roughly scheduled series of environmental modifiers to maintain the right conditions for mushroom growth. This was a good start, and it did meet the requirements of keeping the crop alive without having someone tending to it every day, but there was a lot of room for improvement. Roman had a lot of ideas about the physical design of the unit, and I had a lot that I wanted to do with the software and hardware side, so we both set off to make a more complete prototype.\"), mdx(\"div\", {\n    className: \"paragraph-with-picture\"\n  }, mdx(\"p\", null, \"We had been relying on an Arduino Mega to run the environmental modifiers, which included heaters, fans, lights, and humidifiers. That would have been fine If we wanted to keep running everything on a basic schedule, but I knew that we could incorporate sensors into the mix to have more relevant data to work with. Keeping things on a schedule was just replicating the traditional methods of mushroom farming\\u2013we could make it better! Another big blind spot was being able to see what the unit was actually doing. We had a lot of data being printed out via the serial port on the Arduino telling us what was on or off, but there wasn\\u2019t a good way to see the readings, and we definitely weren\\u2019t storing the data for long-term analytics. I decided to scrap the old code and move everything over to a Raspberry Pi, which had been around for four years at that point, but was really starting to pick up steam in 2016.\"), mdx(\"div\", {\n    \"className\": \"image-container small-image\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/59b118b39f74bdf1523652258dd544d0/533dc/sojourn-original.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQCAQP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAat49EhUGg4ZQb//xAAZEAEBAQEBAQAAAAAAAAAAAAABAgARAyH/2gAIAQEAAQUC8pMzLqnjNm6b441Li03/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAcEAACAAcAAAAAAAAAAAAAAAAAEQEQICExQVH/2gAIAQEABj8CxEW+OSHZjo//xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhMUFxgf/aAAgBAQABPyFZTcBrx9RZLktEXpBu+Td8Slj9EeQWXkOocn//2gAMAwEAAgADAAAAEH//ALz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAVEQEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAgEBPxBj/8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFBYf/aAAgBAQABPxBqggn0PrzjC9UtADxR8gi7URCKIaLB2jxZdoiauO624cBi8lHwOFT/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"One of the first iterations of the grow chamber\",\n    \"title\": \"One of the first iterations of the grow chamber\",\n    \"src\": \"/static/59b118b39f74bdf1523652258dd544d0/e5166/sojourn-original.jpg\",\n    \"srcSet\": [\"/static/59b118b39f74bdf1523652258dd544d0/f93b5/sojourn-original.jpg 300w\", \"/static/59b118b39f74bdf1523652258dd544d0/b4294/sojourn-original.jpg 600w\", \"/static/59b118b39f74bdf1523652258dd544d0/e5166/sojourn-original.jpg 1200w\", \"/static/59b118b39f74bdf1523652258dd544d0/d9c39/sojourn-original.jpg 1800w\", \"/static/59b118b39f74bdf1523652258dd544d0/df51d/sojourn-original.jpg 2400w\", \"/static/59b118b39f74bdf1523652258dd544d0/533dc/sojourn-original.jpg 4911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n    \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"One of the first iterations of the grow chamber\"), \"\\n  \")), mdx(\"p\", null, \"The use of the Pi opened up a lot of doors for us. Now we didn\\u2019t just have something that could turn the modifiers on or off\\u2013we had a whole server that we could run on the unit. After replicating the basic functionality of the timers that we had running with the Arduino, I moved on to integrating sensors into the system. I built an application that ran on Node, Express, and Mongo, and was able to respond in real-time to sensors that measured the carbon dioxide, relative humidity, and temperature inside the unit. I had also been hearing a lot of people praise a new JavaScript framework called React over the previous months\\u2013I had done a little work with Angular before the notorious 2.0 split, so I wanted to try out React while everything settled down in the Angular community. I decided to use that to build a super simple front-end that would show the current readings for the unit, and we never turned back from using React. It gave us the same flexibility in componentization that we had on the physical side of the unit, and ended up being perfect for us.\"), mdx(\"div\", {\n    className: \"paragraph-with-picture\"\n  }, mdx(\"p\", null, \"That initial unit worked well enough for us to regularly produce decent yields of oyster mushrooms with very few issues. We were harvesting a little under a pound a week per substrate block, which was acceptable. At this point we were targeting two main groups\\u2013restaurants interested in hyperlocal produce, and mushroom enthusiasts looking to grow their own at home. We started building this unit at a local makerspace, and were connected to Google Chicago\\u2019s head chef through a mutual friend. They loved the idea of growing food on-site, and encouraged us to build a unit for their cafeteria. Roman facilitated the grow, and we ended up being able to deliver a few pounds of fresh mushrooms to the Google chefs every week.\"), mdx(\"div\", {\n    \"className\": \"image-container small-image\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1080px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/9bcd9e0aa6489538c1424cf4e094341d/47311/sojourn-prototype.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQDAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAACAf/aAAwDAQACEAMQAAAB8rTXYKFwsqmCpgx//8QAGRABAAMBAQAAAAAAAAAAAAAAAQACEQMQ/9oACAEBAAEFAhgDLZvPC3R5lWwy1ma+f//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABURAQEAAAAAAAAAAAAAAAAAABAB/9oACAECAQE/ASH/xAAbEAACAgMBAAAAAAAAAAAAAAAAAREiAiAhQf/aAAgBAQAGPwLg5Z6WwgoidP/EAB4QAQACAQQDAAAAAAAAAAAAAAEAESExQVFhEHGB/9oACAEBAAE/IT5X3LlQ1Z28Rmq/EKqw76xI5PUVsGZiRqc67eP/2gAMAwEAAgADAAAAEJvXP//EABgRAAIDAAAAAAAAAAAAAAAAAAABEBEx/9oACAEDAQE/ELeDHH//xAAYEQACAwAAAAAAAAAAAAAAAAABEQAQMf/aAAgBAgEBPxBBMQZb/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFBUZGh0eH/2gAIAQEAAT8QFsBxOilQUQE7vrqLQEAYBeYXAMwlcUu+4MhuhbLzwtQxJnkD7iBMVMxICOGJoT//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"The prototype unit at Google\",\n    \"title\": \"The prototype unit at Google\",\n    \"src\": \"/static/9bcd9e0aa6489538c1424cf4e094341d/47311/sojourn-prototype.jpg\",\n    \"srcSet\": [\"/static/9bcd9e0aa6489538c1424cf4e094341d/f93b5/sojourn-prototype.jpg 300w\", \"/static/9bcd9e0aa6489538c1424cf4e094341d/b4294/sojourn-prototype.jpg 600w\", \"/static/9bcd9e0aa6489538c1424cf4e094341d/47311/sojourn-prototype.jpg 1080w\"],\n    \"sizes\": \"(max-width: 1080px) 100vw, 1080px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n    \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"The prototype unit at Google\"), \"\\n  \")), mdx(\"p\", null, \"We had a little bit of momentum from the Google project, and we had a lot of chefs and restaurants saying that they were interested in the product. One of our contacts at Google mentioned that they had a large refrigerator that they would be willing to donate to us, which we happily took. The size constraints of the first unit limited us to two substrate blocks per growth cycle, which was not enough to justify purchasing the unit for most restaurants. We retrofitted the refrigerator to be able to maintain the environment just like the smaller units, but now we had the potential to produce almost 200 pounds of mushrooms per week. This got us excited about the potential for other businesses like farms to be able to add mushroom production to the services and goods that they offered.\"), mdx(\"p\", null, \"While working with Google was a great clout builder and an extremely fun experience, we quickly realized that the restaurant-focused mushroom business wasn\\u2019t going to do us any favors. Smallhold, our major competitor, was already doing an excellent job producing bespoke mushroom-growing chambers for small restaurants in Brooklyn. It was incredibly fun to work on those one-off projects, but they weren\\u2019t paying the bills, and Roman and I were still trying to bootstrap the startup. At this point, Roman and I decided to split our focus on what we thought would be the most likely to have some success\\u2013he focused on making a consumer version of the kit that could fit on a kitchen counter, and I focused on building something that could be used in classrooms.\"), mdx(\"p\", null, \"Roman\\u2019s consumer-focused venture had a decent strategy that seemed worth pursuing. Consumer\\u2019s attitudes around mushrooms were evolving. There was a massive opportunity in the medicinal market for mushrooms like reishis or lion\\u2019s manes, and foodies were quickly realizing that there were other kinds of mushrooms besides the white button style that were ubiquitously available. He took the same technology setup that I used for the rest of the products and built a beautiful iteration called the Model A.\"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"786px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/79ffff620d4594c6cbdd988e0d7ec1e3/28be2/sojourn-model-a.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"61.33333333333334%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGlmc+bpIxP/8QAGRAAAwEBAQAAAAAAAAAAAAAAAAECEhAR/9oACAEBAAEFAtSJ+Sqknm2f/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BiP/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAZEAACAwEAAAAAAAAAAAAAAAAAARAhMUH/2gAIAQEABj8CFSww5P8A/8QAHBAAAwEAAgMAAAAAAAAAAAAAAREhADFBYYGR/9oACAEBAAE/IQBQCHkjIFJ1LY+sfarxm+hkGL5v/9oADAMBAAIAAwAAABCLL//EABURAQEAAAAAAAAAAAAAAAAAAAEA/9oACAEDAQE/EASL/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8Qpb//xAAcEAEAAwEBAAMAAAAAAAAAAAABABEhQTFhgZH/2gAIAQEAAT8QO3ESgbTryd300LddszkqU7N1Vhns3sz6Ut/saG0+viKxXeuZ/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Sojourn Model A\",\n    \"title\": \"Sojourn Model A\",\n    \"src\": \"/static/79ffff620d4594c6cbdd988e0d7ec1e3/28be2/sojourn-model-a.jpg\",\n    \"srcSet\": [\"/static/79ffff620d4594c6cbdd988e0d7ec1e3/f93b5/sojourn-model-a.jpg 300w\", \"/static/79ffff620d4594c6cbdd988e0d7ec1e3/b4294/sojourn-model-a.jpg 600w\", \"/static/79ffff620d4594c6cbdd988e0d7ec1e3/28be2/sojourn-model-a.jpg 786w\"],\n    \"sizes\": \"(max-width: 786px) 100vw, 786px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"Sojourn Model A\")), mdx(\"p\", null, \"While Roman was shopping the consumer level product around, I took on the responsibility of developing something that we could use to work with educators. We had a lot of organic interest from teachers, but we knew that the high price point of individual units wouldn\\u2019t be viable for most schools. I worked with a series of schools that already had an agricultural component to them in order to figure out what an educational product would look like. After a lot of market research and convincing, we ended up getting connected to ComEd, the power company for Illinois. ComEd was hosting an event called the Solar Spotlight, and this year they wanted a food-focused product that the students could build. The gist of the event was that ComEd would invite students from underprivileged parts of Chicago to come work with them over two weekends to learn about STEM and solar power. They loved our idea, and were incredibly interested in getting students excited about growing their own food. They asked us if we could make a kit version that high schoolers could assemble, and if we could integrate solar power into the unit.\"), mdx(\"div\", {\n    className: \"paragraph-with-picture\"\n  }, mdx(\"p\", null, \"I set out to determine what aspects of the unit we could actually power via solar, and Roman took to redesigning the unit with a focus on bringing down the cost and making it accessible to high school students. We ended up modifying a small storage bin to serve as the main compartment for the unit. All of the modifiers, sensors, and other components were consolidated to one central 3D-printed mount that lived on the back of the enclosure. The amount of solar power that we could generate with the nine watt, six volt panel that we sourced wasn\\u2019t enough to run everything, but it was enough to power the Raspberry Pi that controlled all of the moving parts.\"), mdx(\"div\", {\n    \"className\": \"image-container small-image\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"500px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/34e1104edf026a5e3314b244d83b8e59/41099/builders-kit.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"63.33333333333333%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUCAwb/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABobpmhnyJH//EAB0QAAEDBQEAAAAAAAAAAAAAAAIBAwQAERITFDL/2gAIAQEAAQUCighnzNWL1GJdrrqiOVf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAEBAAEFAAAAAAAAAAAAAAABAFEQEjEyQf/aAAgBAQAGPwJEG6zpux5m4L//xAAYEAEBAQEBAAAAAAAAAAAAAAABEQAhMf/aAAgBAQABPyHjYB7rROkM8GYkHGe4uV66Mabj/9oADAMBAAIAAwAAABAAP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABYRAAMAAAAAAAAAAAAAAAAAABARQf/aAAgBAgEBPxBwf//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFBUWFxkf/aAAgBAQABPxBFYA1C813HAVduWF7yR4MZ0rr1xBly5AHRUceS6BW3kt+z/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"The Builder's Kit\",\n    \"title\": \"The Builder's Kit\",\n    \"src\": \"/static/34e1104edf026a5e3314b244d83b8e59/41099/builders-kit.jpg\",\n    \"srcSet\": [\"/static/34e1104edf026a5e3314b244d83b8e59/f93b5/builders-kit.jpg 300w\", \"/static/34e1104edf026a5e3314b244d83b8e59/41099/builders-kit.jpg 500w\"],\n    \"sizes\": \"(max-width: 500px) 100vw, 500px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n    \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"The Builder's Kit\"), \"\\n  \")), mdx(\"p\", null, \"We hosted two events with ComEd\\u2013one for Black History Month, and one for the National Hispanic Heritage Month. Each event consisted of groups between sixty and seventy students assembling and testing their mushroom growing unit in small groups over the span of four hours. The work was challenging, but ComEd provided employee mentors to sit with each group to make sure that they could successfully complete their kit. Students were informed at the end of the day that the units they built would be delivered back to the schools for use in their science classes over the next semester. Roman and I had been working on sample curriculum to teach experimental design using the kits\\u2013we wanted to make sure that the educators who would be receiving these kits had a clear path forward on how to integrate them into their lesson plans without a ton of extra work.\"), mdx(\"div\", {\n    \"className\": \"gatsby-resp-iframe-wrapper\",\n    \"style\": {\n      \"paddingBottom\": \"56.09243697478992%\",\n      \"position\": \"relative\",\n      \"height\": \"0\",\n      \"overflow\": \"hidden\",\n      \"marginBottom\": \"1.0725rem\"\n    }\n  }, \" \", mdx(\"div\", {\n    parentName: \"div\",\n    \"style\": {\n      \"padding\": \"56.25% 0 0 0\",\n      \"position\": \"relative\"\n    }\n  }, \" \", mdx(\"iframe\", {\n    parentName: \"div\",\n    \"src\": \"https://abc7chicago.com/video/embed/?pid=5143962\",\n    \"frameBorder\": \"0\",\n    \"allowFullScreen\": true,\n    \"style\": {\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\",\n      \"width\": \"100%\",\n      \"height\": \"100%\"\n    }\n  }), \" \"), \" \"), mdx(\"br\", null), mdx(\"p\", null, \"The Solar Spotlight events were extremely successful, but unfortunately financial circumstances led to us having to shutter the company in the spring of 2019. Roman had always been paying the bills with a mix of freelance and working on the startup, and I had been doing the same after I left my full-time role at Fjord in the summer of 2018. Roman made the tough decision to move back to Ohio, and I decided that I would try to tackle our final Solar Spotlight event the following September on my own. That outcome is obviously not what either of us wanted, but I wouldn\\u2019t trade the experience for anything. While Sojourn wasn\\u2019t the first startup that I worked on, it was the one that got me hooked. The things that I learned and ideas that I explored there drastically changed my practice as a developer, and I would not be writing the same kind of code or approaching problems in the same way without having worked on those products.  \"));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"slug":"/sojourn-fare/","previous":{"id":"a3f7e8fa-53ac-5164-b4ed-ec9fb1efa7e6","fields":{"slug":"/put-to-light/"},"frontmatter":{"title":"A.C. Moore Put to Light"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"A.C. Moore Put to Light\",\n  \"date\": \"2018-07-10T00:00:00-0500\",\n  \"teaser\": \"A custom-built Put to Light system for A.C. Moore's warehouses to increase order processing speed and accuracy.\",\n  \"featuredImage\": \"ptl-walls.jpg\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Retailers have their work cut out for them if they\\u2019re going to keep up with Amazon. The scale and speed at which they operate has completely transformed consumer expectations\\u2013two-day shipping has become the de facto standard for delivered goods. A.C. Moore, a major arts and crafts retailer for the eastern part of the United States, realized that they would have a major problem on their hands if they didn\\u2019t adapt to meet that shipping speed. There\\u2019s only so much control that they have over an order when it leaves their warehouse, but they can control how quickly they process orders inside their operation.\"), mdx(\"p\", null, \"One of the pieces of their order fulfillment puzzle was a strategy called \\u201CPut to Light.\\u201D Whenever an order comes into their warehouse it is split into three major phases\\u2013picking, sorting, and packing. During the picking phase, items are retrieved from the warehouse floor and sent along conveyors in a series of \\u201Cpick waves.\\u201D When a pick wave is ready to be sorted, it gets diverted to a put wall. That\\u2019s where I come in! A.C. Moore knew that they wanted put walls, but they weren\\u2019t happy with the existing options, and they wanted one that would integrate perfectly with their custom-built warehouse management system. They asked if I could build them nine custom put walls, and before I knew it, I was knee deep in warehouse logistics!\"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/64d95373b0eb3bf4163bfb0cb4075088/89513/ptl-walls.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"66.33333333333333%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAVZbsc83I//EABwQAAIABwAAAAAAAAAAAAAAAAABAgMQERIhMf/aAAgBAQABBQJy9wqw6PmKP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABYQAAMAAAAAAAAAAAAAAAAAABAgMf/aAAgBAQAGPwIRP//EABkQAAMBAQEAAAAAAAAAAAAAAAABESExYf/aAAgBAQABPyGERz0bprPEJXVQt6Jo7Yf/2gAMAwEAAgADAAAAEOjf/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qh//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAgEBPxBwm//EABsQAQEAAgMBAAAAAAAAAAAAAAERACExQVHw/9oACAEBAAE/ENWKrttDnBRUfa4dUXu40CjXhlAIUlnGDtdvUz//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"The completed put walls\",\n    \"title\": \"The completed put walls\",\n    \"src\": \"/static/64d95373b0eb3bf4163bfb0cb4075088/e5166/ptl-walls.jpg\",\n    \"srcSet\": [\"/static/64d95373b0eb3bf4163bfb0cb4075088/f93b5/ptl-walls.jpg 300w\", \"/static/64d95373b0eb3bf4163bfb0cb4075088/b4294/ptl-walls.jpg 600w\", \"/static/64d95373b0eb3bf4163bfb0cb4075088/e5166/ptl-walls.jpg 1200w\", \"/static/64d95373b0eb3bf4163bfb0cb4075088/d9c39/ptl-walls.jpg 1800w\", \"/static/64d95373b0eb3bf4163bfb0cb4075088/df51d/ptl-walls.jpg 2400w\", \"/static/64d95373b0eb3bf4163bfb0cb4075088/89513/ptl-walls.jpg 4288w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"The completed put walls\")), mdx(\"p\", null, \"At its core a put wall is a fairly simple technology. We needed to be able to light up a specific location under a bin on a shelf where an item would be placed, and then listen for a button click to confirm that the picker put the item in the bin. While simple from a hardware perspective, there is a lot that needs to happen on the software side of things, and it gets increasingly complex as you try to scale it. Whatever solution I came up with needed to be able to communicate to the endpoints of their warehouse management system (WMS). It also needed to be able to do it for roughly 500 bins at a time, with absolutely no errors, as fast as it possibly could.\"), mdx(\"div\", {\n    className: \"paragraph-with-picture\"\n  }, mdx(\"p\", null, \"I decided to use a Raspberry Pi for the brain of each put wall. We needed to be able to perform some pretty complex handshakes with the WMS that would have been an absolute nightmare to attempt on an Arduino. While the Pi was better-suited for the networking side, it does not ship with the kind of inputs and outputs that we needed. Each put wall needed to listen to 52 buttons and run approximately six thousand WS2812B LEDs.\", mdx(\"br\", null), mdx(\"br\", null), \"The first thing to account for were the buttons. We needed twice as many inputs as were available on the Pi, which meant that I\\u2019d have to find an external way to expand the I/O capabilities. I sourced an excellent stackable HAT from ModMyPi that gave us access to two MCP23017 port expander chips. By stacking two of these HATs on the Pi we could move all of the inputs from the buttons off of the main GPIO pins. That left enough room for us to drive the extremely long LED strips and account for all the buttons.\"), mdx(\"div\", {\n    \"className\": \"image-container small-image\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/c7c17638e588ddb37456820b250c05dc/9568a/gpio-config.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"133.33333333333331%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwH/2gAMAwEAAhADEAAAAV7xAKVDRyUp4VwhNX//xAAbEAABBAMAAAAAAAAAAAAAAAABAAIRIQMSMv/aAAgBAQABBQLYElzYeLyAQKVrI2tFIBPLuF//xAAYEQEBAAMAAAAAAAAAAAAAAAAAARESQf/aAAgBAwEBPwHixlvX/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAgEBPwGCyH//xAAbEAACAgMBAAAAAAAAAAAAAAAAASExEBEggf/aAAgBAQAGPwIsobhCIa9N4lrj/8QAGxABAAMAAwEAAAAAAAAAAAAAAQARITFBUWH/2gAIAQEAAT8hULeeiVVGJS+kw3wPfsFkkV6AYZr5JariwGrKuAjGZzP/2gAMAwEAAgADAAAAELvqfP/EABcRAQEBAQAAAAAAAAAAAAAAAAEAETH/2gAIAQMBAT8QMQ5At1kR/8QAGBEBAQADAAAAAAAAAAAAAAAAAAEhMXH/2gAIAQIBAT8Q6VhNLD//xAAeEAEAAwACAgMAAAAAAAAAAAABABEhMUFRcYGh8f/aAAgBAQABPxCp0OWle4sLuFeXiOtFKfbE4jhu2uk998ZxHR2m7cLiHKgBb+QElhSdwBBVWtY0RoFsADr5hi1teY6nC6zkrqs//9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"The MCP23017 HAT with everything plugged in\",\n    \"title\": \"The MCP23017 HAT with everything plugged in\",\n    \"src\": \"/static/c7c17638e588ddb37456820b250c05dc/e5166/gpio-config.jpg\",\n    \"srcSet\": [\"/static/c7c17638e588ddb37456820b250c05dc/f93b5/gpio-config.jpg 300w\", \"/static/c7c17638e588ddb37456820b250c05dc/b4294/gpio-config.jpg 600w\", \"/static/c7c17638e588ddb37456820b250c05dc/e5166/gpio-config.jpg 1200w\", \"/static/c7c17638e588ddb37456820b250c05dc/d9c39/gpio-config.jpg 1800w\", \"/static/c7c17638e588ddb37456820b250c05dc/df51d/gpio-config.jpg 2400w\", \"/static/c7c17638e588ddb37456820b250c05dc/9568a/gpio-config.jpg 3024w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n    \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"The MCP23017 HAT with everything plugged in\"), \"\\n  \")), mdx(\"p\", null, \"The LEDs were split into two long zig-zag strips\\u2013one for the putting side on the front, and one for the packing side on the back. The general idea is that when an item is scanned, the bin that it goes in will light up blue on the front of the wall. When a picker places the item in that bin, they hit the button, and then the system checks if anything else needs to go into the bin to complete the order. If the order is ready to ship, then the LEDs on the other side of the wall light up green to let the shipping department know that the bin is ready to be pulled from the wall and packed for shipping. At 3,000 pixels long we were definitely stretching the boundaries of what our Neopixels were capable of. We were, however, able to get great performance out of them thanks to a beefy power supply that was introduced at multiple parts of the circuit and no need for animation along the strips. Ultimately each wall would only have 30 or 40 LEDs turned on at a time in most cases, so we were able to run both strips from two pins on the Pi. We wanted to go with a full RGB LED rather than a solid-colored strip in order to communicate different phases of a pick wave. For instance, if a picker realized that something was wrong after they confirmed an item\\u2019s placement, they could flag the location for a QA check from the tablet computer attached to the wall. This would then light up the front and back of the location with orange lights to let both sides know not to proceed with that bin.\"), mdx(\"p\", null, \"After I squared away the physical production side of mounting all the buttons and running all the LEDs, we needed to determine the most efficient way for the Pi to communicate with the WMS. I decided to build a custom API that communicated with the WMS via a MQTT server. MQTT has been around since 1999, but has become increasingly popular because of its usefulness in IoT projects. As its core, MQTT is a super lightweight pub/sub communicator that lets you rapidly send or receive small bits of information. This was perfect for our use case\\u2013the wall would subscribe to lighting messages coming from the WMS, and then publish button presses back to the WMS. In addition to the speed of MQTT, you can also set a quality of service. This means that you can say if you want a message to continue trying to send until it receives a confirmation that the message was received. Having the system be able to confirm a message like that was a huge help in making sure that there were zero errors during processing.\"), mdx(\"p\", null, \"We had the luxury of setting up a brand new warehouse for A.C. Moore in Chicago at the start of this project, so we began by only running three of the nine put walls on the new system to make sure that everything worked. There was a fair amount of wear and tear on the shelves since everyone is the warehouse is moving so quickly, but I designed the system to be as modular as possible and to be simple enough for any of the warehouse managers to repair. After a few tweaks to the physical design of the system, we rolled out the other six walls right before Black Friday, where they ran for almost two days solid. Since then A.C. Moore has also installed five of the walls in their main warehouses in Berlin, New Jersey.\"), mdx(\"p\", null, \"The whole process can be a lot to wrap your head around if you aren\\u2019t familiar with warehouse logistics. Check out the video below to see what a full pick wave looked like when I was testing it with an A.C. Moore employee.\"), mdx(\"video\", {\n    src: \"/41af92184c63a761f93160b0ff68ccf8/blitsy-pick-wave.mp4\",\n    controls: true,\n    muted: true,\n    autoPlay: true,\n    loop: true\n  }), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;"},"next":{"id":"9e593e85-5c16-5e13-980c-70a88e9797ac","fields":{"slug":"/internet-in-a-box/"},"frontmatter":{"title":"Expanding Internet in a Box's Storage on a Raspberry Pi"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Expanding Internet in a Box's Storage on a Raspberry Pi\",\n  \"date\": \"2021-06-30T00:00:00-0500\",\n  \"teaser\": \"Running Internet in a Box on a Pi is great until you run out of storage. Check out this post to see how I set up my instance.\",\n  \"featuredImage\": \"internet-in-a-box.jpg\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    href: \"https://github.com/iiab/iiab\",\n    target: \"_new\"\n  }, \"Internet in a Box project\"), \" provides a suite of tools and knowledge that can be accessed even if you don\\u2019t have internet connectivity. Their project page bills it as a \\u201Cfree Digital Library of Alexandria.\\u201D When I bumped into their project on \", mdx(\"a\", {\n    href: \"https://news.ycombinator.com/item?id=27568332\",\n    target: \"_new\"\n  }, \"Hacker News\"), \", I knew that I had to get one set up. I live in a place that\\u2019s frequently affected by hurricanes, and much like the rest of the population in a post-2020 world, preparedness has been more on my mind lately. There is some valuable emergency-related material that you can install on the box, but it\\u2019s also just a good source of entertainment and information if the internet does go down for a prolonged period of time. \"), mdx(\"p\", null, \"IIAB is built to run on any UNIX-based device, which makes the Raspberry Pi a great candidate for a host. I chose to build mine on a Raspberry Pi 4 Model B. This lets me run the IIAB project as a full desktop if I\\u2019d like to, or just utilize the option to run the Pi as an access point in order to access it via other devices.\"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"640px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/9953b2efe91e5f104ab8abc2ee361248/c08c5/internet-in-a-box.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"75%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDBf/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABKY8vRYi//8QAGRABAQEBAQEAAAAAAAAAAAAAAgEDAAQS/9oACAEBAAEFArpYh6LOyX0FkVb5lOwKg//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABwQAAICAgMAAAAAAAAAAAAAAAARAjEBIhIhQf/aAAgBAQAGPwLg6FmLO7H6ayNrZ//EABwQAAICAwEBAAAAAAAAAAAAAAABEVEhMUGh8P/aAAgBAQABPyFmaPHyGe407HUGGOcYujPzeDB0H//aAAwDAQACAAMAAAAQyP8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/EEci/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAxQf/aAAgBAgEBPxATs7f/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhMVFhocH/2gAIAQEAAT8QmaiUNvRXvBFBAFa8uA3RWHfP3FxZdk3OcbnRs3WBxiF3es//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Internet in a Box running on a Raspberry Pi\",\n    \"title\": \"Internet in a Box running on a Raspberry Pi\",\n    \"src\": \"/static/9953b2efe91e5f104ab8abc2ee361248/c08c5/internet-in-a-box.jpg\",\n    \"srcSet\": [\"/static/9953b2efe91e5f104ab8abc2ee361248/f93b5/internet-in-a-box.jpg 300w\", \"/static/9953b2efe91e5f104ab8abc2ee361248/b4294/internet-in-a-box.jpg 600w\", \"/static/9953b2efe91e5f104ab8abc2ee361248/c08c5/internet-in-a-box.jpg 640w\"],\n    \"sizes\": \"(max-width: 640px) 100vw, 640px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"Internet in a Box running on a Raspberry Pi\")), mdx(\"p\", null, \"I started by using one of IIAB\\u2019s pre-formatted SD images, but quickly realized that I wanted more space to store content than was available on my SD card. High-capacity SD cards exist, but the price skyrockets fairly quickly with the amount of storage, and I was trying to set this project up with stuff that I had laying around. I decided that I\\u2019d use a spare external hard drive that I had to expand the storage capacity instead. Sounds easy, right? Nope. Turns out that IIAB will let you copy things over to a drive, but actually letting it use the drive as its base storage was a little more complicated. There is some documentation on their site for how to do this, but that didn\\u2019t work for me. I ended up replacing the SD card with the entire system mounted onto the hard drive, which also allowed me to utilize the full 2T for the project\\u2019s storage. \"), mdx(\"h3\", null, \"Booting Your Raspberry Pi from a External Drive\"), mdx(\"p\", null, \"After I hit the issues with IIAB not wanting to install content anywhere else besides the 16GB SD card, I decided to just run everything from the hard drive. You\\u2019ll still need a MicroSD to start, but once you get everything set up, you\\u2019ll be able to ditch the SD and run your Pi exclusively off the hard drive.\"), mdx(\"p\", null, \"This portion of the process is specific to Raspberry Pi 4 Model B\\u2019s and later, or any other BCM2711-based devices. If you\\u2019re using an older Pi, your sequence to complete this step will look different.\"), mdx(\"p\", null, \"To start, you\\u2019ll need a SD card with the latest version of Raspbian on it. Do not use NOOBS\\u2013it will not work with IIAB. You can get that by using the \", mdx(\"a\", {\n    href: \"https://www.raspberrypi.org/software/\",\n    target: \"_new\"\n  }, \"Raspberry Pi Imager\"), \".\"), mdx(\"p\", null, \"Go through your usual Pi setup, and then attach your hard drive to your Pi and power everything up. You\\u2019ll need to be able to get to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"raspi-config\"), \" on your Pi, which means you\\u2019ll either need to be able to SSH/VNC into it, or have access to a screen and keyboard. \"), mdx(\"div\", {\n    className: \"paragraph-with-picture\"\n  }, mdx(\"p\", null, \"Once your Pi is booted up, run \", mdx(\"code\", null, \"sudo raspi-config\"), \" or open the config tool via the GUI if you're using a screen. The specific option that we're looking for is under \", mdx(\"code\", null, \"Advanced Options > Boot Order\"), \". We want our Pi to boot from the USB, so we select \\\"USB Boot\\\".\", mdx(\"br\", null), mdx(\"br\", null), mdx(\"em\", null, \"Do not reboot your Pi!\"), \" Before we reboot, we want to copy our Pi's card over to our external hard drive.\"), mdx(\"div\", {\n    \"className\": \"image-container small-image\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/c8717da3450bbe4412125788c693e348/d9b5d/usb-boot.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"64.99999999999999%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABbUlEQVQ4y62Q2U7CQBiF594rERNFTeRtXN7FWCNIEBQTvfAVWKTFSGsjS8tSC3QDJPGpjn9bkFIgauLFl/+cM2f+SYZFYm24bP6RyBrYzqGCGLEfJO6iTrWKven0dNzvxEjv0gzi7mJl4R3lUhtCXoXw1IHAa+CLLU/zBdXTlXLX99R7pvNyXkGJfKmio0j3C25GkyfY5HOMfk2CmEpAuklD5M4gXl1CzqQgk68mL9DIZSDfXqOa4FDLZSGlk6iRV+9zaN5loTw+YOQM8DFxwAzTgt7VoLyIUKsSWqLkzbb06uHmXfmNtOydzXK9Vke/oRBNDJQWjIEJwzDBTNOEZdtwxmOf0Wg+p9qe6QDWcDjHcWBZFtxdbCa+MYxF/wfcXWxV+NvLq7q00EaQXm9Af2EhnC/3+l43nDPH0RFE1xV6WUM4D6NpDa8bztnRyTmCHJ9yxGK2Cr/HLeVsI1rHAltToj+wpse2Dzr4T74ApBOv0o1kvewAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Selecting USB Boot from Raspi-Config\",\n    \"title\": \"Selecting USB Boot from Raspi-Config\",\n    \"src\": \"/static/c8717da3450bbe4412125788c693e348/c1b63/usb-boot.png\",\n    \"srcSet\": [\"/static/c8717da3450bbe4412125788c693e348/5a46d/usb-boot.png 300w\", \"/static/c8717da3450bbe4412125788c693e348/0a47e/usb-boot.png 600w\", \"/static/c8717da3450bbe4412125788c693e348/c1b63/usb-boot.png 1200w\", \"/static/c8717da3450bbe4412125788c693e348/d9b5d/usb-boot.png 1224w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n    \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"Selecting USB Boot from Raspi-Config\"), \"\\n  \")), mdx(\"p\", null, \"I used the \", mdx(\"a\", {\n    href: \"https://www.raspberrypi.org/blog/another-update-raspbian/\",\n    target: \"_new\"\n  }, \"SD Card Copier tool\"), \" on Raspbian to clone my SD to my HD. If you are working with a Raspbian without a desktop, or if you don\\u2019t have access to something that will let you see the desktop, you may be able to run this part with \", mdx(\"a\", {\n    href: \"https://github.com/billw2/rpi-clone\",\n    target: \"_new\"\n  }, \"RPI-Clone\"), \", but using the visual tool is how I did this for my own instance.\"), mdx(\"p\", null, \"Open the SD Card Copier by going to Accessories in the main Raspberry Pi menu. You want to copy from your Micro SD Card (probably \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/dev/mmcblk0\"), \") to your external hard drive (probably \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/dev/sda\"), \"). Once your card has finished copying, shut down your Pi, remove your MicroSD card, and then turn your Pi back on. It should boot straight from the hard drive now. If something in this process doesn\\u2019t work for you, I followed \", mdx(\"a\", {\n    href: \"https://www.tomshardware.com/how-to/boot-raspberry-pi-4-usb\",\n    target: \"_new\"\n  }, \"this guide from Tom\\u2019s Hardware\"), \" the first time I was setting my hard drive up, and there may be an answer for you there.\"), mdx(\"h3\", null, \"Installing IIAB\"), mdx(\"p\", null, \"Since we did a little bit of configuration on our own to boot from the HD, we aren\\u2019t able to use the pre-fab SD image of IIAB. Instead, we\\u2019ll use the curl command listed in \", mdx(\"a\", {\n    href: \"http://wiki.laptop.org/go/IIAB/FAQ#Is_a_quick_installation_possible.3F\",\n    target: \"_new\"\n  }, \"their FAQ\"), \".\"), mdx(\"p\", null, \"Run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"curl d.iiab.io/install.txt | sudo bash\"), \" on the Pi to get the latest pre-release of IIAB. As noted in their docs, this step can take a long time to complete depending on which size of installation you choose when prompted after running the curl command. It\\u2019s also strongly recommended to be connected to a fast network via ethernet for this step. I went with a medium-sized installation, which gets you all of the basic tools like WordPress and NextCloud, but leaves off some of the heavier items like the Internet Archive\\u2019s Wayback Machine, phpMyAdmin, and VOIP tools. If you\\u2019re unsure about which size you want to install, make sure you check out \", mdx(\"a\", {\n    href: \"http://wiki.laptop.org/go/IIAB/FAQ#What_services_.28IIAB_apps.29_are_suggested_during_installation.3F\",\n    target: \"_new\"\n  }, \"the comparison table\"), \". \"), mdx(\"h3\", null, \"Troubleshooting the One-Line IIAB Install\"), mdx(\"p\", null, \"They aren\\u2019t kidding when they tell you that you may need to run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo iiab\"), \" multiple times to get the installation to run successfully. Keep an eye on your console output, and make sure that you start the process again with that command if the process dies.\"), mdx(\"p\", null, \"I had a particular error with NextCloud\\u2019s installation that required me to jump into MySQL to fix it. \"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/fc9f0e3326286ff6399e0c15c87b5115/2a08f/nextcloud-sql-error.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"9.333333333333334%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAeElEQVQI1y3M2w6CMBAEUKRVoiExxsh29KFBxGJB1P//uHG8PJzsfYv1yXEFx+rg6I8lS5P9gr7xtMGIEQy3wJACMSuOkmX4x/ybfWqTojbHrY5rPdzF5ddGvSZW7J7GdgY7PW0zeFbe38H0Aq8P5RN4SRK1I728AaphM6gHgqPyAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"SQL error regarding NextCloud during install\",\n    \"title\": \"SQL error regarding NextCloud during install\",\n    \"src\": \"/static/fc9f0e3326286ff6399e0c15c87b5115/c1b63/nextcloud-sql-error.png\",\n    \"srcSet\": [\"/static/fc9f0e3326286ff6399e0c15c87b5115/5a46d/nextcloud-sql-error.png 300w\", \"/static/fc9f0e3326286ff6399e0c15c87b5115/0a47e/nextcloud-sql-error.png 600w\", \"/static/fc9f0e3326286ff6399e0c15c87b5115/c1b63/nextcloud-sql-error.png 1200w\", \"/static/fc9f0e3326286ff6399e0c15c87b5115/2a08f/nextcloud-sql-error.png 1422w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"SQL error regarding NextCloud during install\")), mdx(\"p\", null, \"To fix that error, login to MySQL by running \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo mysql\"), \". Once logged in, check that the NextCloud database exists by running \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SHOW DATABASES;\"), \". If it\\u2019s there, delete it by running \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DROP DATABASE nextcloud;\"), \", exit MySQL, and then run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo iiab\"), \" to attempt the installation again.\"), mdx(\"h3\", null, \"Logging In and Installing Content\"), mdx(\"p\", null, \"Once your installation successfully completes, you should be able to access your IIAB by pointing a browser at \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"box.local\"), \". You can find the \", mdx(\"a\", {\n    href: \"http://wiki.laptop.org/go/IIAB/FAQ#What_are_the_default_passwords.3F\",\n    target: \"_new\"\n  }, \"default passwords here\"), \", and should immediately change them as well as your Pi\\u2019s password since this project is connected to the internet. \"), mdx(\"p\", null, \"Your IIAB dashboard is accessible at \", mdx(\"a\", {\n    href: \"http://box.local/admin/\",\n    target: \"new\"\n  }, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"http://box.local/admin\"\n  }, \"http://box.local/admin\")), \". You can find available content by navigating to the \\u201CInstall Content\\u201D menu to browse through ZIM files and OER2Go modules. With your external hard drive running the entire installation, you should have ample space to install information to your heart\\u2019s content. To verify that your storage is hooked up correctly, you can go to \\u201CManage Content\\u201D inside the \\u201CInstall Content\\u201D menu to see your available space.\"), mdx(\"div\", {\n    \"className\": \"image-container large-image\"\n  }, \"\\n  \", mdx(\"span\", {\n    parentName: \"div\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/6ec882424ec086562d3ca712cfb3942b/6b26f/manage-content.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"34.66666666666667%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABYklEQVQoz5WRS0vDQBSF80PFggsRdCWurKAbxR/gCxFd6EJRULfahZu2VihWI9KXaU2aNJNHE2tDHjU9zh1rwaUXPs6ZLG6+SSRd11Gr1VCv1wWapqHRaECWZZimCZo0TTEajf6QpmNGY8Znqd1uo1qtgpIWdTodDIdDhGEoFv13JNd1hRUtIluy8jxP0Ov1YNs2HMcRUA8Gn2BegOxpBWsXT9i8fhGsnFWwcSVDMgwDiqIIVFWdQMaU9Jx6q9VCs/mGMBiA+SFm9++xcPSAxeMylk7KmDsoiZQYM6Gp7wLHtkDGZGJZlrBijE0s4zgW17L7ETd8RJZbrZ4/CdNlfl6/5Ib8O6LLXERJCupxkiDh/F4xiiJh6fs+Qt57joWW6SOzW8D0dh4ze0VkdgqY2spj/rAE6Wugw1KKCJiMtK/w9//8LVoQBIEwok6LaWKeH0GEnNzF7bMhMicbuOH97tXEN9+9/CRNqj+eAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Manage content screen showing available space\",\n    \"title\": \"Manage content screen showing available space\",\n    \"src\": \"/static/6ec882424ec086562d3ca712cfb3942b/c1b63/manage-content.png\",\n    \"srcSet\": [\"/static/6ec882424ec086562d3ca712cfb3942b/5a46d/manage-content.png 300w\", \"/static/6ec882424ec086562d3ca712cfb3942b/0a47e/manage-content.png 600w\", \"/static/6ec882424ec086562d3ca712cfb3942b/c1b63/manage-content.png 1200w\", \"/static/6ec882424ec086562d3ca712cfb3942b/6b26f/manage-content.png 1658w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"className\": \"image-caption\"\n  }, \"Manage content screen showing available space\")), mdx(\"p\", null, \"If you\\u2019re on an internet plan with data caps, it may make sense to space your usage out over a few billing payments - it\\u2019s pretty easy to get carried away and download hundreds of gigs of content. There\\u2019s a lot of really great stuff available to install. The medium installation gives you tools like WordPress and NextCloud if you\\u2019re using the project for more long-term information sharing. I also grabbed the entirety of Wikipedia, a few medical guides, the CDC\\u2019s website, satellite imagery and OpenStreetMap data of North America, Project Gutenberg, a bunch of TED Talks, lots of archived StackOverflow sub-sites, and RadioLab recordings. In reality, this will probably only be used for entertainment during extended power outages, but it\\u2019s nice to have on hand if you already have a spare Pi and hard drive that you aren\\u2019t using. \"));\n}\n;\nMDXContent.isMDXComponent = true;"}}},"staticQueryHashes":["3128451518"]}