[{"_path":"/","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"chava.io","description":"Hey, bud! I'm Chava Sobreyra. I'm a software engineer with over 10 years of experience. I've worked at some companies that you may have heard of including Informa, ELB Learning, Bankrate, and Red Ventures.","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Hey, bud! I'm Chava Sobreyra. I'm a software engineer with over 10 years of experience. I've worked at some companies that you may have heard of including "},{"type":"element","tag":"a","props":{"href":"https://informa.com","rel":["nofollow"]},"children":[{"type":"text","value":"Informa"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":"https://www.elblearning.com/","rel":["nofollow"]},"children":[{"type":"text","value":"ELB Learning"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":"https://bankrate.com","rel":["nofollow"]},"children":[{"type":"text","value":"Bankrate"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":"https://redventures.com","rel":["nofollow"]},"children":[{"type":"text","value":"Red Ventures"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Currently, I'm helping to transform the mass-tort industry at "},{"type":"element","tag":"a","props":{"href":"https://torticity.com","rel":["nofollow"]},"children":[{"type":"text","value":"Torticity"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I have designed, implemented, and deployed software that has driven hundreds of millions of dollars in annual revenue."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I'm embarking on a journey to transition from employee to entrepreneur. I will be building in the open, so feel free to "},{"type":"element","tag":"a","props":{"href":"https://www.twitter.com/chavasobreyra","rel":["nofollow"]},"children":[{"type":"text","value":"follow"}]},{"type":"text","value":" along!"}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Hey, bud! I'm Chava Sobreyra. I'm a software engineer with over 10 years of experience. I've worked at some companies that you may have heard of including "},{"type":"element","tag":"a","props":{"href":"https://informa.com","rel":["nofollow"]},"children":[{"type":"text","value":"Informa"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":"https://www.elblearning.com/","rel":["nofollow"]},"children":[{"type":"text","value":"ELB Learning"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":"https://bankrate.com","rel":["nofollow"]},"children":[{"type":"text","value":"Bankrate"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":"https://redventures.com","rel":["nofollow"]},"children":[{"type":"text","value":"Red Ventures"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Currently, I'm helping to transform the mass-tort industry at "},{"type":"element","tag":"a","props":{"href":"https://torticity.com","rel":["nofollow"]},"children":[{"type":"text","value":"Torticity"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I have designed, implemented, and deployed software that has driven hundreds of millions of dollars in annual revenue."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I'm embarking on a journey to transition from employee to entrepreneur. I will be building in the open, so feel free to "},{"type":"element","tag":"a","props":{"href":"https://www.twitter.com/chavasobreyra","rel":["nofollow"]},"children":[{"type":"text","value":"follow"}]},{"type":"text","value":" along!"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:index.md","_source":"content","_file":"index.md","_extension":"md"},{"_path":"/my-journey-to-profitable-algotrader","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"My Journey to Profitable Algotrader","description":"In 2017 I was captivated by the Bitcoin run to over $20,000.","excerpt":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"my-journey-to-profitable-algotrader"},"children":[{"type":"text","value":"My Journey to Profitable Algotrader"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2017 I was captivated by the Bitcoin run to over $20,000."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Like many, I knew I wanted to get involved but I wasn't sure how. Mining, blockchain development, and day trading all seemed interesting, but as a software engineer the idea of algotrading seemed the most interesting."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fast forward to 2021, my algotrading bot \"Bitshark\" made me over $100,000 dollars in profit (over 400% return). In total, my bot managed over 10,000 transactions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2017, I had already started searching for strategies for trading. Eventually I found one Youtuber I really liked, trusted, and understood (more on the strategy itself another day). I took up to trying out his strategy by trading manually. I found some success, but often times I would not execute a trade correctly because I was asleep in the middle of the night or at work. This irked me endlessly. I channeled that frustration motivation to create automation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I started by writing a simple backtesting script from scratch. I knew next to nothing at that point, and I made every mistake you can imagine. \"I'm going to be rich in a few weeks!!!\" I remember thinking to myself as my backtests returned profit numbers in the hundreds of millions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After spot checking the backtest against reality, I quickly found out I had made many flawed assumptions and my code was riddled with bugs. Classic rookie mistake, I know. However, despite these setbacks, something had been ignited withing me."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I can build something that makes money while I sleep."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I had never really considered this as an option. My fire and motivation to take this further was burning more intensely than ever."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There were several days I never even got out of bed except to eat and use the restroom. I literally woke up, reached and grabbed my laptop from the nightstand, coded all day, and eventually put my laptop back on the nightstand and went back to sleep for the night."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eventually, I ironed out all the kinks (or so I thought). I decided I was ready to turn on my bot for the first time."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"Here we go!!!\" I thought to myself as I excitedly watched the first live logs come in:"}]},{"type":"element","tag":"code","props":{"code":"Bought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"Bought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"😫 \"Oh no, there must be bugs in the runtime code causing an infinite loop of buys!\" I scrambled furiously to turn to bot off. This was going to be much harder than I was hoping."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I made some fixes, and turned the bot back on. Different bug. Turned the bot off. Made some fixes. Turned the bot back on. The feedback loop was up and running."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This cycle continued for weeks and months, but eventually my bot stabilized and I was able to keep the bot running for stretches of time without being afraid it would lose all my money."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eventually my focus shifted from stability and maintainability to strategy optimization. My bot was consistently winning, but something was holding it back -- it was only trading against of symbol pair."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Read more about how I solved Bitshark's single market limitation by using \"the slots strategy\" in a future blog post."}]}]},"date":"2022-08-05","body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"my-journey-to-profitable-algotrader"},"children":[{"type":"text","value":"My Journey to Profitable Algotrader"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2017 I was captivated by the Bitcoin run to over $20,000."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Like many, I knew I wanted to get involved but I wasn't sure how. Mining, blockchain development, and day trading all seemed interesting, but as a software engineer the idea of algotrading seemed the most interesting."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fast forward to 2021, my algotrading bot \"Bitshark\" made me over $100,000 dollars in profit (over 400% return). In total, my bot managed over 10,000 transactions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2017, I had already started searching for strategies for trading. Eventually I found one Youtuber I really liked, trusted, and understood (more on the strategy itself another day). I took up to trying out his strategy by trading manually. I found some success, but often times I would not execute a trade correctly because I was asleep in the middle of the night or at work. This irked me endlessly. I channeled that frustration motivation to create automation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I started by writing a simple backtesting script from scratch. I knew next to nothing at that point, and I made every mistake you can imagine. \"I'm going to be rich in a few weeks!!!\" I remember thinking to myself as my backtests returned profit numbers in the hundreds of millions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After spot checking the backtest against reality, I quickly found out I had made many flawed assumptions and my code was riddled with bugs. Classic rookie mistake, I know. However, despite these setbacks, something had been ignited withing me."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I can build something that makes money while I sleep."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I had never really considered this as an option. My fire and motivation to take this further was burning more intensely than ever."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There were several days I never even got out of bed except to eat and use the restroom. I literally woke up, reached and grabbed my laptop from the nightstand, coded all day, and eventually put my laptop back on the nightstand and went back to sleep for the night."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eventually, I ironed out all the kinks (or so I thought). I decided I was ready to turn on my bot for the first time."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"Here we go!!!\" I thought to myself as I excitedly watched the first live logs come in:"}]},{"type":"element","tag":"code","props":{"code":"Bought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Bought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x\nBought $100 of x"}]}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"😫 \"Oh no, there must be bugs in the runtime code causing an infinite loop of buys!\" I scrambled furiously to turn to bot off. This was going to be much harder than I was hoping."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I made some fixes, and turned the bot back on. Different bug. Turned the bot off. Made some fixes. Turned the bot back on. The feedback loop was up and running."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This cycle continued for weeks and months, but eventually my bot stabilized and I was able to keep the bot running for stretches of time without being afraid it would lose all my money."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eventually my focus shifted from stability and maintainability to strategy optimization. My bot was consistently winning, but something was holding it back -- it was only trading against of symbol pair."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Read more about how I solved Bitshark's single market limitation by using \"the slots strategy\" in a future blog post."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:my-journey-to-profitable-algotrader.md","_source":"content","_file":"my-journey-to-profitable-algotrader.md","_extension":"md"},{"_path":"/my-2021-algotrading-year-in-review","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"My 2021 Algotrading Year in Review","description":"In 2021, my algotrading bot \"Bitshark\" made me over $100,000 dollars in profit (over 400% return). In total, my bot managed over 10,000 transactions.","excerpt":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"my-2021-algotrading-year-in-review"},"children":[{"type":"text","value":"My 2021 Algotrading Year in Review"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2021, my algotrading bot \"Bitshark\" made me over $100,000 dollars in profit (over 400% return). In total, my bot managed over 10,000 transactions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"2021 Portfolio Balance Chart","src":"/2021-portfolio.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I built Bitshark from scratch using Javascript (later moved to Typescript). Although I started building it in 2018, it wasn't until 2021 that I ran the bot for an entire year uninterrupted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I want to continue leaning in to algotrading and so I'm considering sharing more about how I built my bot and strategy - What would you like for me to share next?"}]}]},"date":"2022-08-03","body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"my-2021-algotrading-year-in-review"},"children":[{"type":"text","value":"My 2021 Algotrading Year in Review"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In 2021, my algotrading bot \"Bitshark\" made me over $100,000 dollars in profit (over 400% return). In total, my bot managed over 10,000 transactions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"2021 Portfolio Balance Chart","src":"/2021-portfolio.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I built Bitshark from scratch using Javascript (later moved to Typescript). Although I started building it in 2018, it wasn't until 2021 that I ran the bot for an entire year uninterrupted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I want to continue leaning in to algotrading and so I'm considering sharing more about how I built my bot and strategy - What would you like for me to share next?"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:my-2021-algotrading-year-in-review.md","_source":"content","_file":"my-2021-algotrading-year-in-review.md","_extension":"md"},{"_path":"/code-first-feature-flags","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"Code-first Feature Flags","description":"You know what's annoying about using today's typical feature flag services such as LaunchDarkly, Flagsmith, and others? In order to create and manage feature flags, I have to leave my IDE and log in to their website and use their UI. I think we can do better.","excerpt":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"code-first-feature-flags"},"children":[{"type":"text","value":"Code-first Feature Flags"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You know what's annoying about using today's typical feature flag services such as LaunchDarkly, Flagsmith, and others? In order to create and manage feature flags, I have to leave my IDE and log in to their website and use their UI. I think we can do better."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"What if I never had to leave my IDE? After all, that's where the feature flag is actually consumed."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"But first, let's rewind and walk through what creating and managing a feature flag using one of these services looks like:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say I'm working on implementing a new version of a feature that I know we'll want to feature flag. I've picked out the spot in my code where the logic will fork."}]},{"type":"element","tag":"code","props":{"code":"if (true) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"if (true) {\n  // new behavior\n} else {\n  // old behavior\n}\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I'm forced to log in to their UI, and only from there can I create the feature flag."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Creating a feature flag","src":"/ff.gif"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, I can return to my ide and start consuming my feature flag"}]},{"type":"element","tag":"code","props":{"code":"if (flagsmith.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"if (flagsmith.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That was annoying. I was forced to context switch away from code to the feature flag UI."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Why can't I just define my feature flag in the code, and have it appear in the UI for non technical folks to interact with?"}]},{"type":"element","tag":"code","props":{"code":"const flags = setupFlags([\n  {\n    name: 'my_feature',\n    description: 'Determines whether or not to enable my feature',\n    default: false,\n  },\n])\n\nif (flags.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"const flags = setupFlags([\n  {\n    name: 'my_feature',\n    description: 'Determines whether or not to enable my feature',\n    default: false,\n  },\n])\n\nif (flags.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n"}]}]}]}]},"date":"2022-07-31","body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"code-first-feature-flags"},"children":[{"type":"text","value":"Code-first Feature Flags"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You know what's annoying about using today's typical feature flag services such as LaunchDarkly, Flagsmith, and others? In order to create and manage feature flags, I have to leave my IDE and log in to their website and use their UI. I think we can do better."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"What if I never had to leave my IDE? After all, that's where the feature flag is actually consumed."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"But first, let's rewind and walk through what creating and managing a feature flag using one of these services looks like:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say I'm working on implementing a new version of a feature that I know we'll want to feature flag. I've picked out the spot in my code where the logic will fork."}]},{"type":"element","tag":"code","props":{"code":"if (true) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-01f2c5"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":") {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// new behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"} "}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"else"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// old behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"}"}]}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I'm forced to log in to their UI, and only from there can I create the feature flag."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Creating a feature flag","src":"/ff.gif"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, I can return to my ide and start consuming my feature flag"}]},{"type":"element","tag":"code","props":{"code":"if (flagsmith.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" (flagsmith."}]},{"type":"element","tag":"span","props":{"class":"ct-9e2825"},"children":[{"type":"text","value":"hasFeature"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-028a11"},"children":[{"type":"text","value":"my_feature"}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":")) {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// new behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"} "}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"else"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// old behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"}"}]}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That was annoying. I was forced to context switch away from code to the feature flag UI."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Why can't I just define my feature flag in the code, and have it appear in the UI for non technical folks to interact with?"}]},{"type":"element","tag":"code","props":{"code":"const flags = setupFlags([\n  {\n    name: 'my_feature',\n    description: 'Determines whether or not to enable my feature',\n    default: false,\n  },\n])\n\nif (flags.hasFeature('my_feature')) {\n  // new behavior\n} else {\n  // old behavior\n}\n","language":"js"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" flags "}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9e2825"},"children":[{"type":"text","value":"setupFlags"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"(["}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"    name"}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-028a11"},"children":[{"type":"text","value":"my_feature"}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"    description"}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-028a11"},"children":[{"type":"text","value":"Determines whether or not to enable my feature"}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"    default"}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-01f2c5"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  },"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"])"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" (flags."}]},{"type":"element","tag":"span","props":{"class":"ct-9e2825"},"children":[{"type":"text","value":"hasFeature"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-028a11"},"children":[{"type":"text","value":"my_feature"}]},{"type":"element","tag":"span","props":{"class":"ct-68e771"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":")) {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// new behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"} "}]},{"type":"element","tag":"span","props":{"class":"ct-df7817"},"children":[{"type":"text","value":"else"}]},{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"  "}]},{"type":"element","tag":"span","props":{"class":"ct-18185c"},"children":[{"type":"text","value":"// old behavior"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-18d2a6"},"children":[{"type":"text","value":"}"}]}]}]}]}]},{"type":"element","tag":"style","children":[{"type":"text","value":".ct-028a11{color:#E7EE98}.ct-68e771{color:#DEE492}.ct-9e2825{color:#62E884}.ct-18185c{color:#7B7F8B}.ct-01f2c5{color:#BF9EEE}.ct-18d2a6{color:#F6F6F4}.ct-df7817{color:#F286C4}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:code-first-feature-flags.md","_source":"content","_file":"code-first-feature-flags.md","_extension":"md"},{"_path":"/commiting-to-entrepreneurship","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"Committing to Entrepreneurship","description":"For years I've been very critical of all of my own business ideas. \"The initial build-out will take too much time.\" \"That won't scale.\" \"I'll never be able to find customers.\" \"I'll be crushed by the juggernauts in the space.\" I haven't allowed any idea to make it out of the idea phase. Starting today, I'm taking a different approach.","excerpt":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"commiting-to-entrepreneurship"},"children":[{"type":"text","value":"Commiting to Entrepreneurship"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For years I've been very critical of all of my own business ideas. \"The initial build-out will take too much time.\" \"That won't scale.\" \"I'll never be able to find customers.\" \"I'll be crushed by the juggernauts in the space.\" I haven't allowed any idea to make it out of the idea phase. Starting today, I'm taking a different approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently watched a talk by Pieter Levels about his journey to $2.7m ARR. I read his article about starting "},{"type":"element","tag":"a","props":{"href":"https://levels.io/12-startups-12-months/","rel":["nofollow"]},"children":[{"type":"text","value":"12 Startups in 12 Months"}]},{"type":"text","value":". It broke my perception of what starting a business could look like. It doesn't need to be an impossible undertaking. You can start small."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I found this slide in one of his talks particularly fascinating."}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 100,000 people to buy a $10 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 50,000 people to buy a $20 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 10,000 people to buy a $100 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 5,000 people to buy a $200 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 1,000 people to buy a $1,000 product"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That doesn't seem so impossible, does it? That seems....achievable. A business doesn't need to become massive to be successful."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So, today I'm committing to launching some startups. My first idea (or first many ideas) almost certainly won't be successful, and I am ok with that. I'll go into each successive idea with more experience. With some hard work and some luck, I might be able to find some success. Wish me luck!"}]}]},"date":"2022-07-30","body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"commiting-to-entrepreneurship"},"children":[{"type":"text","value":"Commiting to Entrepreneurship"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For years I've been very critical of all of my own business ideas. \"The initial build-out will take too much time.\" \"That won't scale.\" \"I'll never be able to find customers.\" \"I'll be crushed by the juggernauts in the space.\" I haven't allowed any idea to make it out of the idea phase. Starting today, I'm taking a different approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently watched a talk by Pieter Levels about his journey to $2.7m ARR. I read his article about starting "},{"type":"element","tag":"a","props":{"href":"https://levels.io/12-startups-12-months/","rel":["nofollow"]},"children":[{"type":"text","value":"12 Startups in 12 Months"}]},{"type":"text","value":". It broke my perception of what starting a business could look like. It doesn't need to be an impossible undertaking. You can start small."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I found this slide in one of his talks particularly fascinating."}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 100,000 people to buy a $10 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 50,000 people to buy a $20 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 10,000 people to buy a $100 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 5,000 people to buy a $200 product"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"You need 1,000 people to buy a $1,000 product"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That doesn't seem so impossible, does it? That seems....achievable. A business doesn't need to become massive to be successful."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So, today I'm committing to launching some startups. My first idea (or first many ideas) almost certainly won't be successful, and I am ok with that. I'll go into each successive idea with more experience. With some hard work and some luck, I might be able to find some success. Wish me luck!"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:commiting-to-entrepreneurship.md","_source":"content","_file":"commiting-to-entrepreneurship.md","_extension":"md"}]