<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Elite Team of Software Craftsmen - AI, Machine Learning, LLM Agents, Computer Vision, Data Intelligence, Robotics, Cloud, React, React Native, GraphQL development | ST6]]></title><description><![CDATA[ST6 is your AI Special Forces, specializing in AI, Machine Learning, LLM Agents, Computer Vision, Data Intelligence,Robotics, Cloud, React, and GraphQL. Discover our services and success stories with Markforged, MacStadium, and Exodus.]]></description><link>https://st6.io</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 10 Dec 2024 08:06:52 GMT</lastBuildDate><item><title><![CDATA[ORGANIZATIONS OF THE FUTURE - ST6 Structure - Office circle]]></title><description><![CDATA[We talked about the ST6 structure. In our organization, we operate in circles, not departments. Now, let's focus on the Office Circle. Here…]]></description><link>https://st6.io/blog/office-circle-structure/</link><guid isPermaLink="false">https://st6.io/blog/office-circle-structure/</guid><pubDate>Mon, 05 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/blog/structure-circles/&quot;&gt;We talked about the ST6 structure&lt;/a&gt;. In our organization, we operate in circles, not departments.&lt;/p&gt;
&lt;p&gt;Now, let&apos;s focus on the Office Circle. Here, we know what a &lt;strong&gt;404 error&lt;/strong&gt; means for everything related to the office and a &lt;strong&gt;429 error&lt;/strong&gt; while going to the toilets.
From coordinated efforts to operational efficiency, we&apos;ll share what makes this circle crucial for the seamless functioning of our working environment.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/63bdbcc91600eb944f01283e25fb61c1/b54c8/st6er-at-work.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQP/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdVkWIuKg5TJvMFx/8QAGxAAAwACAwAAAAAAAAAAAAAAAQIDAAQQERP/2gAIAQEAAQUCA4IxqlcfZHU9gMspJ50khy0lR//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABwQAAICAgMAAAAAAAAAAAAAAAABETECIRAiUf/aAAgBAQAGPwLnrnJpwyXYtFUQvD//xAAcEAADAQACAwAAAAAAAAAAAAAAAREhUXExQYH/2gAIAQEAAT8hTFhOUvhoZTlbvRhrZyqI8F7JHQVIt8GTsk1yHp//2gAMAwEAAgADAAAAEPcXPv/EABgRAQEAAwAAAAAAAAAAAAAAAAEAEBEx/9oACAEDAQE/EMAant//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxCL0R//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMVGBQcHR/9oACAEBAAE/EKCWz4wNTTZpkHOYgIc7vwg+nJBYO4n7keNpGh94q90pXqlcFUGHDw+8KGPYXef/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ST6-er at work&quot;
        title=&quot;ST6-er at work&quot;
        src=&quot;/static/63bdbcc91600eb944f01283e25fb61c1/acb04/st6er-at-work.jpg&quot;
        srcset=&quot;/static/63bdbcc91600eb944f01283e25fb61c1/bc01b/st6er-at-work.jpg 188w,
/static/63bdbcc91600eb944f01283e25fb61c1/bf173/st6er-at-work.jpg 375w,
/static/63bdbcc91600eb944f01283e25fb61c1/acb04/st6er-at-work.jpg 750w,
/static/63bdbcc91600eb944f01283e25fb61c1/b54c8/st6er-at-work.jpg 879w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;purpose&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purpose&quot; aria-label=&quot;purpose permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purpose&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Craft and maintain a pleasant and inspiring office space that provides superior comfort, supports the team in achieving excellence and promotes happiness and productivity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;domain&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#domain&quot; aria-label=&quot;domain permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Domain&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All maintenance of shared spaces, equipment, and amenities.&lt;/li&gt;
&lt;li&gt;New hire&apos;s onboarding.&lt;/li&gt;
&lt;li&gt;Prepare the seating arrangements and provide equipment for the new hire.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;accountabilities&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#accountabilities&quot; aria-label=&quot;accountabilities permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Accountabilities&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that the shared spaces are well-utilized, clean, and well-organized.&lt;/li&gt;
&lt;li&gt;Purchase or arrange new equipment and amenities based on the organization&apos;s needs.&lt;/li&gt;
&lt;li&gt;Prepare the seating arrangements, equipment and peripherals for the new hires.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&apos;s say this: Office Circle&apos;s members are always available to assist when employees need help with anything related to the office space.&lt;/p&gt;
&lt;p&gt;We aim to add detailed descriptions of all the tasks, and the circle&apos;s members can decide which one they want to handle.
Sometimes, some ST6er can be just a guest in the circle. What does that mean?
Anyone who wants to help or work on some task can do so without being a member.&lt;/p&gt;
&lt;p&gt;We joke that the Office Circle is the &apos;quietest circle&apos;- its work doesn&apos;t always stand out, but without it, our office wouldn&apos;t be fun, cosy, and equipped to make people happy.&lt;/p&gt;
&lt;p&gt;Oh, the 3D printer broke again. I am going to check it. 🙂&lt;/p&gt;</content:encoded></item><item><title><![CDATA[FlyCI is Unleashing the Power of Mac Runners for GitHub Actions]]></title><description><![CDATA[In the ever-evolving landscape of software development, efficiency and cost-effectiveness are paramount. Enter FlyCI, a groundbreaking…]]></description><link>https://st6.io/blog/flyci/</link><guid isPermaLink="false">https://st6.io/blog/flyci/</guid><pubDate>Fri, 08 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the ever-evolving landscape of software development, efficiency and cost-effectiveness are paramount. Enter FlyCI, a groundbreaking solution for GitHub Actions, meticulously crafted by the expert team at ST6. Imagine boosting your mobile CI/CD workflows with M1 runners and exclusive access to M2 runners, all while enjoying &lt;strong&gt;cost savings of up to 2x&lt;/strong&gt; compared to traditional options. Let&apos;s dive into the details of this game-changing solution.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a16584116b34405241bf23699e5e0bff/2bef9/flyci.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFYUlEQVR42k2UeUzUZxrHf0lVEJBjcO6LmWGY02EGhoGZYWAcGLlGZBiOMlW5RFlEUAseVSgau0oFFhRdD8SNeGsPTd3dGru77WbT1mWbJm3StP7RdvtXN2vSjdndNtnks5nxn/735E2ez/t9vs/7foV0uYVsXRFSa4A8Tz3WqjZKo33U9h4gPnqSA7NLzN/8PXPXf8trC2/QNzFPdPAI/rad2MMd6ErrkdkrEOW7WaO2I6TJjMki1+hB7gihTUBDrXgaewnGh+nYc4ypS7eZvHCTgVfnqN46gi/Wj626Ha2nDvm6IGsLysjSOEhXmBFS1+pJlxckD7SOCsTWCiyBTTT3DNPUu5fmvn3EdhygY/Aw0b5RIp3DbOocwlPbQa65HG1hEJHORbrcRJo0H2GVSEOqWE+GwozOWorNV4e+tJ6i6lbsFY04q1pwVLXiru2gaEMb9kCEwmATlvJGTGV1mFyVZCitrJYYSF2bh7AqW0mKSEO6LJ8ctR29K4g31o+7aTuupgHEtgpk1vLnPhlLsYS3Utrcj6+5n3XlGxFpHaxRmEjJ1ZCSo0JYmSVnVY4qCc3NW4fE4ELprCbQvoueE0u0j11A41yP3Oon1PUKA7N3qekaxeRvRGpwITE4WS3WkZKjZlW2AmFFpixJzhDnkSkzIjWWoLN68FQ2sHnXOPf+uMzEiXk6unfz3l8+Zc+RU4QiHRhtJaisXrKUJtZI9aTmqFmRKUd4IUNKQmXaWi1piZty8xDrncg0FgLeIHemD/Ht4/t888m7LN+dI94URam1IDEUkSY1kpqrJUOiY2W2goQ44YU1smSRKlIj1toRqUxkKYyIVQU0lJXw0XQX//zDUf7x8Sx/v7WLPbENSJVGclQWshX5SLQWMsTaJCMJ/LmHmUozqgI3eSYXhnw78UAx90fruH+8k4tjvbz/+kvsb/RjN9nQGAtRFxQh0thIzc0jRaRmZZYCITFiQnpi9VkqO5L8YkyFfrzeSmr9PrZHKrn5qyP86eppdrfUEA2U4vcGsLnKkecXJ3vS5WZWS42sFusREg8yU70OkcGN0laOwRXEWBTC4a1ha/cAbywu8P2Tv/Kfp0/489s3GRh4meJAPQZnEJXNj9joQVZQgtxYQo62ECFHX4zE7EPjDGEtq8Xmq8dXH+fMlbf4ePlznn79hLmTr3Fr6Tz/+vYrlpc/Y+nNh1S39GIpq8ETbMBRFkZp9ZNrcCNILT4M7mqs/gZs/giFoTYs/giBhhe5fOM+Pzz9Af73X/jpGT8++zcPHn1ITawbZyBCd98g3g0xLN461IXrkZi8z4F57jDm8o2EW7czfXaJnqFDidRASJUQjvXw7gd/49Mvv+MXByfJ1DjIVltxVcVo6Rokurmfsro4Jl9D8gMICnsAY1kd1sooFdEeZuYv8/4Hj1m8+iahTVsQ0hUobH5c1W0ImRoKPGEmzy4xee4a0b59RLuGCWzqxBxoROcOIygdlRT4GnBWtxIfOMj5a/eYX7jBOw8eceXqXVp7hvHUtuMMNdO1Z4IDk79m5Nhphsan6Nk7QXTbKP6mbuzBKLqSGgSFoxJzeWMysiR6ByOvTvLw8RccPnmOvYd/yeTZK5w4d51DUwvsfOUEEzMXOXbqMoNjU/SMHKNlx34atg7j29iJ3lOLEOsa5HcP36Ntxwgl4RgrRFqqWrZxaOYSx89dY3bxDkfmFjk6d4mp89c4eeEGR0//htHjZ+g7OEl0+z4qY9vwRrY8t6UiEmf8+Ayhlm1Ute+gdssQLw2NsfvoLGMzC7x+4Tqzi7eZvXybmURyn7/O4emL7ByfJj40Tt2WXXgbu5I7SHj4f9lb/o5dJcTtAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;FlyCI&quot;
        title=&quot;FlyCI&quot;
        src=&quot;/static/a16584116b34405241bf23699e5e0bff/1d69c/flyci.png&quot;
        srcset=&quot;/static/a16584116b34405241bf23699e5e0bff/4dcb9/flyci.png 188w,
/static/a16584116b34405241bf23699e5e0bff/5ff7e/flyci.png 375w,
/static/a16584116b34405241bf23699e5e0bff/1d69c/flyci.png 750w,
/static/a16584116b34405241bf23699e5e0bff/2bef9/flyci.png 1024w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;benefits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#benefits&quot; aria-label=&quot;benefits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Benefits&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unprecedented Cost Savings:&lt;/strong&gt;
FlyCI Mac Runners offer a cost-effective alternative to traditional solutions, allowing you to optimize your development budget. With prices up to 2x cheaper than existing options, FlyCI is committed to delivering value without compromising performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exclusive Access to M2 Runners:&lt;/strong&gt;
Stay ahead of the curve with exclusive access to M2 runners, providing you with the latest in Mac hardware technology. FlyCI ensures that your development environment is always equipped with the cutting-edge resources needed to meet the demands of modern software development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mind-blowingly Simple Configuration!&lt;/strong&gt;
​&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;getting-started&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getting-started&quot; aria-label=&quot;getting started permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Getting started with FlyCI Mac Runners is as easy as entering your email to receive the GitHub App install link. Ready to supercharge your GitHub Actions? Transform your development process - &lt;a href=&quot;http://www.flyci.net/&quot;&gt;try it for free today&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;usage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#usage&quot; aria-label=&quot;usage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Usage&lt;/h2&gt;
&lt;p&gt;Integrating FlyCI Mac Runners into your GitHub workflow is a breeze. With just one simple modification to your existing workflow configuration, you can harness the power of FlyCI&apos;s Mac runners. Update your workflow as shown below:&lt;/p&gt;
&lt;p&gt;For M1 runners:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre class=&quot;language-diff-yaml diff-highlight&quot;&gt;&lt;code class=&quot;language-diff-yaml diff-highlight&quot;&gt;jobs:
&lt;span class=&quot;token unchanged language-yaml&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;ci&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-yaml&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; macos&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;xlarge
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-yaml&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;   &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flyci&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;macos&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;xlarge
&lt;/span&gt;&lt;span class=&quot;token unchanged language-yaml&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 👀 Checkout repo
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For our exclusive M2 runners:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ci&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flyci&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;macos&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;large&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;m2&lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 👀 Checkout repo
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This single-line change opens up a world of possibilities, seamlessly allowing you to tap into the enhanced capabilities of FlyCI&apos;s Mac Runners.&lt;/p&gt;
&lt;h2 id=&quot;flexible-pricing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flexible-pricing&quot; aria-label=&quot;flexible pricing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flexible Pricing&lt;/h2&gt;
&lt;p&gt;FlyCI offers a flexible pricing structure where you can choose between four plans. Read our &lt;a href=&quot;https://flyci.net/blog/flyci-new-pricing-announcement&quot;&gt;blog post introducing the new pricing structure&lt;/a&gt; or just check out &lt;a href=&quot;https://flyci.net/pricing&quot;&gt;the pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;runner-labels&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#runner-labels&quot; aria-label=&quot;runner labels permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Runner Labels&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Processor/OS&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM (GB)&lt;/th&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Price on FlyCI&lt;/th&gt;
&lt;th&gt;Price on GitHub *&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M2/macOS 13&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;flyci-macos-large-latest-m2&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M2/macOS 13&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;flyci-macos-xlarge-latest-m2&lt;/td&gt;
&lt;td&gt;$0.12&lt;/td&gt;
&lt;td&gt;$0.16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M2/macOS 14&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;flyci-macos-14-m2&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M2/macOS 14&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;flyci-macos-14-xlarge-m2&lt;/td&gt;
&lt;td&gt;$0.12&lt;/td&gt;
&lt;td&gt;$0.16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All runners offer 28GB of SSD storage.&lt;/p&gt;
&lt;p&gt;*GitHub doesn&apos;t offer M2 runners. The prices in the table are for GitHub&apos;s M1 runners which are 20% slower than the M2 ones.&lt;/p&gt;
&lt;h2 id=&quot;unleash-the-power-of-mac-runners&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#unleash-the-power-of-mac-runners&quot; aria-label=&quot;unleash the power of mac runners permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Unleash The Power of Mac Runners!&lt;/h2&gt;
&lt;p&gt;In the fast-paced world of software development, having the right tools can make all the difference. FlyCI Mac Runners offer a cost-effective, cutting-edge solution to elevate your GitHub Actions workflows. With the promise of exclusive access to M2 runners and a user-friendly onboarding process, FlyCI is set to become an indispensable ally in your development journey.&lt;/p&gt;
&lt;p&gt;Ready to supercharge your GitHub Actions? Enter your email, get the GitHub App install link, and experience the future of Mac runners with FlyCI, proudly crafted with passion by ST6. Don&apos;t miss out on the opportunity to transform your development process - &lt;a href=&quot;http://www.flyci.net/&quot;&gt;try it for free today&lt;/a&gt;!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Integrating Slack with G-Drive, using Google Apps Script]]></title><description><![CDATA[But why? At ST6 we ❤️ Slack. It enables productivity with its user-centric features and we definitely get the most out of their user groups…]]></description><link>https://st6.io/blog/integrating-slack-with-g-drive-using-google-apps-script/</link><guid isPermaLink="false">https://st6.io/blog/integrating-slack-with-g-drive-using-google-apps-script/</guid><pubDate>Mon, 14 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;/br&gt;
&lt;h2 id=&quot;but-why&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-why&quot; aria-label=&quot;but why permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But why?&lt;/h2&gt;
&lt;p&gt;At &lt;strong&gt;ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt; we ❤️ Slack. It enables productivity with its user-centric features and we definitely get the most out of their &lt;a href=&quot;https://slack.com/help/articles/212906697-Create-a-user-group#:~:text=A%20user%20group%20is%20a,another%20member%20of%20your%20workspace.&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;user groups&lt;/a&gt;. We have dedicated user groups for each project, &lt;a href=&quot;/blog/structure-circles/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;circle&lt;/a&gt;, and their respective roles.&lt;/p&gt;
&lt;p&gt;We also use G-Drive for organization-related documents where we describe the structure, circle definitions, the roles, their members, and so on. More often than not, we catch ourselves having outdated documents that mislead us about who is a member of what circle and what roles are occupied by whom.&lt;/p&gt;
&lt;p&gt;As Slack naturally settled down as the single source of truth for such matters, we decided to solve this once and for all. We are about to use Slack as the source for the relevant data and present it in nice-looking tables and matrices in Google Sheets. Not only this would keep everything in sync, but also provide us with a holistic overview of the building blocks of our organization. Now let&apos;s dive right into the solution!&lt;/p&gt;
&lt;h2 id=&quot;solution-overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solution-overview&quot; aria-label=&quot;solution overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solution overview&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/7fee5/diagram.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.48936170212767%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABe0lEQVR42m2S22rcMBCG/ZR9llz2pjelL9DLQg8E+gC9a8gSillwCs2SLLFrQ1OfCD6ubEle6QtSspsU+sOPNGg0888hEJMAA3YxLMvyD3e7HeM4ekohEOLRFkIgpcTBWou1h9MSaKX52WaUomWRiv1+752NMSilsMZggUrOCOlulnme/dtzQHu8B4vSvDp7x8mPD/xJMq5vboiiS69OK+mD8fcbrz++4VfuDMMsla/gGRb1ZAcu05f4nK/xBUPbU9f10VnOMxoYw+/cXpwxaNgvir7vaduWYRhQ80Q4wUlyxVV3R+A+t/cN28012+2WzWZD0zQ+oNYLZZGT5iVFfU9dFpRVRZ7npGlKkiSUVUH4OeL801tu704fFSqt6IfBZ3TZXbkOTkWWZWTpb//ZJTxU4Hp8wHSZUJ2+x6iC4DCt/8EpWa1WrNdroigiDEPiOGaapuPgXJMbMZJ3A0obArcCTqVz8GqfqLX2K+LKd0q7rvN06h1frs1LPAAt5V6FHpSo3QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;G-Drive integration with Slack diagram&quot;
        title=&quot;G-Drive integration with Slack diagram&quot;
        src=&quot;/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/1d69c/diagram.png&quot;
        srcset=&quot;/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/4dcb9/diagram.png 188w,
/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/5ff7e/diagram.png 375w,
/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/1d69c/diagram.png 750w,
/static/2d116d5d25b36d5cbab2f1ae3b9c4c58/7fee5/diagram.png 781w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;set-up-the-script-environment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#set-up-the-script-environment&quot; aria-label=&quot;set up the script environment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set up the script environment&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Create a new Google Apps Script by clicking &lt;em&gt;&quot;&lt;nobr&gt;Extentions -&gt; Apps Script&quot;&lt;/em&gt;&lt;/nobr&gt; in the Google Sheets document toolbar menu.&lt;/li&gt;
&lt;li&gt;From the sidebar editor tab, create a file named &lt;code class=&quot;language-text&quot;&gt;appscript.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Setup the script metadata with the following &lt;code class=&quot;language-text&quot;&gt;&quot;oauthScopes&quot;&lt;/code&gt;. This allows external http requests via the &lt;a href=&quot;https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;UrlFetchApp API&lt;/a&gt; and updating the spreadsheet content via the &lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SpreadsheetApp API&lt;/a&gt;.
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;timeZone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Europe/Sofia&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;oauthScopes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/script.external_request&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/spreadsheets&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;runtimeVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;V8&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create an &lt;code class=&quot;language-text&quot;&gt;index&lt;/code&gt; file where we&apos;ll place our code.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;get-a-slack-auth-token&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get-a-slack-auth-token&quot; aria-label=&quot;get a slack auth token permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get a Slack auth token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;a href=&quot;https://api.slack.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;api.slack.com/apps&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;em&gt;&quot;Create New App -&gt; From scratch&quot;&lt;/em&gt; and pick the desired workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the side menu on your app&apos;s page, go to &lt;em&gt;&quot;OAuth &amp;#x26; Permissions&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll down to &lt;em&gt;&quot;Scopes -&gt; Bot Token Scopes -&gt; Add an OAuth Scope&quot;&lt;/em&gt; and include the following scopes to enable calls to Slack API methods &lt;a href=&quot;https://api.slack.com/methods/users.list&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;users.list&lt;/a&gt; and &lt;a href=&quot;https://api.slack.com/methods/usergroups.list&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;usergroups.list&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;users:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;usergroups:read&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll to the top to &lt;em&gt;&quot;OAuth Tokens for Your Workspace&quot;&lt;/em&gt; and click &lt;em&gt;&quot;Install to Workspace&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the &lt;em&gt;&quot;Bot User OAuth Token&quot;&lt;/em&gt; for later use in the script.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;retrieve-data-from-slack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#retrieve-data-from-slack&quot; aria-label=&quot;retrieve data from slack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Retrieve data from Slack&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchFromSlack&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;apiMethod&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; apiUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://slack.com/api/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;apiMethod&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Bearer &amp;lt;SLACK_AUTH_TOKEN&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;apiUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; headers &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getEmployees&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; members &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchFromSlack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;users.list&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; members
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        deleted&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        is_bot&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        is_app_user&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        is_restricted&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        is_ultra_restricted&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
        name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;slackbot&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
          deleted &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
          is_bot &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
          is_app_user &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
          is_restricted &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
          is_ultra_restricted
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; display_name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; display_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getUserGroupsWithMembers&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;employees&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; employeesById &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; employees&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;result&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; displayName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; displayName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchFromSlack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;usergroups.list?include_users=true&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;usergroups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;user_count&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; membersCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; membersIds &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;rest &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      membersCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;members&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; membersIds&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; employeesById&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;handle-the-circles-participation-table-formatting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#handle-the-circles-participation-table-formatting&quot; aria-label=&quot;handle the circles participation table formatting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Handle the circles participation table formatting&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;formatCirclesParticipation&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; employees&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userGroups &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; circleHandleSuffix &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-circle&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; conventionDisclaimerRow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;To display a circle user group, its handle must be suffixed with &quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;circleHandleSuffix&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; circlesGroups &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userGroups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; handle &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
    handle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;circleHandleSuffix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; circleNamesWithMembersCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; circlesGroups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; membersCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;membersCount&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tableHeaderRow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;circleNamesWithMembersCount&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; employees&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; displayName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; participationChecks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; circlesGroups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; members &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
      members&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;displayName &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; displayName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;✅&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; participationCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; participationChecks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Boolean&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;employeeName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;participationCount&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;participationChecks&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;conventionDisclaimerRow&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tableHeaderRow&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;rows&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;update-the-google-sheet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#update-the-google-sheet&quot; aria-label=&quot;update the google sheet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Update the Google Sheet&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;updateContent&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; employees &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getEmployees&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; userGroups &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getUserGroupsWithMembers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;employees&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; updatedRows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatCirclesParticipation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; employees&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userGroups &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// the spreadsheet ID from your sheet document URL e.g.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// https://docs.google.com/spreadsheets/d/1a2b3c/edit#gid=0 -&gt; id is &quot;1a2b3c&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; spreadSheetDoc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;openById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;SHEET_DOCUMENT_ID&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;firstSheet&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; spreadSheetDoc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; activeSheet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setActiveSheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;firstSheet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  activeSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearContents&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// clears all but keeps existing formatting&lt;/span&gt;
  activeSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;activate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  updatedRows&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; activeSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendRow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;run-the-script&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#run-the-script&quot; aria-label=&quot;run the script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Run the script&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Manually - while developing, testing or one-off accidental updates:
&lt;ol&gt;
&lt;li&gt;From Google Apps Script Editor, select the &lt;em&gt;&quot;updateContent&quot;&lt;/em&gt; function from the dropdown menu at the top.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;&quot;Run&quot;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Watch your sheet getting cleared and updated row by row.&lt;br&gt;
&lt;img src=&quot;/static/9d013d22f867a20df2cf0e0196a9ff83/popcorn.gif&quot; alt=&quot;Michael Jackson is eating popcorn, looking intrigued while watching a movie&quot;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;with a time-based trigger - to get a truly automated experience once the script is all set and done:
&lt;ol&gt;
&lt;li&gt;From the sidebar menu select &lt;em&gt;&quot;Triggers&quot;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Create a new trigger and for &lt;em&gt;&quot;Select event source&quot;&lt;/em&gt;, pick &lt;em&gt;&quot;Time-driven&quot;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Choose the desired time pattern.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;end-result&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#end-result&quot; aria-label=&quot;end result permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;End result&lt;/h2&gt;
&lt;p&gt;Depending on the formatting you defined via the Google Sheets graphic user interface (GUI), you might end up with something like this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/84102f0f91fc94a193c01e11f909bbe6/985a9/result.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.659574468085104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB+klEQVR42mWSS2/aQBSF+f8/AbECNqwACViyoRJIQCgQSFDVQOoHJODXjD0ez9g+1dxg2qqWjuZoHt8998q1kEVgKceN+QiSCJHg8OMQHgsQywQ8jcFFDH73YcxoFVJASgmlNZRSyLKM1hqLOX7dHJyuFsn2zl+rf4Z1c3G62nD8C46fFt1z/DPerzYBy7JEnucoyoJ8URSocc4ReD6kkOCMg4UReMgg4gS+54NHjPZDPyAlcYIojKC1hvkMpJKB1zKVwUD3+z2EEAiCAE/rJ3zfrmFZFnb7HTabDU7vJxwOB6zXaxyPR7weDlgul+SrdAR0XRfT6RStVgu9fg8vzy/4Gb1h87FFkRUwI2GcIU1TJElCxVMhqDj5NCXgo2XbcTCbzdDtdtHv9wkYliGc1KGWYh3jpm7kRS7gSpe8AVQt0xyrhI7rYjKZoNFooNlsYrFY0EWlFVAAkYpwSS9ACehCQ+Xqn7lV+pPQtjGfzzEcDjEajbDb7QhoqpVFiVgl8KRP3jwwRcxZXtx1T/dIaNkOvk0mqNfraLfbNOgKaFJFiuEiP8gbgElZJTJ7/yX88WZhNpui1+uRVqsVAfU9IVccn/JKj4MswHO0I5/qFGEW0h1T6JHQtDwej9HpdDAYDOgXqRL+3Y6R1BKe9AjoSx+bcPs121w/gL8B5Uo9wPqCeC0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Google Sheets and Slack Integration auto-generated participation table&quot;
        title=&quot;Google Sheets and Slack Integration auto-generated participation table&quot;
        src=&quot;/static/84102f0f91fc94a193c01e11f909bbe6/1d69c/result.png&quot;
        srcset=&quot;/static/84102f0f91fc94a193c01e11f909bbe6/4dcb9/result.png 188w,
/static/84102f0f91fc94a193c01e11f909bbe6/5ff7e/result.png 375w,
/static/84102f0f91fc94a193c01e11f909bbe6/1d69c/result.png 750w,
/static/84102f0f91fc94a193c01e11f909bbe6/78797/result.png 1125w,
/static/84102f0f91fc94a193c01e11f909bbe6/aa440/result.png 1500w,
/static/84102f0f91fc94a193c01e11f909bbe6/985a9/result.png 1512w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;bonus-tips-security&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bonus-tips-security&quot; aria-label=&quot;bonus tips security permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bonus tips (security)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Remove hardcoded values for &lt;code class=&quot;language-text&quot;&gt;&amp;lt;SLACK_AUTH_TOKEN&gt;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;lt;SHEET_DOCUMENT_ID&gt;&lt;/code&gt;.&lt;br&gt;
You can safely store these values as script properties and remove them from the code:
&lt;ol&gt;
&lt;li&gt;Go to your script page and select &lt;em&gt;&quot;Project settings&quot;&lt;/em&gt; - the gear icon at the sidebar.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;em&gt;&quot;Script properties&quot;&lt;/em&gt; section and add the respective key-value pairs.&lt;/li&gt;
&lt;li&gt;Then replace the hardcoded values with: &lt;code class=&quot;language-text&quot;&gt;PropertiesService.getScriptProperties().getProperty(&apos;&amp;lt;YOUR_SCRIPT_PROPERTY_KEY&gt;&apos;);&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Restrict the usage of the Slack &lt;em&gt;&quot;Bot User OAuth Token&quot;&lt;/em&gt; to the Google Scripts IP ranges only:
&lt;ol&gt;
&lt;li&gt;Go back to the Slack app created in the earlier steps and navigate to &lt;em&gt;&quot;OAuth &amp;#x26; Permissions&quot;&lt;/em&gt; from the sidebar.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;em&gt;&quot;Restrict API Token Usage&quot;&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Enter &lt;a href=&quot;https://www.gstatic.com/ipranges/goog.txt&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;these IP ranges&lt;/a&gt; used for Google Apps Script.&lt;br&gt;
In case you wonder where these come from, they are buried in &lt;a href=&quot;https://developers.google.com/apps-script/guides/jdbc#creating_other_database_connections:~:text=you%20must%20authorize-,IP%20ranges,-from%20this%20data&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this Google docs section&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;At &lt;strong&gt;ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt; we use the same approach to generate other tables overviews as well.&lt;br&gt;
We rely on Slack user groups conventions to parse and present the data in an easy-to-view manner.&lt;br&gt;
Here&apos;s a glimpse of some circle roles in Slack with their corresponding Google Sheets table:&lt;/p&gt;
&lt;h3 id=&quot;slack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#slack&quot; aria-label=&quot;slack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slack&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/static/293b12ae6638a26b2e7d27b9efbb2774/slack-circles-roles.gif&quot; alt=&quot;Slack user groups auto-complete&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;google-sheets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#google-sheets&quot; aria-label=&quot;google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Google Sheets&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c9a0ff8afe9c7dd211fe5810aae0b044/410b4/roles-table-example.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.53191489361703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABqElEQVR42pWSb5OaMBCH+f4fre2NYisCpwgKBMWqEP5JCE8nsS+u59yLbmZnk53kyW+zcaq6RjQlSZWTypP1rDmTyROiLUnr4kPu/NxTFxwqQVafONYFQpZc5BXZNTiTUpRlSZbniKIg/xutC4EoBFmW2fnlcuF6vdIPPV3fMQwD/TDYaNZqmnBGrTiXZzb+huA9IIoj3rchQRiwjXb4YYAf+DYmxwOZyGm6lrZrkW1DJWtu1Q0pJVprnENVcExTlFKoSZEXZx5KM4waPc88B9bNAROLU0G0j6xqc26cFHrWzPOMc7gLfry9Eccx8wyr3Z1vQU1aDhZjIB/d2Ha7ZbFYEAQBYRjaJzBingrvgqXrkhgg8Cvu+B42BMcW8XvA3PIZmCQJq9WKx+NhpRuYUTnrGSe55yzdJfv93kr2tjlhXHK+j1zlaHOfgaYa13VtM4z9C7zluCsXb71mmjSbRLKOJcX1QdUq5ln/HzC+5bZkz/NQk8aNGn7uWyLRk39RsgEul0v6vn8Fmjf0fZ/dbmcVBmmLl7SEaWeB92Z8AZp/aRoyjuML8A+91PcmU7IjggAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Auto-generated Google Sheets table representing existing roles and their members grouped by circle&quot;
        title=&quot;Auto-generated Google Sheets table representing existing roles and their members grouped by circle&quot;
        src=&quot;/static/c9a0ff8afe9c7dd211fe5810aae0b044/1d69c/roles-table-example.png&quot;
        srcset=&quot;/static/c9a0ff8afe9c7dd211fe5810aae0b044/4dcb9/roles-table-example.png 188w,
/static/c9a0ff8afe9c7dd211fe5810aae0b044/5ff7e/roles-table-example.png 375w,
/static/c9a0ff8afe9c7dd211fe5810aae0b044/1d69c/roles-table-example.png 750w,
/static/c9a0ff8afe9c7dd211fe5810aae0b044/78797/roles-table-example.png 1125w,
/static/c9a0ff8afe9c7dd211fe5810aae0b044/aa440/roles-table-example.png 1500w,
/static/c9a0ff8afe9c7dd211fe5810aae0b044/410b4/roles-table-example.png 2102w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s definitely room for creativity here. Unleash yours and&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/455eafc3505d01649c7637efa8ac5886/4ca46/craft-with-passion.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.53191489361703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAEU1AABFNQF8gVf5AAADrUlEQVR42k2UW1NaVxTHiU3e+t6+tB+g7XQ605l22nQmX6CPzfSxj2mn04fETk3TTKdSSaJcpIBaiYJ6CILKTYEGhBqDIqCOiIkEvGC4Zaxyxwqcc/a/s89A6p7Zs86cvdZv77X2+m8RAFFkPSyitj0/LxYLjp1YLJzLZZ0AvgdwGcC7AKYO9vcrL+K7pFA4TQD4hsaQdqwwAPI+x7FhAF8BuJpMJOB2uxBaW4Nv0Quv5zFqtepmqVhMT07oYTQ+wrTRSH4XixEIPAWAn9sH6SrljikQ31nmZrG09He92WwcGwwMZszm5lpwlf9DqWTVKhWr1Y5iYd4BcW9va2UlQKYmJzGkUbMulxObGxsU+jGF8hzbRYEfrq4EWLlMBrPZhGBwlVcOKnC75yeikMvI3OwM1CoVJ+79jac++/t7JJNJk7XgKgW1ZsxmahXtU74hIoSfjUa3YLNZeb/Pxx8eHsDATJFWq0lu9/Sg+9ZNDA1p8O2NGxh7qEW5XKJQOBx24vV6eElfH/L5XAbAW0Ida7XqP7/evYtwOMQOadRIJhOEYaagHR3Fj93deKgdhUatAt0ol8uClkcuk4Km7rDbsfxkqTXvcNBTSgQggE8z6XRrft5BHbnNjXW8epUndOfNzQ1ksxn4FhdB13di25ibnYXdZsWEXoevr18nXs9jzu1yASBzxWJB1GmVLzLp9Il0YAAyqZSPx3fJ8vIT+P0+OOw2GBiG/odyUA6jgYFCLge9mL29JHn+/Bmh64nEi3NC+JuiVqt5pQ2V68bHYbVYWr/cuQO9TkcG+vuFixoZGUZoLQilahhW+wIikTD8Ph/o5RmYKZoBSzc5PT0pCP3TBl4Lh0NYj0R4u83GOhfmedpCLqeTmKYfEbVmhGx7hgnO06j/e85rVCr2nqSPSyYT3LTRiLOz+jGAL0WNxrmoWq1cakM1NM3xsTHYbTa4XS7+L7cL/fclRCwZIEnbLZyFHnBSmQK68TGYTdOIx3fhXFjAs53YEYA3qVJey8676KH2h3q9tnSUStWsVgs4jmX7H9wHwzA4iG+xxok/cfTyJQ2+VyoV/bHYdkWpHETgqaCaa7QPL+pYmOVyidqr8fhug9bw8PCALZyetEwmMw5TRxUAH1G/aHSL+r3TbDQs1WolCuBtQc8dKMexQk3LlfLlNvyzo1SqRNuEppdKHZQAfNJeu5LNZYT6x3ZigkpePxAXB/9/CTrQ9/L5XDSfz20D+KAjsQsZden1us73pf8AW8yOADPmohAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Craft with passion logo&quot;
        title=&quot;Craft with passion logo&quot;
        src=&quot;/static/455eafc3505d01649c7637efa8ac5886/1d69c/craft-with-passion.png&quot;
        srcset=&quot;/static/455eafc3505d01649c7637efa8ac5886/4dcb9/craft-with-passion.png 188w,
/static/455eafc3505d01649c7637efa8ac5886/5ff7e/craft-with-passion.png 375w,
/static/455eafc3505d01649c7637efa8ac5886/1d69c/craft-with-passion.png 750w,
/static/455eafc3505d01649c7637efa8ac5886/78797/craft-with-passion.png 1125w,
/static/455eafc3505d01649c7637efa8ac5886/aa440/craft-with-passion.png 1500w,
/static/455eafc3505d01649c7637efa8ac5886/4ca46/craft-with-passion.png 1944w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Migrating from Bootstrap to Tailwind CSS (part 3)]]></title><description><![CDATA[In the previous article, we went through the different architectural strategies we considered for migrating from Bootstrap to Tailwind CSS…]]></description><link>https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-3/</link><guid isPermaLink="false">https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-3/</guid><pubDate>Wed, 07 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/&quot;&gt;previous article&lt;/a&gt;, we went through the different architectural strategies we considered for migrating from Bootstrap to Tailwind CSS, and then I shared the one we chose.&lt;/p&gt;
&lt;p&gt;In this article, I will go through the actual execution of the picked strategy and share some &lt;strong&gt;anti-patterns and learned lessons&lt;/strong&gt; throughout the whole experience.&lt;/p&gt;
&lt;h2 id=&quot;a-quick-recap-of-the-chosen-strategy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-quick-recap-of-the-chosen-strategy&quot; aria-label=&quot;a quick recap of the chosen strategy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A quick recap of the chosen strategy&lt;/h2&gt;
&lt;p&gt;Following the &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/&quot;&gt;previous article&lt;/a&gt;, you now know that we chose &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/#strategy-4-integrate-tailwind-css&quot;&gt;Strategy 4&lt;/a&gt;, where we integrated Tailwind CSS and used it on top of Bootstrap. This way, we could continue delivering features to the end users while updating and styling certain pages step by step with Tailwind CSS.&lt;/p&gt;
&lt;p&gt;Using two libraries for styling is an &lt;a href=&quot;https://en.wikipedia.org/wiki/Anti-pattern&quot;&gt;anti-pattern&lt;/a&gt;, but it was the most suitable decision, both from a business and technical perspective. For more info about the pros and cons of the strategy, see &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/#strategy-4-integrate-tailwind-css&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-tech-stack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-tech-stack&quot; aria-label=&quot;the tech stack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The tech stack&lt;/h2&gt;
&lt;p&gt;We extended the old technical stack with the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://headlessui.com/&quot;&gt;Headless UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ben-rogerson/twin.macro&quot;&gt;twin.macro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-execution-phase&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-execution-phase&quot; aria-label=&quot;the execution phase permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The execution phase&lt;/h2&gt;
&lt;p&gt;Now, let’s dive into the most exciting part of the series → the execution of our architectural decision (&lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/#strategy-4-integrate-tailwind-css&quot;&gt;Strategy 4&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Before starting the implementation, we revisited how we used &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt; in the project. We discovered we were referencing it throughout the whole codebase. And this was another &lt;a href=&quot;https://en.wikipedia.org/wiki/Anti-pattern&quot;&gt;anti-pattern&lt;/a&gt; we had in our project.&lt;/p&gt;
&lt;p&gt;That’s how we came up with Step 1.&lt;/p&gt;
&lt;h3 id=&quot;step-1-isolate-code-classlanguage-textreact-bootstrapcode&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-1-isolate-code-classlanguage-textreact-bootstrapcode&quot; aria-label=&quot;step 1 isolate code classlanguage textreact bootstrapcode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 1: Isolate &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;By isolating &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt; in our codebase, we could later replace one component from the package with our implementation. We could do that without updating the files where we used the component.&lt;/p&gt;
&lt;p&gt;Consider the following example:
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/1ff84/dependency-isolation-bad-good-example.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 99.46808510638297%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE5UlEQVR42j2TaagcZRaG65+gucm9fbtvV1dXV6/VS1VXd1VXL9XV2+317ok3m0nMnqhRRyEoEhBFnUBwoiiTMdFxVDSKBJeMOIiDDDNoRAQFUZSgouKCiiiiDIy/HunKZX48vN/353znPe/5hJMXfuPe1//H8X/9yj2v/cJd//yZO1/5idv/8SPHXvqB2178nlue/5aj577h5me/4g9Pf8n1T33BtU98xuG/fcqBv37MvjMX2XP6IjtPfYRw4j//ZfmGE7ibDuNuPkJl+RDl5UPYSwcpLR7EWjiAOb+f4mgfheE+jMFe8v096L3daN2ryXV3oza2Ya/exvYH3ke4+9UfsYY7iOdrxAouIbWElLYR1ZJHMGURTFrMJC0CCZNAvIh/TGyNuMlkOEfMXmLzve8g3PHyd1iL+9C0KlWtRtpdIFZoo5b7JEtd1MqAdGVIwuqilgeolSFJu0/C6hHK1gmmHfxxi3htlY3H30I4dv5rzOFOlFyFhNEkWmii6C6K3kDWXCKai5yrI2UdxHTVI6hWmElVCCTLBFJVfNEi0fJGFu96A+HWc59jjq4mVumTaa2Qq8+Tas4Trw1IlLoknQVidp+4OYucb/2fsN5EzNYJJCtMKUWU0jKj2/+NcPSZTzAGu5Aay0ScBaJmB9EdItZ6KIU2UmUe0ewSt3qkqvMkykNStQUSlTmiZhd/YlywQMRaon/sNYSbnrqI0d2OrJZIFJrEi23iehMl6xLOuSg5BznreDZ9URNf1PI6mowUmVJMphNlJiMFwuYinVtfRbjh8Q/J93cSaSyTbG0i48wRnV0i4o48y7HGCrI9JFHqE7MHRK0+8fKQaGmAbHTwxW02yAZScYHm0VcQrnv0A3KdbYhWl7DZRdJcgsWWh5ei0WFGa3ozGxcI661Lmm8jZl18sUsFQ8Y87s0vIxx++H209laklI2Udrw0pXSNkFolmK4RTJUJriXqj9tMx218sdIa43uZ9eE8Yn6O2o0vIRw4/R7ZxhZEvUzYriNl6oiZmldMTF/SmVTVY7wi41S9IKIlJhXLY0LKE9TnKB85j7D31Ltk6lsJ1WzkUZW43iU03rucS7TQRjHahLUmkXwLxeh4Or5PxUpsUCyPCUlnRhthXfsCwu4H30F1VxFjJeR0w5vb2Lqo1rxuRK+rsmdtIlxgImwwIRlr5wLrZZN1IZ1Abkjh0HMIO+5/G7W5Fak2T7yxQqoyRG7OE6r2UQodZGeJkNkjqNaQC10iZh+52EPKzxLMNpmM2lwhavizQ/T95xC2/+ktEvVV/IUOAa3lzWlKd5nK1fEnK/gyDSZTjheAqDWR9DbBbIOZtItfddiglLg8mGM6MyC351mELSfeJOWsIiZKRI02seIsit4i7IVTJ5x1CaUd76F1ksEVofwahsc6qcjlQQ1fekB61zMIVx5/nVhtE35nEbE8R1hvMO308NltxIxDwB4xpbe9H6J4Sz3ydGw/pDXZIJtcNp1iMtkhedVZhI1/vEC2ewDJ6BMujpDyfUL5PmK+TzDXZUbrMZPrEsh0CGS7Hv7MLNNqB1+qzWSyxfqog9/YQmzbWYTley7Qu+XvNI48iXPNY1QPPkp5/yOU9p7B3H2awq6/kN9xCm37n8lufRB19QGSm+4nsXIfseWTKEsniSzeh7zyEJEtZ/kdZiCwGadhL1oAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;dependency isolation bad good example&quot;
        title=&quot;dependency isolation bad good example&quot;
        src=&quot;/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/1d69c/dependency-isolation-bad-good-example.png&quot;
        srcset=&quot;/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/4dcb9/dependency-isolation-bad-good-example.png 188w,
/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/5ff7e/dependency-isolation-bad-good-example.png 375w,
/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/1d69c/dependency-isolation-bad-good-example.png 750w,
/static/310b5b6c0de4ed1a8aafaea0cbf7b0ed/1ff84/dependency-isolation-bad-good-example.png 1040w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When isolating the &lt;code class=&quot;language-text&quot;&gt;Button&lt;/code&gt; component, we could replace its implementation in &lt;code class=&quot;language-text&quot;&gt;../components/ui/Button.js&lt;/code&gt; with our custom one. We would update only one file. Later, we could substitute &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt; without introducing significant changes in the project.&lt;/p&gt;
&lt;p&gt;Yet, we had to update all files that referenced &lt;code class=&quot;language-text&quot;&gt;import { Button } from &apos;react-bootstrap&apos;;&lt;/code&gt;. That was very risky, and it brought an enormous potential for breaking something.&lt;/p&gt;
&lt;p&gt;That&apos;s why we moved all &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt;&apos;s components into one place.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Isolate dependencies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;step-2-integrate-tailwind-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-2-integrate-tailwind-css&quot; aria-label=&quot;step 2 integrate tailwind css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 2: Integrate Tailwind CSS&lt;/h3&gt;
&lt;p&gt;We followed the &lt;a href=&quot;https://tailwindcss.com/docs/installation&quot;&gt;tailwindcss installation guide&lt;/a&gt; to install and configure it in our project.&lt;/p&gt;
&lt;p&gt;But, we did two crucial changes in our configuration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We turned off the &lt;a href=&quot;https://tailwindcss.com/docs/preflight&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;preflight&lt;/code&gt;&lt;/a&gt; mode to disable the default styling coming from Tailwind CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We added a custom &lt;a href=&quot;https://tailwindcss.com/docs/configuration#prefix&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prefix&lt;/code&gt;&lt;/a&gt; to all Tailwind CSS classes, so as not to have any collisions with the Bootstrap ones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This enabled us to use classes both from Bootstrap and Tailwind CSS at the same time without interference. For example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mt-2 ms-px-2 ms-text-amber-300 ms-border&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hello World!&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;step-3-rewrite-components-when-possible&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-3-rewrite-components-when-possible&quot; aria-label=&quot;step 3 rewrite components when possible permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 3: Rewrite components when possible&lt;/h3&gt;
&lt;p&gt;In Steps 1 and 2, we isolated &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt; components into a single place, and we configured Tailwind CSS. Next, we sought opportunities to extract reusable React components styled with Tailwind CSS.&lt;/p&gt;
&lt;p&gt;Since we would be creating new React components, we decided to split them into two categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generic Components&lt;/strong&gt; styled with Tailwind CSS. Our goal was to prepare for creating a Reusable React Component UI Library, which we could use throughout our client&apos;s projects in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain Components&lt;/strong&gt; tailored to our Domain and used throughout the pages in the current web application.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To better illustrate the idea, consider the image bellow:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ec96272ab3a1ed9dcb8e9d5763895fcf/6e29b/generic-domain-components-example.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.61702127659575%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADG0lEQVR42o2TbUyVZRjHH92goy2BYx9wCgfkPM9zPy/nBB4wDwcOYtRA460aBxkbrVazAM+YL1POObLAQJyGneK0gURbQKbH0dmSajp1tazIJbMPaZ/60tpqbjbnF537tedRXvyg68Nvu+9d//u6r+v637dkqIJFVHRFYKoqiltQbCqMtWdzfSiT349lcrw9mxKPYsfMB1rrzNIc0tLNvEDIAp+p8vOAk1vjT3FjLIO/RzO5N/kkc4ez7IssjbGQ9BEJLbxCZV2uxgdvrIHpFfx2NIM/jqRx/VA6197LgNQKO5bj0vAI9fEV3g+qqLLgx3dXQzKdu1OruHCqjovJOu5MZcCpdLtyTbE6+p8JLfHlQ0446aAvOUj1N79S/fVV3kkegRNPcOVw1kMjenzLmspal8FUZxY3U4LnP/2KxuMTNHz8GTWTM/yT8nBiZyY5eYY9nvki5pEWDVFtLPdkt0blhvXMDeez48w09cmz1J8+x46ZL5hLrKfKl4+7QHtgirqkdRVJlxV0t4wptAU8miA/T6XGt5a9sSZe+vyMzZ4DzWzbmEtuno5XE3iEwBTC1luuW0hbdkd48cMxgntiVEb7qIz0URk9SG18hIrufpQcF4Z1SNfIWeOisdzF7MBqJnY6mQw7Se5y2usfDjoZ78xGqh2ZoHX2GtUjkzx3bJSq+Bhbx0/S8v1VmpIzBANlBP0BKkr9+MteYChcCqk0/kqs5KdeB3MDDn7pd0DKYX8AqXowTtOXF9k8cJTS7gMEoj1UDSV4ZfostYlP8OoGzxgmRaaBLHvpaJC5Pb6S2d7lJMPLOB1exrfR5fw7msb5nqeRvEU+vMUl1DS2Ur+9g7rQ22x7uQ2PrxizcAPCLS+gFsgY7jxqgkW83rKdtlAzbaEQrza30Nq4lUChjKS5VYyCdXTuv0zvRxCLQ2TwT4KbSgj6S6kIlC1SVk65/1nCXf10vw89CYjEIToMu3uvUGjK1rPRMJQCXnsrQVfsEl2x7+jYNWE759ENPJq+gFc30WU3DXUhuiIX6Nx3nva95+jYf4k324cpNBT+Ayc4IAbtLba7AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;generic domain components example&quot;
        title=&quot;generic domain components example&quot;
        src=&quot;/static/ec96272ab3a1ed9dcb8e9d5763895fcf/1d69c/generic-domain-components-example.png&quot;
        srcset=&quot;/static/ec96272ab3a1ed9dcb8e9d5763895fcf/4dcb9/generic-domain-components-example.png 188w,
/static/ec96272ab3a1ed9dcb8e9d5763895fcf/5ff7e/generic-domain-components-example.png 375w,
/static/ec96272ab3a1ed9dcb8e9d5763895fcf/1d69c/generic-domain-components-example.png 750w,
/static/ec96272ab3a1ed9dcb8e9d5763895fcf/78797/generic-domain-components-example.png 1125w,
/static/ec96272ab3a1ed9dcb8e9d5763895fcf/aa440/generic-domain-components-example.png 1500w,
/static/ec96272ab3a1ed9dcb8e9d5763895fcf/6e29b/generic-domain-components-example.png 1610w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this example, we can have a generic &lt;code class=&quot;language-text&quot;&gt;Button&lt;/code&gt; component and a &lt;code class=&quot;language-text&quot;&gt;LoadingButton&lt;/code&gt; as a Domain Button component.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 A key principle we followed was &lt;a href=&quot;https://bradfrost.com/blog/post/atomic-web-design/&quot;&gt;Atomic Design&lt;/a&gt;, where we’re not designing pages; we’re designing systems of components.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also, we didn’t change the components’ APIs. We followed the ones from &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt; because we didn’t want to introduce many changes at once, only style updates.&lt;/p&gt;
&lt;p&gt;One key aspect of this step was using &lt;a href=&quot;https://github.com/ben-rogerson/twin.macro&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;twin.macro&lt;/code&gt;&lt;/a&gt; to have &lt;code class=&quot;language-text&quot;&gt;tailwindcss&lt;/code&gt; classes in our &lt;strong&gt;styled-components&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is how we rewrote &lt;code class=&quot;language-text&quot;&gt;react-bootstrap&lt;/code&gt;&apos;s &lt;code class=&quot;language-text&quot;&gt;Badge&lt;/code&gt; component to use Tailwind CSS and keep the same API.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; forwardRef &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; PropTypes &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;prop-types&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cx &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;classnames&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; styled &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@emotion/styled/macro&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; tw &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;twin.macro&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; StyledBadge &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;styled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;span&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;tw&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;ms-px-2 ms-py-1 ms-inline-flex ... ...&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;

    &amp;amp;.primary {
        &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;tw&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;ms-bg-primary-100 ms-text-primary-500&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    }

		...

    &amp;amp;.pill {
        &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;tw&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;ms-rounded-full&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    }

    &amp;amp;.xs {
        &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;tw&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;ms-text-xs&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    }

    ...
&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Badge &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;forwardRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; className&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; variant&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pill&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StyledBadge&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ms-badge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; className&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; variant&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        pill&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

Badge&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propTypes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;pill&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bool&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;elementType&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

Badge&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;defaultProps &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;pill&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;primary&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;span&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Badge&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the end, our Folder Structure looked like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/src
│   ...
|   ...
│   AppRoutes.js
│
└───components         --&gt; reusable Domain Components used throughout the Pages
│   │   Header.js
│   │   ...
│   └───ui             --&gt; Generic Components (preparing for UI lib)
│       │   index.js
│       │   Button.js
|       |   Badge.js
│       │   ...
└───pages              --&gt; actual Pages on our web app
│   │   ...
│   └───login
│       │   index.js
│       │   ...
└───...
│
└───...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you enjoyed the &lt;a href=&quot;https://st6.io/tags/bootstrap-to-tailwindcss/&quot;&gt;Migrating from Bootstrap to Tailwind CSS&lt;/a&gt; blog post series. We explored different architectural strategies for migrating from one UI library to another. Along the way, we learned something new, like the importance of conducting good research before implementing а specific architectural decision, and isolating dependencies. We also discovered how to use Tailwind CSS in our styled components. The experience taught us valuable lessons in achieving maintainability, good software architecture, and project structure, and avoiding potential anti-patterns.&lt;/p&gt;
&lt;p&gt;There are a few pieces of practical advice I&apos;d like to point out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Strive for &lt;strong&gt;incremental improvements&lt;/strong&gt;. Rome was not built in a day. Neither will be your “perfect” application, so having some “bad code” is okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be careful about anti-patterns and code smells. Try to avoid them in advance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Sometimes you can accept having an anti-pattern in your codebase but you should be very aware of why you have it and at what cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you liked my blog posts, you can follow me on &lt;a href=&quot;https://www.linkedin.com/in/petarivanovv9&quot;&gt;LinkedIn&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/petarivanovv9&quot;&gt;Twitter&lt;/a&gt;, where I share coding tips daily. Hope to see you there.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Supercharging GitHub Actions: Leveraging Jetson Nano's Hardware in a Self-Hosted Runner]]></title><description><![CDATA[GitHub Actions is a powerful tool for automating software development workflows, but it does have some limitations when it comes to hardware…]]></description><link>https://st6.io/blog/jetson-nano-self-hosted-runner/</link><guid isPermaLink="false">https://st6.io/blog/jetson-nano-self-hosted-runner/</guid><pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub Actions is a powerful tool for automating software development workflows, but it does have some limitations when it comes to hardware resources. The default GitHub-hosted runners are virtual machines running on the GitHub infrastructure, which means they have predefined specifications and limitations that may not be suitable for all use cases.&lt;/p&gt;
&lt;h2 id=&quot;github-actions-limitations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#github-actions-limitations&quot; aria-label=&quot;github actions limitations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GitHub Actions limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited processing power&lt;/strong&gt;: GitHub-hosted runners have predefined CPU and memory limits. These limits are typically sufficient for most workflows, but if your workflow requires &lt;strong&gt;heavy computation&lt;/strong&gt; or resource-intensive tasks, such as &lt;strong&gt;training machine learning models&lt;/strong&gt; or running &lt;strong&gt;simulations&lt;/strong&gt;, the limited processing power of GitHub-hosted runners may become a bottleneck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No GPU support&lt;/strong&gt;: GitHub-hosted runners do not provide access to GPUs. GPUs are crucial for tasks like deep learning, computer vision, and other GPU-accelerated computations. Without GPU support, you may not be able to take advantage of the full potential of your workflows that require GPU resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Specific software dependencies&lt;/strong&gt;: GitHub-hosted runners come with a predefined set of software dependencies and tools. If your workflow requires &lt;strong&gt;specific software versions&lt;/strong&gt; or custom configurations, you may face limitations or compatibility issues with the default runners.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;our-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#our-problem&quot; aria-label=&quot;our problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our problem&lt;/h2&gt;
&lt;p&gt;Our specific challenge revolves around running automation scripts on our custom hardware, which is based on an ARM chipset. These scripts encompass various tasks like smoke tests, packaging, and Docker image generation. Running them on our ARM-based custom hardware enables us to validate the software&apos;s performance, behavior, and seamless integration with the specific hardware architecture.&lt;/p&gt;
&lt;p&gt;However, the default GitHub-hosted runners do not support our custom hardware, posing a significant obstacle. Consequently, comprehensive testing and validation become challenging, hindering the accuracy of our automation processes when using GitHub Actions.&lt;/p&gt;
&lt;h2 id=&quot;solution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solution&quot; aria-label=&quot;solution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solution&lt;/h2&gt;
&lt;p&gt;By setting up a self-hosted runner on &lt;a href=&quot;https://developer.nvidia.com/embedded/jetson-nano-developer-kit&quot;&gt;NVIDIA&apos;s Jetson Nano&lt;/a&gt;, you can leverage the Jetson Nano&apos;s AI capabilities and low-power consumption for running your GitHub Actions workflows. The Jetson Nano is a small, single-board computer designed for AI and robotics applications. It features a &lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit&quot;&gt;CUDA-enabled GPU&lt;/a&gt;, which can significantly accelerate AI workloads.&lt;/p&gt;
&lt;p&gt;With a self-hosted runner on the Jetson Nano, you can perform tasks that require &lt;strong&gt;GPU acceleration&lt;/strong&gt;, run resource-intensive computations, and take advantage of the Jetson Nano&apos;s hardware capabilities in your workflows. This allows you to overcome the limitations imposed by the default GitHub-hosted runners and unlock the full potential of your development and deployment processes.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prerequisites&quot; aria-label=&quot;prerequisites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jetson Nano (In this example running on Ubuntu 18.04 Jetpack L4T 32.7.3)&lt;/li&gt;
&lt;li&gt;Basic knowledge of GitHub Actions and the concepts of self-hosted runners&lt;/li&gt;
&lt;li&gt;Basic knowledge of Docker and containerization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-1-prepare-the-jetson-host&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-1-prepare-the-jetson-host&quot; aria-label=&quot;step 1 prepare the jetson host permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 1: Prepare the Jetson host&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install Docker.&lt;/li&gt;
&lt;li&gt;Install Nvidia Runtime.
NVIDIA Container Runtime for Docker (previously known as &quot;nvidia-docker&quot;) is a software tool specifically designed to enable the use of NVIDIA GPUs within Docker containers. It serves as a bridge between Docker and the NVIDIA GPU drivers, allowing containerized applications to seamlessly access and utilize the computational power of NVIDIA GPUs.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nvidia-container-runtime&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3.7&lt;/span&gt;.0-1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I experienced some problems with newer versions on Ubuntu 18.04.&lt;/p&gt;
&lt;p&gt;Make sure that &lt;code class=&quot;language-text&quot;&gt;/etc/docker/daemon.json&lt;/code&gt; has the configuration that enables running the Nvidia Container Runtime.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;runtimes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;nvidia&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvidia-container-runtime&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;runtimeArgs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nvidia-container-csv-cudnn
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nvidia-container-csv-tensorrt
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nvidia-container-csv-cuda&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These packages, are necessary to ensure that a container utilizes the underlying host&apos;s CUDA, cuDNN, and TensorRT software stack. Installing these packages results in the creation of CSV files, which can be found under &lt;code class=&quot;language-text&quot;&gt;/etc/nvidia-container-runtime/host-files-for-container.d&lt;/code&gt;. These CSV files contain the paths to the corresponding libraries, which are then attached to the Docker container by the NVIDIA Container Runtime.&lt;/p&gt;
&lt;p&gt;In summary, these packages are crucial for establishing the connection between the container and the host&apos;s CUDA, cuDNN, and TensorRT libraries. The CSV files facilitate the inclusion of the necessary libraries within the container, enabling it to access and utilize these software components provided by the host.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Restart docker.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;systemctl restart docker.service&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;step-2-create-and-build-a-runner-image&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-2-create-and-build-a-runner-image&quot; aria-label=&quot;step 2 create and build a runner image permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 2: Create and build a runner image&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create a Dockerfile.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; nvcr.io/nvidia/l4t-base:r32.7.1&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; TZ=Europe/Sofia&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; DEBIAN_FRONTEND=noninteractive&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; CUDA_HOME=&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/cuda&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; PATH=&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/cuda/bin:/home/myuser/.local/bin:${PATH}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; LD_LIBRARY_PATH=&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/cuda/lib64:/usr/local/lib:/usr/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; LLVM_CONFIG=&lt;span class=&quot;token string&quot;&gt;&quot;/usr/bin/llvm-config-9&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; RUNNER_LABELS=&lt;span class=&quot;token string&quot;&gt;&quot;self-hosted-jetson&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; REPO_URL=&lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;repo_url&gt;&apos;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Install dependencies&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apt-get update &amp;amp;&amp;amp; &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    apt-get install -y &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    curl &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    build-essential &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    sudo &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# extra dependencies \&lt;/span&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Add a non-root user&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; useradd -m myuser&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# The GPU (for hardware accelerated access) requires the user be a member of group “video”. This is true for both GUI and CUDA use.&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; usermod -aG sudo,video myuser&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Set the working directory and give ownership to the new user&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /runner&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; chown -R myuser:myuser /runner&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; echo &lt;span class=&quot;token string&quot;&gt;&apos;myuser:myuser&apos;&lt;/span&gt; | sudo chpasswd&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Switch to the new user&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;USER&lt;/span&gt; myuser&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Download the GitHub runner package and install it. Get the latest version from github.com&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; curl -o actions-runner-linux-arm64-2.304.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-arm64-2.304.0.tar.gz &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &amp;amp;&amp;amp; echo &lt;span class=&quot;token string&quot;&gt;&quot;34c49bd0e294abce6e4a073627ed60dc2f31eee970c13d389b704697724b31c6  actions-runner-linux-arm64-2.304.0.tar.gz&quot;&lt;/span&gt; | shasum -a 256 -c &lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
    &amp;amp;&amp;amp; tar xzf ./actions-runner-linux-arm64-2.304.0.tar.gz&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;/bin/bash&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;-c&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;(./config.sh --token $GITHUB_TOKEN --labels $RUNNER_LABELS --url $REPO_URL --unattended &amp;amp;&amp;amp; /runner/bin/runsvc.sh)&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Build the image.
Make sure to execute this from the Dockerfile directory&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; my-nano-runner &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;step-3-create-a-registration-token-from-the-github-ui&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-3-create-a-registration-token-from-the-github-ui&quot; aria-label=&quot;step 3 create a registration token from the github ui permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 3: Create a registration token from the GitHub UI&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to your repository.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; -&gt; &lt;strong&gt;Actions&lt;/strong&gt; -&gt; &lt;strong&gt;Runners&lt;/strong&gt;.
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0bcbde71393e8af67523d46ccb2ff137/95be1/runners-page.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.8936170212766%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABMElEQVR42o2RyW7DMAxEc64XWftmS86iBImLov2Cnvv/HzSF6MTJqehhQFkgh2/knbQTlEuIuaCe/XSkauOeziZk+q4ycQ9pE/W7MCPPBTxGyDSCWY92sNg1TKOXngbeerVJ+Rn59I5OBHTcoRcOHbfoahUOPXdgyiF933D4+YJeDmh6jV07GAwqEI2fTrS93jE9QfgCGc+QLlPPQ0yuEmYClxGdSOh4oLnNMB+v0H4mknrXcYN20GiZpighX5BOC9Lhin1ZMJeFiFu+9hI9v0cWZsQ4n9HQsEFvHhFX9SpBhAIZClQ40PvW9+Rm3Iw2QyLUkQiZXI2Y8uv2wd6rQcsUGpLetCZ5mq2RK6HLKLdP2DiDm0jEz+j2T9GyuzZCriOOlw+KUv/wa8N/TF8j/wLwFsfYmjN6eAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Github UI runners page&quot;
        title=&quot;Github UI runners page&quot;
        src=&quot;/static/0bcbde71393e8af67523d46ccb2ff137/1d69c/runners-page.png&quot;
        srcset=&quot;/static/0bcbde71393e8af67523d46ccb2ff137/4dcb9/runners-page.png 188w,
/static/0bcbde71393e8af67523d46ccb2ff137/5ff7e/runners-page.png 375w,
/static/0bcbde71393e8af67523d46ccb2ff137/1d69c/runners-page.png 750w,
/static/0bcbde71393e8af67523d46ccb2ff137/78797/runners-page.png 1125w,
/static/0bcbde71393e8af67523d46ccb2ff137/aa440/runners-page.png 1500w,
/static/0bcbde71393e8af67523d46ccb2ff137/95be1/runners-page.png 2574w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Click New self-hosted runner in the top right corner.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;linux&lt;/strong&gt; as runner image and &quot;ARM64&quot; as the architecture.
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2ce4f9f3ed4833b2ac68987675b5d91b/95be1/github-new-runner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.95744680851064%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB6UlEQVR42l2TUXOjMAyE+3xpAgEMNthgYggBmjZp7+bu//+xvVkRyLQPO8Iy/ryS4CXJLdLCoaw78LmoWomp9kjLDmXdw7gOxgVU/oxM1ziqCrl2sK7FLlJ4jXPsj4XohYkoNQLl869Dhl2UIVINMjejCSPafobvJol56RGlJY7KIs4quTzOyieQdCbogi7pgODCBnTzH9TnO/r5C+P1E64d5ALfzzB+RlGPMH5CVobN5Qasw4jMNJIkMMkdKj8gVhb7REsVh8Rgf8xlnzokWvZ20Y+SaZvudgclyUOu5ZKq6ZGoStrwGhdQZSv9k3cSDW1PIoERvjrkS+wPwVzv4hzaBvTTDdoFGYipO7lkLY3xpx7AxSEPc8J0SdfKNOjGG1yYUFPdjKRwy8GHm5/i3uawqE5bKcxFj76mukFS1CKWzHVGGb9paYX9DuTkOEVlPJacFYf9dEe4fEgc3r5wGt7hTiNse5Fo6n4B5u4JXAfAXsWqWqZcOMz3f5huf9FPnwInrD1f0XSztIFAd7oInBU8gaqC9cM2lDW3uhquvwVGCA+XzVlEd/LMs4X7DgzDFeHyLj1chuIFwJiXLVTppc/8VvmH8G9ZxfOMG3AdxuExPU7+mFv4/k0cUYSzVGrtn6zDBO06uYTA//WxUUb5H7WWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Github UI new runner page&quot;
        title=&quot;Github UI new runner page&quot;
        src=&quot;/static/2ce4f9f3ed4833b2ac68987675b5d91b/1d69c/github-new-runner.png&quot;
        srcset=&quot;/static/2ce4f9f3ed4833b2ac68987675b5d91b/4dcb9/github-new-runner.png 188w,
/static/2ce4f9f3ed4833b2ac68987675b5d91b/5ff7e/github-new-runner.png 375w,
/static/2ce4f9f3ed4833b2ac68987675b5d91b/1d69c/github-new-runner.png 750w,
/static/2ce4f9f3ed4833b2ac68987675b5d91b/78797/github-new-runner.png 1125w,
/static/2ce4f9f3ed4833b2ac68987675b5d91b/aa440/github-new-runner.png 1500w,
/static/2ce4f9f3ed4833b2ac68987675b5d91b/95be1/github-new-runner.png 2574w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Copy the token from the &lt;strong&gt;Configure&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;./config.sh &lt;span class=&quot;token parameter variable&quot;&gt;--url&lt;/span&gt; https://github.com/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;entity&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;repo&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--token&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;registration token&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are using the token in the next step.&lt;/p&gt;
&lt;h2 id=&quot;step-4-start-a-runner-container&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-4-start-a-runner-container&quot; aria-label=&quot;step 4 start a runner container permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 4: Start a runner container&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--gpus&lt;/span&gt; all &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt; nvidia &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$GITHUB_TOKEN&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${RUNNER_LABELS&lt;span class=&quot;token operator&quot;&gt;:+&lt;/span&gt; -e RUNNER_LABELS=$RUNNER_LABELS}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
my-nano-runner:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--gpus all&lt;/code&gt; flag: Shares all host GPUs with the container. This option enables the container to access and utilize the computational power of &lt;strong&gt;all available GPUs&lt;/strong&gt; on the host machine.&lt;br&gt;
&lt;code class=&quot;language-text&quot;&gt;--runtime nvidia&lt;/code&gt; flag: Specifies the NVIDIA Container Runtime as the runtime for the container. This ensures that the container can effectively utilize NVIDIA GPUs and access related NVIDIA software, such as CUDA and cuDNN. The flag can be omitted if the runtime is already configured in the docker config file.&lt;/p&gt;
&lt;p&gt;See &lt;code class=&quot;language-text&quot;&gt;https://github.com/&amp;lt;entity&gt;/&amp;lt;repo&gt;/settings/actions/runners&lt;/code&gt; to check the status of the runner. At this point, the runner should be idle and ready to execute workflows triggered by GitHub Actions.&lt;br&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a16aadee1c2572b6cc0f84026996df58/4b701/idle-runner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.702127659574465%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABEklEQVR42n2R226DMBBE+ZU0YGzwBV8wl4aEpIpU9f//Z6pdBG3z0IeRd63V7PG4MHFG1y9wpHSBH26QJuEkNN5qi5MwfO711pujflVh0wVhXKH9BB1mUN90I6TNUG74VzRnI80PrFonFI0bkC9PpPmBON2ZME0rdLpC5i/U4Y7Wj9BhOoyop4Vn6dDGEbVJKFWHUnkU0vTo8sKK0wqb3iHcgoqke9Smh2gjqjawhI5stEcgdGCzPZpC2p6fvBE+oNMNVbdCdFc2U7ZnAnoOzRLAnilJusRkVNMiNiSzYXnCjR+Q+ZPppIlQLjMdmZEp5VQ14aChU9kMio1qNvz5uW3DmTebPxS/f/n1rmw8qsYf/TcFZdbG9cvq6gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Idle self hosted runner&quot;
        title=&quot;Idle self hosted runner&quot;
        src=&quot;/static/a16aadee1c2572b6cc0f84026996df58/1d69c/idle-runner.png&quot;
        srcset=&quot;/static/a16aadee1c2572b6cc0f84026996df58/4dcb9/idle-runner.png 188w,
/static/a16aadee1c2572b6cc0f84026996df58/5ff7e/idle-runner.png 375w,
/static/a16aadee1c2572b6cc0f84026996df58/1d69c/idle-runner.png 750w,
/static/a16aadee1c2572b6cc0f84026996df58/78797/idle-runner.png 1125w,
/static/a16aadee1c2572b6cc0f84026996df58/aa440/idle-runner.png 1500w,
/static/a16aadee1c2572b6cc0f84026996df58/4b701/idle-runner.png 1587w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;step-5-use-our-runner-in-a-workflow&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-5-use-our-runner-in-a-workflow&quot; aria-label=&quot;step 5 use our runner in a workflow permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 5: Use our runner in a workflow&lt;/h2&gt;
&lt;p&gt;Apply the runner label defined in the previous steps to use our new self-hosted runner in a workflow.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;job-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;hosted&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;jetson&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;common-problems&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#common-problems&quot; aria-label=&quot;common problems permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Common problems&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Updating runners&lt;/strong&gt;&lt;br&gt;
By default, GitHub runners are self-updating which takes them offline during the process. There is a &lt;code class=&quot;language-text&quot;&gt;--disableupdate&lt;/code&gt; flag that can be used to &lt;strong&gt;disable the updates&lt;/strong&gt; but in this case the runner should be updated &lt;a href=&quot;https://github.blog/changelog/2022-02-01-github-actions-self-hosted-runners-can-now-disable-automatic-updates/#:~:text=If%20you%20specify%20the%20%2D%2D,runner%20is%20in%20a%20container&quot;&gt;manually within 30 days&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not enough space on the host&lt;/strong&gt;&lt;br&gt;
You may need to expand the Nano storage with a USB card and change the default Docker storage directory if there is not enough space available on the root storage. For example, this is usually the case with carrier boards that use eMMC storage. On these, the eMMC storage is 16GB and installing NVIDIA JetPack 4.6.3 consumes 11.6 GB of it. You can check out &lt;a href=&quot;https://developer.nvidia.com/blog/minimizing-storage-usage-on-jetson/&quot;&gt;this article&lt;/a&gt; for minimizing storage usage on Jetson.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessing the Nano L4T image may require authentication with Docker using your NVIDIA Developer account.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The different versions of Jetpack and Ubuntu will have their own quirks. Be prepared to dig through the Nvidia forums when the path is not smooth&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This guide provided a &lt;strong&gt;basic setup&lt;/strong&gt; for using the Jetson Nano as a self-hosted runner. For more advanced scenarios, you can explore options such as using &lt;strong&gt;orchestration tools&lt;/strong&gt; to provision runner containers &lt;strong&gt;on-demand&lt;/strong&gt; or using Ansible to provision different hosts with specific configurations.&lt;/p&gt;
&lt;p&gt;Stay tuned to our blog for these exciting follow-up articles! By delving into these advanced scenarios, you&apos;ll unlock the full potential of the Jetson Nano as a self-hosted runner and take your GitHub Actions workflows to new heights.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Migrating from Bootstrap to Tailwind CSS (part 2)]]></title><description><![CDATA[In the previous article, we got familiar with the business case behind the migration from Bootstrap to Tailwind CSS, the two libraries and…]]></description><link>https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/</link><guid isPermaLink="false">https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-2/</guid><pubDate>Tue, 28 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-1/&quot;&gt;previous article&lt;/a&gt;, we got familiar with the business case behind the migration from Bootstrap to Tailwind CSS, the two libraries and the difference between them. I also shared my personal opinion of using the two technologies.&lt;/p&gt;
&lt;p&gt;In this article, I will discuss the pros and cons of the architectural strategies we considered during the migration.&lt;/p&gt;
&lt;h2 id=&quot;starting-point&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#starting-point&quot; aria-label=&quot;starting point permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Starting point&lt;/h2&gt;
&lt;p&gt;Prior to the migration, we had a single-page app (SPA) created with Create React App (CRA) and the following packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React 16&lt;/li&gt;
&lt;li&gt;Bootstrap 4, React-Bootstrap&lt;/li&gt;
&lt;li&gt;Classnames, Polished, Emotion (styled-components)&lt;/li&gt;
&lt;li&gt;React-Query, Axios&lt;/li&gt;
&lt;li&gt;Jest, React-Testing-Library, MSW&lt;/li&gt;
&lt;li&gt;Formik&lt;/li&gt;
&lt;li&gt;and others&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;To get the most out of this article, you need to be familiar with these technologies.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;research-phase&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#research-phase&quot; aria-label=&quot;research phase permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Research phase&lt;/h2&gt;
&lt;p&gt;After some ideation, we came up with &lt;strong&gt;four&lt;/strong&gt; strategies/options to migrate from Bootstrap to Tailwind CSS. We evaluated each by listing the positive and negative sides and creating a quick SPIKE to have a broader view of the potential pitfalls. This way, we can make the most informed decision.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Look before you leap.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c3a925576032d5c81402efa467f920e4/859c3/compass-unsplash.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.5531914893617%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAEbM9o0NQv/xAAbEAACAgMBAAAAAAAAAAAAAAABAwACBBESIv/aAAgBAQABBQJTyIxp53MWnTnjdbeZ/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BCf/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/AWf/xAAbEAADAAIDAAAAAAAAAAAAAAAAAREQITFRYf/aAAgBAQAGPwLfUJwlhebHCH//xAAZEAADAQEBAAAAAAAAAAAAAAAAAREhMVH/2gAIAQEAAT8hirSwGMJB6IFwKLluO+lOouH/2gAMAwEAAgADAAAAEOcP/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEh/9oACAEDAQE/EMKj/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREA/9oACAECAQE/EGyaO//EABwQAQACAwADAAAAAAAAAAAAAAEAESExUUHh8f/aAAgBAQABPxB41VAx9lZPQJlvsI8GHtQq869zTqjKtqxwhVhVbGf/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;compass unsplash&quot;
        title=&quot;compass unsplash&quot;
        src=&quot;/static/c3a925576032d5c81402efa467f920e4/acb04/compass-unsplash.jpg&quot;
        srcset=&quot;/static/c3a925576032d5c81402efa467f920e4/bc01b/compass-unsplash.jpg 188w,
/static/c3a925576032d5c81402efa467f920e4/bf173/compass-unsplash.jpg 375w,
/static/c3a925576032d5c81402efa467f920e4/acb04/compass-unsplash.jpg 750w,
/static/c3a925576032d5c81402efa467f920e4/ec605/compass-unsplash.jpg 1125w,
/static/c3a925576032d5c81402efa467f920e4/c58a3/compass-unsplash.jpg 1500w,
/static/c3a925576032d5c81402efa467f920e4/859c3/compass-unsplash.jpg 5124w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;strategy-1-complete-rewrite-of-the-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strategy-1-complete-rewrite-of-the-app&quot; aria-label=&quot;strategy 1 complete rewrite of the app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strategy 1: Complete rewrite of the app&lt;/h3&gt;
&lt;p&gt;from Bootstrap to Tailwind CSS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros (➕):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nice, sweet, and clean&lt;/strong&gt; - We won&apos;t have any dirty stuff and workarounds by rebuilding the project from scratch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons (➖):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;time &amp;#x26; $$$&lt;/strong&gt; - It will cost a lot of time and money to rebuild the project using the new UI library.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;no value for the end customers&lt;/strong&gt; - For some time, we won’t be able to implement new features and deliver any customer value.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;strategy-2-update-bootstraps-variables-and-theme&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strategy-2-update-bootstraps-variables-and-theme&quot; aria-label=&quot;strategy 2 update bootstraps variables and theme permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strategy 2: Update Bootstrap’s variables and theme&lt;/h3&gt;
&lt;p&gt;so they resonate with Tailwind CSS’s default theme and continue developing new features with Tailwind CSS. For more info, check &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-1/#how-do-bootstrap-and-tailwind-compare-from-my-point-of-view&quot;&gt;this section&lt;/a&gt; in the previous &lt;a href=&quot;https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-1/&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros (➕):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;customer value&lt;/strong&gt; - We can deliver customer value and features while integrating and using the two frameworks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;save time and $$$&lt;/strong&gt; &lt;em&gt;(maybe)&lt;/em&gt; - Instead of completely rewriting the app, we can integrate and use both libraries incrementally. We will waste considerable time and money if we have the bugs mentioned in the cons section.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons (➖):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;class and style mismatches&lt;/strong&gt; - We might end up having classes with the same names from the two libraries leading to unexpected styles in the end and making it hard to debug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hard to update the theme&lt;/strong&gt; - There are just too many things to cover and there’s always the risk of missing something.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;big risk for potential issues&lt;/strong&gt; - The risk for future problems and hard debugging is enormous.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hard to replace Bootstrap later&lt;/strong&gt; - By mixing both libraries in our components and pages, it will become complicated to remove Bootstrap after that because everything will be coupled → spaghetti code 🍝.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;strategy-3-create-a-component-library&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strategy-3-create-a-component-library&quot; aria-label=&quot;strategy 3 create a component library permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strategy 3: Create a Component Library&lt;/h3&gt;
&lt;p&gt;based on our Design Language System (DLS) with Tailwind CSS and use it throughout the different client projects, starting from the current one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros (➕):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design Language System ready to be used throughout the different projects and products&lt;/strong&gt; - Having a DLS will be a huge benefit, so we can have the same look and feel throughout the different customer product lines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nice, sweet and clean&lt;/strong&gt; - We will have clean code. Everything will be decoupled and properly configured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons (➖):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;time and $$$ to develop and integrate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;no value for the end customers&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;strategy-4-integrate-tailwind-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strategy-4-integrate-tailwind-css&quot; aria-label=&quot;strategy 4 integrate tailwind css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strategy 4: Integrate Tailwind CSS&lt;/h3&gt;
&lt;p&gt;and use it on top of Bootstrap. As part of this strategy we decided to look for opportunities to extract reusable atomic React components styled with Tailwind CSS and prepare for the DLS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros (➕):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;customer value&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;save time and $$$&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;remove Bootstrap later&lt;/strong&gt; - By rightly integrating Tailwind CSS, we can lay the foundations for later removing Bootstrap with ease.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons (➖):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;class and style mismatches&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;messy and ugly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;anti-pattern&lt;/strong&gt; - That’s an &lt;a href=&quot;https://en.wikipedia.org/wiki/Anti-pattern&quot;&gt;anti-pattern&lt;/a&gt; because we will be using two completely different libraries for the same thing (styling) in the same project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end, we decided to go with &lt;strong&gt;Strategy 4.&lt;/strong&gt; We can start using Tailwind CSS, update the pages step by step, and simultaneously deliver new features to the end customers, so we don’t stop providing customer value.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 625px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4b3245bea5343282e3fb8a153bb01162/dfe3c/what-could-possibly-go-wrong.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAwAC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgME/9oADAMBAAIQAxAAAAEU0iAW62f/xAAYEAEBAQEBAAAAAAAAAAAAAAABAgAREP/aAAgBAQABBQIapSxR3BzyvP/EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiL/2gAIAQMBAT8BHi03/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARIv/aAAgBAgEBPwFOrC//xAAcEAACAQUBAAAAAAAAAAAAAAAAAZEQMTJBoUL/2gAIAQEABj8CSSUHmDUF+GfKf//EABoQAQADAQEBAAAAAAAAAAAAAAEAETEhUXH/2gAIAQEAAT8htsXOC4evfkJdlsSfbTgegwiyf//aAAwDAQACAAMAAAAQSC//xAAYEQACAwAAAAAAAAAAAAAAAAAAEQExYf/aAAgBAwEBPxBrRZuf/8QAFREBAQAAAAAAAAAAAAAAAAAAEIH/2gAIAQIBAT8QgL//xAAdEAEAAwABBQAAAAAAAAAAAAABABEhQTFRcYGh/9oACAEBAAE/ELYwqwOGsqwgbRm6UmMsVHgkDhMaRMd/rEgkSWN9xsabOGus/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;what could possibly go wrong&quot;
        title=&quot;what could possibly go wrong&quot;
        src=&quot;/static/4b3245bea5343282e3fb8a153bb01162/dfe3c/what-could-possibly-go-wrong.jpg&quot;
        srcset=&quot;/static/4b3245bea5343282e3fb8a153bb01162/bc01b/what-could-possibly-go-wrong.jpg 188w,
/static/4b3245bea5343282e3fb8a153bb01162/bf173/what-could-possibly-go-wrong.jpg 375w,
/static/4b3245bea5343282e3fb8a153bb01162/dfe3c/what-could-possibly-go-wrong.jpg 625w&quot;
        sizes=&quot;(max-width: 625px) 100vw, 625px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-enablers&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-enablers&quot; aria-label=&quot;the enablers permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The enablers&lt;/h2&gt;
&lt;p&gt;Going through an extensive exploration phase, we found two &lt;strong&gt;enablers&lt;/strong&gt; for implementing &lt;strong&gt;Strategy 4&lt;/strong&gt;. These are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Tailwind CSS’s &lt;a href=&quot;https://tailwindcss.com/docs/configuration#prefix&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prefix&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://tailwindcss.com/docs/preflight&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;preflight&lt;/code&gt;&lt;/a&gt; configurations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We can add a custom prefix to all Tailwind CSS classes, so we don’t have any collisions with the Bootstrap ones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disable the default styling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ben-rogerson/twin.macro&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;twin.macro&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can use CSS classes with our styled-components.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because of them, we managed to create the component below:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; StyledBadge &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;styled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;span&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;tw&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;ms-px-2 ms-text-amber-300 ...&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Badge&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StyledBadge&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      ...
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StyledBadge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more on the implementation, see part 3 of the series.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;To summarize, before tackling a problem or proceeding with an architectural decision, it’s a good practice to &lt;strong&gt;spend some time planning, researching and developing in a time-boxed manner.&lt;/strong&gt; This way, the chances of getting the most suitable decision for your case increase.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 There’s no silver bullet for every problem or situation. That’s why good exploration sets the path to success. In the end, it’s all about tradeoffs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Stay tuned for the next article in the series, where I will go through the execution part of the chosen strategy, how we leveraged the &lt;strong&gt;enablers&lt;/strong&gt; and some anti-patterns we went through.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Migrating from Bootstrap to Tailwind CSS (part 1)]]></title><description><![CDATA[In this article, I will set the stage for the entire series. I will go over WHY we migrated from Bootstrap to Tailwind CSS, and share my…]]></description><link>https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-1/</link><guid isPermaLink="false">https://st6.io/blog/migrating-from-bootstrap-to-tailwind-part-1/</guid><pubDate>Tue, 18 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this article, I will set the stage for the entire series. I will go over &lt;strong&gt;WHY&lt;/strong&gt; we migrated from Bootstrap to Tailwind CSS, and share my thoughts on the pros and cons of the two technologies.&lt;/p&gt;
&lt;h2 id=&quot;why-did-we-have-to-migrate-from-bootstrap-to-tailwind-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-we-have-to-migrate-from-bootstrap-to-tailwind-css&quot; aria-label=&quot;why did we have to migrate from bootstrap to tailwind css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did we have to migrate from Bootstrap to Tailwind CSS?&lt;/h2&gt;
&lt;p&gt;In a nutshell, our customer wanted to introduce a fresher look and feel to their website to meet their business needs. They decided to start with the basics and engaged another agency to craft a new &lt;a href=&quot;https://uxdesign.cc/everything-you-need-to-know-about-design-systems-54b109851969&quot;&gt;design system&lt;/a&gt;, which would lay at the heart of the update. The agency chose to work with Tailwind CSS and its &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss/blob/master/stubs/config.full.js&quot;&gt;default theme&lt;/a&gt;. This required us to migrate from Bootstrap to Tailwind CSS.&lt;/p&gt;
&lt;p&gt;The following two screenshots are from the customer’s design system.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 672px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b27d99aa275cf814fa94986398b027d0/30d16/new-dls-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.78723404255319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC1UlEQVR42q2N3U9TdwBAfw/TBx98802f9qJGTVziWOLbZjTBr7CYZRmyrSbgkkmU+UGEZZigjKpbJ4GMUupKC3HjQ1FZsAGxGIo01FK0YlcQ0xawXLhtV/p1b297FvwbdpLzeo4oFArk8/n3FvJ5FDVHKq0ABdzTMS5e9fH8ZYJQMIxOV0NHxz2SyRQVFZeorm4gm1WoqbnK8eNlLC6+Q2iaxnp0HVVVSaYV1lIqWl6lVj/D7gNPuNYcwvCrmY0bdnHgMx02Wx9CbGXz5h10dvayadM2hBC0tJgRuZxGNpt9f1IUhWQqQ/zfFJqm8swtUVXnZcIjMzf7hpMnL2IydROLxTilq+L8D1dYS6xx4cJPFBd/STAYRvA/IzIZhcBcGP9ciFg8QXwpQXhOJiqnSS7LxN8GUWUJSZLx+4MEQ1FySZm85KWwMk1mLUpgPsRM4A1yLI545V9g/5F69n5RS8/fT7GdGaD0EzPtt71M6tsYLDlB1KbHYLCwZ883fHu6mxWniYJBQPMH+J5Y+fhoOR/uO4S15wFiZlamuNLOwcZ++p0emkp7ObzXyK02N5P1vzF07CBxy4/oG81s367jq1N9LDtugV6AQeC1G9nxaSlbdu7H1NmLkOQsXSMRuqaC/LMYYezOC/5ommDMtcCCw4HfYiThGsLhcHP9+p90/fWclcAkkr0OebiekN9DU1s3DTfbcHt8iLCkcuV+krqJCN7wKrPNUW5XRRl+rFEYsSLXNpK+68FmHeLzkkau/fyIoWca3zXA9zfAOZ7g98t26ssfMjkyjwgsKJRZE3ztmMcxG2K0MkL1kRVsd3NoFj2RE+eIG8e5+ctDPioycPayi77BFEdP5ymphIGBJc6XWCgtasXePY1YjinYXDE6XwcJRCR8Pav0tq/iepEl4xzmXXs/Uedbno4FaGp188C+xNSrNMY7aUw9WXy+KPfM43QYRnk9FeY/YOy7nWbjqg0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;new dls 1&quot;
        title=&quot;new dls 1&quot;
        src=&quot;/static/b27d99aa275cf814fa94986398b027d0/30d16/new-dls-1.png&quot;
        srcset=&quot;/static/b27d99aa275cf814fa94986398b027d0/4dcb9/new-dls-1.png 188w,
/static/b27d99aa275cf814fa94986398b027d0/5ff7e/new-dls-1.png 375w,
/static/b27d99aa275cf814fa94986398b027d0/30d16/new-dls-1.png 672w&quot;
        sizes=&quot;(max-width: 672px) 100vw, 672px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;The color palette.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 672px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0454cc40e5abcb9dd96c19d95464a3af/30d16/new-dls-2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 111.17021276595744%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAABYlAAAWJQFJUiTwAAAE00lEQVR42k2U+28cVxXH54/jIbW0An7iBypK37FQVVVtEVWRCC3QgiBIQGJCpaS1syFtnIcT2a6SNDFN0tiWH2tnkzjdtXfn3rlz59557Mzsw5uk/qC521B+ODpX5zvf73nonPGiKEbphJ22ItQpxiRIKZFSIIIYEWRsNxVSZYggRThMEuqIOCnQUYqNi294As/YhLZv2Gy06EiLjTNHEEIQqJSOsKxvNfFlTBB2EWIsqLXBxiVBmGAqQZuNBcNQUxQlg/7Aea0jRwgCScfXSNXDxkOCsHSJg8cVhiFZlpFlXWdRNOZ5ZVmQ5QXNXZ+87DHo9111Qviupbzo0dzdpT/ok2V9fF84vBLb39+nPxjy9f4+g8EA3/fxrDUuQ9V61u2SJPabGUpkYPCDnFY7QajCzfQxZqKIoigct/JJEo9bXrhm+fWhIX86OuCdvww5PZcQ6YoguXg55s339/jdP4a88Yc9Pp7J0KEkVJJ6I+TsQsLc5zFn5hOuL0doLfFOzRc89x786jD8/F04+ukAGwmsEdQulvzsILx9BJ49CH+dHqFD4URX6oapCwPOXekzdWHIpespkRZ4u+t3qE9fYmP6MvWpS7SWNglC5ay13GBlcp7lyQVWDs+x/fnaGAsC2s0dtm6ss3l9nc0v1mk27qOUwtMfHqP4/tOUz79M/r0fEH3wZ2RskUlCVGHfeYLypQmK7z6JPfh7pDEorWneuEn98CT3Tp6kfmSSO7MXUMbgBVcXCT84RPi3o4TvHyK4uECgNTKKUFeuoX/7R6JDh50PZ2aRWhMoxe7tBnfnPmP7ylXnm0srLpFXfSCsQZho7CM93sPKdIg0GqkVQRXXodtPh6lqLCHy/7zbQ6VCIm2+tcii1FjUFyFSxt9akOCLMaYChdbWXYz+Hy/Ei0xCNx/x1Y6i3tghjHKsTd2S+iIlyUbcb2nWNncQKkeq3GGVQDffw8QlKuqSZAOMTfFUqN1DRzGhtlQJqli1pB2h8WVGR1T3HtMRKb6IHOY6MwmRial+MI95XpwkjEYPSdLcBfv9IUmSInwfFSYUvYeYuKqs6mRIqDNXYRzHPHjwkMFgSK8/YDR6QJpmeEWeAA/p9WJsHMB+n7LI6HQ6LsH+/iOyboIIJMO9HnHSpd3ukKUV7xGPHu0xGvWdRlF08eqNiNlLXeav5SwsFly4nFO/rd21rGxEnDifc3quYGa+R2224NaqcafZbClWNiyrm5a1Teve280Qb/pclydfgWffhpd/A09NwNTZLoOyw/GZgicOwHPvwMS78PQvYLJWkqc+X64a/j5VcnympDZbcqTW4+pNi7e0bjh2OufEuYyTsxnHzxRUsdgKbixHTH6UcexEzEcnY/75cZfFLy0mEtz7KmTxluX6suHGiuE/S5bGPY1nz5+nP3GA3i/fovfWm/QmDhCtLCGKAnvmLOXzL1K8/gb5a69TvPQKZvEaQZrSXlvlbm2K+2dn2D5zmrv/ruE3buMFtU/RP/wp0QuvYl58jfBHzyC/uInsl4TTpzBP/QT7wqvOzI+fQS1cRnUzmreWWT3yL7ZOnGKr9glrHx5nZ6OOJ9ttZOPO2G43kHfvEfj++KRaO6j1Omp9A7W2gapvEbQ7BCpAVovf2sFvtug0m+4theC/lLIM9JSnXHwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;new dls 2&quot;
        title=&quot;new dls 2&quot;
        src=&quot;/static/0454cc40e5abcb9dd96c19d95464a3af/30d16/new-dls-2.png&quot;
        srcset=&quot;/static/0454cc40e5abcb9dd96c19d95464a3af/4dcb9/new-dls-2.png 188w,
/static/0454cc40e5abcb9dd96c19d95464a3af/5ff7e/new-dls-2.png 375w,
/static/0454cc40e5abcb9dd96c19d95464a3af/30d16/new-dls-2.png 672w&quot;
        sizes=&quot;(max-width: 672px) 100vw, 672px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;The button component with its different states.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-do-bootstrap-and-tailwind-compare-from-my-point-of-view&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-do-bootstrap-and-tailwind-compare-from-my-point-of-view&quot; aria-label=&quot;how do bootstrap and tailwind compare from my point of view permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do Bootstrap and Tailwind compare from my point of view?&lt;/h2&gt;
&lt;p&gt;Let&apos;s begin by saying a few words about the two technologies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;&lt;/strong&gt; is a giant collection of handy, reusable bits of HTML, CSS, and JavaScript code. Currently, that’s the most popular frontend toolkit for developing responsive, mobile-first projects on the web.&lt;/p&gt;
&lt;p&gt;After you install Bootstrap in your project, you can start using a bunch of variables, mixins, etc., in your components.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 671px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5f22126a74869eadc1169bac532f9fcb/d0e73/bootstrap-files.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 130.85106382978722%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAESklEQVR42m1V15LbOBDUv9xJKzEiZ5BgkOSVN5T3wv//SV8B1Mo+2w9TFAVUs2emp2fXc48cDbFoqUVDDHpm0DGPtNyQ1q8gYoBSHs4EGB3Q9BanVuPU/Rq7jjmYeIbyC6SdoP0C7WYoN4OICBPOcOMVyoxIIsBzh4F7JBlRdwpPNcfxh9h11BYgYRK4HiHsBK4ihB7K/3b8gjGsSHrERQ8Q1KLvFCgxeGoE9jXHIUe1PXctC6gy3ZxCo3BsFE6tQk0MiIyFuQ5naJtgXETPLUgG7HUJ0mv0vQJhGn1O2ahnCLaA2gA1jtBjQkMdnmoJpgbE6YYw3eCHKwadsLgBSYaSMiMGXafQ9Qo9VWg7hd3V/4Ok32CmiPPHGeNtQdUrHCqGXgRovxaWws2wNkBIg6qXJdV9xfFnxfDniZXfuZ67ZN7gxBfIGBAuE+pel4MMyPSIdHlDGC4Y/ILJT7DCYnYB0fmSJqEKjGs0vdxqeHZ/YZAvUGPAcJvRUrMB1gycjxjsC4xYIdwVwj3DuQWzCJhUwKQDRhMwao8oAwx12E3mHV48Qw4B6WVFy74DEhqh2AJGEyo1ozLnogBFDSSxUMSCU4NjI1E3AnUrsZvtO4J8hp4i4nXCqZUFMEdHPJRYwHgC0zMEk2hagT8qttXwXsfP+yXl1X0gyq+wy4D57c6w4jjmL3YabrjCxQvm3GW/IpgAynMWotz5OUrKmaFKEellAVGuiLQA9lmXvAj4KTNvZHmvWnEH3O6VafkEvPi/kdQb9DRg/ThjuN1Baw5CDKhNqJnD4cQeqf0cP4LuRv1aZKPGiPg8wa0JzPrCqus1gh+h7YieGpza36f5P4a5hoN6KSlPrwvm9xXxOm+d61URtR2uMH6BynNPTHnmDjvmwKkt2Xyy3SXzyTDALQlEWxBl701R5fL+PvjHVv6WYVbG6X72EHaWTRb2qZHYH9ldNgZaB4SQQGVAxwOa7JnUomWuRLa/nocyptlLH8LOgLnLdhlLU/YVA6UWelgg0grKLeqKoqoZTrVA1Wzxc4N2i/1WdOjWEeu3M9w5oZe2aDHXMA6v8PEV3l0R4g1xuOHiI5IO4MT8UoYHYBb2+eMC4QNO3TYtTa9Q1RKnShQ727cah07j2HIcms1pfmG4CfsGNQSMtxnc+YcUcg2JjmhVQOsXMDuASActDLy24EyV+a3uc3x6NEVtTUmvK0TIDr4xrDpV0qJ5gQkHLwNU3kHMQWaDoKac59B5NfQ6C/sFTlzBvYe/JKghomWbJ1atBBUerR1REYXDkeBwoqVhOd0sp/3dKPL73Q83c8gMl/dzMYc8Zp/6UjwgmhmCR9R8QC1nUBEg7vuE3SMLvifqU9jXsgKybKj+bg7HNo+fBREJHY+oqEfFYqlt3nx5h3T3yOB1J7H74v/FpN9h5s0c7JQegJlhvsT1CqkWtCyi4gMamYqxkm5jl8FE+YjGf97dS9CRCMrJAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;bootstrap files&quot;
        title=&quot;bootstrap files&quot;
        src=&quot;/static/5f22126a74869eadc1169bac532f9fcb/d0e73/bootstrap-files.png&quot;
        srcset=&quot;/static/5f22126a74869eadc1169bac532f9fcb/4dcb9/bootstrap-files.png 188w,
/static/5f22126a74869eadc1169bac532f9fcb/5ff7e/bootstrap-files.png 375w,
/static/5f22126a74869eadc1169bac532f9fcb/d0e73/bootstrap-files.png 671w&quot;
        sizes=&quot;(max-width: 671px) 100vw, 671px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;On the left side, you can see the different files that come with Bootstrap, and on the right, an example of the Bootstrap&apos;s &lt;code class=&quot;language-text&quot;&gt;button&lt;/code&gt; class and what it includes.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Okay, but what about Tailwind CSS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt;&lt;/strong&gt; is a bunch of many single-purpose classes and functions where each does basically only one thing. That way, the framework lets you build highly customizable user interfaces with less fuss than some of the other solutions out there. It gives you many utility functions and classes you need to develop great designs without any opinionated styles.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/596ec0afb278abdbe480d6ba5f5a4e09/bb33f/tailwind-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.93617021276595%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACFklEQVR42k3SS2/aQBiFYS9LKgEB7PEN3y9jG7DBGJtLEhUSqW22USp13fz/n/BWOFXF4tnM4sz5vhnlTkgGdsnAbxlER77GJ4bhgYnTMDMrhF4grBUzPWeiSe6FZCwkI5Ex1osbOWORoajuGi1sUKMOkR7R0hO6PGEmR2yvxbVqNJHjmBWh32CGO0TQIMIWEe5Q/S2at+3P9KhDmacH3PyReHHg4+MP3eMrZtThZif88Ih09ljmCstYkgUdftAinA3qvOLeKBhpkpGaMvxHsZIOW55wZYvMV6TVI1Z6ZC6PRP6BpXvAtdeYYkES7KjKM0l2Ikj3hPkJN26wgxrL3/QUr3hguX8lb74TVRei8oyTn7g2j50dpdPhW2vm+orU25HHe0J/i+uusZ0SzVwwNQqmRt5T5OaZh++/ac9vHF5+sX9+p7u8E5Xf8PQVhVnjWRWuUVJ518Z7AnfL3Kkx7DVTVTKaJQx7MUpSXdid31i0P5H1S6/Y/SBYPqGrGb62wL7uUCzI3JZSPiGjI45ZYhpLVPH5+mM17XepxDeBUXnpd2fLYz/yTEsQsxTdWCBEQeI2JF5DYK0J7DW2sUTTcqZa9hk4S1CEv8FOWuy4xYpbhF+jBzXC2zCahkymIape9E2ugXnQETp1b26u+sDZbeBg7PFl5PYGV2Pvv7t7j+HE7z+zaa4I7A26KNBF3ru2vl40vRn5L2Q+Hovqs/41AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tailwind 1&quot;
        title=&quot;tailwind 1&quot;
        src=&quot;/static/596ec0afb278abdbe480d6ba5f5a4e09/1d69c/tailwind-1.png&quot;
        srcset=&quot;/static/596ec0afb278abdbe480d6ba5f5a4e09/4dcb9/tailwind-1.png 188w,
/static/596ec0afb278abdbe480d6ba5f5a4e09/5ff7e/tailwind-1.png 375w,
/static/596ec0afb278abdbe480d6ba5f5a4e09/1d69c/tailwind-1.png 750w,
/static/596ec0afb278abdbe480d6ba5f5a4e09/78797/tailwind-1.png 1125w,
/static/596ec0afb278abdbe480d6ba5f5a4e09/aa440/tailwind-1.png 1500w,
/static/596ec0afb278abdbe480d6ba5f5a4e09/bb33f/tailwind-1.png 2208w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;That’s a screenshot from the official Tailwind CSS website. You can see on the right what type of code and classes you must apply to have the user interface on the left. I think you sense it.&lt;/p&gt;
&lt;p&gt;Then, which one should a developer choose? Well, it depends. 🤷‍♂️&lt;/p&gt;
&lt;p&gt;After spending some time with both technologies, here’s my &lt;strong&gt;personal opinion&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bootstrap’s strongest sides are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI components that you could easily use&lt;/li&gt;
&lt;li&gt;Out-of-the-box responsiveness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can quickly create user interfaces that look good and are responsive, so in the end, the pages you create look okay on smaller devices like tablets, mobile phones, etc.&lt;/p&gt;
&lt;p&gt;Tailwind CSS’s strongest sides are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Highly customizable: you can combine different &lt;a href=&quot;https://designsystem.digital.gov/utilities&quot;&gt;utility classes&lt;/a&gt; and create custom UI components.&lt;/li&gt;
&lt;li&gt;You can easily create a &lt;a href=&quot;https://uxplanet.org/design-language-system-d438f4aa30e0&quot;&gt;Design Language System (DLS)&lt;/a&gt; tailored to your business, projects, brand, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Having said all that, these two UI frameworks have different ideologies and solve different problems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With Bootstrap, you can easily and quickly develop standard-looking user interfaces because you have many components out-of-the-box ready to use. However, customization is another (and more difficult) matter altogether.&lt;/p&gt;
&lt;p&gt;On the other hand, working with Tailwind CSS is difficult initially because you have to manually create your own reusable UI components. There are a lot of utility classes that you can go through and combine. At the same time, you have the flexibility to create and customize whatever you want.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;To summarize, I will go with Bootstrap when I want to &lt;strong&gt;quickly&lt;/strong&gt; create basic pages, Minimum Viable Products, etc. I will choose Tailwind CSS when I want to create a separate UI library and design language system for &lt;strong&gt;a consistent brand experience&lt;/strong&gt; throughout projects and products.&lt;/p&gt;
&lt;p&gt;Stay tuned for the next article in the series, where I will discuss the pros and cons of the architectural strategies we considered during the migration.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Weekly Knowledge Sharing - What You Need to Know]]></title><description><![CDATA[There is more to being part of ST6 than merely ‘’doing the job’’. It is instead being part of a society where culture truly matters and is…]]></description><link>https://st6.io/blog/weekly-knowledge-sharing/</link><guid isPermaLink="false">https://st6.io/blog/weekly-knowledge-sharing/</guid><pubDate>Fri, 22 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;There is more to being part of ST6 than merely ‘’doing the job’’. It is instead being part of a society where culture truly matters and is one of the fundamental pillars on which everything is based. To make our culture thrive, we have established several ‘’traditions’’. One fragment of the latter is our weekly knowledge-sharing sessions.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;knowledge-is-power&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#knowledge-is-power&quot; aria-label=&quot;knowledge is power permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Knowledge is power&lt;/h2&gt;
&lt;p&gt;The influence of knowledge is undoubtedly immense. From improving brain function through critical thinking to simply sharpening your skills, knowledge has proved to be essential in human development. At ST6, we believe that knowledge is power, as the old adage goes. Hence, why we are so devoted to implementing various knowledge sharing initiatives in the workplace. One of these happens to be the weekly knowledge sharing sessions. We see this as a positive asset to our culture as knowledge sharing has proven to be quite efficient in enhancing the collective ability of the entire team to understand different concepts better. Essentially, these initiatives are also helping us to improve our internal communication and create an even stronger bond with each other. We are delighted to share more insight for our weekly knowledge sharing sessions.&lt;/p&gt;
&lt;h2 id=&quot;weekly-knowledge-sharing-sessions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#weekly-knowledge-sharing-sessions&quot; aria-label=&quot;weekly knowledge sharing sessions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Weekly knowledge sharing sessions&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b1173a1984b2811802768905f81b3fc1/d2602/st6-watching.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUBAgQG/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAdkqax0InF//xAAbEAACAwADAAAAAAAAAAAAAAABAgAREgMTMv/aAAgBAQABBQK6nZE8ktZchOPWP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAQACAwAAAAAAAAAAAAAAAAABITEyUf/aAAgBAQAGPwJxTZUyy//EABsQAQADAAMBAAAAAAAAAAAAAAEAESExYXGh/9oACAEBAAE/IV4Ps4VvaMTRAzZrW8gdvGREaJ//2gAMAwEAAgADAAAAEIjP/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EIx//8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Qh//EABwQAAIDAQADAAAAAAAAAAAAAAERACExgUGR8P/aAAgBAQABPxBzuGmfwjC1wsBfIEaODcKJd8eoQZNsoI3nPMGty0DP/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Weekly knowledge-sharing&quot;
        title=&quot;Weekly knowledge-sharing&quot;
        src=&quot;/static/b1173a1984b2811802768905f81b3fc1/acb04/st6-watching.jpg&quot;
        srcset=&quot;/static/b1173a1984b2811802768905f81b3fc1/bc01b/st6-watching.jpg 188w,
/static/b1173a1984b2811802768905f81b3fc1/bf173/st6-watching.jpg 375w,
/static/b1173a1984b2811802768905f81b3fc1/acb04/st6-watching.jpg 750w,
/static/b1173a1984b2811802768905f81b3fc1/ec605/st6-watching.jpg 1125w,
/static/b1173a1984b2811802768905f81b3fc1/c58a3/st6-watching.jpg 1500w,
/static/b1173a1984b2811802768905f81b3fc1/d2602/st6-watching.jpg 4032w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Every week at ST6 we have knowledge sharing sessions. These occasions are meant to gather the team together to present and discuss topics and ideas of different nature. The primary objective at the beginning was sharing technical knowledge, i.e., sharing a new technology experience, a tool that might be useful for work, or simply a crafting experience. However, with time the focus gradually shifted towards knowledge sharing in other areas. For instance, one of the novelties is the hot seat. Whoever has the ba… pardon, courage to step up gets the chance to present a bit more about themselves. They can talk about their background, life achievements, education, and overall development in the past years; in other words, they share a fragment of their lives with other ST6ers.&lt;/p&gt;
&lt;p&gt;Perhaps you now begin to understand that everything we do at ST6 comes with a meaning and a purpose. It is not just a 60-minute presentation. It is a way of sharing something that excites us and inspires us to grow as individuals and as an organization as a whole. Regular knowledge sharing sessions are great occasions for us to gather together and indulge in an open and honest discussion.&lt;/p&gt;
&lt;p&gt;Would you like to be the next weekly knowledge sharing presenter? Share your ideas for a knowledge sharing session in the comments below.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing Our NON-Q and Monthly Gatherings]]></title><description><![CDATA[Could it actually be any different than the traditional quarterly gatherings we are all used to? Yes, it certainly can, and it brings many…]]></description><link>https://st6.io/blog/non-q-gatherings/</link><guid isPermaLink="false">https://st6.io/blog/non-q-gatherings/</guid><pubDate>Mon, 11 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5e9361a94e05c1aa05f686ab623dc2fc/d2602/q-gathering.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAF9hrhiUr//xAAaEAACAwEBAAAAAAAAAAAAAAABAgADExES/9oACAEBAAEFAlrHjNTHRVYHpNIaZ2LP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BiP/EABsQAAMBAAMBAAAAAAAAAAAAAAABEQIhIjLB/9oACAEBAAY/AldLJ6pMrg7IuXGT6f/EABwQAAICAgMAAAAAAAAAAAAAAAABETEQIUFxkf/aAAgBAQABPyHberZTcc0mOKKQqRqfccrkJ6H/2gAMAwEAAgADAAAAEGwf/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EFLS/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EJTT/8QAHRABAAICAgMAAAAAAAAAAAAAAQARIVExQWGBkf/aAAgBAQABPxDBCFRG77gyjQGuZcyl8FBnrcp7B76HjUJWV4DJLDYx5APiT//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Q-Gatherings!&amp;quot;&quot;
        title=&quot;&amp;quot;Q-Gatherings!&amp;quot;&quot;
        src=&quot;/static/5e9361a94e05c1aa05f686ab623dc2fc/acb04/q-gathering.jpg&quot;
        srcset=&quot;/static/5e9361a94e05c1aa05f686ab623dc2fc/bc01b/q-gathering.jpg 188w,
/static/5e9361a94e05c1aa05f686ab623dc2fc/bf173/q-gathering.jpg 375w,
/static/5e9361a94e05c1aa05f686ab623dc2fc/acb04/q-gathering.jpg 750w,
/static/5e9361a94e05c1aa05f686ab623dc2fc/ec605/q-gathering.jpg 1125w,
/static/5e9361a94e05c1aa05f686ab623dc2fc/c58a3/q-gathering.jpg 1500w,
/static/5e9361a94e05c1aa05f686ab623dc2fc/d2602/q-gathering.jpg 4032w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Could it actually be any different than the traditional quarterly gatherings we are all used to? Yes, it certainly can, and it brings many benefits. Read along to indulge even more profoundly in our culture.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Meetings, yes, we all &lt;em&gt;&quot;love&quot;&lt;/em&gt; them and often joke about how most of them could have eventually been an email. While this might be the case in traditional organizations, it certainly isn&apos;t one here at ST6. Since it is the time of another one of our monthly gatherings, we thought we&apos;d share some insight into what these meetings represent in our organization. In the following lines, we will focus on two types of gatherings that occur throughout the year: NON-Q and monthly gatherings.&lt;/p&gt;
&lt;h3 id=&quot;non-q-gatherings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#non-q-gatherings&quot; aria-label=&quot;non q gatherings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;NON-Q gatherings&lt;/h3&gt;
&lt;p&gt;NON-Q gatherings at ST6 could be defined as a mixture of all traditional definitions for quarterly meetings that you have heard before. We took the concepts of quarterly business reviews (QBR) and all-hands meetings and added a pinch of ST6 spirit to them to create the perfect NON-Q gathering to fit our culture. After all, no one likes to see their team with drooping eyes drawing doodles while slowly falling asleep. To be fair, there is much more potential in such gatherings than most people imagine, which is why we took a different approach. Here&apos;s the arsenal of our secret weapons that helped us make quarterly meetings more effective and exhilarating.&lt;/p&gt;
&lt;p&gt;With a meeting cadence of two times per year, NON-Q gatherings at ST6 are rather big and exciting events. An entire day filled with ideas and knowledge sharing, financial overviews, jokes, and lots of food. The primary goal here is transparency. We have already talked about &lt;a href=&quot;/blog/radical-transparency/&quot;&gt;radical transparency&lt;/a&gt; being a fundamental pillar in ST6&apos;s culture. So, the most logical thing was to base NON-Q gatherings entirely on that principle.&lt;/p&gt;
&lt;p&gt;A typical meeting of this kind starts with breakfast and some chit-chat. Moving on to the presentation segment, we usually start with a review of what we have achieved in the past six months, or in other words, a pat on the back moment. The company strategy is also discussed at this point of the gathering. The focus then shifts to the &lt;a href=&quot;/blog/structure-circles/&quot;&gt;Circles&lt;/a&gt;, where each circle champion comes forward and talks about the things that have happened within that particular circle. Here we discuss the future goals of the circles, as well as what were the lessons learned from previously executed tasks. Towards the end of the presentation segment, we get to the financial overview, followed by a discussion of different topics that intrigue us. Everything ends with a generous lunch probably similar to the ones that royalties like Henry VIII used to have.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/656c7671a77dcda3383908aa8a6d1371/d2602/slide-hristo.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFplcqNo8P/xAAbEAEAAgIDAAAAAAAAAAAAAAABAAMCEBETIf/aAAgBAQABBQLKsiJrnyyxLOzEn//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAMBAAMAAAAAAAAAAAAAAAABESEQMVH/2gAIAQEABj8C847RrhrtNVP/xAAaEAEBAQADAQAAAAAAAAAAAAABEQAxQWGB/9oACAEBAAE/IYaOFtjk8/ubYC60gozg1b//2gAMAwEAAgADAAAAEHT/AP/EABcRAAMBAAAAAAAAAAAAAAAAAAABEWH/2gAIAQMBAT8QS0h//8QAFREBAQAAAAAAAAAAAAAAAAAAERD/2gAIAQIBAT8QWf/EABsQAQEBAQADAQAAAAAAAAAAAAERIQAxQVGB/9oACAEBAAE/EFN8fdOrkJRPezlup+PAx6rBYn5w5YAJ4t3MhxelG07/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Emotions slide!&amp;quot;&quot;
        title=&quot;&amp;quot;Emotions slide!&amp;quot;&quot;
        src=&quot;/static/656c7671a77dcda3383908aa8a6d1371/acb04/slide-hristo.jpg&quot;
        srcset=&quot;/static/656c7671a77dcda3383908aa8a6d1371/bc01b/slide-hristo.jpg 188w,
/static/656c7671a77dcda3383908aa8a6d1371/bf173/slide-hristo.jpg 375w,
/static/656c7671a77dcda3383908aa8a6d1371/acb04/slide-hristo.jpg 750w,
/static/656c7671a77dcda3383908aa8a6d1371/ec605/slide-hristo.jpg 1125w,
/static/656c7671a77dcda3383908aa8a6d1371/c58a3/slide-hristo.jpg 1500w,
/static/656c7671a77dcda3383908aa8a6d1371/d2602/slide-hristo.jpg 4032w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;monthly-gatherings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#monthly-gatherings&quot; aria-label=&quot;monthly gatherings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Monthly gatherings&lt;/h3&gt;
&lt;p&gt;As suggested by the name, monthly gatherings happen every month. Similar to the concept of NON-Q gatherings, here we gather for an hour to talk about the success and highlights of each circle and the projects we are working on. A monthly sync-up allows us to communicate any upcoming changes and update each other as needed. Sometimes we have monthly meetings for the overall improvement of the workflow at the organization.&lt;/p&gt;
&lt;h3 id=&quot;we-will-meet-you-there&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#we-will-meet-you-there&quot; aria-label=&quot;we will meet you there permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;We will meet you there!&lt;/h3&gt;
&lt;p&gt;Now you know how gatherings are carried out at ST6. We believe that transparency is a crucial asset for every organization, and so we strive to implement it in everything we do. Transparency in gatherings allows us to share everything there is to be known with every member of our team. We must all be on the same page and understand why certain decisions are made and what lessons could be learned from the outcomes. And to answer the question we posed at the beginning of the post—yes, quarterlies can most certainly be done differently and with every member of the organization involved and engaged more than ever before. If you like the idea and want to &lt;a href=&quot;/careers/&quot;&gt;be a part of it&lt;/a&gt;, we are looking forward to seeing you at one of our next gatherings!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f867da048f51939ec14f3ce58f092151/d2602/together.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAEZOqWkwM//xAAYEAEBAAMAAAAAAAAAAAAAAAABAgADEf/aAAgBAQABBQKXChyiu7dtMzS009//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAACAwEAAAAAAAAAAAAAAAAAAQIhMRD/2gAIAQEABj8CtFGcTkaf/8QAGhABAAIDAQAAAAAAAAAAAAAAAQBRESExYf/aAAgBAQABPyEA2YCCXp0wEhHDwJVRknMc/9oADAMBAAIAAwAAABBL7//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxDIj//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/EIf/xAAdEAEBAQABBQEAAAAAAAAAAAABEQAhMUFRgZHx/9oACAEBAAE/EAJDFZ00JQfyHPhPy4WWHBwGkb6wjSUMoXsmQko+d//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Happy times&amp;quot;&quot;
        title=&quot;&amp;quot;Happy times&amp;quot;&quot;
        src=&quot;/static/f867da048f51939ec14f3ce58f092151/acb04/together.jpg&quot;
        srcset=&quot;/static/f867da048f51939ec14f3ce58f092151/bc01b/together.jpg 188w,
/static/f867da048f51939ec14f3ce58f092151/bf173/together.jpg 375w,
/static/f867da048f51939ec14f3ce58f092151/acb04/together.jpg 750w,
/static/f867da048f51939ec14f3ce58f092151/ec605/together.jpg 1125w,
/static/f867da048f51939ec14f3ce58f092151/c58a3/together.jpg 1500w,
/static/f867da048f51939ec14f3ce58f092151/d2602/together.jpg 4032w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the ST6ers - Iliyan]]></title><description><![CDATA[Why did you join ST6? At the beginning of my career, I was as eager to learn and grow professionally as a junior in the field can be…]]></description><link>https://st6.io/blog/meet-the-st6ers-iliyan/</link><guid isPermaLink="false">https://st6.io/blog/meet-the-st6ers-iliyan/</guid><pubDate>Mon, 22 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/655d3edeec23e8e2528f62823b714295/9568a/iliyan-cover.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAZABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwX/xAAXAQEBAQEAAAAAAAAAAAAAAAACAQAD/9oADAMBAAIQAxAAAAHIvnFQUpabeXPrjHM//8QAHBAAAgEFAQAAAAAAAAAAAAAAAQIDABAREiEz/9oACAEBAAEFAjC4pQ2gCim1xwWl4ZWIQIMSeklv/8QAFxEBAAMAAAAAAAAAAAAAAAAAAQIRIP/aAAgBAwEBPwGJbj//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/AaUWf//EACAQAAECBQUAAAAAAAAAAAAAAAEAERASITFxUWGBkaH/2gAIAQEABj8C2ypG5VSFeF/EG6QDtNohSAzD/8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFRYRBBsf/aAAgBAQABPyG+9jmH0gtt2uWAp5YX3xbG9ZwQcQATJeULFmXQgipgn0Jt4f/aAAwDAQACAAMAAAAQex4D/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREA/9oACAEDAQE/EJA5C6yBqb//xAAYEQEBAQEBAAAAAAAAAAAAAAABABEhcf/aAAgBAgEBPxBBeZudtv/EACAQAQADAAIBBQEAAAAAAAAAAAEAESExYUFxgaGx0fD/2gAIAQEAAT8QuAgqKMJab2mkvD0HULFToO51OlGK/kt4JSjWkbVC9rde8edoBhavMJOAZYseF8svS0Frrk4/70nx/wBw4PSf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Iliyan at the BBQ grill&amp;quot;&quot;
        title=&quot;&amp;quot;Iliyan at the BBQ grill&amp;quot;&quot;
        src=&quot;/static/655d3edeec23e8e2528f62823b714295/acb04/iliyan-cover.jpg&quot;
        srcset=&quot;/static/655d3edeec23e8e2528f62823b714295/bc01b/iliyan-cover.jpg 188w,
/static/655d3edeec23e8e2528f62823b714295/bf173/iliyan-cover.jpg 375w,
/static/655d3edeec23e8e2528f62823b714295/acb04/iliyan-cover.jpg 750w,
/static/655d3edeec23e8e2528f62823b714295/ec605/iliyan-cover.jpg 1125w,
/static/655d3edeec23e8e2528f62823b714295/c58a3/iliyan-cover.jpg 1500w,
/static/655d3edeec23e8e2528f62823b714295/9568a/iliyan-cover.jpg 3024w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-did-you-join-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-you-join-st6&quot; aria-label=&quot;why did you join st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did you join ST6?&lt;/h2&gt;
&lt;p&gt;At the beginning of my career, I was as eager to learn and grow professionally as a junior in the field can be. Surprise, surprise :).
It was 2017 at my previous workplace when I was fortunate enough to work with Niki Valchev. He was &lt;strong&gt;THE&lt;/strong&gt; right software craftsman for that job!
Thanks to him, I was able to learn and grow at the pace I was striving for. But this isn&apos;t the best part. The whole process was what I appreciated the most.
We had regular sync meetings, we were open, honest, and direct with each other. The only motivation behind this was the common goal—to do things better as a team and help each other grow professionally.
Later that year ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt; was founded by his former colleagues. They played a vital role in his career growth.
Niki was offered to join as one of the first ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;ers, and so he did. I was both happy for him and a little sad that the role model I had was leaving.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/8f5d418f517b6f8e8b41835e5461e60e/robert-redford.gif&quot; alt=&quot;Robert Redford nodding with a laser sabre&quot;&gt;&lt;/p&gt;
&lt;p&gt;Before he left, he told me: &lt;em&gt;&quot;Get your sh*t together and sooner rather than later, you&apos;ll be the ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;er we would love to have on board&quot;&lt;/em&gt;.
We stayed in touch and he told me a lot of intriguing things about ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;—top-notch software craftsmen to learn from, no bosses, transparent salaries, etc. It sounded like a nice place to be.
Fast-forward to 2019 and I started my journey with one of the best software craftsmen out there, in a very promising environment that seemed aligned with my beliefs and values.
Sounds like it&apos;s all rainbows and sunshine, but it&apos;s not. It&apos;s more like &quot;tough love&quot; :). Why? Keep reading.&lt;/p&gt;
&lt;h2 id=&quot;what-do-you-like-most-about-working-at-the-organization&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-do-you-like-most-about-working-at-the-organization&quot; aria-label=&quot;what do you like most about working at the organization permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What do you like most about working at the organization?&lt;/h2&gt;
&lt;h3 id=&quot;the-strongspanfont-colorffa60ba-playersfontspanstrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-strongspanfont-colorffa60ba-playersfontspanstrong&quot; aria-label=&quot;the strongspanfont colorffa60ba playersfontspanstrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The &lt;strong&gt;&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;&quot;A&quot; players&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;There are plenty of role models within the organization that I can learn from.
Having many smart and highly opinionated people on all varieties of topics has a downside, though.
Knowing when to keep your opinion to yourself is a vital skill that some of us (well, most of us ¯\_(ツ)_/¯) need to master. Combine this with the &lt;a href=&quot;/tags/transparency/&quot;&gt;&lt;em&gt;radically transparent culture&lt;/em&gt;&lt;/a&gt; we have and the challenge becomes even bigger.
It&apos;s not easy, but it&apos;s worth it. This is where the &quot;tough love&quot; part comes but also where the growth happens.&lt;/p&gt;
&lt;h3 id=&quot;the-strongspanfont-colorffa60bfreedomfontspanstrong-to-do-what-im-passionate-about&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-strongspanfont-colorffa60bfreedomfontspanstrong-to-do-what-im-passionate-about&quot; aria-label=&quot;the strongspanfont colorffa60bfreedomfontspanstrong to do what im passionate about permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The &lt;strong&gt;&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;freedom&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt; to do what I&apos;m passionate about&lt;/h3&gt;
&lt;p&gt;At least in the context of the organization, of course.
We all have a profession, but everyone has other superpowers too.
Besides my interest in the software field, I&apos;m also interested in psychology and neuroscience.
That&apos;s why I&apos;m part of our &lt;a href=&quot;/blog/structure-recruiting-circle/&quot;&gt;&lt;em&gt;Recruiting circle&lt;/em&gt;&lt;/a&gt;. Now you might be like: &lt;em&gt;&quot;So, you&apos;re a software craftsman and an HR?!&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1e1684fe78f4cb988b181fe3805ead03/066f9/wtf.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.1063829787234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAMBAgQG/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQIA/9oADAMBAAIQAxAAAAHpnfJUmoeypcedBv/EABwQAAICAgMAAAAAAAAAAAAAAAECAxIABCIyM//aAAgBAQABBQJyWj1uBmJvGmJCEaat4+pzc9v/xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAwEBPwHCxx//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARMf/aAAgBAgEBPwEoWR//xAAeEAABAwQDAAAAAAAAAAAAAAABAAIREBIhMUFhgf/aAAgBAQAGPwJ8YPSLRzS4HaulZfFfF//EABwQAAICAwEBAAAAAAAAAAAAAAABETEhQVFxsf/aAAgBAQABPyGagHaThJy9lhhxo4BpwaJXxcIbaKK/EUPiP//aAAwDAQACAAMAAAAQ1wBD/8QAGBEBAQADAAAAAAAAAAAAAAAAAQAQETH/2gAIAQMBAT8QUCQNXWP/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEx/9oACAECAQE/EAXJe3Kb/8QAHhABAAIBBAMAAAAAAAAAAAAAAQARITFBUfBhcYH/2gAIAQEAAT8QZVQBVmhLr5ccNiLXDzA3VgUWLjZopdliEXSaQGbrYbcTtuJrTte5/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;WTF&quot;
        title=&quot;WTF&quot;
        src=&quot;/static/1e1684fe78f4cb988b181fe3805ead03/066f9/wtf.jpg&quot;
        srcset=&quot;/static/1e1684fe78f4cb988b181fe3805ead03/bc01b/wtf.jpg 188w,
/static/1e1684fe78f4cb988b181fe3805ead03/bf173/wtf.jpg 375w,
/static/1e1684fe78f4cb988b181fe3805ead03/066f9/wtf.jpg 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Well, I&apos;m not. I only work on tasks I can bring value to, like our &lt;a href=&quot;/careers/&quot;&gt;careers page&lt;/a&gt;, for example. Two years ago there were only 3 job offers—no more, no less. As a typical software craftsman, I started with research about what a good careers page is supposed to look like.
And here we are with two more sections—&lt;a href=&quot;/careers/&quot;&gt;&lt;em&gt;&quot;What drives us&quot;&lt;/em&gt;&lt;/a&gt; and &lt;em&gt;&quot;Our perks&quot;&lt;/em&gt;. Leading a similar effort end-to-end and looking back once it&apos;s done, feels pretty damn satisfying :). Thank you, Fatme and Iva, for giving me a hand with this effort!&lt;br&gt;
Of course, all of this doesn&apos;t play well when it&apos;s rough and tough with deadlines looming over our heads in the project. In such cases, you have to act accordingly.
For example, we had an important release coming and I left the &lt;a href=&quot;/blog/structure-recruiting-circle/&quot;&gt;&lt;em&gt;Recruiting circle&lt;/em&gt;&lt;/a&gt; for a while, so I could entirely focus on the upcoming release.
A few months later, once I had pulled myself together and felt ready to contribute again, I returned back to the &lt;em&gt;Recruiting circle&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-strongspanfont-colorffa60bchallengesfontspanstrong-both-professional-and-personal&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-strongspanfont-colorffa60bchallengesfontspanstrong-both-professional-and-personal&quot; aria-label=&quot;the strongspanfont colorffa60bchallengesfontspanstrong both professional and personal permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The &lt;strong&gt;&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;challenges&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;, both professional and personal&lt;/h3&gt;
&lt;p&gt;I took part in several projects. Most of them were built from the ground up and some were a full rewrite plus additional features.
My contribution is mostly on the front end, but I don&apos;t mind getting my hands dirty with infrastructure or backend tasks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Human Design matching social platform (mobile)&lt;/li&gt;
&lt;li&gt;Fin-tech platform helping businesses optimize their payments (web)&lt;/li&gt;
&lt;li&gt;Shipping platform helping customers get their packages safely delivered (web &amp;#x26; mobile)&lt;/li&gt;
&lt;li&gt;Our website &lt;a href=&quot;/&quot;&gt;ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technologies: &lt;br /&gt;&lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;, &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;, &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt;, &lt;a href=&quot;https://reactnative.dev/&quot;&gt;React Native&lt;/a&gt;, &lt;a href=&quot;https://xstyled.dev/&quot;&gt;xstyled&lt;/a&gt;, &lt;a href=&quot;https://jestjs.io/&quot;&gt;jest&lt;/a&gt;, &lt;a href=&quot;https://github.com/wix/Detox&quot;&gt;Detox&lt;/a&gt;, &lt;a href=&quot;https://playwright.dev/&quot;&gt;Playwright&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/cdk/&quot;&gt;AWS CDK&lt;/a&gt;, &lt;a href=&quot;https://www.fastify.io/&quot;&gt;fastify&lt;/a&gt;, &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt;, &lt;a href=&quot;https://www.apollographql.com/&quot;&gt;Apollo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The personal challenges come in different shapes and frameworks. The one I&apos;ve tried and would recommend is the &lt;a href=&quot;https://www.youtube.com/watch?v=FFYnVmGu9ZI&amp;#x26;t=1s&amp;#x26;ab_channel=BCODN&quot;&gt;&quot;immunity to change map&quot;&lt;/a&gt;. &lt;em&gt;TL;DR;&lt;/em&gt; it&apos;s a tool to help you overcome and change behaviors that go against who you want to be. It helped me overcome the defensive mode I used to dive in, when faced with an opposing point of view or some feedback that I had received.&lt;/p&gt;
&lt;h3 id=&quot;klasik-klasikovich-strongspanfont-colorffa60bpicnic-team-buildingsfontspanstrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#klasik-klasikovich-strongspanfont-colorffa60bpicnic-team-buildingsfontspanstrong&quot; aria-label=&quot;klasik klasikovich strongspanfont colorffa60bpicnic team buildingsfontspanstrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Klasik Klasikovich &lt;strong&gt;&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;picnic team buildings&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Like the one from the cover photo. Adds +5 authenticity to the blogpost, doesn&apos;t it? 😃&lt;/p&gt;
&lt;h2 id=&quot;what-would-you-say-are-some-of-the-biggest-challenges-you-face-at-stspanfont-colorffa60b6fontspan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-would-you-say-are-some-of-the-biggest-challenges-you-face-at-stspanfont-colorffa60b6fontspan&quot; aria-label=&quot;what would you say are some of the biggest challenges you face at stspanfont colorffa60b6fontspan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What would you say are some of the biggest challenges you face at ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt;?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Leaving behind the corporate baggage you carry from your previous workplaces. It&apos;s pretty different how everything operates here.
Switching the mindset from a follower to a leader is both challenging and exciting!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Knowing when to speak up, and more importantly when NOT to. The latter is the bigger challenge when you&apos;re surrounded by highly opinionated people, as I already mentioned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of the words we most relate to is &lt;em&gt;&quot;feedback&quot;&lt;/em&gt;. We have tons of it. It flies in every direction.
We even have a dedicated whiteboard where we write down every kind/class of feedback we encounter over time.
Learning how to give and receive it is also something most of us yet need to master.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f8a05491dec3b170138ec9a334edee7b/9568a/feedback-white-board.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.51063829787233%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDBAH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdvZNmuIETK5Uyh//8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECEBEhEv/aAAgBAQABBQK0zeehVJik80k+/wD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAUEAEAAAAAAAAAAAAAAAAAAAAw/9oACAEBAAY/Ak//xAAcEAACAgIDAAAAAAAAAAAAAAAAAREhEDFBYbH/2gAIAQEAAT8hV4aPDA9Bqnomi1ERYmH8j//aAAwDAQACAAMAAAAQpBOO/8QAFREBAQAAAAAAAAAAAAAAAAAAESD/2gAIAQMBAT8QY//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QH//EAB0QAAICAgMBAAAAAAAAAAAAAAERACExQVFhsaH/2gAIAQEAAT8QIBwhAk1RO4B4Eu6IeQCB0jBW5EqtkPJVTRJgAiqiJghoRPPwRX04n//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ST6 Feedback whiteboard&quot;
        title=&quot;ST6 Feedback whiteboard&quot;
        src=&quot;/static/f8a05491dec3b170138ec9a334edee7b/acb04/feedback-white-board.jpg&quot;
        srcset=&quot;/static/f8a05491dec3b170138ec9a334edee7b/bc01b/feedback-white-board.jpg 188w,
/static/f8a05491dec3b170138ec9a334edee7b/bf173/feedback-white-board.jpg 375w,
/static/f8a05491dec3b170138ec9a334edee7b/acb04/feedback-white-board.jpg 750w,
/static/f8a05491dec3b170138ec9a334edee7b/ec605/feedback-white-board.jpg 1125w,
/static/f8a05491dec3b170138ec9a334edee7b/c58a3/feedback-white-board.jpg 1500w,
/static/f8a05491dec3b170138ec9a334edee7b/9568a/feedback-white-board.jpg 3024w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;show-the-best-meme-you-have-in-your-phone&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#show-the-best-meme-you-have-in-your-phone&quot; aria-label=&quot;show the best meme you have in your phone permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Show the best meme you have in your phone&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c6259da47626e8baeff54fa5eb2c0c70/c1b63/iliyan-klasik.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 116.48936170212767%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGL0lEQVR42i3R6W/Thx3H8d+T0RWRtku5GYQjhBBikkBIyEUOO/F9xLcT33F8xg62E8e5IAckpCQZCFJKWg616qpSVVuZulWaqklrYRqdqo1J1TRt0v6S73sq24P309eDz0eJ54syNJrAHgyLbTiAwe1F73Qz4HChGXS8Sm2z02ex02Uw09avo89iQ22xc8lgplNnpFWjlXadgV6zXZTk5JR4E0kK0zNy++4W11ZXmVtYJJnLMT0/T7E8Q7E8y/T8FTZu32Fq7gpLqzdYXr3B4soqN9Y3CKWyYvAGMfmC/wP9mXHcowlxRqLYgyFMviESuRwr/8enZua4ub7BlcUl5hcWmVtcxh9L4ovGGRpJMhxPiS0QxeqPiLK8sSHlxRVC2YLYY3GMgRB9Lg9Wf4BoKsPV62tMX10mUyyTKkwSTWWJpcfJTE4TTOdwhOMMp7LiGU3jGEmI8uijj2Xzzn3ihSmxx1NYIiMMeIdpM5rR2FxkZxYZKy+gdXhp7ujkxLEqDu3bzYW2VlyhKI5QDHckLiZfCL3HL8rNu/dkZnWD0HhR3MkxLOEfwSG6rYOYvH7GZxZegSaLBfWxCt7RVbPcX83xXQqtXZ1oXd4fDxNLIIolGBUlNzcv0csFhtNZ8aZzWCIxtL4huixWzD4/hfklIvk5xoMOXmRa+Nesmn/MqnloP4nvYg11re2o2jtlwOFDbXOLkl9clHipjH8sK85ECkt0BO2wnw7rIHrvEIFMDl+6iE/fx2bvQdY6D/GhrYYX2UaeelR09w/QZRkUtcNNh8kqyvj8giRKZQK5nHgSabShUYadRsLWHnRDfvpsdvSeAG6jng8d9bxIt/Msc4FvUyredzbRabLTYXNJm8lKU49GlEx5WiKX8wSzWbGOxClPxrltb2a+7efYhz2vtrQGwljdHt7R1vLrwTqeZZt54jnO+6ZDDDvbaOxVi6pngKZetSjpmWmJFvKEx7Nijae4VfTxdaqN+5rDxG29tFnt6Bwu2gb0aFpOs9S8m8eOE2x0vsW25xiZSB2J6EXp1ndzprNXlESpJJHLlwlls+JKZRiLuflD5hzfl5p5EG+nw2Ciy2imWzuAUd+AR30Uw+GfMnuxkpyvlpC3jomxFinlL2F1dIsSnyhJMDfOUCYjnmQc2+goU4YGPjLu4e/zzdwcM9Cqs2Id1KDrOYq29xjnqiuwa4/gsZ9kNNRAOn5BkrHzjAQaRYkVJyWQyzGUzYo3k8aZTGCOxpg0n2dTf4CoRoVt0EjY105Hy36c5hoCnno89loi/gZGQg1EAmfF6ziF01orSnAsJ8FMhkA6LUPJBPboCOZIjETYjvfcAVxN+3m+oOGetw5HTxXTBQOlXC9eZy3uwZOv8jpPi81UjVlXLUo6nxLfaAJnNC6e0SRj2Sjh9AgOv49Nxxm2dW/zp2ITj21HSOpqyMVU3C5rWR7vwOM+jc9bz5C7XjQ9R2mq3y3K09lW+XShn60pnSyFW9maNuOJhDEOByj4BljpqOShcQ9/Lp7jtucEi8FTvLzWzQ8rvWzHGvHra9D3V0vN8QrONx4U5bsP/PKriWb++sgl32+b+GQ9xMq1OcqFUa5MpSk6usg3VPBkcD9/TNXydbSGvxQa+CZdy++DVZSaKzmyd4ecPlVJZ9tRUT7I9sp72UvcuqyRBzMD3Eq28mn+Il/NtvDFVDsPykYmLefIVys87HqNJ7o3+KVuF4tNP0G9W2HPDoXDh16Xhvp9NDcdEGW95Q15kungN48W5P5akbmIic0xE09X3Xx2I8QXa0G2Jhxk+xvZGu7iXriPdX8/9o5GmptV6A19nFUdFFX9Xi5eOCzK74pq+e6TJf7zw3PZuDLFVNTLrakkT36R51bBz92lEmvlBJuzSR7cv8v1hVlG4jH0xgH61Z2M55K0tlTLqZNvUVfztijPTTXyt/VJ/vnymdwcj/Gev5YvJ9r5beYs6327ub82z521q9yYGePxuxuslpO8uVOh4nWFXTsVdr6moDpTKQ2qn6GqqxBlu2qHvGvv598vv5Fvv/qcxwUL24kzrJurSFXtoGw9y9WclznXGa6nzHz58RYnjuyl8s0d1NXuwzE4QCRkk4mJAKUJv/wX94q8zjNMBiUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Klasik Iliyan&quot;
        title=&quot;Klasik Iliyan&quot;
        src=&quot;/static/c6259da47626e8baeff54fa5eb2c0c70/1d69c/iliyan-klasik.png&quot;
        srcset=&quot;/static/c6259da47626e8baeff54fa5eb2c0c70/4dcb9/iliyan-klasik.png 188w,
/static/c6259da47626e8baeff54fa5eb2c0c70/5ff7e/iliyan-klasik.png 375w,
/static/c6259da47626e8baeff54fa5eb2c0c70/1d69c/iliyan-klasik.png 750w,
/static/c6259da47626e8baeff54fa5eb2c0c70/78797/iliyan-klasik.png 1125w,
/static/c6259da47626e8baeff54fa5eb2c0c70/c1b63/iliyan-klasik.png 1200w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;share-your-passions-with-us&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#share-your-passions-with-us&quot; aria-label=&quot;share your passions with us permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Share your passions with us&lt;/h2&gt;
&lt;p&gt;Check our &lt;a href=&quot;/careers/&quot;&gt;careers&lt;/a&gt; page, join the ST&lt;span&gt;&lt;font color=&quot;#ffa60b&quot;&gt;6&lt;/font&gt;&lt;/span&gt; team, and bring your whole self!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ORGANIZATIONS OF THE FUTURE - ST6 Structure - Recruiting circle]]></title><description><![CDATA[In our previous blog post, we talked about the ST6 structure and circles in general. Now it's time to get in more details about each circle…]]></description><link>https://st6.io/blog/structure-recruiting-circle/</link><guid isPermaLink="false">https://st6.io/blog/structure-recruiting-circle/</guid><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In our previous &lt;a href=&quot;/blog/structure-circles/&quot;&gt;blog post&lt;/a&gt;, we talked about the ST6 structure and circles in general. Now it&apos;s time to get in more details about each circle.
Today&apos;s topic is the Recruiting circle - its purpose, domain, goal and responsibilities!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;
Craft a revolutionary selection process that would find the best talent fitting for our culture and organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;
Grow the ST6 team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify the people we would like to recruit.&lt;/li&gt;
&lt;li&gt;Drive, organize, and improve the end-to-end recruitment process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Accountabilities&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage all communication with candidates, and facilitate each step from the end-to-end recruiting process.&lt;/li&gt;
&lt;li&gt;Ensure diversity by attracting different interview attendees.&lt;/li&gt;
&lt;li&gt;Compose inspiring job offers that reflect the current needs of our organization.&lt;/li&gt;
&lt;li&gt;Gain more exposure, attract, and engage future ST6ers.&lt;/li&gt;
&lt;li&gt;Establish recruiting best practices.&lt;/li&gt;
&lt;li&gt;Create an efficient and innovative selection process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enough governance for now.&lt;/p&gt;
&lt;p&gt;Reading so far, you probably think this should be the HR department. Well...no. As we mentioned before, each ST6er can participate in any circle they want, no matter their role or background. The important thing is what inspires you and where you want to contribute. So here are the recruiting circle members:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Krisi (Software Craftswoman)&lt;/li&gt;
&lt;li&gt;Dimitar (Software Craftsman)&lt;/li&gt;
&lt;li&gt;Fatme (Software Craftswoman)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/meet-the-st6ers-petar/&quot;&gt;Petar&lt;/a&gt; (Software Craftsman)&lt;/li&gt;
&lt;li&gt;Lidia (Office Happiness Champion)&lt;/li&gt;
&lt;li&gt;Spasena (Talent &amp;#x26; Operations Craftswoman)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/meet-the-st6ers-iliyan/&quot;&gt;Iliyan&lt;/a&gt; (Software Craftsman)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More about the team &lt;a href=&quot;/team/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Circle&apos;s Champion is Spasena, and the Circle&apos;s Secretary is Fatme.&lt;/p&gt;
&lt;p&gt;We have other circle-specific roles like Tech Task Reviewer, Candidate&apos;s Coordinator, New Position Champion, GDPR Master, and Candidate&apos;s Champion. We have more roles and governance yet to be defined, so let&apos;s, for now, focus on the Candidate&apos;s Champion Role, as this is a role each one of us takes.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Candidate&apos;s Champion&lt;/strong&gt; is the main point of contact between the candidate and ST6. They assure consistent and transparent dialog and guarantee an end-to-end recruitment journey that resonates with every ST6 value. All of the circle members rotate through this role in a particular order.
And thus, each candidate has a different champion.&lt;/p&gt;
&lt;p&gt;Currently, we have plenty of open positions, and we are very actively looking for our new ST6ers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What do we look for in a candidate?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A passion and excitement for your craft. You love what you do and have fun doing it.&lt;/li&gt;
&lt;li&gt;A desire for solving problems.&lt;/li&gt;
&lt;li&gt;A self-awareness to embrace the failures.&lt;/li&gt;
&lt;li&gt;A belief in pursuing a common goal as a team.&lt;/li&gt;
&lt;li&gt;A conscious desire to work in an environment with open and transparent information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What is our interview process?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;15-30min Say Hi!&lt;/strong&gt;—We know the whole process is inherently stressful, so we start with a brief, informal video call to break the ice and say Hi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1-3h Cultural Talk&lt;/strong&gt;—You are a very cool person, and we are a very cool organization, but what&apos;s most important here is how well we click.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Technical Task&lt;/strong&gt;—This depends on the position you are applying for. We usually do not place restrictions on the technologies you can use and we do not set a deadline for the implementation. The most important thing for us is for your solution to be well crafted. :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1-4h Technical Talk&lt;/strong&gt;—Being the geeks that we are, let&apos;s dig deep together into some practical and theoretical problems and how you&apos;d tackle them.&lt;/p&gt;
&lt;p&gt;We know it sounds scary, but we promise you it&apos;s all worth it. :) We are pretty friendly and fun. :)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If you have already been in a recruitment process with us, and you have feedback, if you want to apply, and you have questions, or you want to chat and know more - &lt;a href=&quot;/careers/&quot;&gt;write to us :)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ORGANIZATIONS OF THE FUTURE - ST6 Structure]]></title><description><![CDATA[You can often hear us saying we are “an organization of the future,” a #noboss organization… and we operate in circles instead of…]]></description><link>https://st6.io/blog/structure-circles/</link><guid isPermaLink="false">https://st6.io/blog/structure-circles/</guid><pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can often hear us saying we are “an organization of the future,” a #noboss organization… and we operate in circles instead of departments like most organizations. What do we really mean?&lt;/p&gt;
&lt;p&gt;ST6 follows the Sociocracy guide for building organizations of the future and is organized into &lt;a href=&quot;https://patterns.sociocracy30.org/circle.html&quot;&gt;circles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/36ae2a5b7195d555c2d16aa7bab5aa3c/61583/image2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.02127659574468%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABOklEQVR42o2T647CIBCFff9X2/2xl+iul6qpdb1UbauFQhk4G6g0tbbqJBMIgS9nzgwDrTVsEpFbjTFox2orESflzZm/13xrc9AGVpcMwo3AKVOIE4WPMcMo4DgkCvtTib9Y1tCXge+jHNFOgsggywk5J3ceRALfU/YakKgCHlOFnwVHqe7LPzPC54Qhu9Dzko3RDrLeyxuvmunDqldk3JteIKCdR9arpvFNmF8PaeUnYO6BttQKaDBfi+vFbnV+3cTSNa4HSLXCYcARbmWnwiZ4sRb4XfJuYF2y0eCFxibuV2g77RQeSgipH3vou2xLnoVF5yCnF4VpWGB/Us+77IFcaLwNczd/NrbHEqyo9vNIuEH38Rh4HexC6Lo5u2OJrwnDbCWcKuuvPXv5p7T/svVsvCycyrYFXcB/Go374H9bTGMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Circle&quot;
        title=&quot;Circle&quot;
        src=&quot;/static/36ae2a5b7195d555c2d16aa7bab5aa3c/1d69c/image2.png&quot;
        srcset=&quot;/static/36ae2a5b7195d555c2d16aa7bab5aa3c/4dcb9/image2.png 188w,
/static/36ae2a5b7195d555c2d16aa7bab5aa3c/5ff7e/image2.png 375w,
/static/36ae2a5b7195d555c2d16aa7bab5aa3c/1d69c/image2.png 750w,
/static/36ae2a5b7195d555c2d16aa7bab5aa3c/78797/image2.png 1125w,
/static/36ae2a5b7195d555c2d16aa7bab5aa3c/aa440/image2.png 1500w,
/static/36ae2a5b7195d555c2d16aa7bab5aa3c/61583/image2.png 1616w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://patterns.sociocracy30.org/all.html&quot;&gt;A Practical Guide for Evolving Agile and Resilient Organizations with Sociocracy 3.0&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Each circle has its domain, accountabilities, members, meetings, roles, assigned people into the roles, Trello board, meeting notes, and Slack channel.&lt;/p&gt;
&lt;p&gt;Each circle has a &lt;strong&gt;Champion&lt;/strong&gt; and a &lt;strong&gt;Secretary&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let’s talk in details about the roles:&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Champion’s purpose&lt;/strong&gt; is to facilitate the smooth operation of the circle, to engage the circle to ideate, implement, and participate in exciting, productive, and efficient initiatives related to the circle domain.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Champion’s domain&lt;/strong&gt; is the day-to-day operations of the circle, and long and short-term circle strategy and strategic initiatives.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Champion’s accountabilities&lt;/strong&gt; include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;coordinate and facilitate the execution of the strategy of the whole organization through the domain of the circle&lt;/li&gt;
&lt;li&gt;organize and facilitate regular circle meetings&lt;/li&gt;
&lt;li&gt;organize and facilitate retrospectives and planning initiatives&lt;/li&gt;
&lt;li&gt;manage the circle’s calendar and Trello board&lt;/li&gt;
&lt;li&gt;ensure the circle activities and decisions are communicated to the organization through the respective channels, like Slack, meeting notes and recordings, monthly gatherings, Q-gatherings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;Secretary’s purpose&lt;/strong&gt; is to record all decisions, discussions, and other relevant information during a meeting to ensure organizational transparency and organizational memory.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Secretary’s accountabilities&lt;/strong&gt; include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;record decisions made&lt;/li&gt;
&lt;li&gt;record discussed topics&lt;/li&gt;
&lt;li&gt;capture voiced opinions, ideas, objections, etc.&lt;/li&gt;
&lt;li&gt;publish the meeting notes to a location accessible by the entire organization&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This way, we ensure complete transparency in the organization about decisions made, progress on tasks, and different discussions within the circles.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;at-st6-we-have-the-following-circles&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#at-st6-we-have-the-following-circles&quot; aria-label=&quot;at st6 we have the following circles permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;At ST6 we have the following circles:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Organization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Office&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consulting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project sub-circles&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BizDev&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recruiting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strategy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Product&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each ST6er is free to join any circle they want to contribute to. Each STer is also free to leave a circle if they feel overwhelmed and want to put their energy somewhere else.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Do you feel intrigued? &lt;a href=&quot;/careers/&quot;&gt;write to us :)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the ST6ers - Petar]]></title><description><![CDATA[Why did you join ST6? One of the crucial reasons I've decided to join ST6 is the very experienced and intelligent team and the values that…]]></description><link>https://st6.io/blog/meet-the-st6ers-petar/</link><guid isPermaLink="false">https://st6.io/blog/meet-the-st6ers-petar/</guid><pubDate>Fri, 18 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/15e877dc647de1c00f0fd39dc978d7ec/40ba2/petar2.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMCBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGM680YB//EABsQAAICAwEAAAAAAAAAAAAAAAABAxECECEi/9oACAEBAAEFAnLIx+tLNo7VM//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAcEAABAwUAAAAAAAAAAAAAAAAAASEyEBExQVH/2gAIAQEABj8CkpJ9mLjir2n/xAAbEAADAQEAAwAAAAAAAAAAAAAAAREhMUFhcf/aAAgBAQABPyFNsCVuk4bY6nn0QjiX1CN5z3ET4f/aAAwDAQACAAMAAAAQl8//xAAWEQADAAAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8QiRD/xAAWEQEBAQAAAAAAAAAAAAAAAAABECH/2gAIAQIBAT8QE7H/xAAdEAEAAgEFAQAAAAAAAAAAAAABABEhMUFhcYGx/9oACAEBAAE/EKuHhiUiqaQJzn5HSceDGoFWAVe5gt4arfzSOGFO9J//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Petar&amp;quot;&quot;
        title=&quot;&amp;quot;Petar&amp;quot;&quot;
        src=&quot;/static/15e877dc647de1c00f0fd39dc978d7ec/acb04/petar2.jpg&quot;
        srcset=&quot;/static/15e877dc647de1c00f0fd39dc978d7ec/bc01b/petar2.jpg 188w,
/static/15e877dc647de1c00f0fd39dc978d7ec/bf173/petar2.jpg 375w,
/static/15e877dc647de1c00f0fd39dc978d7ec/acb04/petar2.jpg 750w,
/static/15e877dc647de1c00f0fd39dc978d7ec/ec605/petar2.jpg 1125w,
/static/15e877dc647de1c00f0fd39dc978d7ec/c58a3/petar2.jpg 1500w,
/static/15e877dc647de1c00f0fd39dc978d7ec/40ba2/petar2.jpg 3023w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-did-you-join-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-you-join-st6&quot; aria-label=&quot;why did you join st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did you join ST6?&lt;/h2&gt;
&lt;p&gt;One of the crucial reasons I&apos;ve decided to join ST6 is the very experienced and intelligent team and the values that we share. I see ST6 as the place where I can learn, develop, and improve my capabilities as well as contribute to the company and other people&apos;s well-being. I&apos;m always looking for ways to challenge myself, enhance my current skills, and learn new ones. I do believe that ST6 could be my arena for experimentation, personal and technical development.&lt;/p&gt;
&lt;p&gt;Apart from that, ST6 embraces the Teal organization principles and values such as transparency, being your whole self, etc. When I started my first startup, Parknshare, I wanted to introduce transparency, equality, openness and create a unique culture and environment. After I failed, I found ST6 as a place that&apos;s already based on that, so it was an easy choice.&lt;/p&gt;
&lt;h2 id=&quot;tell-me-about-your-work-at-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tell-me-about-your-work-at-st6&quot; aria-label=&quot;tell me about your work at st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tell me about your work at ST6&lt;/h2&gt;
&lt;p&gt;I started working for a client called MacStadium from day one when I joined the organization.&lt;/p&gt;
&lt;p&gt;MacStadium is a leading provider of Apple Mac infrastructure, providing scalable, reliable, and secure private clouds and dedicated servers for MacOS. Currently, I am working on the Portal, a web app used directly by MacStadium customers to purchase products, talk to the support team, user management, and manage the various payment methods. The technologies we use are all JavaScript-oriented, like ReactJS, React-Query, Reach-Router, GraphQL, Apollo, NodeJS, Jest. Then we have GitHub, AWS, and MySQL.
Outside the project, I am part of the Recruiting circle where we try to find like-minded people that embrace our culture and are in the top 5% of technical talent. Being part of the circle, I participate in many interviews, both cultural and technical ones, which helps me get out of my comfort zone and tune my sense and evaluation of people.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1c9e07f4640c62be2d216ed79f5bbe20/818b0/petar1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/2gAMAwEAAhADEAAAAaHx6ScsYNn/xAAbEAACAgMBAAAAAAAAAAAAAAABAwIRABIjE//aAAgBAQABBQLp5NNBp6LGmMiDIrjf/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BZ//EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQIBAT8BDtjf/8QAHBAAAgICAwAAAAAAAAAAAAAAAAECEQMQITFS/9oACAEBAAY/AsKh1Vsh6GJWy+df/8QAGxABAAIDAQEAAAAAAAAAAAAAAQARITFhQZH/2gAIAQEAAT8hU0ODJLZsmbiqNXyUgQT11LhbPYx7+z//2gAMAwEAAgADAAAAEJwv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EMAJLt//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QbZF//8QAHRABAAICAgMAAAAAAAAAAAAAAQARIVExcUFhgf/aAAgBAQABPxA2yGGi6OssdKrcLx7+wRQm04RrZTVh01LRpC56jhUP/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Petar Talk 1&amp;quot;&quot;
        title=&quot;&amp;quot;Petar Talk 1&amp;quot;&quot;
        src=&quot;/static/1c9e07f4640c62be2d216ed79f5bbe20/acb04/petar1.jpg&quot;
        srcset=&quot;/static/1c9e07f4640c62be2d216ed79f5bbe20/bc01b/petar1.jpg 188w,
/static/1c9e07f4640c62be2d216ed79f5bbe20/bf173/petar1.jpg 375w,
/static/1c9e07f4640c62be2d216ed79f5bbe20/acb04/petar1.jpg 750w,
/static/1c9e07f4640c62be2d216ed79f5bbe20/ec605/petar1.jpg 1125w,
/static/1c9e07f4640c62be2d216ed79f5bbe20/c58a3/petar1.jpg 1500w,
/static/1c9e07f4640c62be2d216ed79f5bbe20/818b0/petar1.jpg 1722w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-do-you-prefer-to-start-your-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-do-you-prefer-to-start-your-day&quot; aria-label=&quot;how do you prefer to start your day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do you prefer to start your day?&lt;/h2&gt;
&lt;p&gt;I love starting my day by getting up early in the morning, around 5:50 am, and going straight to the gym for a heavy weight lifting session. Then, I eat my breakfast and do 20-30 minutes of zen meditation practice. Both activities help me set a tone for the day, clear my mind and prepare me for the challenges during the day.&lt;/p&gt;
&lt;h2 id=&quot;how-would-you-describe-your-job-to-a-bunch-of-five-year-olds&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-would-you-describe-your-job-to-a-bunch-of-five-year-olds&quot; aria-label=&quot;how would you describe your job to a bunch of five year olds permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How would you describe your job to a bunch of five-year-olds?&lt;/h2&gt;
&lt;p&gt;It’s all about crafting great products. You build something from nothing, from 0 to 1. As a five-year-old, you build great things from a Lego, a puzzle, or randomly experiment with some stuff. That’s the creative and inspiring process. You’re thrilled by the experience, not by the results. That’s the same in our everyday job. We do love creating and shipping great products and software, but more than that, we love the process of making something.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/43dc623aa28374cf513d80528d082247/98d66/petar3.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.27659574468085%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB5asBrWf/xAAcEAACAQUBAAAAAAAAAAAAAAAAAQIDERITISL/2gAIAQEAAQUCzZJ91TE7Eanrp//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAIDAQAAAAAAAAAAAAAAAAABAhASQf/aAAgBAQAGPwISicpainX/xAAcEAACAQUBAAAAAAAAAAAAAAAAAREhMUFRYeH/2gAIAQEAAT8hTkuk95aqnhjZ6EUxinCaYLJ6J2P/2gAMAwEAAgADAAAAEBf/AP/EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPxCBf//EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCsiP/EABsQAQEAAwADAAAAAAAAAAAAAAERACFRQWFx/9oACAEBAAE/EFwBagGM+NJ96YrXbAeyqY8u4bJIkiu+37kNIpn/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Petar Talk&amp;quot;&quot;
        title=&quot;&amp;quot;Petar Talk&amp;quot;&quot;
        src=&quot;/static/43dc623aa28374cf513d80528d082247/acb04/petar3.jpg&quot;
        srcset=&quot;/static/43dc623aa28374cf513d80528d082247/bc01b/petar3.jpg 188w,
/static/43dc623aa28374cf513d80528d082247/bf173/petar3.jpg 375w,
/static/43dc623aa28374cf513d80528d082247/acb04/petar3.jpg 750w,
/static/43dc623aa28374cf513d80528d082247/ec605/petar3.jpg 1125w,
/static/43dc623aa28374cf513d80528d082247/c58a3/petar3.jpg 1500w,
/static/43dc623aa28374cf513d80528d082247/98d66/petar3.jpg 1905w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;share-your-passions-with-us&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#share-your-passions-with-us&quot; aria-label=&quot;share your passions with us permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Share your passions with us&lt;/h2&gt;
&lt;p&gt;Check our &lt;a href=&quot;/careers/&quot;&gt;careers&lt;/a&gt; page, join the ST6 team, and bring your whole self!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the ST6ers - Martin]]></title><description><![CDATA[Why did you join ST6? I joined ST6 because it aligns with my vision of how an organization should be structured and how it should operate. I…]]></description><link>https://st6.io/blog/meet-the-st6ers-martin/</link><guid isPermaLink="false">https://st6.io/blog/meet-the-st6ers-martin/</guid><pubDate>Tue, 27 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/affe19c97a296e86670f792750586b61/e1596/martin-1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMFAf/EABYBAQEBAAAAAAAAAAAAAAAAAAABA//aAAwDAQACEAMQAAABVSdkTigNf//EABoQAAIDAQEAAAAAAAAAAAAAAAECAAMTERL/2gAIAQEAAQUCe33ZsWDjrBVmazJJ/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAECAxH/2gAIAQMBAT8BFbJLD//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGMj//EABwQAAIBBQEAAAAAAAAAAAAAAAABIQIREjEykf/aAAgBAQAGPwLJJ2IJpfpyjSOT/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERUSExYeH/2gAIAQEAAT8h3uHgSBPmYsc5yeeCXW6IZuOA/9oADAMBAAIAAwAAABA7z//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxDIsG//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREx/9oACAECAQE/ENUbnT//xAAcEAEBAAMAAwEAAAAAAAAAAAABEQAhMVGBscH/2gAIAQEAAT8QtCFEO9fHAPzR0kmq8Htx63yxKqDAmJAsKeSXA+e1X9z/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Martin-one&amp;quot;&quot;
        title=&quot;&amp;quot;Martin-one&amp;quot;&quot;
        src=&quot;/static/affe19c97a296e86670f792750586b61/acb04/martin-1.jpg&quot;
        srcset=&quot;/static/affe19c97a296e86670f792750586b61/bc01b/martin-1.jpg 188w,
/static/affe19c97a296e86670f792750586b61/bf173/martin-1.jpg 375w,
/static/affe19c97a296e86670f792750586b61/acb04/martin-1.jpg 750w,
/static/affe19c97a296e86670f792750586b61/ec605/martin-1.jpg 1125w,
/static/affe19c97a296e86670f792750586b61/c58a3/martin-1.jpg 1500w,
/static/affe19c97a296e86670f792750586b61/e1596/martin-1.jpg 2048w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-did-you-join-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-you-join-st6&quot; aria-label=&quot;why did you join st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did you join ST6?&lt;/h2&gt;
&lt;p&gt;I joined ST6 because it aligns with my vision of how an organization should be structured and how it should operate. I read about it in the book &lt;a href=&quot;https://www.reinventingorganizations.com/&quot;&gt;&quot;Reinventing Organizations&quot;&lt;/a&gt; a while ago. Since then, I genuinely believe this is the way to go for any existing or newly created organization. That was the selling point for me when I interviewed here.&lt;/p&gt;
&lt;p&gt;I like the fact that the guidelines and principles are accepted and genuinely applied by everyone at any time. I also like that I&apos;m well accepted and feel that my opinion and expertise matter, whatever the topic.&lt;/p&gt;
&lt;h2 id=&quot;tell-me-about-your-work-at-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tell-me-about-your-work-at-st6&quot; aria-label=&quot;tell me about your work at st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tell me about your work at ST6&lt;/h2&gt;
&lt;p&gt;Right at the start, I became part of the team, which works with a client called Markforged. It&apos;s a company which manufactures industrial 3D printers. I, myself, own a 3D printer, so it is pretty exciting to work with such a client on the inside and be part of it all. My role in all this, for now, is to help with the software, which manages 3D printer farms and controls what gets printed, where, and when. The technologies we use are all JavaScript-oriented, like &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;Node.js&lt;/a&gt;, &lt;a href=&quot;https://threejs.org/&quot;&gt;three.js&lt;/a&gt;, &lt;a href=&quot;https://jestjs.io/&quot;&gt;Jest&lt;/a&gt;. Then we have &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt;, &lt;a href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt;, and &lt;a href=&quot;https://circleci.com/&quot;&gt;CircleCI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Outside the project, I&apos;m part of the Office and Branding circles. Since I&apos;m working from the office, it makes sense to join the former. About the latter, branding&apos;s something out of my comfort zone, and it was something I wanted to do to widen my scope and knowledge. The people in the circle accept me and value my opinion, so it&apos;s a pleasure to be there. This is where the organization&apos;s culture enables me to join a domain in which I&apos;m not so proficient, but still contribute and grow.&lt;/p&gt;
&lt;h2 id=&quot;what-would-you-say-are-some-of-the-biggest-challenges-you-face-at-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-would-you-say-are-some-of-the-biggest-challenges-you-face-at-st6&quot; aria-label=&quot;what would you say are some of the biggest challenges you face at st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What would you say are some of the biggest challenges you face at ST6?&lt;/h2&gt;
&lt;p&gt;The fact that it&apos;s hard to abstract yourself from what you have already learned from the corporate world. It&apos;s pretty different how everything operates here—it&apos;s like you never had any professional experience, and you start building everything from the ground up. My colleagues at ST6 have already built a lot, and it&apos;s both easy and interesting to see what they had to go through to achieve all of this. It&apos;s also thrilling to see where all this will take us, but that&apos;s a challenge I&apos;m happy to take on any day.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/698427ff1f7720fa474887220ccb0fd6/c3b2b/martin-2.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGfFCRZ0Yf/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADBCER/9oACAEBAAEFAnU1FC5npl/Xz81NP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AUf/xAAeEAABAgcBAAAAAAAAAAAAAAABABACERIhMUFRYf/aAAgBAQAGPwKk5RIBOmjn4rdb/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARITFRQf/aAAgBAQABPyG6JYvHJWsbIXEPUnRUjMaIqFmJtP/aAAwDAQACAAMAAAAQEM//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPxBX/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Qg//EABoQAQADAQEBAAAAAAAAAAAAAAEAESExQXH/2gAIAQEAAT8QZ9QNEXH8tADMyLUq6mkarUTqi+fIrhiFQm5E13yf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Martin-two&amp;quot;&quot;
        title=&quot;&amp;quot;Martin-two&amp;quot;&quot;
        src=&quot;/static/698427ff1f7720fa474887220ccb0fd6/acb04/martin-2.jpg&quot;
        srcset=&quot;/static/698427ff1f7720fa474887220ccb0fd6/bc01b/martin-2.jpg 188w,
/static/698427ff1f7720fa474887220ccb0fd6/bf173/martin-2.jpg 375w,
/static/698427ff1f7720fa474887220ccb0fd6/acb04/martin-2.jpg 750w,
/static/698427ff1f7720fa474887220ccb0fd6/ec605/martin-2.jpg 1125w,
/static/698427ff1f7720fa474887220ccb0fd6/c58a3/martin-2.jpg 1500w,
/static/698427ff1f7720fa474887220ccb0fd6/c3b2b/martin-2.jpg 3648w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-do-you-prefer-to-start-your-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-do-you-prefer-to-start-your-day&quot; aria-label=&quot;how do you prefer to start your day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do you prefer to start your day?&lt;/h2&gt;
&lt;p&gt;I like to start my day with any exercise—running, swimming, activities... Mornings are the part of the day in which you have the least distraction, so it&apos;s good to keep the discipline.&lt;/p&gt;
&lt;h2 id=&quot;work-from-the-office-or-remote-why&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#work-from-the-office-or-remote-why&quot; aria-label=&quot;work from the office or remote why permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Work from the office or remote? Why?&lt;/h2&gt;
&lt;p&gt;Hybrid. I think people should be able to be flexible and be able to switch at any time. I believe there is no need to marry one option, but maybe choose a primary one.&lt;/p&gt;
&lt;h2 id=&quot;what-are-your-interests-outside-of-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-are-your-interests-outside-of-work&quot; aria-label=&quot;what are your interests outside of work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What are your interests outside of work?&lt;/h2&gt;
&lt;p&gt;They are too many… Family and friends come first. When I feel in good shape, I do triathlons, half-marathons, or bike rides. I also do seasonal sports like snowboarding and windsurfing. Throughout the pandemic, I discovered my cooking side, and I&apos;m still exploring it. When I find time outside any of that, which is rare now, I&apos;m pretty interested in IoT stuff, like building your battery pack, solar panels, or anything small you might program.&lt;/p&gt;
&lt;h2 id=&quot;whats-one-thing-you-are-learning-now-and-why-is-it-important&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-one-thing-you-are-learning-now-and-why-is-it-important&quot; aria-label=&quot;whats one thing you are learning now and why is it important permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s one thing you are learning now, and why is it important?&lt;/h2&gt;
&lt;p&gt;I&apos;m learning how to deliver my full potential to the whole organization. It&apos;s something I never felt I could do in any of my previous workplaces. Now, I know it will take some time and adjustment, but I&apos;m certain that what I give and what I take back will be much better.&lt;/p&gt;
&lt;h2 id=&quot;share-your-passions-with-us&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#share-your-passions-with-us&quot; aria-label=&quot;share your passions with us permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Share your passions with us&lt;/h2&gt;
&lt;p&gt;Check our &lt;a href=&quot;/careers/&quot;&gt;careers&lt;/a&gt; page, join the ST6 team, and bring your whole self!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the ST6ers - Hristo]]></title><description><![CDATA[Why did you join ST6? I am truly passionate about transforming work culture and the ways humans create value together. I have co-founded…]]></description><link>https://st6.io/blog/meet-the-st6ers-hristo/</link><guid isPermaLink="false">https://st6.io/blog/meet-the-st6ers-hristo/</guid><pubDate>Thu, 22 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/68e1649eed3223f55f502bfe9d1c08f4/4b319/hristo.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAC/9oADAMBAAIQAxAAAAGpkKZrBIH/xAAbEAADAAIDAAAAAAAAAAAAAAABAgMABBEiMv/aAAgBAQABBQIbK5S/U3bmaIJOgVn9f//EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAEDAQE/AYf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAAQIRIRAxMv/aAAgBAQAGPwKorTEdnhMuPH//xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhMUFhkf/aAAgBAQABPyHFsUvLKBsejAr11m7DFr3EXhXTyZJa+T//2gAMAwEAAgADAAAAELvP/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EIbH/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQARMVH/2gAIAQIBAT8QRrZT2f/EABsQAQEAAwEBAQAAAAAAAAAAAAERACExgVFh/9oACAEBAAE/ELrpyIbkp7jBIDfA/CXA8dadm/TN6UFatVPzBgzAdlA4ncD2Rn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Hristo&quot;
        title=&quot;Hristo&quot;
        src=&quot;/static/68e1649eed3223f55f502bfe9d1c08f4/acb04/hristo.jpg&quot;
        srcset=&quot;/static/68e1649eed3223f55f502bfe9d1c08f4/bc01b/hristo.jpg 188w,
/static/68e1649eed3223f55f502bfe9d1c08f4/bf173/hristo.jpg 375w,
/static/68e1649eed3223f55f502bfe9d1c08f4/acb04/hristo.jpg 750w,
/static/68e1649eed3223f55f502bfe9d1c08f4/ec605/hristo.jpg 1125w,
/static/68e1649eed3223f55f502bfe9d1c08f4/c58a3/hristo.jpg 1500w,
/static/68e1649eed3223f55f502bfe9d1c08f4/4b319/hristo.jpg 5472w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-did-you-join-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-you-join-st6&quot; aria-label=&quot;why did you join st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did you join ST6?&lt;/h2&gt;
&lt;p&gt;I am truly passionate about transforming work culture and the ways humans create value together. I have co-founded several organizations based on the principles of &lt;a href=&quot;https://sociocracy30.org/the-details/&quot;&gt;Sociocracy&lt;/a&gt;, &lt;a href=&quot;https://www.holacracy.org/&quot;&gt;Holacracy&lt;/a&gt;, and self-management, and one of them was acquired by Amazon in 2019. After the acquisition, I dedicated my time to sharing my learning and experience with other organizations as a professional coach and advisor. The passion for co-creating “human-loving organizations” never left me, so joining ST6, as one of the best genuinely sociocratic organizations in Bulgaria, was the natural next step in my career and life as a whole.&lt;/p&gt;
&lt;h2 id=&quot;tell-me-about-your-work-at-st6&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tell-me-about-your-work-at-st6&quot; aria-label=&quot;tell me about your work at st6 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tell me about your work at ST6&lt;/h2&gt;
&lt;p&gt;I am a member of four circles, and I hold multiple roles within the organization. They all inspire me.&lt;/p&gt;
&lt;p&gt;
  &lt;font color=&quot;#fd7e14&quot;&gt;
    &lt;strong&gt;As an internal coach and advisor&lt;/strong&gt;
  &lt;/font&gt;
  , I partner with people in a creative and thought-provoking process focused on
  personal and professional growth. By exploring their own inherent wisdom, people
  are inspired and curious to grow, find their own truths, and live happily. This
  type of relationship provokes me to grow as well.
&lt;/p&gt;
&lt;p&gt;
  &lt;font color=&quot;#fd7e14&quot;&gt;
    &lt;strong&gt;As a member of the Organization circle&lt;/strong&gt;
  &lt;/font&gt;
  , I support the organization on its journey to becoming even more sociocratic,
  self-managed, and human-loving. It is a never-ending evolution where we all learn
  to think, behave, and interact with each other mindfully, with higher awareness,
  empathy, and acceptance.
&lt;/p&gt;
&lt;p&gt;
  &lt;font color=&quot;#fd7e14&quot;&gt;
    &lt;strong&gt;As a member of the Strategy circle&lt;/strong&gt;
  &lt;/font&gt;
  , I support the organization with our strategic and business efforts and I participate
  in key strategic decisions that are the responsibility of the circle. Our purpose
  is to sense the ever-changing external environment and adopt the organizational
  strategy in the best way possible.
&lt;/p&gt;
&lt;p&gt;
  &lt;font color=&quot;#fd7e14&quot;&gt;
    &lt;strong&gt;As a member of the Branding circle&lt;/strong&gt;
  &lt;/font&gt;
  , I support the organization in all branding, PR, marketing, and communications
  efforts. Our purpose is to inform and educate people about the type of organization
  we are creating and its opportunities. Thus, people who resonate with our values
  can self-identify and decide if they want to join our organization.
&lt;/p&gt;
&lt;h2 id=&quot;whats-your-favorite-way-to-unwind-after-a-busy-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-your-favorite-way-to-unwind-after-a-busy-day&quot; aria-label=&quot;whats your favorite way to unwind after a busy day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s your favorite way to unwind after a busy day?&lt;/h2&gt;
&lt;p&gt;After a busy day, I like to spend time with my family. I’m a father of two boys—two and four years old. We play games and have a nourishing dinner together, and after they go to bed comes my personal time. I usually play video games online with my friends, meditate, or learn new things.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6663703eafe6c74febf6d614b5b50771/c94d3/family.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB57eNxUgP/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECEQMSEzL/2gAIAQEAAQUCgtiT1KSMElddDL7/AP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAICAQUAAAAAAAAAAAAAAAABESFBEiJRcbH/2gAIAQEABj8CSSshuesG7wjTfJeJGf/EABoQAAMBAQEBAAAAAAAAAAAAAAABESExQYH/2gAIAQEAAT8hmqK/gpIm8gVNYdDSwheholvXDEu3MP/aAAwDAQACAAMAAAAQQ8//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAeEAEAAwACAgMAAAAAAAAAAAABABEhMUFRYYGR4f/aAAgBAQABPxBtKlFpFjvwP3KMAqdw+nKhQzpNqIisBpovCdw5SUOF0/kS9jA8BxP/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Hristo&amp;#39;s Family&quot;
        title=&quot;Hristo&amp;#39;s Family&quot;
        src=&quot;/static/6663703eafe6c74febf6d614b5b50771/acb04/family.jpg&quot;
        srcset=&quot;/static/6663703eafe6c74febf6d614b5b50771/bc01b/family.jpg 188w,
/static/6663703eafe6c74febf6d614b5b50771/bf173/family.jpg 375w,
/static/6663703eafe6c74febf6d614b5b50771/acb04/family.jpg 750w,
/static/6663703eafe6c74febf6d614b5b50771/ec605/family.jpg 1125w,
/static/6663703eafe6c74febf6d614b5b50771/c58a3/family.jpg 1500w,
/static/6663703eafe6c74febf6d614b5b50771/c94d3/family.jpg 6720w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-are-your-interests-outside-of-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-are-your-interests-outside-of-work&quot; aria-label=&quot;what are your interests outside of work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What are your interests outside of work?&lt;/h2&gt;
&lt;p&gt;Latin-American dancing, snowboarding, kite-surfing, motorcycling, mountain biking, hiking, video games, photography, meditation, yoga, eastern philosophies, psychology, you name it! :)
My restless mind pushed me in many directions, and as a result, I started various hobbies and later on struggled to keep up with all of them. Lately, eastern wisdom and meditation have helped me learn to let go and find pleasure in doing less rather than “drinking more coffee and doing more stupid things faster” :)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7b9f690090cb5952d3b80927a6906e49/4b319/meditation.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/aAAwDAQACEAMQAAABJ478qRIP/8QAGhAAAgIDAAAAAAAAAAAAAAAAAiEBEgMRE//aAAgBAQABBQLHWnVGcbAmZqYf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAACH/2gAIAQIBAT8BV//EAB0QAAICAQUAAAAAAAAAAAAAAAABESJhAhAhMZH/2gAIAQEABj8CjyUXXGCtcLZTpR2f/8QAGBABAQEBAQAAAAAAAAAAAAAAAREAMUH/2gAIAQEAAT8hta08Gpkp8XXK7CdMzDzEkjMY/9oADAMBAAIAAwAAABDf7//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8QSwh//8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBx/9oACAECAQE/EFbV/8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFBUf/aAAgBAQABPxC+p7NFPlp0l8jr2UZuUQ8k9OC/uwZsGw8GHhEqzEye8Z8n/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Hristo Meditating&quot;
        title=&quot;Hristo Meditating&quot;
        src=&quot;/static/7b9f690090cb5952d3b80927a6906e49/acb04/meditation.jpg&quot;
        srcset=&quot;/static/7b9f690090cb5952d3b80927a6906e49/bc01b/meditation.jpg 188w,
/static/7b9f690090cb5952d3b80927a6906e49/bf173/meditation.jpg 375w,
/static/7b9f690090cb5952d3b80927a6906e49/acb04/meditation.jpg 750w,
/static/7b9f690090cb5952d3b80927a6906e49/ec605/meditation.jpg 1125w,
/static/7b9f690090cb5952d3b80927a6906e49/c58a3/meditation.jpg 1500w,
/static/7b9f690090cb5952d3b80927a6906e49/4b319/meditation.jpg 5472w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;share-your-passions-with-us&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#share-your-passions-with-us&quot; aria-label=&quot;share your passions with us permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Share your passions with us&lt;/h2&gt;
&lt;p&gt;Check our &lt;a href=&quot;/careers/&quot;&gt;careers&lt;/a&gt; page, join the ST6 team, and bring your whole self!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Transparency - The Foundation For Startup Success]]></title><description><![CDATA[Illustration 193041456 © Tarikvision - Dreamstime.com In early 2014, I created my first real startup, Loanbase. It didn’t start out by that…]]></description><link>https://st6.io/blog/transparency-the-foundation-for-startup-success/</link><guid isPermaLink="false">https://st6.io/blog/transparency-the-foundation-for-startup-success/</guid><pubDate>Wed, 09 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/da8aad00d258bc898594998d2acce62f/4b190/transparency.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBP/EABYBAQEBAAAAAAAAAAAAAAAAAAECBP/aAAwDAQACEAMQAAAB72aaKGv/xAAXEAEBAQEAAAAAAAAAAAAAAAABEBEA/9oACAEBAAEFAuNyKz//xAAWEQADAAAAAAAAAAAAAAAAAAABEBH/2gAIAQMBAT8BNX//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAEAAwAAAAAAAAAAAAAAAAAQACEx/9oACAEBAAY/Apbp/8QAGxABAQACAwEAAAAAAAAAAAAAAREAIRAxQWH/2gAIAQEAAT8hu/gbxJIiPXCRozeIh6d4EJn/2gAMAwEAAgADAAAAEGsf/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxBLwR//xAAXEQADAQAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/EDbi/8QAHBABAAICAwEAAAAAAAAAAAAAAQARITFBUYGx/9oACAEBAAE/ECztByub38gH0jKz2DYMWyJFwtsB03iVAVruf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;alt_text&quot;
        title=&quot;Transparency in Business&quot;
        src=&quot;/static/da8aad00d258bc898594998d2acce62f/acb04/transparency.jpg&quot;
        srcset=&quot;/static/da8aad00d258bc898594998d2acce62f/bc01b/transparency.jpg 188w,
/static/da8aad00d258bc898594998d2acce62f/bf173/transparency.jpg 375w,
/static/da8aad00d258bc898594998d2acce62f/acb04/transparency.jpg 750w,
/static/da8aad00d258bc898594998d2acce62f/4b190/transparency.jpg 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Illustration &lt;a href=&quot;https://www.dreamstime.com/d-isometric-flat-vector-conceptual-illustration-corruption-illegal-business-transparency-financial-clarity-anti-policies-image193041456&quot;&gt;193041456&lt;/a&gt; © &lt;a href=&quot;https://www.dreamstime.com/tarikvision_info&quot;&gt;Tarikvision&lt;/a&gt; - &lt;a href=&quot;https://www.dreamstime.com&quot;&gt;Dreamstime.com&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;In early 2014, I created my first real startup, Loanbase. It didn’t start out by that name, but that’s a different story. Within two years of starting, Loanbase became the biggest P2P Bitcoin lending platform in the world. Within a year of reaching this peak, the company failed and we disbanded! This was a very painful experience, which prompted me to do a lot of soul-searching.&lt;/p&gt;
&lt;p&gt;The first sign that things weren’t going well was that one of our best engineers left the company at the very peak of our “success”. One of the reasons that he left was that the equity structure wasn’t complete yet. We had put it off for some time because we were busy doing other things. In retrospect, this certainly wasn’t the only reason he left, and it never is. The equity was just the final straw for him. It took me a while to figure out what all the other straws were and the list was long. It was a death by a thousand paper cuts and a few swift sword chops! Our business wasn’t going well, the product-market fit wasn’t there, the traction wasn’t there, my co-founder and I were frequently having heated arguments in front of the employees, but worst of all… our accountability, to our team, our customers, and our shareholders, was nonexistent. While all of this was happening, we kept telling our stakeholders and (worst of all) ourselves, that everything was fine!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8ed6066186a999f64476f9d089b1c184/4b190/failed-rocket.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.1063829787234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIGAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAVzqreM6UAP/xAAZEAADAQEBAAAAAAAAAAAAAAAAAQISIjH/2gAIAQEAAQUCTQ+m/cyYkxB//8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEDERL/2gAIAQMBAT8BUVMwf//EABURAQEAAAAAAAAAAAAAAAAAAAAS/9oACAECAQE/AaU//8QAGRAAAgMBAAAAAAAAAAAAAAAAAAEQETIx/9oACAEBAAY/AilGUcMo/8QAGhAAAwADAQAAAAAAAAAAAAAAAAERIUHxcf/aAAgBAQABPyGYRYCsgcgpqvDln//aAAwDAQACAAMAAAAQuD//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFx/9oACAEDAQE/EMhW7v/EABYRAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPxB2R//EABsQAQADAQADAAAAAAAAAAAAAAEAETEhUYGR/9oACAEBAAE/EKXpCWgq2o7OhA8x8YgeqtFJ7iTX0M//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;alt_text&quot;
        title=&quot;failed rocket&quot;
        src=&quot;/static/8ed6066186a999f64476f9d089b1c184/acb04/failed-rocket.jpg&quot;
        srcset=&quot;/static/8ed6066186a999f64476f9d089b1c184/bc01b/failed-rocket.jpg 188w,
/static/8ed6066186a999f64476f9d089b1c184/bf173/failed-rocket.jpg 375w,
/static/8ed6066186a999f64476f9d089b1c184/acb04/failed-rocket.jpg 750w,
/static/8ed6066186a999f64476f9d089b1c184/4b190/failed-rocket.jpg 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Illustration &lt;a href=&quot;https://www.dreamstime.com/d-isometric-flat-vector-conceptual-illustration-corruption-illegal-business-transparency-financial-clarity-anti-policies-image193041456&quot;&gt;193041456&lt;/a&gt; © &lt;a href=&quot;https://www.dreamstime.com/tarikvision_info&quot;&gt;Tarikvision&lt;/a&gt; - &lt;a href=&quot;https://www.dreamstime.com&quot;&gt;Dreamstime.com&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;By contrast, we’ve been running ST6 for more than 3 years now. Our organization is twice as big as Loanbase at its peak, we’re self-sustainable, 10x more profitable than the closest competitors in our segment, our average employee compensation is 20% higher than what the competitors offer, and our employee churn rate for this entire time has been 0. So the problems we encountered with Loanbase were certainly not unavoidable. &lt;strong&gt;I believe that nearly all of them could have been avoided had we been more transparent!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;better-decision-making-with-transparency-and-accountability&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#better-decision-making-with-transparency-and-accountability&quot; aria-label=&quot;better decision making with transparency and accountability permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Better Decision-Making with Transparency and Accountability&lt;/h2&gt;
&lt;p&gt;Transparency keeps you honest and focused, makes your organization more resilient, provides you with the highest probability of success, and makes everybody accountable. Of course, the ultimate accountability comes in the form of the startup failing if you make enough bad decisions. However, you might already realize that keeping yourself accountable isn’t something you should do once every couple of years (the approximate time it takes for you to burn through your runway). Your monthly check-ins with investors aren’t enough either. Not only are they not enough, but the whole principle of those check-ins is completely broken! Instead, you should do it every single day. Transparency also allows you to &lt;em&gt;easily&lt;/em&gt; delegate decision-making to other members of your organization. That frees you up to focus on the issues that need your attention the most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you hire smart people, then it would be an absolute pity if you didn’t enable them to make the best decisions possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I ran across &lt;a href=&quot;https://medium.com/morozko-method/to-make-better-decisions-40bbf57fe46&quot;&gt;a very interesting blog post by Thomas Seager&lt;/a&gt; which defined a decision as “&lt;em&gt;an irreversible commitment of resources.&lt;/em&gt;” The blog post is an excellent dive into what it takes to make a decision. One of the key takeaways was that if you wanted “&lt;em&gt;to empower people in your organization to make decisions, you must communicate to them the resources they have the right to commit.&lt;/em&gt;” That’s a sentiment that I mostly agree with and we have a very similar understanding at ST6. In addition, we find that we also have to provide people with all the relevant resources they need in order to make a decision. The key things that people need to know about when they make a commitment of resources are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All Relevant &lt;strong&gt;Communication&lt;/strong&gt; and &lt;strong&gt;Decisions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;All Company &lt;strong&gt;Finances&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The overall state of company finances&lt;/li&gt;
&lt;li&gt;Pricing, sales, and income&lt;/li&gt;
&lt;li&gt;Spending and salaries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a founder, you want to have a clear view of all of the information you have at your disposal in order to make the best decisions. If you hire smart people, then it would be an absolute pity if you didn’t enable them to make the best decisions possible.&lt;/p&gt;
&lt;h2 id=&quot;transparency-in-communication-and-decisions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transparency-in-communication-and-decisions&quot; aria-label=&quot;transparency in communication and decisions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transparency in Communication and Decisions&lt;/h2&gt;
&lt;p&gt;Usually, people look up to the leadership of the companies to make great decisions. The reason why that happens is not that the leadership are the smartest and most experienced people (I don’t discount the possibility that they might be), but because they’re the ones that usually have enough information to make a decision and the permission to commit resources. If you want to enable more people in the company to make decisions, you not only have to give them permission to commit resources but you have to give them enough relevant information. Note that this doesn’t preclude the company from taking into account people’s experience and competency when helping vet those decisions.&lt;/p&gt;
&lt;p&gt;Within ST6, we strive to keep all legally permissible communication available in channels accessible to everybody in the organization. All of the internal team communication and external communication with clients is shared in the corresponding Slack channels. Before I reach out to a client for any communication that is relevant to the team, I first share it in the Slack channel for that client and I ensure that the team provides me with constructive feedback. Only then do I send it to the client. Likewise, I also see all the day-to-day communication related to that account in Slack. Each team (called a circle) has a specific domain it owns within the organization. Each circle maintains public meeting notes, which contain the discussions and decisions that they’ve made.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/546347dff2810472366847a900b2bb86/302a4/link-circles.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.40425531914893%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABOUlEQVR42p1Ry0oDQRDc//8VPelBEBUURGPEEAl6ED1EJatJNvuYmZ7pp+zGzcOjdZihZ6rorurMekAUD2JmqrY+VU3UtCcws/fedpCZGbEm1PO7+uiydCBIavtQVUT6mi+Go3EIgIhbcVFR4wWSBJAQdV6Sqi5L+l7R20csG0FMAUBEiEhEnPdE1IovhvVg4sy6CbuWL9N4cFa4wDEpJB1M/PHVqjfSMmJKD+NJjCl7eoNpnn7/umGKih+e3cb81zK+vkNbbsyLfM5yZs7KhiPumWTRouJNiYQpwZ8UXAiqmsWkswVClPVrIs2X2ISd2M3qxjkf1gQRqRvnA/wGdvPoDs8KlpZ7eludXJc7C2uvqq5v70cBwNTy7/ndaLxNOyatPVcNr2puPId+ir1VESGiD0AdtuJ/4wfNqkUhq66cwQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;alt_text&quot;
        title=&quot;Linked Circles&quot;
        src=&quot;/static/546347dff2810472366847a900b2bb86/1d69c/link-circles.png&quot;
        srcset=&quot;/static/546347dff2810472366847a900b2bb86/4dcb9/link-circles.png 188w,
/static/546347dff2810472366847a900b2bb86/5ff7e/link-circles.png 375w,
/static/546347dff2810472366847a900b2bb86/1d69c/link-circles.png 750w,
/static/546347dff2810472366847a900b2bb86/302a4/link-circles.png 1080w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In addition to having good practices for information-sharing, we also have an organizational structure that fosters the distribution of information across the entire organization. We’ve been inspired by &lt;a href=&quot;https://patterns.sociocracy30.org/circle.html&quot;&gt;Sociocracy 3.0 to adopt the circles as an organizational structure&lt;/a&gt;. Each team member is free to join any circle within the organization &lt;a href=&quot;https://patterns.sociocracy30.org/double-linking.html&quot;&gt;which results in double-linking&lt;/a&gt; and the proliferation of relevant information within other circles.&lt;/p&gt;
&lt;h2 id=&quot;transparency-in-company-finances&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transparency-in-company-finances&quot; aria-label=&quot;transparency in company finances permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transparency in Company Finances&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/939ff28d6b7a63388e09abf4242f3a01/dca52/quickbooks-dashboard.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.95744680851064%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACqUlEQVR42m2SSY8cRRCF64+MF+TxACfwL+WIkA8WQkLIGLDFASQjTuCxe2/P1kxPd3uWXqq6spasLZfKD1W1NNYgQkqF4mVm6MV74X32xef1l0+e8Gj/wD14+Al79x7cOfeac/8/dYs9ZG/vPvuPD9h//Kl7tH/Q1Mb7/fVr+sOx6w/GdDo9ut0+vf6QXm/Q5k63z9sG7w1v606nz7tOj8O33RYbDMecnEzc8x9/wru6Xrksr7A1Tjlw3A1bgwi2YO1d3NaY5nIX7bfJZOK88+mcKJbIrMSfHCKuzsiKChFFXC9X1EozE4J5HOO0QWmNsRaZZRRFQVVVJEmKso7+YIg3nS2Ik4y8qOCf31CLLmlmkGmOLQ2zJOWbiwu+iwTdMET4QdswzwuKosRaS1mWNFwHo/d4nfc9fF+QypxLseY6XhGVIb7cEEZLhr7Ps/GIHy6mHEaCLIrahk2zqixbhlJKCm3pD0Z459MZIkqReclp+DN/Xn7Lq/NfeHH6Pb9OXuKspb9aMVgu0daSygxrLFllEIUirzRFkVO1I4/wLmYLElmQF6plmaQZSulW9CY3UphS3RqhtaYsVatz2byrHdbsnBmNxniz2Qe2YUwqC7aBYLUKsOaj12VZcXVzQxTHOzudo65rjDGtfpUuOA5fApqjo9Mdw13DHGslxkQoG2Nq3X6slG5ZObdbDlsbjDW7CbQmShIugzOUUYzHR3iz+QeX54osL92r+XO+Pv6KF9OnLKM5mWzWQqG0Itc5aRWTqwxtDGkq2W5DhIgIw7Qh3ozsvOubNcbiSmX4o3F0saArBFbrjxv7P9GY4qcFUVagdauxOz45wTs6PqtX64DlcuPKOMEmkiyKCUNBsA3Z+AG+HxAE29u8Xm/wgxB/K9hsW8xJmfHX32/sv73hobzdtMw0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;alt_text&quot;
        title=&quot;image_tooltip&quot;
        src=&quot;/static/939ff28d6b7a63388e09abf4242f3a01/1d69c/quickbooks-dashboard.png&quot;
        srcset=&quot;/static/939ff28d6b7a63388e09abf4242f3a01/4dcb9/quickbooks-dashboard.png 188w,
/static/939ff28d6b7a63388e09abf4242f3a01/5ff7e/quickbooks-dashboard.png 375w,
/static/939ff28d6b7a63388e09abf4242f3a01/1d69c/quickbooks-dashboard.png 750w,
/static/939ff28d6b7a63388e09abf4242f3a01/78797/quickbooks-dashboard.png 1125w,
/static/939ff28d6b7a63388e09abf4242f3a01/aa440/quickbooks-dashboard.png 1500w,
/static/939ff28d6b7a63388e09abf4242f3a01/dca52/quickbooks-dashboard.png 1550w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Another key area of transparency is financial. In standard organizations, company leadership also factors in the financial situation of the company when they’re making decisions. We find that enabling employees to make decisions also requires financial information to be made available. Within ST6, each employee has full access to the complete state of company finances, which is provided to them via a shared reporting account in Quickbooks. They can run any financial report or dig into every transaction that the company makes. As you can imagine, the financial accountability of ST6 is far greater than any other private company. In fact, we find that even public institutions don’t provide such direct access to financial information to their constituents.&lt;/p&gt;
&lt;p&gt;We share all of the analysis relating to our formation of pricing. Each employee also sees the invoices we send out. They see the rates at which we bill the client for every person in the company. Quickbooks not only lets employees see the spending but the salaries as well. So each employee knows what everybody in the company is making, including the founders and partners within the company. &lt;strong&gt;That’s key to the enablement of employees to get involved in the decision-making process!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-results&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-results&quot; aria-label=&quot;the results permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Results&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/be54d7f6a9751360815c380521a24eff/4b190/rocket.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIB/9oADAMBAAIQAxAAAAHp5TQahsa1pKTFl//EABoQAAICAwAAAAAAAAAAAAAAAAABAhARITL/2gAIAQEAAQUCVozo7kopV//EABgRAAIDAAAAAAAAAAAAAAAAAAEQAhEh/9oACAEDAQE/AQpnaX//xAAWEQEBAQAAAAAAAAAAAAAAAAAQAQL/2gAIAQIBAT8Bpk//xAAaEAABBQEAAAAAAAAAAAAAAAABABARICFB/9oACAEBAAY/ArGeLA3/xAAcEAEAAgEFAAAAAAAAAAAAAAABABExECFBUWH/2gAIAQEAAT8hEreuvJUcS2GLAqY4k4M0/9oADAMBAAIAAwAAABAD9wP/xAAXEQEBAQEAAAAAAAAAAAAAAAABERAh/9oACAEDAQE/ECS4xB5n/8QAGBEBAAMBAAAAAAAAAAAAAAAAARARITH/2gAIAQIBAT8QW1BEt7H/xAAdEAEAAwABBQAAAAAAAAAAAAABABEhMUFRYXGB/9oACAEBAAE/ELY2ZEaKuE8R1AHUPbOHC6+zSFr2KGhXqxiwXe1lz//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;alt_text&quot;
        title=&quot;successful rocket launch&quot;
        src=&quot;/static/be54d7f6a9751360815c380521a24eff/acb04/rocket.jpg&quot;
        srcset=&quot;/static/be54d7f6a9751360815c380521a24eff/bc01b/rocket.jpg 188w,
/static/be54d7f6a9751360815c380521a24eff/bf173/rocket.jpg 375w,
/static/be54d7f6a9751360815c380521a24eff/acb04/rocket.jpg 750w,
/static/be54d7f6a9751360815c380521a24eff/4b190/rocket.jpg 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Photo &lt;a href=&quot;https://www.dreamstime.com/silver-red-space-rocket-launching-female-hand-blue-background-science-technology-startup-projects-research-development-image136284351&quot;&gt;136284351&lt;/a&gt; © &lt;a href=&quot;https://www.dreamstime.com/gearstd_info&quot; itemprop=&quot;author&quot;&gt; Gearstd &lt;/a&gt; - &lt;a href=&quot;https://www.dreamstime.com/&quot;&gt;Dreamstime.com&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;This whole exercise wouldn’t be worth the time if we didn’t find our results to be exceptional. As I mentioned in the beginning of the post: we’re self-sustainable, 10x more profitable than the top 3 closest competitors in our segment, our average employee compensation is 20% higher than what the competitors offer, and our employee churn rate for this entire time has been 0. This approach not only leads to excellent performance, but also enables all sorts of useful behavior. For example, employees can now set their own salaries and my life is much easier because I no longer have to think about who is getting fair compensation and who isn’t. The drama and tension around compensation are completely gone—nobody thinks about it. &lt;strong&gt;Our entire focus is on solving problems and realizing the vision of the company!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;P.S.&lt;/p&gt;
&lt;p&gt;Of course, we didn’t invent any of this ourselves. By the time Stefan, Ivaylo, and I started ST6, we had already built up a lot of experience with the problems of insufficient transparency and accountability. Stefan pushed us to learn more about what other competent people were doing. As the saying goes- &lt;a href=&quot;https://www.youtube.com/watch?v=a6jeZ7m0ycw&quot;&gt;“good artists copy; great artists steal” and we too are shameless&lt;/a&gt; about the fact that we’ve “stolen” some of these ideas from other successful entrepreneurs. In particular, from Ray Dalio’s “&lt;a href=&quot;https://www.youtube.com/watch?v=3kUQlAUoDPw&quot;&gt;Radical Transparency&lt;/a&gt;,” Frederic LaLoux’s “&lt;a href=&quot;https://www.reinventingorganizations.com/&quot;&gt;Reinventing Organizations&lt;/a&gt;,” Kagan &amp;#x26; Lahey’s “&lt;a href=&quot;https://ssir.org/books/excerpts/entry/becoming_a_deliberately_developmental_organization#&quot;&gt;Deliberately Developmental Organizations&lt;/a&gt;,” and &lt;a href=&quot;https://sociocracy30.org/the-details/&quot;&gt;Sociocracy 3.0&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Radical Transparency]]></title><description><![CDATA[In self-managed organizations like ST6, everyone is empowered to make important decisions on a daily basis and is able to impact the future…]]></description><link>https://st6.io/blog/radical-transparency/</link><guid isPermaLink="false">https://st6.io/blog/radical-transparency/</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2eb8400a6f66abc1c96af4a749c59e8a/3c492/transparency.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABcSAAAXEgFnn9JSAAADKklEQVR42gXBXUwbBQDA8XtRN1dKKb3aa3tt71qO9gqU0GsLLR0UBCzdoCuTzzgMcYBbtiAKbmNmIXP4QVyWkAwzjR9L1BiNLEMMiRNc4swMJkaNCc7EaEx80EcfL7m/v5+w9/MDc3N3z3xhadks5PPmzjffm5/duW/e3Pza/O2f/8wbt3bN1avXzeUzp82NzTvm3i+/m/t//G3e3vrSnJsYMU/2tJovXVgyf/3rX3P33nemcO3yRT66tcVzzy/SljK4/+M+2zvfsnrtOm+8eZP24hG6+7qYm51m+fU17v6wz08P/uTqyyucKvdzeXKIlYsX2PrqHgtzpxFWz81br71yxZqdnbXidaq19s6H1vuffG4Nl49ZT/V3WMVszEq3qNarL56xPvj0trV2411rY/uutTC/YJUM3bryZM46OzVqvb2+bg02yZYwd6LC6FiF3o4UHqeNxcXzLF1aobdJZbpo0NMgUWwUWZweYWNzm4+/2GH9rfeYP14kpzhp1USyiRDnZsZpDdUidBc0ks0SqUQQWXLTezhFe0uMfFQkWV+L6rfRE3cy3BFjZuZZTpxd4pmjPYw1e4lIDkKeKvweG111NaR8VQjJlI9yzs94Pko4FKQ1JpPTJKKqE5/fjuI5SFvYxuPpAJPDfZw/3sepfJS86kIWD5FR7ZS0Gp5u8lDSRIRUxks+KVExNNqzBtlYgBbNRyIkUu+343QcpNr2EPW6RksmTbMiMdAUpBTzovtqGGlwMRxxMhhykPE5EAq5IIW2MIVkDCUSoi7gJuhzk4hH6Yh7iQZdHKp6FCUkU6kMkUgaKGEFXRbJRdxMNrnIuA5Q0URaPA4ESXIS8LuQ/U4eOfAwAXc1huqmmI6RMZoxdIVSZ5ahwaOMjk5QPlJCCfrwBGR01cd8IcJUOsBEKkxZlxHCITupBhd6nYjdYUf1i4S8LtJhkXxCozmmI/mDROMJSqUBKk9009YYQZZEHDXVyF43aT1Iuy7TH/cjBGQn/oAbe40dVaqlL1lHsl4mm9C4NDXORKtBVzLJyYESY8fK9HTm6TRihJQgXoeNw8pjNAYlJMmN0yPyP+6nlvXNFmGYAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Radical Transparency&quot;
        title=&quot;Radical Transparency&quot;
        src=&quot;/static/2eb8400a6f66abc1c96af4a749c59e8a/1d69c/transparency.png&quot;
        srcset=&quot;/static/2eb8400a6f66abc1c96af4a749c59e8a/4dcb9/transparency.png 188w,
/static/2eb8400a6f66abc1c96af4a749c59e8a/5ff7e/transparency.png 375w,
/static/2eb8400a6f66abc1c96af4a749c59e8a/1d69c/transparency.png 750w,
/static/2eb8400a6f66abc1c96af4a749c59e8a/78797/transparency.png 1125w,
/static/2eb8400a6f66abc1c96af4a749c59e8a/3c492/transparency.png 1300w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In self-managed organizations like ST6, everyone is empowered to make important decisions on a daily basis and is able to impact the future of the organization. Information is a key part of any good decision-making process. Thus, in our organization, it is especially important that everyone has access to all the information needed to make adequate, informed decisions.&lt;/p&gt;
&lt;p&gt;In traditional organizations, access to information is restricted based on one’s position in the corporate hierarchy and only the CEO has access to all of the information. At ST6 we believe that&lt;/p&gt;
&lt;h2 id=&quot;the-truth-belongs-to-everyone&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-truth-belongs-to-everyone&quot; aria-label=&quot;the truth belongs to everyone permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;the truth belongs to everyone&lt;/h2&gt;
&lt;p&gt;and everyone in the organization has access to all of the information. We often say that here everyone is an acting CEO. Therefore, we have opened and made &lt;strong&gt;fully transparent&lt;/strong&gt; all information related to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Financial performance of the organization&lt;/li&gt;
&lt;li&gt;Revenue, profit, and expenses&lt;/li&gt;
&lt;li&gt;Active contracts and invoicing&lt;/li&gt;
&lt;li&gt;Pricing and customer offers&lt;/li&gt;
&lt;li&gt;Billing rates and hours&lt;/li&gt;
&lt;li&gt;Company bank accounts&lt;/li&gt;
&lt;li&gt;All other relevant information necessary for making CEO-level decisions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Furthermore, we have full transparency of all processes and numbers related to &lt;strong&gt;salaries, bonuses, and equity&lt;/strong&gt;. In addition to knowing how much everyone in the organization earns, everyone is empowered to decide their own salary—a process called &lt;a href=&quot;https://corporate-rebels.com/self-set-salaries/&quot;&gt;self-set salaries&lt;/a&gt;. Since you are your own boss, it only makes sense that you and only you will be able to decide how much you will get paid.&lt;/p&gt;
&lt;p&gt;Finally, to continue on the path of radical transparency, after each meeting we share notes outlining what happened in the meeting, what was discussed, and what decisions were made. This allows for full awareness throughout the organization about all dynamics, discussions, and decisions.&lt;/p&gt;
&lt;p&gt;As you can see, at ST6 we do not hold the truth as hostage. Access to information is not a privilege, restricted only to the higher ranks. There are no higher ranks. Everyone is empowered, enabled, and supported to make the best decisions possible.&lt;/p&gt;
&lt;p&gt;Rather than relying on the single person’s intelligence, we&lt;/p&gt;
&lt;h2 id=&quot;utilize-the-collective-wisdom&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#utilize-the-collective-wisdom&quot; aria-label=&quot;utilize the collective wisdom permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;utilize the &lt;a href=&quot;https://en.wikipedia.org/wiki/Collective_wisdom&quot;&gt;collective wisdom&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;to propel the organization forward. At the same time, by being actively involved in making important decisions, each of us has the opportunity to act, make mistakes, learn, and grow—personally, emotionally, spiritually, intellectually, and professionally!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Musings on Digital Transformation]]></title><description><![CDATA[For years I have been living with the idea that every company will become a software company because "Software is eating the world." I have…]]></description><link>https://st6.io/blog/musings-on-digital-transformation/</link><guid isPermaLink="false">https://st6.io/blog/musings-on-digital-transformation/</guid><pubDate>Tue, 13 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e6705435b78532849ab0136188e66d3c/0f98f/digital-butterfly.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAL/2gAMAwEAAhADEAAAAcF9BpDqIFr/xAAYEAADAQEAAAAAAAAAAAAAAAAAAQIxA//aAAgBAQABBQI5xLm0lRGPf//EABURAQEAAAAAAAAAAAAAAAAAAAIQ/9oACAEDAQE/AVP/xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwEn/8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEhIP/aAAgBAQAGPwIrJj//xAAaEAEAAgMBAAAAAAAAAAAAAAABABEQITFR/9oACAEBAAE/IYs1a7EArPcG3eD/2gAMAwEAAgADAAAAEOwP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARIf/aAAgBAwEBPxAOQcv/xAAWEQEBAQAAAAAAAAAAAAAAAAABACH/2gAIAQIBAT8Qey7f/8QAGxABAQEAAgMAAAAAAAAAAAAAAREAECExQVH/2gAIAQEAAT8QPOYCpRenR73xLwCxYZ9t/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Digital Butterfly Symbolizing Digital Transformation&quot;
        title=&quot;Digital Butterfly Symbolizing Digital Transformation&quot;
        src=&quot;/static/e6705435b78532849ab0136188e66d3c/acb04/digital-butterfly.jpg&quot;
        srcset=&quot;/static/e6705435b78532849ab0136188e66d3c/bc01b/digital-butterfly.jpg 188w,
/static/e6705435b78532849ab0136188e66d3c/bf173/digital-butterfly.jpg 375w,
/static/e6705435b78532849ab0136188e66d3c/acb04/digital-butterfly.jpg 750w,
/static/e6705435b78532849ab0136188e66d3c/ec605/digital-butterfly.jpg 1125w,
/static/e6705435b78532849ab0136188e66d3c/c58a3/digital-butterfly.jpg 1500w,
/static/e6705435b78532849ab0136188e66d3c/0f98f/digital-butterfly.jpg 1920w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For years I have been living with the idea that every company will become a software company because &lt;a href=&quot;https://a16z.com/2011/08/20/why-software-is-eating-the-world/&quot;&gt;&quot;Software is eating the world.&quot;&lt;/a&gt; I have been following the rise of software companies to the top of the public markets. I have co-founded and worked for software companies. I&apos;m immersed in this ecosystem and forever will be. Yet recently, I have been gaining a new perspective on business digitalization.&lt;/p&gt;
&lt;p&gt;I have started to realize that we are hitting a big wall. As more and more companies are digitally transforming themselves, the need for software developers is growing. Looking at the problem, it seems like a bandwidth one - there are not enough software engineers out there to solve all challenges. Until we have general purpose no-code development platforms and/or some form of artificial general intelligence, we (as an industry) need to solve this problem ourselves.&lt;/p&gt;
&lt;p&gt;Back to my utopian thinking that every company will become a software company. I was envisioning that every company would have technical founders (or C-level execs) with hordes of software developers. It turns out this is not possible (for now). The main reasons are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The above-mentioned bandwidth problem with not enough &lt;del&gt;minerals&lt;/del&gt; developers.&lt;/li&gt;
&lt;li&gt;Most of the founders (C-level execs) are not technical. And it&apos;s almost impossible for them to become highly technical. It takes &lt;a href=&quot;https://norvig.com/21-days.html&quot;&gt;10 years&lt;/a&gt; (or &lt;a href=&quot;https://en.wikipedia.org/wiki/Outliers_(book)&quot;&gt;10,000 hours&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Growing teams is hard. Growing software teams is even harder. Nurturing strong technical culture requires sharing core technical values which might be the hardest part for non-technical owners.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;What advice should our industry give to those that want to transform digitally?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My answer is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Focus on the Product!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...but what does &quot;Focus on the Product&quot; mean exactly?&lt;/p&gt;
&lt;h2 id=&quot;focus-on-product-management&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#focus-on-product-management&quot; aria-label=&quot;focus on product management permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Focus on Product Management&lt;/h2&gt;
&lt;p&gt;Instead of looking to hire the best software developers out there try to find one (or two) of the best product managers.&lt;/p&gt;
&lt;p&gt;A product manager is this mythical creature that has three heads - one for the customer, one for the technology, and one for the business. Depending on the context they should be able to put different hats on those heads and explain the whole picture to all parties involved.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 495px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a7861200308358d582f22bf04b53e05f/a4d88/what-is-product-management.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.74468085106383%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABzklEQVR42m2SaW+jMBiE+/9/12pbRZumVkkJxxIgQAPmMNjxgY93laA02Sgj5A+jeTxjiRfnnDHGWWuMsRcJITjnUkpjDKW07/txHM1V1jlrLVz0UhTF6+sbQsjzvP6iruvGccQYx3FclmV+UZqmURS9v28+EPqzXm82mzNsrdVaW2NmpaqqmucZAKy1dV1rrYUQi6O19n2fMWatnZUihJxhAHDOAUDf9xjjZQ8hpO97AKCUlmW5mMMw5Hn2k/8PTtN0KQGAIAg8zwvDMI7j9Xq9mJzzNE2X/ILc4DzPp2kCgOPxuFqthmEAgFnrz09vWSSEOBwOz5sJIVmWcc73+z1jrO/a0UBRd5yxgRDGGCGkbdtH+EdFUSCEloQQou3aMCulcUbPYRhijK21DsBd8zd4uW+32yGEoihKkqSqKozbvxWOswNCH/ed7ilMCGma5j4HAA2hWVHQ2TVUtSdNuJHaPs4GAGNMWZZKqXuTTtNAuV/zt2z6lYy/96Nf89m4RxgAlFJd1zHGlFJCCCklOHuc1NfxtGv4pmD5IP369D2pR3hZO03T13YbBMF2u6Xs9OM7AHt7DTxpBgApZRhG31WVJHsyjtcf4wyfz+v3D13hIFoCgNpuAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;What is Product Management? Intersection of Customer, Technology and Business circles.&quot;
        title=&quot;What is Product Management? Intersection of Customer, Technology and Business circles.&quot;
        src=&quot;/static/a7861200308358d582f22bf04b53e05f/a4d88/what-is-product-management.png&quot;
        srcset=&quot;/static/a7861200308358d582f22bf04b53e05f/4dcb9/what-is-product-management.png 188w,
/static/a7861200308358d582f22bf04b53e05f/5ff7e/what-is-product-management.png 375w,
/static/a7861200308358d582f22bf04b53e05f/a4d88/what-is-product-management.png 495w&quot;
        sizes=&quot;(max-width: 495px) 100vw, 495px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://www.prodpad.com/resources/guides/product-management-process/&quot;&gt;ProdPad&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Having a skilled product manager will help you craft a product vision and strategy. Align the whole team towards a shared goal, and move all in the right direction. You would rather have a small team sailing in the right direction than a big team sailing in the wrong one.&lt;/p&gt;
&lt;p&gt;Having a great product manager can even help you with outsourcing your software development to external contractors to do the &quot;heavy lifting&quot;.&lt;/p&gt;
&lt;p&gt;The critical part is that Product Managers should be part of your core team and organization. They should live your core values through the eyes of your customers.&lt;/p&gt;
&lt;h2 id=&quot;its-a-product-not-a-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-a-product-not-a-project&quot; aria-label=&quot;its a product not a project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s a Product, not a Project&lt;/h2&gt;
&lt;p&gt;If you look at your digital transformation as a temporary endeavor, you have already failed. Building a software product is like raising a child - it takes time, continuous effort, courage, and tears. It is a cultivation process.&lt;/p&gt;
&lt;p&gt;This is an area where traditional project thinking falls apart. The idea that you can &quot;fix the scope&quot; does not work in an ever-changing environment. It is rather the opposite - organizations should be able to deliver value continuously. The future belongs to those organizations that can continuously learn in a never-ending loop. &lt;a href=&quot;https://arstechnica.com/science/2020/03/inside-elon-musks-plan-to-build-one-starship-a-week-and-settle-mars/&quot;&gt;Can you build one Starship a week&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;To change this legacy project mindset, we need new tactics, techniques, tools, and practices. We need a new strategy - &lt;a href=&quot;https://www.infoq.com/minibooks/noprojects-value-culture&quot;&gt;&quot;A Culture of Continuous Value&quot;&lt;/a&gt;. That&apos;s the philosophy behind the &lt;a href=&quot;https://noprojects.org&quot;&gt;#noprojects&lt;/a&gt; movement.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 540px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/731e07854704aca39cb4a57f009d2769/07484/noprojects.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 130.31914893617022%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGk0lEQVR42lWVaXOT1xWA9WfaP5DM9Ev6oZCZpgVCE8q+hAbMFtsQAwaHAgFMWAwJSYjDElxsLAMykiVblvRK765dthbLQrYxtuXd2u1CTOp2+nRkJh96Z+7M/XDmmXPPOXMew2+EPO948vxezPO+lGedXOAvSoG/qgW2aEW2awV26kV2eUvs0Its1YpsUgtslAv8WS6wVi7wnljgHU+BCsvwO0+etZ4sH8glNqolNusltqkF9ugF9mk59nsL7FHz7PTMsVvN86meZ6+WZ7evxHY1zyZxgXWeBda6F6iwDO9LOda7sxywRTjeHaLOPsR5eYJjngyHg0vUKHPcD4zjGZrnp/Akn3nzVKvz7HsaZ6e0wFbvElvUAhukHGvFHIYPtRJbu19iMz4j4nARFiRGY0le9A/wZVeU2FQR+C+/Ht/wLFfvdtHRYeG+0UaTP8VW/W22Fahhm15ihzDNPZOEGEhjcQYRg0O0u/q4ak+QHM+RnlkmNb9CprxCcGCUm989Qu+1EhJcyJbbnOhNskcvsk3JYdjjLVItznCvR6fH7cAhuzG6ZJq0ca4P/kJjT4QW6x2MUhuXu4M0OCa4IaQYSoQZHoxjbrnGGWeSA74Se9Qcht16iTZ3nKQcRuyxEJWMmLwR7lqD3HOEyU02sTz0MSPuzfxrbAMtksTX8gQORYefp3jaa+eQWKQ68IoqbwHDgcAi16UXWDttBHxeWtpMnDP6uBlfIhS0sDLxGWlxIyHrDnKRP/Kiv5qWdht3HW5+UsdpFe20Kh1cdgc4FFjCcDRYpj5Y5J6rC7/g4rHNyY2eMN9pWcYSx/jn8/WEuzbiN32E/mQL2dR2HljcPBIFmsRpXD1nmHW8S4/4FYcDyxiOB8ucDRe5GH9Dh92HSXBijjhokWOExNMw9x6zyXPEPWdgcg1J/1GavVlkzYJsvcPtZy6aFYXrwWE+DyxiqA+VuRjKczNW4rEQ4r44SHv/KJ2+OGaXQr94jJjcStf9izxX/4Y1msCkpFEEjcFwL0Y1xjlvmfP9r1Z/ajgVWeSKb472ji4UwYXVJhFOjzI62MfY+DAWYQDVdImovZrOJ48RYl7MXQ5klw+32Yjg1HjoHeHLvjINoSKGhr4lrnhnMbW1Y2trpccmovUliAW9pEfS2CPjCE+u4H7UgLHtKV2+EObEAqLXh6YqGD39NLuTXAoVfgUu0uid5X5vBLs7xMNOhccDOayJcZzDkwhDs7hUGUHookN6iUUdxKVFUQcyeNQozzwh7HqAxsAcDZEyhoZwmQuBHG09PtJiE2293TwQR5G6L+CzVeFzXUbw6fQGogT8D5H9/XRZRNxqCKsjQKtLw6iKXAnPcCq82pQS58NlboSn6Hb+QJvTzoPwPGYhSIeaotP7nO7oJA49yHzyALGuTTw1t9AqJjE+MXI9tkRj6j+cj7wdv9WxOddXXq3BPywhbM4wVo+OwyUTHU5i8yewqQlGU3GG4j3kE4fwxE20+8bxCk8w+/r5ITDNhVCeukAJQ22gxBd9i5wRJ4j2eZkei+ITrIRUD/nZFBaHgtkVZDodJuYPIQpeTB6dV4tTLJfGYGWGWCLOWWWKmuAihiP+EscDJc6GilzWRmlyD/CjHKPZ2cdt3xg/hud4lC6jhHqRQlYeBZJ0JBaQRqZwjc7jGJmlIz7BSV+Ww/4ShipfkRp/kZORJc7GXtM4uMLV1L+5lVrm+6EVmod/ofn5z3z//A3fpt5wK/WGpsFlLsZeczb6mvq+19SGX1HjL1Gl5zFUVv1Bb56a0CL1kSUaupOcc6S55JvnSjDLteAC14NZmoILXAvOc1mdpFGf5mIwy9+lcU46RziqzXOwogoth2GrWmCvmuWgXoEuUftVG3XfmKi/6+DUt52cumXi9K1OTt+20nDHTv2tTk7cfEzdzaccu+Ok+utnHP7GzF4lS4Vl2KAUVh+faHmq/CWOuDPUStPUKbOc8Exw0hyj3hKnQZ/jlJihzhjg894Rat0ZjggTVLkm2Ns9vMrYoBQxrJUKrFcKbNaK7NIK7HNPcXA1OEONNMNReYaj0vTqrRWnqBGnOeKZ4qA4zT5hkk96X7LNNckGKU+FtarRP0h5/iQX+KiSrZxjl5JbLcOnapb9eo4qLUeVusB+Ncs+dYG98hy7xTm2ifN87J5jnTDLGjH/VqO//T/RV+RdZKNSkflbqW/XS+wU59jlmmSnM8N2xwSbXVNs6s3woT3DB/YMa3oyvOvOUWH9D3hWUczOVQWGAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Book cover of #noprojects - A Culture of Continuous Value&quot;
        title=&quot;Book cover of #noprojects - A Culture of Continuous Value&quot;
        src=&quot;/static/731e07854704aca39cb4a57f009d2769/07484/noprojects.png&quot;
        srcset=&quot;/static/731e07854704aca39cb4a57f009d2769/4dcb9/noprojects.png 188w,
/static/731e07854704aca39cb4a57f009d2769/5ff7e/noprojects.png 375w,
/static/731e07854704aca39cb4a57f009d2769/07484/noprojects.png 540w&quot;
        sizes=&quot;(max-width: 540px) 100vw, 540px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Cover of the book &lt;a href=&quot;https://www.infoq.com/minibooks/noprojects-value-culture/&quot;&gt;&quot;#noprojects - A Culture of Continuous Value&quot;&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Applying those new principles you can accelerate your (digital) transformation.&lt;/p&gt;
&lt;h2 id=&quot;epilogue&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#epilogue&quot; aria-label=&quot;epilogue permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Epilogue&lt;/h2&gt;
&lt;p&gt;To have your business transformation epiphany, you should focus on digital productization. It requires a new set of disciplines (Product Management) and a new mindset (#noprojects).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Software Craftsmanship for Kids]]></title><description><![CDATA[Late last year I was invited to my daughter's kindergarten to deliver a presentation about our profession. I thought it would be an…]]></description><link>https://st6.io/blog/software-craftsmanship-for-kids/</link><guid isPermaLink="false">https://st6.io/blog/software-craftsmanship-for-kids/</guid><pubDate>Wed, 07 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/82df2b0c4324d024e90b39771900ec46/c58a3/banner-paint-brush.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.57446808510638%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABhvIsIKkv/8QAGRAAAwADAAAAAAAAAAAAAAAAAQIDAAQh/9oACAEBAAEFAi3ISRp2AFmOLs0mGcu3/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEAAwAAAAAAAAAAAAAAAAAAEBEh/9oACAECAQE/AXR//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECERIxECJB/9oACAEBAAY/AsV6dkmSS1fGMaHJ7Z//xAAZEAEAAwEBAAAAAAAAAAAAAAABABEhMWH/2gAIAQEAAT8huwY1ZYFbdgqgMEYSpxZ9J2ILan//2gAMAwEAAgADAAAAEIDv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREA/9oACAEDAQE/EEZNN//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxA1plv/xAAcEAEAAwACAwAAAAAAAAAAAAABABEhMUFRcfD/2gAIAQEAAT8QdEAAHA8H3qIadu9kqWasqipiQvGIMFXldibnCFFz/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Paint Brushes With Empty Notebook&quot;
        title=&quot;Paint Brushes With Empty Notebook&quot;
        src=&quot;/static/82df2b0c4324d024e90b39771900ec46/acb04/banner-paint-brush.jpg&quot;
        srcset=&quot;/static/82df2b0c4324d024e90b39771900ec46/bc01b/banner-paint-brush.jpg 188w,
/static/82df2b0c4324d024e90b39771900ec46/bf173/banner-paint-brush.jpg 375w,
/static/82df2b0c4324d024e90b39771900ec46/acb04/banner-paint-brush.jpg 750w,
/static/82df2b0c4324d024e90b39771900ec46/ec605/banner-paint-brush.jpg 1125w,
/static/82df2b0c4324d024e90b39771900ec46/c58a3/banner-paint-brush.jpg 1500w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Late last year I was invited to my daughter&apos;s kindergarten to deliver a presentation about our profession. I thought it would be an interesting challenge to explain &quot;Software Craftsmanship&quot; to 4/5-year-olds and capture their imagination.&lt;/p&gt;
&lt;h2 id=&quot;the-structure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-structure&quot; aria-label=&quot;the structure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The structure&lt;/h2&gt;
&lt;p&gt;As with any presentation, the keys to success are: knowing your audience and preparing engaging content that will resonate well. Keeping in mind that the attention span of small kids is short (the rule being to multiply their age by 2-5 minutes), I was aiming for roughly a 15-minute talk.&lt;/p&gt;
&lt;p&gt;To make the talk entertaining, I decided to follow two basic principles that work great for kids: play a game and give everyone presents.&lt;/p&gt;
&lt;p&gt;Here is a brief overview of the structure that I was about to follow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start with content.&lt;/strong&gt; In my case, that was the slides. I knew that the slides would quickly bore the children, but still, I should deliver my core message. The kids would be most focused during the first 5 minutes, so I needed to limit the number of slides as much as possible and present relatable concepts with pictures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Show &amp;#x26; play a mobile game&lt;/strong&gt;. The best way to illustrate your profession is to show off the products it produces. In my case, I decided to show a simple mobile game that the kids could play on a couple of devices I brought with me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Give presents&lt;/strong&gt;. Give away something tangible that the audience can bring back home.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-slides---framing-the-message&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-slides---framing-the-message&quot; aria-label=&quot;the slides   framing the message permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The slides - framing the message&lt;/h2&gt;
&lt;p&gt;Usually, presentations start with a few words about the speaker. This one was no exception. I presented myself as Elitsa&apos;s father (Elitsa is my daughter). This had a couple of benefits: first, every kid knew who Elitsa was, and second, she would feel proud that her father was there in front of her pals.&lt;/p&gt;
&lt;p&gt;Now to the main message. It turned out it was far easier to explain &quot;software&quot; to young kids than I anticipated. In the past, I have tried to explain what I do to my grandparents, and I felt miserable. With the kids, it was simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We all have mobile phones - those are hardware devices. Every phone has icons with applications and games - this is software.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...and that&apos;s all - they got it.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dfcef9b80999fc4f64abcbc757bf2c91/b17f8/stefan-on-software-craftsmanship-for-kids.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEA//EABYBAQEBAAAAAAAAAAAAAAAAAAIBA//aAAwDAQACEAMQAAABpalyehMKf//EABgQAAMBAQAAAAAAAAAAAAAAAAABAhEQ/9oACAEBAAEFAswdzy6c1qZLP//EABcRAQADAAAAAAAAAAAAAAAAAAACESH/2gAIAQMBAT8BxcX/xAAXEQADAQAAAAAAAAAAAAAAAAAAAhES/9oACAECAQE/AYxhz//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExAhCh/9oACAEBAAY/AqOY6SuH4cndGj//xAAbEAEBAQEAAwEAAAAAAAAAAAABEQAhMUFxgf/aAAgBAQABPyFDPS50J48XQ+5CUr2fjLGVg+6A89a13//aAAwDAQACAAMAAAAQnA//xAAXEQADAQAAAAAAAAAAAAAAAAAQETFR/9oACAEDAQE/EHeD/8QAFxEAAwEAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxARxH//xAAdEAEAAgICAwAAAAAAAAAAAAABESEAMVGhQWGR/9oACAEBAAE/EArKLA7ydI1djxX3rBFotttxcqQIIJHs3eXJEVceOJjvGcA7AZz/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Stefan giving a talk on Software Craftsmanship for Kids&quot;
        title=&quot;Stefan giving a talk on Software Craftsmanship for Kids&quot;
        src=&quot;/static/dfcef9b80999fc4f64abcbc757bf2c91/acb04/stefan-on-software-craftsmanship-for-kids.jpg&quot;
        srcset=&quot;/static/dfcef9b80999fc4f64abcbc757bf2c91/bc01b/stefan-on-software-craftsmanship-for-kids.jpg 188w,
/static/dfcef9b80999fc4f64abcbc757bf2c91/bf173/stefan-on-software-craftsmanship-for-kids.jpg 375w,
/static/dfcef9b80999fc4f64abcbc757bf2c91/acb04/stefan-on-software-craftsmanship-for-kids.jpg 750w,
/static/dfcef9b80999fc4f64abcbc757bf2c91/ec605/stefan-on-software-craftsmanship-for-kids.jpg 1125w,
/static/dfcef9b80999fc4f64abcbc757bf2c91/c58a3/stefan-on-software-craftsmanship-for-kids.jpg 1500w,
/static/dfcef9b80999fc4f64abcbc757bf2c91/b17f8/stefan-on-software-craftsmanship-for-kids.jpg 1600w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Explaining how we craft software was a little bit trickier. This was where having good storytelling helped a lot. It went something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You already know what a language is - you are speaking Bulgarian and English. We use similar languages while we craft software but we call them programming languages. We use the same letters from the alphabet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And it&apos;s like painting on a white canvas, but instead of brushes, we use laptops and text editors.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Do you want to see all this in action and play a game?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I guess you already know what the answer to this question was - a screaming YES!&lt;/p&gt;
&lt;h2 id=&quot;the-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-game&quot; aria-label=&quot;the game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The game&lt;/h2&gt;
&lt;p&gt;Demoing a real mobile game would be the coolest part of my whole talk, so I spent a lot of time looking for the right game.&lt;/p&gt;
&lt;p&gt;I had a couple of requirements for the game:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It should be simple so that the kids could get it out of the gate.&lt;/li&gt;
&lt;li&gt;I should use Xcode because it has a big play button in the toolbar (the kids already know the play button from their beloved YouTube).&lt;/li&gt;
&lt;li&gt;Inspired by the &lt;a href=&quot;https://vimeo.com/36579366&quot;&gt;great talk from Bret Victor&lt;/a&gt;, I wanted it to have some moving visual objects. By increasing their sizes, I could illustrate how a simple number change in the editor could significantly alter the game behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using the &lt;a href=&quot;https://github.com/search/advanced&quot;&gt;advanced search capabilities of Github&lt;/a&gt; I was able to find &lt;a href=&quot;https://github.com/JakeLin/SaveTheDot&quot;&gt;SaveTheDot&lt;/a&gt;, which was perfect for my scenario. Here is a preview of the game from the project&apos;s README:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cloud.githubusercontent.com/assets/573856/16248754/90150c2a-3854-11e6-9ee1-c2e4f228a9b6.gif&quot; alt=&quot;SaveTheDot game play&quot;&gt;&lt;/p&gt;
&lt;p&gt;The whole game is implemented in a &lt;a href=&quot;https://github.com/JakeLin/SaveTheDot/blob/master/SaveTheDot/ViewController.swift&quot;&gt;single Swift file&lt;/a&gt;, so it was easy to find the constants that defined the Player&apos;s dot radius. This way, I could manipulate the dot size and illustrate how we could change things.&lt;/p&gt;
&lt;p&gt;You might have guessed how this all ended up - the kids asked me to increase the dot size so that it became enormous and filled up the entire screen 😂.&lt;/p&gt;
&lt;h2 id=&quot;the-presents&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-presents&quot; aria-label=&quot;the presents permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The presents&lt;/h2&gt;
&lt;p&gt;To make a talk memorable, the audience should be able to take something away. For grown-ups, the best you can do is to challenge their way of thinking. For kids, it should be something tangible like a present.&lt;/p&gt;
&lt;p&gt;I took a bunch of cool ST6 stickers with me, which was a two-fold strategy from my side. First, kids love stickers. And second, they would bring them home where their parents could look at them, which would grow the ST6 brand awareness. Touché.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/947077fad31ea886cd1990c0e569a460/c58a3/st6-stickers.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgABA//EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAEI9B2MX//EABkQAAMAAwAAAAAAAAAAAAAAAAABEQIQEv/aAAgBAQABBQK11rWBwRn/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAAIf/aAAgBAgEBPwFX/8QAGBAAAgMAAAAAAAAAAAAAAAAAAAEgMUH/2gAIAQEABj8CyDLP/8QAGxABAAICAwAAAAAAAAAAAAAAAQARMVEhYXH/2gAIAQEAAT8hHg4ShdrDdZ2Q2vkRkrOzP//aAAwDAQACAAMAAAAQw/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAACFh/9oACAEDAQE/ENR//8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQIBAT8Qg//EAB0QAAEFAQADAAAAAAAAAAAAAAEAESExQVFhcaH/2gAIAQEAAT8QlfIb3oTqcHAHv6pCTWiCBHsqhHAD2D1NQGPC/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A pack of ST6 stickers&quot;
        title=&quot;A pack of ST6 stickers&quot;
        src=&quot;/static/947077fad31ea886cd1990c0e569a460/acb04/st6-stickers.jpg&quot;
        srcset=&quot;/static/947077fad31ea886cd1990c0e569a460/bc01b/st6-stickers.jpg 188w,
/static/947077fad31ea886cd1990c0e569a460/bf173/st6-stickers.jpg 375w,
/static/947077fad31ea886cd1990c0e569a460/acb04/st6-stickers.jpg 750w,
/static/947077fad31ea886cd1990c0e569a460/ec605/st6-stickers.jpg 1125w,
/static/947077fad31ea886cd1990c0e569a460/c58a3/st6-stickers.jpg 1500w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;If you love your craft, you will preach it with all your heart. No matter if you are presenting at the biggest software developer conference or in front of a couple of kids. The rule is the same - Craft with Passion.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/455eafc3505d01649c7637efa8ac5886/4ca46/craft-with-passion.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.53191489361703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAEU1AABFNQF8gVf5AAADrUlEQVR42k2UW1NaVxTHiU3e+t6+tB+g7XQ605l22nQmX6CPzfSxj2mn04fETk3TTKdSSaJcpIBaiYJ6CILKTYEGhBqDIqCOiIkEvGC4Zaxyxwqcc/a/s89A6p7Zs86cvdZv77X2+m8RAFFkPSyitj0/LxYLjp1YLJzLZZ0AvgdwGcC7AKYO9vcrL+K7pFA4TQD4hsaQdqwwAPI+x7FhAF8BuJpMJOB2uxBaW4Nv0Quv5zFqtepmqVhMT07oYTQ+wrTRSH4XixEIPAWAn9sH6SrljikQ31nmZrG09He92WwcGwwMZszm5lpwlf9DqWTVKhWr1Y5iYd4BcW9va2UlQKYmJzGkUbMulxObGxsU+jGF8hzbRYEfrq4EWLlMBrPZhGBwlVcOKnC75yeikMvI3OwM1CoVJ+79jac++/t7JJNJk7XgKgW1ZsxmahXtU74hIoSfjUa3YLNZeb/Pxx8eHsDATJFWq0lu9/Sg+9ZNDA1p8O2NGxh7qEW5XKJQOBx24vV6eElfH/L5XAbAW0Ida7XqP7/evYtwOMQOadRIJhOEYaagHR3Fj93deKgdhUatAt0ol8uClkcuk4Km7rDbsfxkqTXvcNBTSgQggE8z6XRrft5BHbnNjXW8epUndOfNzQ1ksxn4FhdB13di25ibnYXdZsWEXoevr18nXs9jzu1yASBzxWJB1GmVLzLp9Il0YAAyqZSPx3fJ8vIT+P0+OOw2GBiG/odyUA6jgYFCLge9mL29JHn+/Bmh64nEi3NC+JuiVqt5pQ2V68bHYbVYWr/cuQO9TkcG+vuFixoZGUZoLQilahhW+wIikTD8Ph/o5RmYKZoBSzc5PT0pCP3TBl4Lh0NYj0R4u83GOhfmedpCLqeTmKYfEbVmhGx7hgnO06j/e85rVCr2nqSPSyYT3LTRiLOz+jGAL0WNxrmoWq1cakM1NM3xsTHYbTa4XS7+L7cL/fclRCwZIEnbLZyFHnBSmQK68TGYTdOIx3fhXFjAs53YEYA3qVJey8676KH2h3q9tnSUStWsVgs4jmX7H9wHwzA4iG+xxok/cfTyJQ2+VyoV/bHYdkWpHETgqaCaa7QPL+pYmOVyidqr8fhug9bw8PCALZyetEwmMw5TRxUAH1G/aHSL+r3TbDQs1WolCuBtQc8dKMexQk3LlfLlNvyzo1SqRNuEppdKHZQAfNJeu5LNZYT6x3ZigkpePxAXB/9/CTrQ9/L5XDSfz20D+KAjsQsZden1us73pf8AW8yOADPmohAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Craft with Passion logo&quot;
        title=&quot;Craft with Passion logo&quot;
        src=&quot;/static/455eafc3505d01649c7637efa8ac5886/1d69c/craft-with-passion.png&quot;
        srcset=&quot;/static/455eafc3505d01649c7637efa8ac5886/4dcb9/craft-with-passion.png 188w,
/static/455eafc3505d01649c7637efa8ac5886/5ff7e/craft-with-passion.png 375w,
/static/455eafc3505d01649c7637efa8ac5886/1d69c/craft-with-passion.png 750w,
/static/455eafc3505d01649c7637efa8ac5886/78797/craft-with-passion.png 1125w,
/static/455eafc3505d01649c7637efa8ac5886/aa440/craft-with-passion.png 1500w,
/static/455eafc3505d01649c7637efa8ac5886/4ca46/craft-with-passion.png 1944w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. You can download the slide deck I have used from &lt;a href=&quot;http://bit.ly/soft-craft-for-kids&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The tragedy of DevOps]]></title><description><![CDATA[Ever since I can remember, I have always had a drive for optimizations across my daily life. From how I do my groceries, to how I organize…]]></description><link>https://st6.io/blog/the-tragedy-of-devops/</link><guid isPermaLink="false">https://st6.io/blog/the-tragedy-of-devops/</guid><pubDate>Fri, 28 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d8e6944dffb7a5218aa90103511ab77b/eaf69/devops.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.765957446808514%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAC4jAAAuIwF4pT92AAABUElEQVR42m2RT0sCURTF31pXkeBCkAikdZ/BL+CqByKuXIY4wyCj+Fb+QWyyQSkS2rRrIbgIXAWWipUEfQfb+g903nN8894NXWRT/jjcxeUeuJyDuJv1ei2EkFLCDglSgHD+Skq0O9kaxuNxvV63bftnA3zFhg3p2PAPpGkaIcQ0TU3TUqlUMpn0eDyZTAYAhHAAgD4XZ+aJ/XlPnwu0k6edPOuWWa8i5iOEEAqFQul0GmMciUTC4XAwGEQIXVUvN873xqRwsGwlrMdzq60um/FlKzGrHk9Lh3w02JgDgUAsFsMYR6NRjLHf70cIGRcVALDebqZF3+LhbNGM027ZaivWE5lfn05KPj56Rbqu53I5QoiqqrquK4ri9Xqz2azrbeOIDczVxx3tG/SlxHoV1jfE/GtPYLVazRWYs2LD2/2BOW445+6qJMhtVdLZzt+S3/aAcy/2alk7AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;DevOps&quot;
        title=&quot;DevOps&quot;
        src=&quot;/static/d8e6944dffb7a5218aa90103511ab77b/1d69c/devops.png&quot;
        srcset=&quot;/static/d8e6944dffb7a5218aa90103511ab77b/4dcb9/devops.png 188w,
/static/d8e6944dffb7a5218aa90103511ab77b/5ff7e/devops.png 375w,
/static/d8e6944dffb7a5218aa90103511ab77b/1d69c/devops.png 750w,
/static/d8e6944dffb7a5218aa90103511ab77b/78797/devops.png 1125w,
/static/d8e6944dffb7a5218aa90103511ab77b/aa440/devops.png 1500w,
/static/d8e6944dffb7a5218aa90103511ab77b/eaf69/devops.png 1701w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Ever since I can remember, I have always had a drive for optimizations across my daily life. From how I do my groceries, to how I organize my work desk. Naturally, years ago when I first heard of DevOps, it immediately got my attention. It promises increased development speed and quality. So how come many organizations try it and fail to see any improvements. Sometimes they even get worse results.&lt;/p&gt;
&lt;p&gt;The tragedy is that as engineers we tend to focus on the technical aspects of problems and ignore the non-technical ones. The reason is that many people don’t fully understand &lt;a href=&quot;https://itrevolution.com/the-three-ways-principles-underpinning-devops/&quot;&gt;the DevOps Ways&lt;/a&gt;. Here are some of the most common &lt;a href=&quot;https://devops.com/what-devops-is-not/&quot;&gt;misconceptions&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DevOps means a team of administrators who are focused on automation.&lt;/li&gt;
&lt;li&gt;DevOps means automating everything.&lt;/li&gt;
&lt;li&gt;DevOps means cool tools.&lt;/li&gt;
&lt;li&gt;DevOps means working with cloud infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-missing-aspects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-missing-aspects&quot; aria-label=&quot;the missing aspects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The missing aspects&lt;/h2&gt;
&lt;p&gt;In my opinion, the non-technical aspects of DevOps are equally if not even more important than the purely technical. Let’s talk about those for a minute.&lt;/p&gt;
&lt;h3 id=&quot;local-vs-global-optimization&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#local-vs-global-optimization&quot; aria-label=&quot;local vs global optimization permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Local vs global optimization&lt;/h3&gt;
&lt;p&gt;Traditional IT development and operation have teams based on their domain of expertise. Their respective goals usually are focused on local optimizations. This means that they might apply improvements to their domain without thinking if it could lead to the degradation of another. This usually causes tension between teams.&lt;/p&gt;
&lt;p&gt;It&apos;s just like &lt;a href=&quot;https://russianuniverse.org/2014/04/06/ivan-krylovs-fable-swan-pike-and-crawfish/&quot;&gt;Ivan Krylov’s Fable “Swan, Pike &amp;#x26; Crawfish”&lt;/a&gt;. Teams start to pull in opposite directions and get nowhere.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 660px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/36b16685f278d2a97d232d6b1e418187/ee745/swan-pike-crawfish.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEBf/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABrU6zaRnif//EABkQAAMBAQEAAAAAAAAAAAAAAAABAhEhEv/aAAgBAQABBQJ2Rcmop9xe1w//xAAWEQADAAAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BUZD/xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhQf/aAAgBAgEBPwG9JZ//xAAYEAADAQEAAAAAAAAAAAAAAAAAARFREP/aAAgBAQAGPwKmc0ahD//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWGB/9oACAEBAAE/IQDCEU6l2mJg4PHkt+U3qW3L7P/aAAwDAQACAAMAAAAQQO//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAEDAQE/EHXhB//EABcRAQEBAQAAAAAAAAAAAAAAAAEA8BH/2gAIAQIBAT8QUvZnN//EAB0QAQEAAQQDAAAAAAAAAAAAAAERACExQVFhgcH/2gAIAQEAAT8Qcltm7NL1l/G4Nt3wJRTxghrsPgy4JV7XpiopnlF05z//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Swan, Pike &amp;amp; Crawfish&quot;
        title=&quot;Swan, Pike &amp;amp; Crawfish&quot;
        src=&quot;/static/36b16685f278d2a97d232d6b1e418187/ee745/swan-pike-crawfish.jpg&quot;
        srcset=&quot;/static/36b16685f278d2a97d232d6b1e418187/bc01b/swan-pike-crawfish.jpg 188w,
/static/36b16685f278d2a97d232d6b1e418187/bf173/swan-pike-crawfish.jpg 375w,
/static/36b16685f278d2a97d232d6b1e418187/ee745/swan-pike-crawfish.jpg 660w&quot;
        sizes=&quot;(max-width: 660px) 100vw, 660px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://obrazovaka.ru/biblioteka/krylov/lebed-shhuka-i-rak-chitat-polnostyu-online&quot;&gt;obrazovaka.ru&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Consider a business that aims to provide a stable and secure service (or product) with fast feature development. Now let&apos;s see how that translates to the teams.&lt;/p&gt;
&lt;h4 id=&quot;operations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#operations&quot; aria-label=&quot;operations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Operations&lt;/h4&gt;
&lt;p&gt;The main goal for the Operations team is to achieve high resiliency and availability.&lt;/p&gt;
&lt;p&gt;Operations might choose to limit the number of changes to production due to stability concerns. As we all know, the most common cause of incidents can be traced to changes.&lt;/p&gt;
&lt;h4 id=&quot;development&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#development&quot; aria-label=&quot;development permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Development&lt;/h4&gt;
&lt;p&gt;Fast feature delivery is the main goal of the Development team.&lt;/p&gt;
&lt;p&gt;Code quality might be lowered for the sake of speed. Bugs can creep to production due to lack of (or limited) testing. The team can also lose interest in how the system behaves in production.&lt;/p&gt;
&lt;h4 id=&quot;security&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#security&quot; aria-label=&quot;security permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security&lt;/h4&gt;
&lt;p&gt;High security standards are the goal of the Security team.&lt;/p&gt;
&lt;p&gt;Security might choose to implement some controls with a minimal benefit without considering how it might affect other teams. This directly translates to a negative impact on the business.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What does that mean?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Each team has a goal that is in line with the business. But each team&apos;s local optimization leads to global degradation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How should we address this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Usually, you will hear how ‘you need to break the silos’ and ’implement cross-functional teams’. That is not necessarily needed. It all boils down to having a common understanding of what the business goals are, how your decisions affect the other teams (and thus the business), and trust.&lt;/p&gt;
&lt;h3 id=&quot;feedback-loops&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#feedback-loops&quot; aria-label=&quot;feedback loops permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Feedback loops&lt;/h3&gt;
&lt;p&gt;Feedback loops are something that can be seen in all aspects of life. Some scientists even believe that they are &lt;a href=&quot;https://bigthink.com/videos/what-is-consciousness-michio-kaku&quot;&gt;the basis of consciousness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2fd0e0c884ec47a3d6da3328375f9eb9/c1b63/feedback-loops.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAADAElEQVR42gXB2WscBQDA4flXVEpBigiChdiHom1Cahfb1E02eyS7STaZzc61s9fsMUdmr9l7k2qTkPQKJq1aS0GbFB/sawUPfFTwTUR99m1kfn6fUFgp+sZ6hWI4GXihK+QuTaFGZerZGpUNA1s26ZbbuLqLumpgay5JpUdCH5IqjFnShyzpgyCR6xNX+75gK65fEU1S588Fv4w1PlfXqMxncEou3ZbH9mDC3u1dGmYD126z3R+hlltElB7LhQkJfURU7gVRuU9M6/mCpbh+XdriiRIL/jlq8KpT4GHZwVRdzJxNIVPFzjlUpTrSaomaZJDOGixqI9J5j4TWwbVGgb7hsJBp+4IlbfnG5hbf9a2ABxV+76p8Iuo4uQ4ducYT06CnudRll+xymbJoEcu0WdS3kTcU+gWNL9ujYK+5zbzk+UJdcvxyxsaV6sGfewZ/TArczpYx5CYPDZO/TlqcNQeYcgMlXaLjuCwpHvHcgHmxySBf4ZG5FShrDouq5wuVTcs3RBNHawWnhsbj9TDtTYOa2mS/7PLv111ejTxcsc1hq81k1yK52WB2pUVvfI+nwz7ppB5EZI8FqesL+bWqXxJtDqxucLryPvn3LiKnCrT1DsXsmPFCGvvmCpYi8eljkZj2IYfNHt8++4Zfz054Phhyc90LFpQeRTnhC8VM0/cyG9yRrgWdtWmc2ddIXZ/CuxPh7iOP589O+fmlzfEXNygdfsTM5Svsl/P8/eMxL77K01fyJJb0IB5T2YgnfUFLt/272Wlq4XNBK68yED9An7uAuZPiwWcuZ7/9xMtBhP3VKUrjDPKywq3ZOYalClVrmWRqgWQ4Hax8vM7SLdEXcutN/0i8yA9Pt4KjcZ1KLs3OsEPD6uPUi9y/N+T4YI9GqUKj2qSkWrTcMa1mF9OwSUfXiM4uBrFQlMVQxBeMGyG/M/cGJ7mrQS98gd3Imygz57FDb+PG03x/f8JBtUB8NsS7r7/DzFvXSF6+Tu7qFPL0JbpKhlExF0zqNXbs2n//A1J4EWESBBUsAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Feedback loops&quot;
        title=&quot;Feedback loops&quot;
        src=&quot;/static/2fd0e0c884ec47a3d6da3328375f9eb9/1d69c/feedback-loops.png&quot;
        srcset=&quot;/static/2fd0e0c884ec47a3d6da3328375f9eb9/4dcb9/feedback-loops.png 188w,
/static/2fd0e0c884ec47a3d6da3328375f9eb9/5ff7e/feedback-loops.png 375w,
/static/2fd0e0c884ec47a3d6da3328375f9eb9/1d69c/feedback-loops.png 750w,
/static/2fd0e0c884ec47a3d6da3328375f9eb9/78797/feedback-loops.png 1125w,
/static/2fd0e0c884ec47a3d6da3328375f9eb9/c1b63/feedback-loops.png 1200w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do feedback loops fit in DevOps?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No one is perfect, and that is normal. It becomes a problem if you stop trying to improve yourself.&lt;/p&gt;
&lt;p&gt;This translates to systems as well. To improve a system, you need to observe it, identify weak points, and make enhancements. This is what is called the &lt;a href=&quot;https://en.wikipedia.org/wiki/PDCA&quot;&gt;Plan-Do-Check-Act or Deming cycle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s see two examples. One with a missing feedback loop and another that is ineffective.&lt;/p&gt;
&lt;h4 id=&quot;missing-feedback-loop&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#missing-feedback-loop&quot; aria-label=&quot;missing feedback loop permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Missing feedback loop&lt;/h4&gt;
&lt;p&gt;Consider a typical siloed organization, test and production environments have different architecture. Even if they are set similarly they often drift with time. This is caused usually by manual changes that are not applied to all environments. This leads to entropy which sooner or later will bite you.&lt;/p&gt;
&lt;p&gt;The Operations team might apply some web server configuration change after a production incident. This change should be communicated to development and applied to the test environment. If this is not done, it can easily mask new issues, that will be encountered later in production.&lt;/p&gt;
&lt;h4 id=&quot;ineffective-feedback-loop&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ineffective-feedback-loop&quot; aria-label=&quot;ineffective feedback loop permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ineffective feedback loop&lt;/h4&gt;
&lt;p&gt;The Development team finishes a new feature and functional tests were successful in the test environment. The new feature is deployed to the production environment and then Operations notice a large increase in the database response times which impacted the business.&lt;/p&gt;
&lt;p&gt;The issue was detected in production, which means that the development team got feedback after the issue was visible to clients and already causing trouble for the business. Such feedback loop is ineffective. The development team should have been aware of the database response time increase before the feature reached production.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How should we address this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You need to increase the flow of information between teams. This will allow you to identify and fix problems sooner.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The non-technical aspects are the starting point for a successful DevOps transformation. The automation and tools are just there to help and don&apos;t make a difference by themselves.&lt;/p&gt;
&lt;p&gt;There is no single way to implement DevOps in an organization. If you want to learn more about this topic, read these books to understand DevOps, and successfully apply it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/0988262592&quot;&gt;The Phoenix Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/DevOps-Handbook-World-Class-Reliability-Organizations/dp/1942788002&quot;&gt;The DevOps Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Birthday Special]]></title><description><![CDATA[Do you remember the last time you spent your birthday at the office? Did you feel festive or was it just a regular working day for you? How…]]></description><link>https://st6.io/blog/birthday-special/</link><guid isPermaLink="false">https://st6.io/blog/birthday-special/</guid><pubDate>Mon, 27 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Do you remember the last time you spent your birthday at the office? Did you feel festive or was it just a regular working day for you?&lt;/p&gt;
&lt;h2 id=&quot;how-we-do-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-we-do-it&quot; aria-label=&quot;how we do it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How We Do It&lt;/h2&gt;
&lt;p&gt;At ST6 we respect everyone’s birthday and we believe that each ST6er deserves to feel special on this exact date. Therefore, our party queen Lidia takes care to prepare a &lt;font color=&quot;#fd7e14&quot;&gt;&lt;strong&gt;personalized gift and desk decoration&lt;/strong&gt;&lt;/font&gt; for every birthday boy and girl. She uses accessories, balloons, and treats usually related to their hobbies or favorite movie. The COVID-19 times we live in haven&apos;t changed a thing. If an ST6er is at home, their birthday surprises are delivered straight to their home office.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/03bf87bf37f22bf87078bc331b691622/e8950/birthday-st6ers.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEfUlEQVR42hXM/VPSdwAH8O+Pu223H/bD7na7PVTn2tUeWg9app4ahgIhCoagoiDyKASKhKSUYCKigKQp5AOGT1GQ2sxlw9YWV6PSHkw3u63Wj9t+qN26awGf926vP+BFxW/FCryuLpSWlRIxK4fEHDqy4reQO5Gh5Oyl2ft6RU2wQSl+UF/NfVVZlAH7UeX6tTnbTG+n4lqPxTD365QzFJvsHXN7OgdnwmNu6tz0mECnkWJ35v6UiL6ffKsrx4hZiV82lhEM+pCz50uwD2RCxmdAKyxAT6s26XdX4IgsF2ohE5cbiuGVMUDLT4fZKAdld9g1tIJcsDi0RCUniyy0VZEhVxO5t3abhCYGUgfz8xJH1IpU0O8mLttR0tYoh7tTm+IydyRLmZnJWT09ccosSrCrhYk6UclrSlQjtgoETLTWV70+I28k00Yjuo/LEb8TxUWbDCZdPa5cuQqTRkGG7I3obdUTh0lG9uXvw5bsTBI8qcTxYBDlozNQtphAWY4ZB81qHo7xpYkGthxtpTpo+QI4ThyBJCcN4hI61FoDNFIm0VZmQHK4iHAYueTtLWnYwioh+xR60I+dxC6RDAKDAVS/vSWyaOFDy96T4GRvJ+KDuzFh4CLibMThjI9Qmf4eaHu3Q6WWQCapgLZOjIw9O3AoYzO2pu/CJ4WHsInFBZ3Hxk/dNaB8TuuNkJGH7zulyUWrCNGuOtzpa0TA0wEOLRPS0gKIGAewfy8DmdkC8MoUqGBkIypmwcvIQTGXDZ5ai2C7Cj+fqgMVX3n04u7DNUQmAqSjjgkNaxv46e/DpKqAXKNHaG4eC99dQehCGIHhUVyLLmFixIcBqwWBnnbUS4RobVDDba5HX48N1PxiDAs314mvOg+hso9R/vU7KEh7E2f9XsxMDcLfokR/swwz4x6sr69i4/EGfKc9MJ8wwXvagyaDFlXVFSivKIdSLgF1fS7019XZ8xiroZEwZzNKt72FvLR3MRsewZnmEpjY6eizyNBU+CnpP1mL+N1bxNXVTlT1cvR7XeT/XKWQQl4ngqlJA+r65YurnSdaIcz6PGU9uAnC7A9xtOoAvN0NCHQL4VQyoa1lwczZSRx6Ou4/jBOPx0Py6XTY29sIvzAHZXwe5mem4evvBtVh1i+x9n6GU7rc5EBzMbFqmeSboRYoxTSi1dOIWVlE2FkfwGIog7erjsRuLMHp9qCh2UJ6O9uIUXSICLns1FJ0ITky7E9QymrB9KBoJ271sP7tUDGSLbX5ifilgddnhvoSXPbm5FQvLxFwFCakZV8khwfMuP9g5c/xYOBlV3dXyu+yEW3tYeTlZsHn60fo/DlQKkml9zhzKzzyDJgrd0Nd8hUmht24vbyMSHgSP0ancHV+GAO9bYjFfsDao4cBp8P2T2jch8VRKyYHO15FIueerSzHo6urKz7KZbcZy4uLXublZt9ksRjzLCZztLZG5Ji5GDY8f/F39frGU+Oj9cfjvz15em9tbRXPfn9S43TadRdCk/qXz/8oALAJwBsURVGXF8LUfw0hxmOX9lWdAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Birthday ST6ers&quot;
        title=&quot;Birthday ST6ers&quot;
        src=&quot;/static/03bf87bf37f22bf87078bc331b691622/1d69c/birthday-st6ers.png&quot;
        srcset=&quot;/static/03bf87bf37f22bf87078bc331b691622/4dcb9/birthday-st6ers.png 188w,
/static/03bf87bf37f22bf87078bc331b691622/5ff7e/birthday-st6ers.png 375w,
/static/03bf87bf37f22bf87078bc331b691622/1d69c/birthday-st6ers.png 750w,
/static/03bf87bf37f22bf87078bc331b691622/78797/birthday-st6ers.png 1125w,
/static/03bf87bf37f22bf87078bc331b691622/aa440/birthday-st6ers.png 1500w,
/static/03bf87bf37f22bf87078bc331b691622/e8950/birthday-st6ers.png 2000w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In addition, the company offers &lt;font color=&quot;#fd7e14&quot;&gt;&lt;strong&gt;an extra day off to every ST6er for their birthday&lt;/strong&gt;&lt;/font&gt;. It’s a great opportunity for each of us to spend time doing what we love. One might even experiment with a thing that they have always wanted to do but have never managed to fit into their schedule. For example, taking the first swimming lesson or hiking around the nearest mountain for a day. And if you&apos;re not in the mood for adventure, you could just sleep till noon in the middle of the week and read a good book in the afternoon.&lt;/p&gt;
&lt;h2 id=&quot;what-about-my-birthday&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-about-my-birthday&quot; aria-label=&quot;what about my birthday permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What About My Birthday?&lt;/h2&gt;
&lt;p&gt;I joined the company recently so I have to wait a few months till my desk converts into a disco. What I know for sure is that I&apos;ll take advantage of the extra day off to hang around the city as I always do for my birthday.&lt;/p&gt;
&lt;h2 id=&quot;join-us&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#join-us&quot; aria-label=&quot;join us permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Join Us!&lt;/h2&gt;
&lt;p&gt;Wanna have a special day on your birthday? Check our &lt;a href=&quot;/careers/&quot;&gt;careers&lt;/a&gt; page, join the ST6 team, and celebrate as every ST6er does!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The Sad State of .NET]]></title><description><![CDATA[Past - the golden years I started my professional career as a .NET developer back in 2004. C# was the new cool kid on the block and everyone…]]></description><link>https://st6.io/blog/the-sad-state-of-dotnet/</link><guid isPermaLink="false">https://st6.io/blog/the-sad-state-of-dotnet/</guid><pubDate>Tue, 04 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2b8c73009b4c9b7d4ec57f3c6e751b3b/1d69c/sad-dotnet-bot-face.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.17021276595745%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5UlEQVR42lXP2U8TURQG8GvxzfgXiYb44qPGGB8MavWlD2LEkEZEZWkCrUDttBCl++J0GzodSqVQWhWBaqsYF5I2DUgIQfSFaFy6zJ3ez7TqRE9ykpMv9/xOLiF/St8+TMKGOU2wP0nM59xOwZhC/N4ilSwZNsNl0GzJkmlmEMfTiI6kEDY8QoLLMvf1acXfG8foWafur0d6j5nIC+md5mVyndguBR7OWLKYvjtPQ4Yk4wdmwQ8kEBpKQjDOQxxN4ymfx8baNhSlwYShOeq6JuC+LhhTwcEOG/nweufgRmGbZD25YO1HDTvFPVp6vsneL5Wx/qyMcn4Lu6VPqHyr4t967M4pjq4IXN3Cqgr2dZgP/J4OHU7bV0rNh4XZtwqt0/+W61UZy6ECFKqAykozYrnoWgt098SWVdB0aqrt1pFx0tduHvP1xFCr1On3Lz+xv/eVtb5GW8uQqzJepYrqgY/lz/B0C4pXL8J2ObCigpZOb5tVGyAjJ6dM1gs+BPQizUtvWMy0AL4/gSW+gHpFbiG7m/so5raQda5i4qIP9ithFh1OIXBTaqig8bRdM3higtw5zh316EU4uiKNsTMONqn144EuCJvWj9DtBOLGBbiuRsB1emE97wXfzMyL8N2IsyT3BL8AT9xq2s2g7y0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dotnet bot crying face&quot;
        title=&quot;Dotnet bot crying face&quot;
        src=&quot;/static/2b8c73009b4c9b7d4ec57f3c6e751b3b/1d69c/sad-dotnet-bot-face.png&quot;
        srcset=&quot;/static/2b8c73009b4c9b7d4ec57f3c6e751b3b/4dcb9/sad-dotnet-bot-face.png 188w,
/static/2b8c73009b4c9b7d4ec57f3c6e751b3b/5ff7e/sad-dotnet-bot-face.png 375w,
/static/2b8c73009b4c9b7d4ec57f3c6e751b3b/1d69c/sad-dotnet-bot-face.png 750w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;past---the-golden-years&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#past---the-golden-years&quot; aria-label=&quot;past   the golden years permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Past - the golden years&lt;/h2&gt;
&lt;p&gt;I started my professional career as a .NET developer back in 2004. C# was the new cool kid on the block and everyone wanted to play with it. Microsoft was pushing hard its &lt;a href=&quot;https://en.wikipedia.org/wiki/Microsoft_.NET_strategy&quot;&gt;.NET strategy&lt;/a&gt; thus sponsoring the local universities and the biggest local technical event - Microsoft Days. It was the era of .NET.&lt;/p&gt;
&lt;p&gt;In the begging C# and .NET were portrayed as the evil twins of Java and JVM - copying all the good things from the &quot;blessed&quot; Java and eliminating some of its bottlenecks - from small things like properties with getters and setters to more impactful features like value types and attributes. All this foundational work laid down the ground for the future innovation that was about to happen. And indeed, it happened: runtime generics (at IL level), &lt;a href=&quot;https://en.wikipedia.org/wiki/Language_Integrated_Query&quot;&gt;LINQ&lt;/a&gt;, &lt;code class=&quot;language-text&quot;&gt;dynamic&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;async/await&lt;/code&gt;. Especially &lt;code class=&quot;language-text&quot;&gt;async/await&lt;/code&gt; was so impactful that it &lt;a href=&quot;https://en.wikipedia.org/wiki/Async/await&quot;&gt;changed the whole industry&lt;/a&gt; and every major programming language has this feature now (yes, even C++).&lt;/p&gt;
&lt;h2 id=&quot;present---soul-searching-days&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#present---soul-searching-days&quot; aria-label=&quot;present   soul searching days permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Present - soul searching days&lt;/h2&gt;
&lt;p&gt;Things started to change in the mid 2010s. &lt;a href=&quot;https://en.wikipedia.org/wiki/Anders_Hejlsberg&quot;&gt;Anders Hejlsberg&lt;/a&gt; shifted his focus from C# to TypeScript, resulting in little to no language innovation in C#. The whole industry started the shift to the Cloud but .NET was not ready for it. Despite being labelled as multi-platform .NET was solely targeting Windows (and mobile via Xamarin). Linux was not first-class citizen, not even second. But the Cloud was all about Linux and Docker. It eventually went that route (thank you &lt;a href=&quot;https://en.wikipedia.org/wiki/Scott_Guthrie&quot;&gt;ScottGu&lt;/a&gt;) under the name of &lt;a href=&quot;https://en.wikipedia.org/wiki/.NET_Core&quot;&gt;.NET Core&lt;/a&gt; but too late for the party.&lt;/p&gt;
&lt;p&gt;On the other hand, Java entered its renaissance. After years of stagnation, Oracle revived the language and put it on the right track. It is now playing the catch-up game with C# but it&apos;s getting there fast. However, the Java ecosystem did have something to offer for the Cloud. Big data (&lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_Hadoop&quot;&gt;Hadoop&lt;/a&gt;), search (&lt;a href=&quot;https://en.wikipedia.org/wiki/Elasticsearch&quot;&gt;Elasticsearch&lt;/a&gt;) and messaging/stream-processing (&lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_Kafka&quot;&gt;Kafka&lt;/a&gt;) are some of the key ingredients that enable the Cloud to shine.&lt;/p&gt;
&lt;p&gt;Python was prepared as well. Having strong backing in academia, it positioned itself as the main player in the new field of machine learning. And the Cloud welcomed it.&lt;/p&gt;
&lt;h2 id=&quot;future---yet-to-be-invented&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#future---yet-to-be-invented&quot; aria-label=&quot;future   yet to be invented permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Future - yet to be invented&lt;/h2&gt;
&lt;p&gt;What about .NET? There is this Question (with а capital Q) that hangs like the sword of Damocles over its head:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Where is .NET/C# positioned now? What will be its main application in the Cloud era?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Only the future will tell but one thing is for sure - .NET/C# needs innovation like it did in the past.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building Another Automated Low-Code Lead Generation Machine!]]></title><description><![CDATA[Lead Generation is key to any successful business development and sales process. Today’s tooling has reached a level of sophistication that…]]></description><link>https://st6.io/blog/building-another-automated-low-code-lead-generation-machine/</link><guid isPermaLink="false">https://st6.io/blog/building-another-automated-low-code-lead-generation-machine/</guid><pubDate>Mon, 03 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/bbe3b8da2275432a8d72b650a7a0bb66/aa440/lead-generation.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAC4jAAAuIwF4pT92AAADR0lEQVR42o2TW2gUVxjHJ9HkoaIo5rH1wdRLAjvnMrMWFSE0oqbQUiilPqQPfSjUJy2IKGIhNgSNMa6bDTG7aE1ckzS7idu9ZG8zZy47lzMzmb1lTai29LmPfeiDIFjW1TTJtuDhz3n4zvnx//h/5zDQKCOj7EmKhx9FumYWPEsEaS5yaqxEoUQ/JFaPSs8alJdMINGNQrLFHLof3tN7evvuPS1t7S3t7W17O3Z+dHTf+YteQg8Sa5BKq9VsvCx1EdopUrQF3rZjB7Nhtba2MgzjxdyzP0qKm3qxmlyppBNuNlKS+qnVTert/AszLS0Mw7R1dOw+0bPr2In33v+AYZgrF79/9afxciX6ajX28mn8eXUpWhQu0ULXVphh9vZ96skoyChBvQglus8fPPtL8q/nucqv4uzTwm/PhISbo+VMr6J3E2sTvBPzDQyQeiRIsT1WrVe3yitp/9WB0Jmvfn44OVOVhygR1/RO0UKbAgtNI1phBf1NSaKHcvqXrvv3fCDV+9mFgZHfT/WVq1msWN8ZmmdLYFB1Gp4NQYl2C8bH5dpa8M54/7f7taJz6pOokTusLh8Qm0YFmgdIzE7V+SKaWhgL9uTU/O1Al2A0mmqGabNYiX5uV75xa0ckeq6yxslW853/hj3EPKm7X7u145p7QHb6zGL/8opXtth3dVbsI6pzPJGHvoljqnO04ADyLs7EBIIOZBuNh/DgMB8Iwoez6O49llYBMTZGuxkmJhAN1ijBpOC9dh3PxfDsIkwKnP8eP+LnRgOgsAwU+39gxQZaEc3FcDiCf5qBeY2/fgMHp/ihEZgi/LAPZFUYz63zb2FiAtmCsQwQDe7OOBeawuEFfnAYhaMwo8CE4L38A5BMtLjkvTpQ92+8xXWYdWr8TR8OTdfPBA0+SaPFJfgkw9+6y9IKDk3hBzMwRfDjhde267BsAUFH0SSKJICg4QeP8aMImo/j0DSM5/jRADc2CTSXHxrhfBP87TGYEPgbo6zqIOkt7L18DWRklla4sSCai6H5OOefZI0SEHT+x5sgX4BZBSby+H4YpmXeN8EqVh1GMkWqwy2mUV5Dio1Eo75LFiImkq03lde/DakOKiwj2cayBWXKKfY/sTaHk8KPHwYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A hand attracting leads with a magnet&quot;
        title=&quot;A hand attracting leads with a magnet&quot;
        src=&quot;/static/bbe3b8da2275432a8d72b650a7a0bb66/1d69c/lead-generation.png&quot;
        srcset=&quot;/static/bbe3b8da2275432a8d72b650a7a0bb66/4dcb9/lead-generation.png 188w,
/static/bbe3b8da2275432a8d72b650a7a0bb66/5ff7e/lead-generation.png 375w,
/static/bbe3b8da2275432a8d72b650a7a0bb66/1d69c/lead-generation.png 750w,
/static/bbe3b8da2275432a8d72b650a7a0bb66/78797/lead-generation.png 1125w,
/static/bbe3b8da2275432a8d72b650a7a0bb66/aa440/lead-generation.png 1500w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Lead Generation is key to any successful business development and sales process. Today’s tooling has reached a level of sophistication that allows Biz Dev and Sales leaders to target potential clients with surgical precision. I was pleasantly surprised to find out that my blog post about &lt;a href=&quot;/blog/how-to-build-an-automated-lead-generation-machine/&quot;&gt;building an automated lead generation&lt;/a&gt; gave people a lot of good ideas! The founder of an investment fund reached out to me with an interesting problem for which my automation experience seemed like a good fit. In this blog post, we will go over how we build out a unique automated lead generation system based on the investor&apos;s feedback.&lt;/p&gt;
&lt;h2 id=&quot;challenge&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#challenge&quot; aria-label=&quot;challenge permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Challenge&lt;/h2&gt;
&lt;p&gt;The challenge faced by the investor was that he needed to provide his portfolio companies with a way to take their Ideal Customer Profile and wade through the vast ocean of digital information on the Internet to find narrowly targeted companies that match that customer profile. The main premise was that companies that post listings for roles that require certain technologies could also be a signal that the company is in-market or open to a new vendor. This signal is one an SDR could follow up if they were monitoring it.&lt;/p&gt;
&lt;p&gt;We determined that the easiest place to get such information was from &lt;a href=&quot;https://www.indeed.com/&quot;&gt;Indeed.com&lt;/a&gt;, where the businesses do list some of the technologies they&apos;re expecting their employees to work with. The workflow for this process looked like this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3bc67108a761e775e38e096883bd596c/7bf07/lead-gen-workflow.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.82978723404255%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcUlEQVR42hXP20+ScRwH4J/oqCUmOc0UhMShYoZoKTlP8yKv27pybZrmRY2pa5aybM4LK1foOqgkKWAIGby2kQrK1gwvWlbedRA7rFJcztMFW6W97/fTfP6DhxV6t1A1uf6vYmKD8rj1iGzgw0KCOcTnjnzhNfaQIDWv/NX1Gd7VOw/tNHKFgsGj4xueKAXdnX0LrINFUnqSSXUvfTe6KxqslflYwUtAPwcUBYHsAJA2ugqV4we03Bq0nlUoHJsoszfjsleOVn8pWnx6XJk4Bn2/FNEmMWSDcigs6ZD0xZLomgjsiB+o8G9Rvv8PJU2A4obCwmHbMhW7QlTkWqR46zblDV4UasZiqInTUAuXQ3XuRNL0igTWxSj5rpSy7qcS62GIMkYJrGpmC7y1hl65bqMyuEstwSWqdIewOWLAov0qysfD1D3bT+0+Lb6P1GHT2oDOyVPoDlSTekhNAcsZwGog3UPFXpmYfuY3Pjk7yMk5UfBCwNmpr9C5vmF+9AZ8DhO0T9fQOHETzV4lXjur8d5xDm3Pj8PAlUP6IBEDltMI2c7T0b5EsDZGTDYNpPtBymkgdRIUPxzmk20/SeYIQ+5YRoJ1k/Itl/i6sf1U40lDrUeOencS5fTG8HvlKFMMRCYxMRMDMzKe5c4CZXOAPghSB4DUx2EUuFdQ4f1FFd4waca2UWJtgnFKDaO/lIy+Yro+rUeJORGKQRWyhjMpw6JCpl1N0k4pWDa3hZPP1gXt+Aay3esRmfnj27RHS4La9hkZ1hBSLOEdXX/jfN2odLfWqUKtU0kXXAqc6Il9I+46EDnYHQfJLQkv6ZZA3C6e+g9AwniO9D+hggAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Leads automation workflow&quot;
        title=&quot;Leads automation workflow&quot;
        src=&quot;/static/3bc67108a761e775e38e096883bd596c/1d69c/lead-gen-workflow.png&quot;
        srcset=&quot;/static/3bc67108a761e775e38e096883bd596c/4dcb9/lead-gen-workflow.png 188w,
/static/3bc67108a761e775e38e096883bd596c/5ff7e/lead-gen-workflow.png 375w,
/static/3bc67108a761e775e38e096883bd596c/1d69c/lead-gen-workflow.png 750w,
/static/3bc67108a761e775e38e096883bd596c/78797/lead-gen-workflow.png 1125w,
/static/3bc67108a761e775e38e096883bd596c/7bf07/lead-gen-workflow.png 1128w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The goal was to automate this workflow to the point where one could enter their &lt;a href=&quot;https://www.propellercrm.com/blog/ideal-customer-profile-icp&quot;&gt;Ideal Customer Profile&lt;/a&gt; and the tool would “magically” get all of the right targets at the end. However, an even bigger challenge was to make this solution without writing any code. There were key constraints with respect to where the information was going to come from and we settled on &lt;a href=&quot;https://www.indeed.com/&quot;&gt;Indeed.com&lt;/a&gt; as the initial source. That would prove to make the “no-code” requirement extremely difficult to fulfill, but we ended up with a pretty elegant solution.&lt;/p&gt;
&lt;h2 id=&quot;solution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solution&quot; aria-label=&quot;solution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solution&lt;/h2&gt;
&lt;p&gt;We built a simple low-code tool that allows the salesperson to define the profile of the companies they want to find, gather data, enrich it, and generate a lead matching the ICP (Ideal Customer Profile). Since the source for the potential leads are the job listings on Indeed, we determined that the ICP would be based on a job query, which we would then match to companies that are seeking a specific talent.&lt;/p&gt;
&lt;p&gt;The workflow looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define the Indeed query that would result in relevant matches (&lt;a href=&quot;https:/airtable.com&quot;&gt;Airtable&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Build the query for each job listing (&lt;a href=&quot;https:/airtable.com&quot;&gt;Airtable&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Monitor the RSS feeds from Indeed for new listings (&lt;a href=&quot;https://clay.run&quot;&gt;Clay.run&lt;/a&gt;) and store the new listings in Airtable.&lt;/li&gt;
&lt;li&gt;Enrich the company data (&lt;a href=&quot;https://zapier.com&quot;&gt;Zapier&lt;/a&gt; + &lt;a href=&quot;https://clearbit.com&quot;&gt;Clearbit&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The tools we used are:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 256px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/37b78ea901f9a4ea56a3f021c02aaa8c/6f3f2/airtable.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADnElEQVR42pWU34sbVRTHvzNjEdn6UKT+KFSldm42KMkttN2sdh/aajcTERTEhz7ogyBI362C/4FP+iLigyilULvsttuZZDcmM5OkblupW3yxvhTqj3VRk81u2+zMdJJ75N6Z3Y2IWg8c7s3JPZ987rkQ4F9i8B0gGtCEB0NlAxrN4t5DNAFxERAtQPjQyYWhal6aTUDVfOjq3NdJ7e+gBkDNLRu6oICyWTY8Jny8IXwcFy08pGryu3lowk9/sJnUEtgiQFMAedCVmQdQWcELwsOnwsOK8EBp/iZ8fCQa2EfVBKIsZa+bAomAn0/u0kjCLuEB4eN14aEpAeRuZj9NEq4CC+FhXvh4jb7FfeQD9VpJm5t/BVg7s0375ZQOUdfeG9QRi7RJAoSHWHgY0JbhQHi4Sy4GKZhiz+jFvvH2j94edN0dujIk2g66jufpKs6Sh1uDGkjUFVjC4hSU7F2IgatT7BpEHjrk4wtq4jlaSN5BxfVnDn957pGJzz/Gkf00v43RDzhBF3FNQevJtaVR3zVo4GlEPhaoiTcX/QKDTRMP2zSdcdZPZ507QDP7rN7lpWs3ckepzMZoanfhmzMjh9+qF/heuokJWlQP0yEPy9TAh9ImO9fL3W/TO0849P2o06OM0yPTDlumHQKr3NLb+eKlNV6ipdyxuJYZpxnzAM0+NdY9u/PQJ6e3HzlKNh497x9/0rDp5Z02TZtOGGedO5Rx1onZQWQ6ITEnrDMnBNq8qHe4daWdL1KXW/0/8sWolTkUndt7kC6YB+n86PhlOehdc3Ri1O6RNGJ2IDNmTjhgTihXMu3ANe0AaOcV8HKHW9TOF+MVbpHcL4xONKb2HHgRRFr2s1Vk7d77zAmkScicUDAnEHI1E7Csu5uG7XzxqjTsJLBKl1svjI3sQMUsgNXIeLxGMJ3oZGoSpyCRgDcNa8pwiU+iw61qh1tfdbk1vpyfxBovqdevmuPG/lM/GcwOwJzw3WGgvK7cm3bQN21lfkUZ/s6LEvDgr7lJdLmF5fyktsIt4xYvKXDGDgx5cAMorzwEoXSOLVaOXmLlLSCWcsf+ApJwGcwJN4ESMgS6ycrhB6wS7TNnbiM5E2gKKJtXuaXWDdBGDANT0DQrR6+yan9EzoxVIpgztzXmhLoczX8GK0eQV2HlaDerRE+bs73kc7UPU46jHOkSmqnRvf3pDgETm9merqwrd1Xtf8cQUJM2meoApr3+jw1/AsVhyD5TFNwNAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Airtable logo&quot;
        title=&quot;Airtable logo&quot;
        src=&quot;/static/37b78ea901f9a4ea56a3f021c02aaa8c/6f3f2/airtable.png&quot;
        srcset=&quot;/static/37b78ea901f9a4ea56a3f021c02aaa8c/4dcb9/airtable.png 188w,
/static/37b78ea901f9a4ea56a3f021c02aaa8c/6f3f2/airtable.png 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 256px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7c5560584a765e9260fb1f6c340b8bc5/6f3f2/clay-run.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADSElEQVR42o2UTWwTRxTHn+NvCw6AVVUcaCXEBQ6JgFSNaFy7ThHCICAKFb0iJMoht4pKUXroKdXabiIkLLkqQuUAUgzseoGAtAJCVQ5cikwPFqKN02JS0k3s3XE+Fu/uvGrWOyRQJ2Kkn/72YX/73szsA2iz/EWymo6ArHes/NchIK9kgKX7G9rL9NcyRyQTCBZ12HC9Ht1cmNu5paDuiY6ru6Pjand0XN0RHVeBs4bMwQM3F/jbYxFRK/hl8hImlhDuLK/mPtxZhtesIfR4bxDYdHWeybLBou48zLLrQoXGc2WayJXNRK6MiVxZSeTKwHlTxvelqHuCrfwpwGQTS/aA8Nj85fhF+9/YKF3uylCjM2MZnRk0OjOK0ZkBzv+Fsu71tzb6dLAla3579h591TOCC7uzdG6/QOfPDGNtcMiqDQ6xVGqDQ8B5u12P2/LGsKQ9Z20OCI+tZs8Izn58jta+PovmbymkfyeQVhMWrTqp0GoCOG8LvUwYLOpf+GXC9sx8OHCBNvZk6fxXw0ircaQv4mhPJdGuJC274qRiV5LAeeMwAjK7bwTCkjYGE4vY/eOfphrPotozhoZ8AnE2hvYffeiK3l0YEbVrrN2j2ZLV6ElT9YCA5qPDSJ8nuAxpJWnR6STSaSb8DBh0em1hgQlTo79b+r4MVZMZbP56xGnZbdep8F2EXiYMSZoAtxZwx6Wq+aJvFOf2nqOL+VOI85+g/ezzlnQqabmp2FNJ4LQ9lEBRT7lXxrx8skCb3d/Tl6k0Nh8cc6R05lOkM3HLTYXOxIHT9rPzFXV/SNLKcGsRd138y6z2jeHCRxn6z8E0Ns6fRuPuABqT/ZYx2c9SMSb7gdNO6G1dcNIfkjSE20tW7PxTq3wwh9beEdro+oGSfWkkMcEivQKSXkEhvQJw2lbIDseVfudKceuV2ebwN/cs5cuf7dKhvF1K5ZulVB5LqbxSSuWBs+a0CbaEjMGQpC17bjacAeG9QTAsaau5H5Y04Kw3vlilHle6PSRp6bCkPQkU9VmfTGo+mag+mbzyyUT0yQQ46wxYDuEnD/AAISxq70fE+gcRsb4tItY/jIj19yJiHTjrLrc6Z5z5ZeLtKMytVL8qOXz9B0tO4ztZwc2nAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Clay.run logo&quot;
        title=&quot;Clay.run logo&quot;
        src=&quot;/static/7c5560584a765e9260fb1f6c340b8bc5/6f3f2/clay-run.png&quot;
        srcset=&quot;/static/7c5560584a765e9260fb1f6c340b8bc5/4dcb9/clay-run.png 188w,
/static/7c5560584a765e9260fb1f6c340b8bc5/6f3f2/clay-run.png 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/670932c89459d06ee13f91c0960f464a/5a46d/zapier.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACTElEQVR42m1V205TQRRdLWkxiEa/whd/wQcjUs+e039Sos9GYyIGEwwPokDFGKnwAYoF0a8RJCF76+xZZzqn8rDTycxaq/t+YALQOroEWPBzlxbPr0xgtDXezUW8Y+87p6MBUMFUzB8HgAb0edfj75ZVMDfByCq/S5iA+cixOomaC4YkpgMHvjbBsQkWnVD5v24WHr53wRTFIrFrLhqSFuweYMtZrPFkYoIb9HC7EPzAu/h2RKw5N2osge4OPYQJQ/tN4InecfJ6IbjhaRGcRIxOsd9dowYLEFz4qgkOKXpK4IEK9ooc7ptgPIM5dG5KQyfmKVazp7WLXs+hVDgvPGtbfEtiR86pWcQKXTTJZ/Vgt/x3n4RTr6zgoQkemWDHBGfZ29upVUp+02cjr2Bqiw0PqynCg9xa4HmXb2MVx0buOxbsBXJlZy2RVih2xSrM04uVBqOXcFxQq/9ylAUZUhTrtwTlck4T8palBt5mm7RDrlp5+uhOJMw6OZvM73MUs5xsuVWUMxN8MsFjEzzh+Q/fvhDbsmbQm/m9qYJfmvJznkMr81q12uZn5JDbV8FcLHsn5kkDrvlstidgzwSfC8Gxe9nGHJObGlsDtwbHySQDJ3bXQW/K0dMU5mQG+8M1Apiz1F+rRbW+Wp3/tVwOI66t+PatqPaqawxQ7EKKagTWWPC7VNW35frSuNLSmC64qOClc/Msy3Qn+l4bosfHZsHuFDnczQs2EFvswhRy8QmI4euQZ0FX0/1TE1yo4MIEz1qfgCFT1jj0r23+AgcyvCCxKNTMAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Zapier logo&quot;
        title=&quot;Zapier logo&quot;
        src=&quot;/static/670932c89459d06ee13f91c0960f464a/5a46d/zapier.png&quot;
        srcset=&quot;/static/670932c89459d06ee13f91c0960f464a/4dcb9/zapier.png 188w,
/static/670932c89459d06ee13f91c0960f464a/5a46d/zapier.png 300w&quot;
        sizes=&quot;(max-width: 300px) 100vw, 300px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;p style=&quot;margin-bottom: 10px&quot;&gt;&lt;/p&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 256px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f6c987862646116c270cb223eed77268/6f3f2/clearbit.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACb0lEQVR42oWUv27bMBDG6aJTxj5Gl+xZsrgtaXdtmorKAxQJAigPE1f0FFBFhuQB+iYdnXapZMMpYDkT5fuKo6g/aWx4+HCkBP5w992RQhmIoMG7a44ket+ETCHGU4jIQsQZhLYQOuM1tfs4wyDO6v8tjOOHb359rAwulcGVMkhkSsl4iiSySOKMEm0p0RldxRku4oyOArCFtjBl6I0y+KEM0JdMgfEUiCwQZ4AOsae7s+84aKDi/TX5shjGh2UKJ1NUMqVKGY6oxlNUkUUVZ6i0bUQcXYDeeissDRrPjkM2ThkimRIpAy+ZgsZTUGRBcQbSlkL0+4222AToIfvaeHhZA6nqwfaVTGHdZHkS264pV+Fw1Yft81BnPkvH37SF5rK9fzLlbnrATiAfOsteNIR6GUb9khN/eAdwZIDPN8DpdrkQ9elNV3IiGbCj5I9T4OsdcH6/VS5EfX6/B8iZDSfAFwv8LIDff4GHxxdyIeqHxxZISdMUuQXIDfn1CCyfgHkJzNfP5ELU8zUJIfm+Nhl6D2krcLasYX9WQN6J8hW5sI7yFTeFb0m6fWz+By7WNagog1agokQD1DWw9vCiG2y0g70HSHkNdWH/KS+7phx1Vw+bMJM0MqAtQPKqIZu8zpLXb4uyG2yG3qn6cdgoAycN3MjADSdwkYWbLeEWa1+eK0pynFm+ogZm8hVEvsKr3vOFA2VwGwacR2hHyfTcxxJm/oTXRUmC9eyBDZkeKoMTZaBHBtFwAh1Z6NkSerFm47mb0OwZl8mZcalFiUHR89BDZcpgam0YGRLDSf38z5YQi7UvS3A38xrC61cB6PUPpmpmmpqc968AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Clearbit logo&quot;
        title=&quot;Clearbit logo&quot;
        src=&quot;/static/f6c987862646116c270cb223eed77268/6f3f2/clearbit.png&quot;
        srcset=&quot;/static/f6c987862646116c270cb223eed77268/4dcb9/clearbit.png 188w,
/static/f6c987862646116c270cb223eed77268/6f3f2/clearbit.png 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;a href=&quot;https:/airtable.com&quot;&gt;Airtable&lt;/a&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;a href=&quot;https://clay.run&quot;&gt;Clay.run&lt;/a&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;a href=&quot;https://zapier.com&quot;&gt;Zapier&lt;/a&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;a href=&quot;https://clearbit.com&quot;&gt;Clearbit&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;define-the-query&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#define-the-query&quot; aria-label=&quot;define the query permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Define the Query&lt;/h3&gt;
&lt;p&gt;Suppose that you’ve built a service that integrates with &lt;a href=&quot;https://www.hotjar.com/&quot;&gt;HotJar&lt;/a&gt; and you would like to find out what companies use &lt;a href=&quot;https://www.hotjar.com/&quot;&gt;HotJar&lt;/a&gt;. One way to find such companies is to look for job listings that include HotJar in the job description. In this case, we would construct an &lt;a href=&quot;https://www.indeed.com/advanced_search?q=hotjar+%28hotjar+or+analytics+or+ads+or+director+or+vp+or+head+or+executive+or+manager+or+chief%29+%2470%2C000%2B&amp;#x26;jt=fulltime&amp;#x26;limit=25&amp;#x26;sr=directhire&amp;#x26;st=employer&quot;&gt;Indeed query that looks for any job listing where HotJar&lt;/a&gt; is part of the description:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
https://www.indeed.com/jobs?q=hotjar&amp;amp;as_any=hotjar+analytics+ads+director+vp+head+executive+manager+chief&amp;amp;as_any=hotjar+analytics+ads+director+vp+head+executive+manager+chief&amp;amp;salary=\$70000%2B&amp;amp;as_not&amp;amp;jt=fulltime&amp;amp;sr=directhire&amp;amp;as_phr=&amp;amp;as_cmp=&amp;amp;as_ttl=&amp;amp;st=employer&amp;amp;limit=25&amp;amp;fromage=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We’ve added a few more narrowing filters, such as a salary of over $70K, the position must be full-time and optionally contain some other keywords. The result is that as of the writing of this article, there are 68 job listings from companies that match this profile.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/32a14c277a27a42183384fd6499e9634/c6720/indeed-hotjar.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.04255319148937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABuklEQVR42nVTSY7bQAzUn/OUAHlGXpKzA8OGxx6NJHgSq9X7rgpILRNnEVBgg00Vi0s3r+8Z3QPQxmKSBs45KKVgrYXWmu08zwDm1T5/m48sodFaIqeAECNSznsgERNhKWUPJtRaYXyGNAmlzk93TOi8xzgKSDlBSgmlNCs0xiDnjJQSg845Jzhn8fnrd3z68g330aLkiBDiB2H3w+I6aLz0Ci+DRvtuIZWBdw4pRhijkVLk0imR9x4hVfhIyv/qABqpA0bpIRRZx3DOI4TAoNLJkkoqn5TWkjHXglLyojwlxBjYNqxCK4yPnwhx6eH240ZChKQsxsj+rutwPB5xOp1wOBxwu91wv98RQ0AjhMD1esPlckHbvqHve1b1xyx5GIxSuL/Ub4rber1Nunk8HjifzxiGAWIcOYiU7QQr9imv6jGvPr4vTEi2oTJowkJMPGFaFcq+YZomBp2XNcq8XkJ5bsfzTlY0lI2ypDzDx2U9Pvaq7nZXWStXIQQlsDDWctmUjLahocxvbYu+75B8eHoB/wIRKylBvddmeVUE4qFqm3EceUpd33NplIkm+r8nVtd1WRT/jpn9vwACzaRsW5R2VAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;indeed hotjar&quot;
        title=&quot;indeed hotjar&quot;
        src=&quot;/static/32a14c277a27a42183384fd6499e9634/1d69c/indeed-hotjar.png&quot;
        srcset=&quot;/static/32a14c277a27a42183384fd6499e9634/4dcb9/indeed-hotjar.png 188w,
/static/32a14c277a27a42183384fd6499e9634/5ff7e/indeed-hotjar.png 375w,
/static/32a14c277a27a42183384fd6499e9634/1d69c/indeed-hotjar.png 750w,
/static/32a14c277a27a42183384fd6499e9634/78797/indeed-hotjar.png 1125w,
/static/32a14c277a27a42183384fd6499e9634/aa440/indeed-hotjar.png 1500w,
/static/32a14c277a27a42183384fd6499e9634/c6720/indeed-hotjar.png 1922w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;build-the-query&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#build-the-query&quot; aria-label=&quot;build the query permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Build the Query&lt;/h3&gt;
&lt;p&gt;As we can see, it is pretty important to have the ability to finetune and troubleshoot the queries to ensure that you get the best results! The next bit of magic is a simple but powerful Queries table. It’s a custom “query builder” in &lt;a href=&quot;https://support.airtable.com/hc/en-us/articles/206058268-Guide-to-forms&quot;&gt;Airtable forms&lt;/a&gt; that mimics the search form in Indeed (see below).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/99119ae902f2d30f647fededa752d4e6/f79fa/airtable-indeed-form.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 203.72340425531914%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAApCAYAAAA1bQl+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACRElEQVR42q2WWbOqMBCE/f+/zvJZX9wVRQVccJtTX+o2FSBs9xyr2hAgk2S6p8Po+/0avzzP7X6/2+PxsNvtZq/Xy93neR/w+3w+NlJnOp3aeDy22Wxmk8nEttttEbDvrwhYnWnIyny4gM/n0wBbfL/frs2fuen+EJC2EX8gSRI7xrFlSWqvfxPopT4oBaSz3+9tsVjYIYosSzNL0tSR0ydobYV00jR1OJ/PFsexHY9Hy7KsWGnXVouAuiB/JLUqA+63weU8FLA6I3rsm79gDtnier221Wrlts3qxLy/GilCqG3ZJ2W5XDpiAMF3u52bYLPZuD5iPxwO7l3A88vlUiKuCMgDVglOp5MbCOgzmGvuKx1CjWVdsHyflCaIPKGRlGpOujTXKhttma3hOKyiaXBnQHXIEQSQMwQ+pOyCW6bMqAyCXa/XkjTa0Fopvg11VUhjpahTlcJQlAIyC+JF0PP53FmZJvF1N4gUHCaKIkcKrQBZVAQK8Ad2uo1ft75wJd7q4F725Se4OqBNl8EcslVcRkF/RQodiECLWumvdShj6Ks/wXec0gqpYVb4JzpULaPBUB6rx0KrH/pHAI4soD1a9IdbS6M6EeXc1aO25NhyaN+taQnGwEFu45tD9dtGR2oInY79Z6SwLfIj6+rSX6iyascojk2r41IkKI9+fnkPRbS6jYIBSADSZwg8a6yUIYdSk3EESSE3//NdWHMb5ZBqQZMhYnr5oV965E7fML6oQ1XRabCqTZEQImPQETD0K6Ep4A94SH4N6IkuZAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;airtable indeed form&quot;
        title=&quot;airtable indeed form&quot;
        src=&quot;/static/99119ae902f2d30f647fededa752d4e6/1d69c/airtable-indeed-form.png&quot;
        srcset=&quot;/static/99119ae902f2d30f647fededa752d4e6/4dcb9/airtable-indeed-form.png 188w,
/static/99119ae902f2d30f647fededa752d4e6/5ff7e/airtable-indeed-form.png 375w,
/static/99119ae902f2d30f647fededa752d4e6/1d69c/airtable-indeed-form.png 750w,
/static/99119ae902f2d30f647fededa752d4e6/f79fa/airtable-indeed-form.png 940w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.indeed.com/advanced_search?q=hotjar+%28hotjar+or+analytics+or+ads+or+director+or+vp+or+head+or+executive+or+manager+or+chief%29+%2470%2C000%2B&amp;#x26;jt=fulltime&amp;#x26;limit=25&amp;#x26;sr=directhire&amp;#x26;st=employer&quot;&gt;Indeed has a number of search parameters&lt;/a&gt; so we had to ensure that our Airtable form covers all of the relevant ones. The parameters are processed and combined into a query string, which is then used to dynamically construct the &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt;. The &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt; is used to access the &lt;a href=&quot;http://rss.indeed.com/rss?q=hotjar&amp;#x26;as_any=hotjar+analytics+ads+director+vp+head+executive+manager+chief&amp;#x26;as_any=hotjar+analytics+ads+director+vp+head+executive+manager+chief&amp;#x26;salary=%2470000%2B&amp;#x26;as_not&amp;#x26;jt=fulltime&amp;#x26;sr=directhire&amp;#x26;as_phr=&amp;#x26;as_cmp=&amp;#x26;as_ttl=&amp;#x26;st=employer&amp;#x26;limit=25&amp;#x26;fromage=&quot;&gt;RSS feed corresponding to that particular search query&lt;/a&gt;. The other important thing here is the ability to inspect the query results. That’s made possible by looking at the &lt;code class=&quot;language-text&quot;&gt;Query URL&lt;/code&gt;, which opens up the standard search results from Indeed where you can easily see the actual result that Indeed would serve for that query.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9a7becdca36fc4bad62ebbb26f677275/b297c/airtable-indeed-query.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.319148936170215%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABB0lEQVR42q3My0rDQBiG4dycokUQlK6kVyDYCiJ1o+68DK9M2iRNm2SSOeXQTIK8MqmIBZcunjl8888XVI/XyNsTzMMl9v0N+zJD+fv9BWY+Qc8n2OUU93yDW17hFmd03vzALc7p7k5xT1Pc64xAiYIi3VFpSW4bpJSYQqALgdhtsWVBLQucUTSloCoFzuof/q3Vkq6u6CpL8AkordHGkGcpSbIlywWFlIRRTBjH4x5tEnZZxsdqzTqKWYUR8SYhFYowEYSbnCQtCYZhwDlH3/fUdY0xBmvteFZKoZQcaaWorEVJ+Z0f+H99P4x8T+CX/X4/FrRte8Tnv/2VNU1zZCz0g77wP3wBoCO001ve6BwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;airtable indeed query&quot;
        title=&quot;airtable indeed query&quot;
        src=&quot;/static/9a7becdca36fc4bad62ebbb26f677275/1d69c/airtable-indeed-query.png&quot;
        srcset=&quot;/static/9a7becdca36fc4bad62ebbb26f677275/4dcb9/airtable-indeed-query.png 188w,
/static/9a7becdca36fc4bad62ebbb26f677275/5ff7e/airtable-indeed-query.png 375w,
/static/9a7becdca36fc4bad62ebbb26f677275/1d69c/airtable-indeed-query.png 750w,
/static/9a7becdca36fc4bad62ebbb26f677275/78797/airtable-indeed-query.png 1125w,
/static/9a7becdca36fc4bad62ebbb26f677275/aa440/airtable-indeed-query.png 1500w,
/static/9a7becdca36fc4bad62ebbb26f677275/b297c/airtable-indeed-query.png 2844w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;All the magic happens in the formulas for the fields &lt;code class=&quot;language-text&quot;&gt;Query String&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Query URL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is the &lt;code class=&quot;language-text&quot;&gt;Query String&lt;/code&gt; &lt;a href=&quot;https://support.airtable.com/hc/en-us/articles/203255215-Formula-Field-Reference&quot;&gt;formula&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
CONCATENATE(&quot;q=&quot;, SUBSTITUTE(TRIM(LOWER(Keywords)), &quot; &quot;, &quot;+&quot;),
&quot;&amp;amp;as_any=&quot;, SUBSTITUTE(TRIM(LOWER({Any Keywords})), &quot; &quot;, &quot;+&quot;),
&quot;&amp;amp;as_any=&quot;, SUBSTITUTE(TRIM(LOWER({Any Keywords})), &quot; &quot;, &quot;+&quot;),
{Location QP}, {Salary QP},
&quot;&amp;amp;as_not&quot;, SUBSTITUTE(TRIM(LOWER({Exclude})), &quot; &quot;, &quot;+&quot;),
&quot;&amp;amp;jt=&quot;, {Type},
&quot;&amp;amp;sr=&quot;, IF({Direct}, &quot;directhire&quot;, &quot;&quot;),
&quot;&amp;amp;as_phr=&quot;, SUBSTITUTE(TRIM(LOWER({Exact Phrase})), &quot; &quot;, &quot;+&quot;),
&quot;&amp;amp;as_cmp=&quot;, SUBSTITUTE(TRIM(ENCODE_URL_COMPONENT(LOWER({Company}))), &quot;%2C&quot;, &quot;+or+&quot;),
&quot;&amp;amp;as_ttl=&quot;, SUBSTITUTE(TRIM(LOWER({In Title})), &quot; &quot;, &quot;+&quot;),
&quot;&amp;amp;st=&quot;, IF({Allow Staffing}, &quot;&quot;, &quot;employer&quot;),
&quot;&amp;amp;limit=25&quot;,
&quot;&amp;amp;fromage=&quot;, {Age})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is the &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt; formula:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
CONCATENATE(&quot;http://rss.indeed.com/rss?&quot;, {Query String})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is the &lt;code class=&quot;language-text&quot;&gt;Query URL&lt;/code&gt; formula:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
CONCATENATE(&quot;https://www.indeed.com/jobs?&quot;, {Query String})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Please feel free to &lt;a href=&quot;mailto:hello@st6.io?subject=Question%20About%20The%20Automated%20Lead%20Generation%20Tool&quot;&gt;request free access to our Airtable base&lt;/a&gt; in order to get the full formulas.&lt;/p&gt;
&lt;h3 id=&quot;monitor-the-rss-feeds&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#monitor-the-rss-feeds&quot; aria-label=&quot;monitor the rss feeds permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Monitor the RSS Feeds&lt;/h3&gt;
&lt;p&gt;Unlike the &lt;a href=&quot;/blog/how-to-build-an-automated-lead-generation-machine/&quot;&gt;previous low-code lead generation tool&lt;/a&gt; I built, this one is a bit more tricky when it comes to the RSS monitoring. Given the fact that we’re building our RSS queries dynamically, we have to ensure that we’re also dynamically monitoring them. Any change to the query parameters will result in a new &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt;, which will mean that you’ll also have to manually change any tool that uses the old link. Of course, this is still doable by hand and you can still use Zapier to monitor the RSS feeds. However, we’ve exposed a &lt;a href=&quot;https://docs.clay.run/docs/overview-quickstart&quot;&gt;Clay.run function&lt;/a&gt; that does this automatically. The &lt;a href=&quot;https://docs.clay.run/docs/overview&quot;&gt;workflow for the Clay.run function&lt;/a&gt; is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Every x minutes (where x is defined by you).&lt;/li&gt;
&lt;li&gt;Trigger the Clay.run function.
&lt;ol&gt;
&lt;li&gt;The function fetches all of the &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt;s from Airtable.&lt;/li&gt;
&lt;li&gt;For each &lt;code class=&quot;language-text&quot;&gt;RSS URL&lt;/code&gt;, check if there is a new item in the RSS feed.&lt;/li&gt;
&lt;li&gt;If there is a new item in the RSS feed, send it to the Jobs table in Airtable.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8986ad994d650db6d0e0eb1e486118f8/2acc9/clay-run-flow.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.680851063829785%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABiklEQVR42m2Sz2sTQRiG9z/tHyBeBE+elFJavJSixUJ7EI8ePQmKbYqXiqcGD0naRIvpujbZ7e5Odn4/MpPsGko+eJnDfPPM+34zyft8yMX9LVJIStGwkBqpTSdjLXVdI6UklPd+o9pKPvV/sLVzyKO9Y57sv+XpwTsevzxh6/krPpx/j01FUZDneXfoIcx5T2UatLMk96WgPxhzORxzObimP7xm/PsPN9mcu6Ii3F2WFWmaYoyJWnfUXmC9w3lH4p0F3FJOgVXrrVjno7s0zdDaoJQOBDZVACf9tOTFlwl7vV/snk7Y/nzF7tlPnn0ccXY1i42NVEvQ6pBz63JxbaMng7TkqDdh/3TA696Iw/MRb75OOLqY8u2miJAQOcuyVdz/M+xAztE0Mj5ggtQgJV5WIGswDWBXIRzGOapa8PdujjG2c/kwanQaHC60odaGhVpJG4Qy1I1GSBWbyrJkNptjre0geV4wnd4ihGipyxlKpWk2KPzBsFrrIijEDS7auNosHyjstfMLwH/VCK3F2TPAvgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;clay.run workflow&quot;
        title=&quot;clay.run workflow&quot;
        src=&quot;/static/8986ad994d650db6d0e0eb1e486118f8/1d69c/clay-run-flow.png&quot;
        srcset=&quot;/static/8986ad994d650db6d0e0eb1e486118f8/4dcb9/clay-run-flow.png 188w,
/static/8986ad994d650db6d0e0eb1e486118f8/5ff7e/clay-run-flow.png 375w,
/static/8986ad994d650db6d0e0eb1e486118f8/1d69c/clay-run-flow.png 750w,
/static/8986ad994d650db6d0e0eb1e486118f8/78797/clay-run-flow.png 1125w,
/static/8986ad994d650db6d0e0eb1e486118f8/aa440/clay-run-flow.png 1500w,
/static/8986ad994d650db6d0e0eb1e486118f8/2acc9/clay-run-flow.png 2378w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The end result is continuous monitoring of all new job listings that show up on Indeed, given the criteria we specified above. Pretty nifty:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b366f89aff9144135c51742a894612fa/0e909/airtable-jobs.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.59574468085106%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABuklEQVR42mVRy47TQBDM3/ELJIs4gSIkrpxCdrksXDjwO9zgI4CNkk2cl+Nn7Nge2zNjp1C1bXYlRmrPuLumprp6dP72Ab8/TeG8e4HL/AbJbIx0NkE6f4V0Nsbl7jXKL1Po+zeob2+g52Po20m3zyfQH19Cf34L8/U96vspRgfPx/cfP/HrzwMuhUKS5chVibyskKkSqq5Raw1tDEzToCgr5EpBW4vaMAxq2wi+0hqjpmkQ+B6OxyNc18V+v8fhcMDpdILb5zzPQ9u24EqSBLvdTnKsERuGgfzXdY2R1hqrx0csl8v/CfsLPBNH0jRNJef7vuQpJIoiBEEAYwxG/HQFF1EUS4GAOI4RxTGKokBZVVBKoaoqZFkmZGEYIowi2an6fD7D2qZXuFphsVjIa9vtVlqiUgYvk4wPc/HiZrP5V3ccRzB+EID2icJj39ogfVDJ4Ov0xhgrhFQ41AcsMQxpmQqpauM4YuwwHAatYI7tU1nbXsXD5xiepf0whLW2I1yv19L2YPIQJ8+TdoghmGsYCoMY7oPi6/X6bCiu2w2CRvdm88yhqLKEbRohzItCCDpVT7YkSSoK/wKHPN83KOV5GAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;airtable jobs&quot;
        title=&quot;airtable jobs&quot;
        src=&quot;/static/b366f89aff9144135c51742a894612fa/1d69c/airtable-jobs.png&quot;
        srcset=&quot;/static/b366f89aff9144135c51742a894612fa/4dcb9/airtable-jobs.png 188w,
/static/b366f89aff9144135c51742a894612fa/5ff7e/airtable-jobs.png 375w,
/static/b366f89aff9144135c51742a894612fa/1d69c/airtable-jobs.png 750w,
/static/b366f89aff9144135c51742a894612fa/78797/airtable-jobs.png 1125w,
/static/b366f89aff9144135c51742a894612fa/aa440/airtable-jobs.png 1500w,
/static/b366f89aff9144135c51742a894612fa/0e909/airtable-jobs.png 3008w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;enrich-the-company-data&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enrich-the-company-data&quot; aria-label=&quot;enrich the company data permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enrich the Company Data&lt;/h3&gt;
&lt;p&gt;With each job listing, we also get the name of the company that posted the job along with the domain for the company. This is quite limited, so in order to really get quality leads, we have to enrich the company information. The workflow here is:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/39bb3ea8d5d3db7ea8829ca082690d55/0e0c4/zapier-workflow.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 123.93617021276594%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC0UlEQVR42pWV23KjOBCGef/32bt9grncu1TGMcYB22AQUktqicP+W90wSXbL2WSo+qplMAepv24VpTVoXIcpZ3DOSNOEaV6wrKvGPE3fZEbghKJzBj/bA0Zy+Pn8jKenJ1yaBmVZgpzD7xzy0IJjAqcFFBmjI4zOaRxGC+cDYkrwMYEC61i+4hFyjUJE0RGhD2E7mad3UoYLES4E9NajM6Q3WB/0RY+Qa8WBDDrTgInQ3e/wRLDWIsaA3z1k/YsYI1Ya4ZxDXdc4n8+oqjNut1YTI6x7/D/W9W9wyijIR3BinZ7nDM9JkTU1sqa0TffaOx0b8ho/ozjYEX91HpkzOCXMy6JMy/L29k2fGfOyanzENO/alGPAH8+AGy3K8ojX8xmn0wn16ytOpxJVVaFpatT1qy7Jl9rEyFiyTDFqpjZ1CJbeo7GEwRKc9/CRP0WWrWglu37ThqdNGf5Amma4kHC3/u2mz1BtjmTQ26tqc71e4ayFMQajMRrNMCB4/81KEW2YscQAIkLdNKpLc7lsNEKDvu+xLCsWSdQDJImiVty0CWAOmzYpqy4k2uyIQr2LuPzSxtGnqDbPdsSPS1Bt5GtFEVHgI7/UUKXmx8iXSj0X1Rjx54toM+J4PGqlHF9eVJ2qOumU5fd3SnFbw8BYM6s2Uvz/LXgKAcYFDC7A7/95yK5dcSWHVtrUrg1P87+USVIBacJI8f2B8RGsnakoycDYK4K1mmXJ6DAMStu26LoOXXsDx/jNBsuMlQPIe7Rdh7a74973yvV2w61tNVpHe13Pe+I+siVMkyJ225A/aLN1GkGUCSnBEONmpJvQ19oc3ICzq5CZ4UPQTCXZrHJG3uM0TZjnees+yyM2sbUfWrIo71cMzqGSLlPXukFJl5EO83I4fGv93rTxgcE87RtN3jYdiftYzlnPGFzU5vBllrcuTO9ltXdl89adCYPzykhf8w9u1I1bICfQmQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;zapier workflow&quot;
        title=&quot;zapier workflow&quot;
        src=&quot;/static/39bb3ea8d5d3db7ea8829ca082690d55/1d69c/zapier-workflow.png&quot;
        srcset=&quot;/static/39bb3ea8d5d3db7ea8829ca082690d55/4dcb9/zapier-workflow.png 188w,
/static/39bb3ea8d5d3db7ea8829ca082690d55/5ff7e/zapier-workflow.png 375w,
/static/39bb3ea8d5d3db7ea8829ca082690d55/1d69c/zapier-workflow.png 750w,
/static/39bb3ea8d5d3db7ea8829ca082690d55/78797/zapier-workflow.png 1125w,
/static/39bb3ea8d5d3db7ea8829ca082690d55/aa440/zapier-workflow.png 1500w,
/static/39bb3ea8d5d3db7ea8829ca082690d55/0e0c4/zapier-workflow.png 1884w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 7 is where you select all the fields that you want to collect for the company and you insert the record into Airtable, if the record doesn’t already exist. Here is how it looks:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/22406ea1e4df1bb723b18e47c1122fe5/ad00e/zapier-create-record.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 197.87234042553192%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAABYlAAAWJQFJUiTwAAADWUlEQVR42qWXiY6jMAyG5/2fcTWaKVcpJBwJARoSr+wkiHC0XS1SBFTI+WL7t90vYwzgwstaC+HdGAtaP4G3HLIsg6Io4Ha7waOqdt/F6+upNT30QoAaJzDWOuN+g2UxMM8zTPMM4zjSMxkMy7g7/oa2vp7PJxlQgySSJEng8XhA0zTAOQel1LpBuJMR44xovYAc1Mag1vTSdR00bUcGlmWhpbWmu9m5wkSEhr7ZEGraue4nSNIcsiwl0rpmdDwgIhMbsRvC5YpQSBBS0o8r2Zkh+yEh6ydIs3z1Y5qmwBiDaZq838y/EfKmhaZtQY0jEWryo3lPeSR0UZ7UAGmaQFk+QEq5ps21oStCPLK1wJqOKEciXP7fh42YyYfoO/Qj45ySGfP8XZQHdRblvodeSJjnJ73bd2ThmwOhN2iNWQ3ZjfQ+8WFMSEe2UPEO7o8Kuq6nSGNSk84/INSnPpQzZHkBee5yEfUshLwOjCfE4yLAqQ9xTZOrJsdyZq4J9YkPzepDiKrL9rKbcnVN6POwqBo6cs0Y9H1PVQedjdLDZ1xh0235QjWhOA5B6dUTqppBXdekYVQLGsZ7eA7pERtcYES974/cdpyMyWEgKqQL5ev1kQ3MR0IgyeFxsdAikRAirof74npJ6I98r3vIi3It+7jQqPJJe5WHaDCoKzIo1AyMcTKIhMMwkEEkdz4763LOYEi12IdtSxXbbrqe8xtctkzjpTdGBn3aKDVSINay9SKhoyObfVB8X8YiiQm66vedwXdpgxENIr9MlY8IfVDyqoOf34QaFOYjpg/6dfSyumpSTnq7tMGXYZyougw+sVFORL1q/bp8hVNGhCWXkKQZ3O93WmVZEmWoJK/a6LHAWgtSjSCko0OyQGc2lfy6fOmj9BxhTmMb8xLE6o1+xMEJ0yoijQhPCizS4bCEY93ofYgLd8dN16Hp0xaAhD+/NzeG0LBUEx0uJEVJRmPJuzYqpIKuFy65PRl+rP1oF9YxOBeN/tEq+Lkl1KCy3DV8pAqU+LwdQEOwXhAOwJuGfBiK63asizS+CcqlDysk9EpByrwoaOiMortbL/Ow6yUw3pBaglL2ut5f7334m9BfB6S8JQn8+f6Goixpo5pxtziHijqj8EO7pj4UDP4FTvg+iJwKBRMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;zapier record creation&quot;
        title=&quot;zapier record creation&quot;
        src=&quot;/static/22406ea1e4df1bb723b18e47c1122fe5/1d69c/zapier-create-record.png&quot;
        srcset=&quot;/static/22406ea1e4df1bb723b18e47c1122fe5/4dcb9/zapier-create-record.png 188w,
/static/22406ea1e4df1bb723b18e47c1122fe5/5ff7e/zapier-create-record.png 375w,
/static/22406ea1e4df1bb723b18e47c1122fe5/1d69c/zapier-create-record.png 750w,
/static/22406ea1e4df1bb723b18e47c1122fe5/78797/zapier-create-record.png 1125w,
/static/22406ea1e4df1bb723b18e47c1122fe5/ad00e/zapier-create-record.png 1366w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you’d like to learn how you can set up this flow, please &lt;a href=&quot;mailto:hello@st6.io?subject=Question%20About%20The%20Automated%20Lead%20Generation%20Tool&quot;&gt;feel free to contact us&lt;/a&gt; and we’ll be happy to share the Zapier workflow with you. The end result is a pipeline of leads with a ton of useful information by which you can filter them.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/147fc4df12a4d4eb3353a26dde18c241/ef0e6/airtable-companies-kanban.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.78723404255319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACOUlEQVR42m2Sy4rUQBiF+7nE99GZlSBecOFWe1yIl1n4AII7V4obF17wgojjRhQde5JOupNOKnVNVSXp7k86CgpjQVHU5f8459Q/sbcvoB/dxRxew9w4h57uj9NM93HTfeKtfbp7lwh3LhIOfu/9dI8w3SMe7BFunicc7NEfXiEeXmOyEjWqWyNdS1YIpPEo68gqgfUtIXhKKeijo4sB3Ui2fSQGj1KWsNngu55KNxinmMhGkhc1Wkkq43lb1OTS0TpHWvWEEKmN4+qzBUepIlrN408LEuXx1vLq6TuS4wzrNGkhmMzTlFmSks3nVNpxtBQUytFaw3zh8G3Aupb7byq+LTXOaD6kmsJGorPo9x/xiyXFasXsJGGSJAlpkrADC6XZjaHvqaqK7aZns15Ti2Y8Z7NmWZR0raELnroWRLbjVZZlpGnCJE1TdtB5liHLmm9HX9HWYq1DGkfbeiqpiU7inaESkmEDseuQomHoulFAnucj5x/gfAz8xdvPKOPIVivOXr7Oyy/HYJfw4Azh82NstwHzY1QYYiQOA13fszgFnM//WttuxkyevHtNpQ1tUxI/PiSW32mUZt3ZMQqlFD4EhmE4rXC3OufIC4kxjrrZwbcM/YBpStaA79aIqqDvd78fRuCulfr/Wk5TbOt5/ilBSItoBIvGorTBe09tLCF2iLoeczTGorWiVC3GOvI8O62waQSNC+ODXRv9nCWcJAlKNhwvxGi3WpXM8pJyVY0xHc9O/tT/ZvwCZ64oaJ8nSv0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;airtable companies kanban board&quot;
        title=&quot;airtable companies kanban board&quot;
        src=&quot;/static/147fc4df12a4d4eb3353a26dde18c241/1d69c/airtable-companies-kanban.png&quot;
        srcset=&quot;/static/147fc4df12a4d4eb3353a26dde18c241/4dcb9/airtable-companies-kanban.png 188w,
/static/147fc4df12a4d4eb3353a26dde18c241/5ff7e/airtable-companies-kanban.png 375w,
/static/147fc4df12a4d4eb3353a26dde18c241/1d69c/airtable-companies-kanban.png 750w,
/static/147fc4df12a4d4eb3353a26dde18c241/78797/airtable-companies-kanban.png 1125w,
/static/147fc4df12a4d4eb3353a26dde18c241/aa440/airtable-companies-kanban.png 1500w,
/static/147fc4df12a4d4eb3353a26dde18c241/ef0e6/airtable-companies-kanban.png 3832w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The default view is the Grid View, where you can also see the full list of leads that have been collected.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9749a5691a3a0452e46519b0459e2118/7e508/airtable-companies-grid.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.74468085106383%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABkklEQVR42l2R22rcMBCG94ELTRcK6UXoVW8COd2EQCFP0Jfatb1rrw+SRrIOtuy/zGyciwgGjUbim/8f7ejlJ+jfG+z7H+j7b6CnPfTDjYR/3iM+3SC+3iK9/pI8Pf9AePwusZ2nlz2mv7+R3u6wM2NA6xPCAgxk0RuCi0liBuCnDE0E60YY66DIwqcJ87JCW4fBEAzfjV7Ou3F06JoG65JBxqBpavhxxPl8RvAeNkR0fQ8iQt/3KIoCMUbw6roOx+MRZVmiKI6S75xz8piXMQaXywXTNMFaixACUgpQahCI9x5KKbnfgHVdS20YBml4BVp7BRKhbVvknAW2rCuSd9BKIcYEHwK01pjnWd4z4HQ6oWkaiXNds+VROq3rCiIr8hnGanJekIOFVoOoF8tl+Wm5HwZUVSVQDhYjQJa8KeRObJetMDT6CK002Im1TqCbZc43IMPYtgAvbYtlWWSWXGQ1h8PhOscpQ2kjVjm44Vcgf2BdNwIW4GaBgSFG2avqJDXtEwxdP2gDfFr+GAGDyo/9Pyy2n+eylnemAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;airtable companies grid view&quot;
        title=&quot;airtable companies grid view&quot;
        src=&quot;/static/9749a5691a3a0452e46519b0459e2118/1d69c/airtable-companies-grid.png&quot;
        srcset=&quot;/static/9749a5691a3a0452e46519b0459e2118/4dcb9/airtable-companies-grid.png 188w,
/static/9749a5691a3a0452e46519b0459e2118/5ff7e/airtable-companies-grid.png 375w,
/static/9749a5691a3a0452e46519b0459e2118/1d69c/airtable-companies-grid.png 750w,
/static/9749a5691a3a0452e46519b0459e2118/78797/airtable-companies-grid.png 1125w,
/static/9749a5691a3a0452e46519b0459e2118/aa440/airtable-companies-grid.png 1500w,
/static/9749a5691a3a0452e46519b0459e2118/7e508/airtable-companies-grid.png 3836w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;now-you-just-have-to-close&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#now-you-just-have-to-close&quot; aria-label=&quot;now you just have to close permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Now You Just Have to Close&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/static/a055ac35c7c5e23264719b83f791c3ea/sell.gif&quot; alt=&quot;george costanza yelling at customer to sell a computer&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you have an automated lead generation system! The hard part is over, now you just have to close your deals! 😉&lt;/p&gt;
&lt;p&gt;At ST6, we always try to use technology to minimize the most expensive part of product development: software engineering. We believe that no-code/low-code tools are going to transform how early-stage product development and product validation works. Entrepreneurs can now build an MVP of their product with minimal coding effort and get something in the hands of their customers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:hello@st6.io?subject=Access%20Request%20For%20Lead%20Gen%20Airtable%20Base%20From%20Blog%20Post&quot;&gt;Contact us now&lt;/a&gt; in order to get free access to the Airtable base and/or get help with setting up your own lead generation pipeline.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Happiness, Balance, or Growth? You CAN Have It All]]></title><description><![CDATA[We live in an era of extreme busyness. It's too easy to get swallowed up by day-to-day tasks and skip taking a minute to just look back and…]]></description><link>https://st6.io/blog/happiness-balance-and-growth-you-can-pick-3/</link><guid isPermaLink="false">https://st6.io/blog/happiness-balance-and-growth-you-can-pick-3/</guid><pubDate>Tue, 07 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/24501fd9d40229dc61275e2e9b54f654/16274/balanced-stones.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAD/9oADAMBAAIQAxAAAAF4mhnTXIA//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAAwQQERIy/9oACAEBAAEFAhYZkBUfu2rvfJn/xAAYEQACAwAAAAAAAAAAAAAAAAAAARESIf/aAAgBAwEBPwGcLM//xAAWEQEBAQAAAAAAAAAAAAAAAAABABL/2gAIAQIBAT8BCyX/xAAaEAACAgMAAAAAAAAAAAAAAAABAgAQETFB/9oACAEBAAY/AtQMuFJnKFf/xAAbEAEBAAIDAQAAAAAAAAAAAAABABEhMUFhkf/aAAgBAQABPyHviBnBOnhmzLLa+Xtf/9oADAMBAAIAAwAAABDX7//EABYRAQEBAAAAAAAAAAAAAAAAAAEQIf/aAAgBAwEBPxBbqH//xAAXEQEBAQEAAAAAAAAAAAAAAAABACFh/9oACAECAQE/EBHLhf/EAB0QAQADAAEFAAAAAAAAAAAAAAEAESFRMWGRsdH/2gAIAQEAAT8QViThYpuQGXrWcDeniKWvaJMvMlgAU2gXvaFXxP/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Balanced cone of stones on the seashore at sunrise&quot;
        title=&quot;Balanced cone of stones on the seashore at sunrise&quot;
        src=&quot;/static/24501fd9d40229dc61275e2e9b54f654/acb04/balanced-stones.jpg&quot;
        srcset=&quot;/static/24501fd9d40229dc61275e2e9b54f654/bc01b/balanced-stones.jpg 188w,
/static/24501fd9d40229dc61275e2e9b54f654/bf173/balanced-stones.jpg 375w,
/static/24501fd9d40229dc61275e2e9b54f654/acb04/balanced-stones.jpg 750w,
/static/24501fd9d40229dc61275e2e9b54f654/16274/balanced-stones.jpg 852w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We live in an era of extreme busyness. It&apos;s too easy to get swallowed up by day-to-day tasks and skip taking a minute to just look back and reflect on our day and ourselves. We&apos;re too busy to spend a minute on this because it eats away from our precious time and we can&apos;t afford it. Inevitably the moment comes, when we lose focus, lose motivation, but it&apos;s ok as &quot;&lt;em&gt;these things happen&lt;/em&gt;&quot;, and we are &lt;em&gt;&quot;fine&quot;&lt;/em&gt;.&lt;br&gt;
We know being &lt;em&gt;&quot;fine&quot;&lt;/em&gt; is not where we want to be. We want something more.&lt;/p&gt;
&lt;p&gt;We are going to take a look at the most common states of mind we are in during our typical workday. We&apos;ll see how it affects us and what we can do about it in a few simple steps. We are not going to change the way we operate that much, but rather tweak the perception and expectations we have for ourselves.&lt;/p&gt;
&lt;h2 id=&quot;doing-everything-with-ease-our-a-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#doing-everything-with-ease-our-a-game&quot; aria-label=&quot;doing everything with ease our a game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Doing everything with ease (our A-game)&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/aa28b906a70217207ae3c93e01d7f073/41099/in-the-zone.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQBA//EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAHviYOoG//EABoQAQEAAgMAAAAAAAAAAAAAAAECAAMQEiH/2gAIAQEAAQUCUmZTh9mdfSs//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BJ//EABoQAAICAwAAAAAAAAAAAAAAAAERABASISL/2gAIAQEABj8CZmLZFKDrVf/EABoQAQACAwEAAAAAAAAAAAAAAAEAERAxUfH/2gAIAQEAAT8hU+EXYbN4N16GKAbxW8f/2gAMAwEAAgADAAAAEOPv/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/EDV//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EAJs/8QAHhAAAgAGAwAAAAAAAAAAAAAAAREAECExUaFBcZH/2gAIAQEAAT8QVOrN+oI1YBAJEW71IuZCj1zAvwqSHK8v/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A person, multitasking at work while being in his most productive state of mind&quot;
        title=&quot;A person, multitasking at work while being in his most productive state of mind&quot;
        src=&quot;/static/aa28b906a70217207ae3c93e01d7f073/41099/in-the-zone.jpg&quot;
        srcset=&quot;/static/aa28b906a70217207ae3c93e01d7f073/bc01b/in-the-zone.jpg 188w,
/static/aa28b906a70217207ae3c93e01d7f073/bf173/in-the-zone.jpg 375w,
/static/aa28b906a70217207ae3c93e01d7f073/41099/in-the-zone.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;http://officedynamicsadelaide.com.au/how-to-scare-your-executive-into-submission-without-the-whip/&quot;&gt;ideasforfreedom&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;There are days where we can’t wait to get something done and see its fruits. We have laser focus. We are proud of ourselves because we know we gave our best, no matter the outcome. We believe this is what matters and what will get us where we want to be.
This is when we have momentum. We feel we just know the right things to do. This is when we are in the zone. Everything is great. This is our A-game.&lt;br/&gt; &lt;small&gt;This is part of Jared Tendler&apos;s concept about the improvement process, called &quot;Inchworm&quot;.&lt;br /&gt; You can read more about it in his book &lt;a href=&quot;http://www.pokerbooks.lt/books/en/The_Mental_Game_of_Poker_%20Jared_Tendler.pdf&quot;&gt;The Mental Game of Poker&lt;/a&gt; on page 28&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;We can easily find ourselves in this state when we are really excited about getting something done and we have a burning desire for it. Maybe we find it very meaningful to us. It might be a cause, a belief, or whatever it is that resonates with our true self. We can also get there by other circumstances as well – i.e. our love life is going great, we are in a good relationship with the people that matter the most, or it&apos;s that good things just happen randomly here and there.&lt;/p&gt;
&lt;h2 id=&quot;back-to-reality-b-and-c-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#back-to-reality-b-and-c-game&quot; aria-label=&quot;back to reality b and c game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Back to reality (B and C-game)&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/447f7d20ca4b08a636055d98faca9549/41099/intense-multitasking.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBP/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAe2MqrOwL//EABgQAAMBAQAAAAAAAAAAAAAAAAECEQAQ/9oACAEBAAEFApQZcwBZVC8//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGBAAAwEBAAAAAAAAAAAAAAAAARARADH/2gAIAQEABj8C7MBUK//EABoQAAEFAQAAAAAAAAAAAAAAAAEAEBEhQTH/2gAIAQEAAT8hA2FPUQBSnW6ivVxG/9oADAMBAAIAAwAAABBn/wD/xAAWEQEBAQAAAAAAAAAAAAAAAAARECH/2gAIAQMBAT8QcCf/xAAWEQEBAQAAAAAAAAAAAAAAAAARECH/2gAIAQIBAT8QNZ//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMRBhQXGR/9oACAEBAAE/EBpyJYV9YTRlJCU7XHTpuRZO02CHwfc/MVex5Q168f/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Stressed out person at work overwhelmed by tasks, can&amp;#39;t find her way out&quot;
        title=&quot;Stressed out person at work overwhelmed by tasks, can&amp;#39;t find her way out&quot;
        src=&quot;/static/447f7d20ca4b08a636055d98faca9549/41099/intense-multitasking.jpg&quot;
        srcset=&quot;/static/447f7d20ca4b08a636055d98faca9549/bc01b/intense-multitasking.jpg 188w,
/static/447f7d20ca4b08a636055d98faca9549/bf173/intense-multitasking.jpg 375w,
/static/447f7d20ca4b08a636055d98faca9549/41099/intense-multitasking.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://www.theceomagazine.com/business/management-leadership/multitasking-vs-monotasking-why-multitasking-doesnt-work/&quot;&gt;CEO Magazine&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;On the other hand, life isn’t all sunshine and rainbows. We are not that often in our A-game state of mind. Most of the time we are at our B, C and even D-game. Often enough, we are not that motivated, we lack focus, we beat ourselves to the ground to get something done. Before we realize it, the day is over and we feel like we haven’t achieved anything meaningful. Sounds familiar, right?&lt;/p&gt;
&lt;p&gt;Did we really not achieve anything this day? I doubt it.&lt;br&gt;
Why is it then that we feel this way?&lt;br&gt;
It turns out we had expectations (spoken or not) about the day, about us, that we didn’t meet. Failing to meet these expectations makes us feel bad in many ways.&lt;/p&gt;
&lt;h2 id=&quot;what-can-we-do-for-our-non-a-game-days&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-can-we-do-for-our-non-a-game-days&quot; aria-label=&quot;what can we do for our non a game days permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What can we do for our non-A-game days?&lt;/h2&gt;
&lt;p&gt;It looks like our life is a chain of ups and downs. Now you might be saying &lt;em&gt;&quot;whoa, thank you, Captain Obvious, for this insight!&quot;&lt;/em&gt;.
Sure, I&apos;m stating the obvious, but the point here is we can&apos;t turn the tide. Whether we like it or not, life will put us in a variety of situations – good and bad.&lt;br&gt;
What&apos;s important is how we approach each one of them.
We want to feel good about ourselves, even when we&apos;re not at our best. We need to accept what we can&apos;t change and make the best out the hand we&apos;re dealt with at the moment.&lt;/p&gt;
&lt;h3 id=&quot;set-the-right-expectations-for-the-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#set-the-right-expectations-for-the-day&quot; aria-label=&quot;set the right expectations for the day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set the right expectations for the day&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 640px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8885a879a9f43a2eda6c989b3d390db9/c08c5/expectations.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.851063829787233%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAGABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAL/2gAMAwEAAhADEAAAAdIQoH//xAAXEAADAQAAAAAAAAAAAAAAAAABESES/9oACAEBAAEFAmFMR//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AYj/xAAXEAADAQAAAAAAAAAAAAAAAAAAEBJh/9oACAEBAAY/AitX/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAERITFBUf/aAAgBAQABPyFQqdsTxOCZq2f/2gAMAwEAAgADAAAAEAff/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EJDD/8QAGhABAAMAAwAAAAAAAAAAAAAAAQARITFBUf/aAAgBAQABPxAwejx0kyTC1LjUjymk/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Colleague having unreasonable expectations about his teammate&amp;#39;s progress on the stuff he never mentioned&quot;
        title=&quot;Colleague having unreasonable expectations about his teammate&amp;#39;s progress on the stuff he never mentioned&quot;
        src=&quot;/static/8885a879a9f43a2eda6c989b3d390db9/c08c5/expectations.jpg&quot;
        srcset=&quot;/static/8885a879a9f43a2eda6c989b3d390db9/bc01b/expectations.jpg 188w,
/static/8885a879a9f43a2eda6c989b3d390db9/bf173/expectations.jpg 375w,
/static/8885a879a9f43a2eda6c989b3d390db9/c08c5/expectations.jpg 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://www.strengthscope.com/setting-clear-expectations-leadership-essentials/&quot;&gt;James Brook blog&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h4 id=&quot;1-start-each-day-by-objectively-evaluating-what-you-can-achieve-for-the-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-start-each-day-by-objectively-evaluating-what-you-can-achieve-for-the-day&quot; aria-label=&quot;1 start each day by objectively evaluating what you can achieve for the day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Start each day by objectively evaluating what you can achieve for the day&lt;/h4&gt;
&lt;p&gt;If you have a TODO list, there’s a decent chance it’s overflowing. Tasks keep piling and piling until eventually, you can clearly see how off-the-track you are. Maybe you want to do too much in a single day.
If you often find yourself in this situation, well… maybe your “objective” evaluation is not that objective and needs to be adjusted.&lt;/p&gt;
&lt;h4 id=&quot;2-formulate-your-tasks-in-a-way-that-you-can-cross-them-off-by-the-end-of-the-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-formulate-your-tasks-in-a-way-that-you-can-cross-them-off-by-the-end-of-the-day&quot; aria-label=&quot;2 formulate your tasks in a way that you can cross them off by the end of the day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Formulate your tasks in a way that you can cross them off by the end of the day&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 486px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1d4f669ba4db5f1cd64dd8e824efc6eb/d7db9/pigeon-todo-1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.702127659574465%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMBBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHoxoTFB//EABkQAQEBAAMAAAAAAAAAAAAAAAEAAhEhMf/aAAgBAQABBQLkLPrIWei//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFhAAAwAAAAAAAAAAAAAAAAAAAAEg/9oACAEBAAY/Ahz/AP/EABwQAAMAAQUAAAAAAAAAAAAAAAABETEhUWFxkf/aAAgBAQABPyFqq+F715NDILFZkWKz2M//2gAMAwEAAgADAAAAEBcf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBABAAMBAAMBAAAAAAAAAAAAAQARITFhcYHw/9oACAEBAAE/ELW68HWYy1a6qvf3yWpM8DFJ3aY2aGjq6WdcD1P/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A pigeon with its todo list for the day&quot;
        title=&quot;A pigeon with its todo list for the day&quot;
        src=&quot;/static/1d4f669ba4db5f1cd64dd8e824efc6eb/d7db9/pigeon-todo-1.jpg&quot;
        srcset=&quot;/static/1d4f669ba4db5f1cd64dd8e824efc6eb/bc01b/pigeon-todo-1.jpg 188w,
/static/1d4f669ba4db5f1cd64dd8e824efc6eb/bf173/pigeon-todo-1.jpg 375w,
/static/1d4f669ba4db5f1cd64dd8e824efc6eb/d7db9/pigeon-todo-1.jpg 486w&quot;
        sizes=&quot;(max-width: 486px) 100vw, 486px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://memeguy.com/photo/251542/pigeon-to-do-list&quot;&gt;memeguy&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;If you take on a big task that would take days to finish, well… promise to yourself that you’ll do only 20% of the work. Come up with some checkpoint for these 20%. Do this in advance and be proud of yourself later for sticking to the initial plan.&lt;/p&gt;
&lt;h4 id=&quot;3-limit-yourself-to-the-very-few-things-that-matter-the-most&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-limit-yourself-to-the-very-few-things-that-matter-the-most&quot; aria-label=&quot;3 limit yourself to the very few things that matter the most permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Limit yourself to the very few things that matter the most&lt;/h4&gt;
&lt;p&gt;Ask yourself &lt;em&gt;“if I could do only one thing today, what would it be?“&lt;/em&gt;.&lt;br&gt;
Start from there. At the end of the day, we want to take a look back and say...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/714cac8872e40afe7af960e79e9f7185/ice-cube-good-day.gif&quot; alt=&quot;Ice cube saying “today was a good day”&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;4-remind-yourself-of-your-long-term-goal&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-remind-yourself-of-your-long-term-goal&quot; aria-label=&quot;4 remind yourself of your long term goal permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Remind yourself of your long-term goal&lt;/h4&gt;
&lt;p&gt;Spare a minute or two to take a look where you are now and where you want to be. Find the connections between today’s tasks and your long-term goal. See how what you do today affects your whole journey even if it is in the slightest manner.&lt;/p&gt;
&lt;h3 id=&quot;approach-unpleasant-tasks-with-the-right-attitude&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#approach-unpleasant-tasks-with-the-right-attitude&quot; aria-label=&quot;approach unpleasant tasks with the right attitude permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Approach unpleasant tasks with the right attitude&lt;/h3&gt;
&lt;p&gt;Starting a task with a bad attitude is a recipe for failure.&lt;br&gt;
Whatever your profession is, there are always things you don’t enjoy much but have to do either way. Whether you like it or not, these moments play a vital role in shaping you as the professional you want to be. The true acceptance of this idea will make it a lot easier to cope with these moments. We can’t change it, but we can change our attitude towards it. We learn every day, so a better way to approach these moments is to try find something interesting, something that this particular task can teach you. Sometimes it might feel the only thing you get out of it is boosting your willpower, but hey...&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7f51961d1c4d3c05275f0168a356c080/f93b5/its-something.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.51063829787234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHfrtgOAP/EABgQAAMBAQAAAAAAAAAAAAAAAAACEQEQ/9oACAEBAAEFAh7SGpz/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAABEDIA/9oACAEBAAY/AnR1Ff/EABsQAQADAAMBAAAAAAAAAAAAAAEAESEQQXGR/9oACAEBAAE/IYE03rKz3hbeE0FX5Aoqf//aAAwDAQACAAMAAAAQsw//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAcEAEAAwACAwAAAAAAAAAAAAABABEhMWFBUaH/2gAIAQEAAT8QltIaKqJzlveQwC7ilLTeVnyaQL8vp0QjHAT/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;It&amp;#39;s something meme&quot;
        title=&quot;It&amp;#39;s something meme&quot;
        src=&quot;/static/7f51961d1c4d3c05275f0168a356c080/f93b5/its-something.jpg&quot;
        srcset=&quot;/static/7f51961d1c4d3c05275f0168a356c080/bc01b/its-something.jpg 188w,
/static/7f51961d1c4d3c05275f0168a356c080/f93b5/its-something.jpg 300w&quot;
        sizes=&quot;(max-width: 300px) 100vw, 300px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;celebrate-the-small-wins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#celebrate-the-small-wins&quot; aria-label=&quot;celebrate the small wins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Celebrate the small wins&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 342px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/66cb5b27e48a447c273e229b4839c61e/f928b/success-kid.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.87234042553192%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAFz4bQoMFH/xAAbEAABBAMAAAAAAAAAAAAAAAACAQMREgAQMv/aAAgBAQABBQJ6SBnicU7Ei11//8QAFxEAAwEAAAAAAAAAAAAAAAAAARAREv/aAAgBAwEBPwHQi//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGNf//EABkQAAMAAwAAAAAAAAAAAAAAAAABERAhMf/aAAgBAQAGPwJIj2cJZBJ4/8QAGhAAAwEBAQEAAAAAAAAAAAAAAAERITFRcf/aAAgBAQABPyHaJ8Q8Xg5SQpuLCyikebrlfpUf/9oADAMBAAIAAwAAABCbP//EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAwEBPxChhob/xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QSq2r/8QAGxABAAIDAQEAAAAAAAAAAAAAAQARIUFRMdH/2gAIAQEAAT8QGCKq5LrsUwDBekqPNDWmFGZ3BwPYbfY37n//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Success kid meme&quot;
        title=&quot;Success kid meme&quot;
        src=&quot;/static/66cb5b27e48a447c273e229b4839c61e/f928b/success-kid.jpg&quot;
        srcset=&quot;/static/66cb5b27e48a447c273e229b4839c61e/bc01b/success-kid.jpg 188w,
/static/66cb5b27e48a447c273e229b4839c61e/f928b/success-kid.jpg 342w&quot;
        sizes=&quot;(max-width: 342px) 100vw, 342px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I can’t emphasize this enough. Every time you cross a task off, you hit a checkpoint, or you just get that feeling you’re doing well, stop right there and take a moment to smile and appreciate your effort. You deserve it.&lt;/p&gt;
&lt;h2 id=&quot;lets-put-it-all-into-practice&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lets-put-it-all-into-practice&quot; aria-label=&quot;lets put it all into practice permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let&apos;s put it all into practice&lt;/h2&gt;
&lt;p&gt;Being part of &lt;strong&gt;ST6&lt;/strong&gt; – a flat-structured company, where empowerment and ownership are embedded in its culture, it looks like the perfect place to verify the validity of the ideas above.
&lt;em&gt;&quot;With great power comes great responsibility,&quot;&lt;/em&gt; Peter Parker says. Let&apos;s give some perspective to this.&lt;/p&gt;
&lt;p&gt;Here, at ST6, I have no boss, I have no manager. I have a tribe by my side, and they&apos;re here to help. Despite the fact we all share common values, we&apos;re still very diverse. What works for somebody, might not work for someone else. So, who would know how I can do my best better than me? Right, but with this comes the ownership and responsibility part. A good thing among ST6-ers is that we also look at failure as an opportunity to grow, so even if I try something that doesn&apos;t really work out... well, I&apos;ll know better.&lt;/p&gt;
&lt;p&gt;So, how does all this fit in my typical work-day?&lt;br&gt;
First things first – it&apos;s not the TODO list, but having a proper start of the day – chit-chat with the colleagues over a cup of coffee.
Next, I go to my desk and about 9:30 my recurring daily TODO is prompting me. It&apos;s called &quot;Divide &amp;#x26; Conquer the day with subtasks&quot;. It takes me up to 3 minutes to revise and decide what my daily focus will be. Then, I estimate how much of it I can do today and write down only these. Boom, here it is- the first task for the day is finished. I cross it off, yeyy! Feels good.&lt;br&gt;
Once I&apos;m done with a task (excluding the 1st one), I take a short 5-10 minutes break. These moments are perfect to clear your mind, praise yourself and freshen up for what&apos;s next.
In the past, I used to &lt;em&gt;&quot;get the advantage of the momentum&quot;&lt;/em&gt; and go straight to the next thing. Don&apos;t fall for this! A lot of time passed, until it hit me- I&apos;m not actually using the momentum, but rather using all my fuel for the day with full throttle. In F1 you can make the fastest few laps this way, but you won&apos;t make it to the finish line for sure. It looks obvious now, but this is how learning works.&lt;/p&gt;
&lt;p&gt;Of course, there are times when things don&apos;t go according to plan. Maybe you underestimated how hard a task would be, or today is not your best day. Oscar Godson has said it very well- &quot;One of the best programming skills you can have is knowing when to walk away for a while.&quot; Take a break and don&apos;t be hard on yourself- this is part of the game.&lt;/p&gt;
&lt;h2 id=&quot;how-about-your-cheat-sheet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-about-your-cheat-sheet&quot; aria-label=&quot;how about your cheat sheet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How about your cheat-sheet?&lt;/h2&gt;
&lt;p&gt;By no means is this the key to the secrets of life, of course.&lt;br&gt;
We are all human, we are all different. This is what helps me stay on the right track. For you, it might be flavored differently.&lt;br&gt;
Share your cheat-sheet in the comments below. I&apos;ll be happy to dive into what works for you.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to Build an Automated Lead Generation Machine, Without Coding!]]></title><description><![CDATA[For the past several months the biggest issue we’ve been struggling with is finding a repeatable sales process for generating leads. I know…]]></description><link>https://st6.io/blog/how-to-build-an-automated-lead-generation-machine/</link><guid isPermaLink="false">https://st6.io/blog/how-to-build-an-automated-lead-generation-machine/</guid><pubDate>Fri, 13 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3105de0f9a9a9535180d2665a580dad1/8740f/leads-automation.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.297872340425535%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC+klEQVR42pWTfUiVZxjGbyvGVv/UBkEjG6t/FrT+tVFQUGTtxMDEZm7LrRgl1ZBjVmbHo9ZSQ007RZ3U/DrW8XgSP7Ggdvpk0zL8rDDdotV6V2R09Lzve973ee4r3jMLIWh0w4/7vi94Lri4eYgmFQASUpIQYiqA6a9h5umT99dIKSfvMwB8QLDHU/2WZEK1jcK6bhlZxraQqr4wTfOJZFYAKMysGIahaLoeQQgR0aWU1vxYSqky8zF6UOQk/8b15K9vmtJ3b2Ta2L8KMbNN1bRR0zT/YeYnlpn10DBNRQ8bEUxTKEJKxRTC0i3DEMAuGs5MoYbNP3xUX+OjmZ/FRKJLIFbT9b+klIMABgD0Aeh5B90A/mbmw0QukPvbDfMPFLlj96RmrJyIvFRV1eeaHn6m6eHxsbGQVEZfYviRgt7hh+i8M4KrfUPo6BqA/2oXqs5fwWgwZAA4Rt1DD8h7PhB3o7sftfVNT78/VO7KqOwIJP5a0bsuy/PI2/Bd8JwvHol5dUgvb4a9rAkpLh9WpZdgQ44TCdlOfJOZiy1Fjcsi8c5cGqDS8prcjmt/oMLf+nz7kdr7Ff5K2HbnaMvTjt9N2L/7ZmKW/bflaaXNSfnVVcmFnuKkghpHzI787Ut25iV9+fOBNV/8dHCJlezh01Ei276WH0vq2jrPXhtE5YXfEbfHXeosdrT29QeMoCZ6gip3CkYAQAeAdoDb/+sR2iZoBnCLmbMo17FiU2PgVpW3oQHV59oRa3fH3/5T22oYQkghBMAMlhBSQg+HoWp6BMM0ISXDFAKGYc0SzOyh05vpk+qWK55THh9KTnvVhNS9s4liKBgaX2BKjjaFjJaSowG8BfMbfS6AeQA+ptwju8ju+MWd4fJ+nZaT6c5wbltbVpZOE9d+J8z8lkbHa73rTja2j2efqEktqG06W9Z8sSvdkTNn4bLV1NUzYP2cKGaOsvr/MMXqVFDhne3vfPz50TMXPvRdHpzhbr0+69NFi6O+ssVRSnYhvW+9AhAbyTPbVVOQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A robot holding a sales lead extracted from a website feed; a sales lead extraction robot&quot;
        title=&quot;A robot holding a sales lead extracted from a website feed; a sales lead extraction robot&quot;
        src=&quot;/static/3105de0f9a9a9535180d2665a580dad1/1d69c/leads-automation.png&quot;
        srcset=&quot;/static/3105de0f9a9a9535180d2665a580dad1/4dcb9/leads-automation.png 188w,
/static/3105de0f9a9a9535180d2665a580dad1/5ff7e/leads-automation.png 375w,
/static/3105de0f9a9a9535180d2665a580dad1/1d69c/leads-automation.png 750w,
/static/3105de0f9a9a9535180d2665a580dad1/8740f/leads-automation.png 1106w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For the past several months the biggest issue we’ve been struggling with is finding a repeatable sales process for generating leads. I know, I’m sure everybody has tuned in right now and is waiting for the silver bullet which I’ve discovered! Sorry to disappoint, but there is no silver bullet. However, I think we&apos;ve found a little silver nugget: a no-code way to build an automated lead generation machine!&lt;/p&gt;
&lt;h2 id=&quot;from-outsourcing-to-automation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#from-outsourcing-to-automation&quot; aria-label=&quot;from outsourcing to automation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;From outsourcing to automation&lt;/h2&gt;
&lt;p&gt;In our never-ending pursuit to be innovative in our business, I’ve been trying to learn as much as possible. I picked up a Udemy course called &lt;a href=&quot;https://www.udemy.com/course/outsourced-lead-generation-machine/&quot;&gt;Outsourced Lead Generation Machine&lt;/a&gt;. It sounded like a great way out of our predicament. After all, most of our team is comprised of Software Craftsmen, and boy, would we want to outsource our lead generation! Sure enough, it’s an excellent course, definitely worth the money. The course led me to the idea of automating, not merely outsourcing, our lead generation. We’re mostly still in the experimental stage of this effort, but we do have enough validated learning to share with you. So the little nugget of knowledge that I’d like to share today is our experience with automating our lead generation.&lt;/p&gt;
&lt;h2 id=&quot;define-your-customer-profile&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#define-your-customer-profile&quot; aria-label=&quot;define your customer profile permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Define your customer profile&lt;/h2&gt;
&lt;p&gt;As I mentioned, the Udemy course is great. It has a lot of useful information and one of the first steps in the process is to build out the customer profile. The obvious reason is that you, as the salesperson, should know who you’re targeting. The customer profile is almost like a scorecard, which you can use to determine which customers are the closest match for your sales targeting needs. We did so in ST6 and here is our customer profile:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a5d9d5afc178445e9ac402cdfb88688f/d9199/customer-profile.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVR42n3S22rbMAAG4DzE1suROrZ1PlhynDmxLVuy5UMa9gRtd1Fo6cYGG4PS1yp9v+GkK7tYBz9CN59OvxYEQAIghQiF8Tbb3N7c3N/dffvy9fry8tePn5+vrq/66PunD7f75f3FMhcxiiGDcBWgp4ezBQEQxwDHAIaRINQa05RV21hTFEPbtVVZp7FLg1qtXBokOCYA8iN+fny/oBBpITOl5+g0lUkqEy0kDKPoPEBhxAkXTEmuVJIpkcBVyCAMV/gF5+vsME51WZX5tsy3+TrbbjYcE4awFtKW5b73h3EYWtfWzTpRHKPzJXh+PJvxRqedtfk6y5Te6DRTGqzC03USxs2usKa+GKeh8966zlpXVZylTw/vFoJQZ4y37jDtJ9/vh8E7VxclQxjHQFJmdoW3zru2s270fVs3o/cIihnjGCghp37QQkrKEsYFZYqLv/ER9F1jvZv92HVSZvOxGcLFx9xbZytjitKaeq4til8rpAgzhAWhgtDjhEhCAGAz5piYXeHqZuqH3nVD22khcQxO+J+hEAYBnF+bAMiOa1OITuMbAL2GI/RS1X92eCvszyf5DRxRjIUoworhAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of a presentation slide containing customer profile properties&quot;
        title=&quot;A screenshot of a presentation slide containing customer profile properties&quot;
        src=&quot;/static/a5d9d5afc178445e9ac402cdfb88688f/1d69c/customer-profile.png&quot;
        srcset=&quot;/static/a5d9d5afc178445e9ac402cdfb88688f/4dcb9/customer-profile.png 188w,
/static/a5d9d5afc178445e9ac402cdfb88688f/5ff7e/customer-profile.png 375w,
/static/a5d9d5afc178445e9ac402cdfb88688f/1d69c/customer-profile.png 750w,
/static/a5d9d5afc178445e9ac402cdfb88688f/d9199/customer-profile.png 960w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You’ll notice that we have some abbreviations in parentheses after each profile property. These are the abbreviations for the potential source of information for the lead. It’s going to be particularly helpful to know where to find this information if you’re going to automate the process.&lt;/p&gt;
&lt;p&gt;In this case, the sources are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JD - Job Description&lt;/li&gt;
&lt;li&gt;WS - Website&lt;/li&gt;
&lt;li&gt;BW - Built With&lt;/li&gt;
&lt;li&gt;CB - CrunchBase&lt;/li&gt;
&lt;li&gt;LI - LinkedIn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In our initial iteration, we wanted to make sure that we identify companies that, at the very least, are looking for software developers. After all, our company is in the business of providing software craftsmanship services. Our hypothesis was that if the companies are listing open positions for software developers, then they might consider software development and consulting services. Naturally, that narrowed down what we were looking for job posts.&lt;/p&gt;
&lt;h2 id=&quot;define-your-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#define-your-problem&quot; aria-label=&quot;define your problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Define your problem&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; At ST6 one of the biggest priorities is to identify and connect with companies, which are looking for remote software engineers. Aside from the standard networking and referral approaches, we decided to explore other ways to identify companies (leads) that might need our services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Scrape the internet for job listings that match the profile of our team. Build out a score that tells us which job is the closest match to our profile.&lt;/p&gt;
&lt;p&gt;The initial information needed was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Technical/Skills&lt;/li&gt;
&lt;li&gt;Background&lt;/li&gt;
&lt;li&gt;Company Culture&lt;/li&gt;
&lt;li&gt;Company Profile&lt;/li&gt;
&lt;li&gt;Remote OK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeah, but how do we do that without writing code, you ask?&lt;/p&gt;
&lt;h2 id=&quot;the-solution-no-code-mvp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-solution-no-code-mvp&quot; aria-label=&quot;the solution no code mvp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The solution: no-code MVP&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/72daa6cca9ad255b82fa692a232065bf/d9199/low-code-mvp.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB10lEQVR42m1SyW7TUBT1ByCxIRWLIhT7Tffd9+IBz3Yc23mJ04RBVIgNqKAWVKlSF4gFAbHhI1iwQCwQO3aFf+FrEHITUIQqnd255w7nHgu52IUSwGxnPp2enZ6+OD45ef7s7N7tRUoYASW2NVoIx4aL9Z4lGReEAmVAWU+AlIynUTxr21nTmknZhnakqLrUKC7UX/HPdwPLRVUmSRFFWRRvOOQgGRXEoUNbCQiDxHd9ZBwZl4wj51rwS/Ge5SkdhKn24yLNKZcOA+TCHqJtayXgjuuZSVWmqQZUAFpKJWAkJSGyn8wc+mHhfnmA2rFf+rfOg32kcv305vujgeDoosrjpJ3UnZkt5107qU3TLoxRGFysb1jaHv56Y35/fDJH+1t2/Xt5bUXx0woef/0s2sNAsCLL20m9nHf3l6tuau4eHMyaZnsz5/K4Dl7PA9/1H6beYaJDpQJvrB69Qu15iFVe1OOqM2bW9BZ202k7Hm/FWkAYZXFWZWGUJFmaFv7IrcvcJL1JGmQeJ824KpK0yosyzbIoLuKYEvzxdmD1v2VUUyoIRUJ6KygDh3AmUABQ5qKq8kIJ4A7ZPFVSunV7E4wr8S85fd+dshHAdu3/EnYldhvhTkj+APeXilTMhrfPAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of a presentation slide containing the initial results from the MVP along with the logos of RSS.app, Zapier, and Airtable&quot;
        title=&quot;A screenshot of a presentation slide containing the initial results from the MVP along with the logos of RSS.app, Zapier, and Airtable&quot;
        src=&quot;/static/72daa6cca9ad255b82fa692a232065bf/1d69c/low-code-mvp.png&quot;
        srcset=&quot;/static/72daa6cca9ad255b82fa692a232065bf/4dcb9/low-code-mvp.png 188w,
/static/72daa6cca9ad255b82fa692a232065bf/5ff7e/low-code-mvp.png 375w,
/static/72daa6cca9ad255b82fa692a232065bf/1d69c/low-code-mvp.png 750w,
/static/72daa6cca9ad255b82fa692a232065bf/d9199/low-code-mvp.png 960w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Software development resources can be very expensive and should be used almost as a last resort. With that in mind, the first thing we wanted to do was build out an MVP which required as little coding as possible. Given that most salespeople are non-technical, it&apos;s also a good exercise to demonstrate that fairly complex automation can be done without a single line of code being written. Technically speaking, there are a few lines of code written, but they’re very basic and could be avoided with Airtable formulas. In fact, some of the Airtable formulas I wrote are more complex than the code written. Here is the most complicated code written and executed inside some of the Zapier tasks:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;pubDate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pubDate &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token literal-property property&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;company &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;company&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; at &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OK, that’s all the code you’ll see in this blog post. Now let’s get back to the solution! Our tools of choice are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rss.app&quot;&gt;RSS.app&lt;/a&gt;, for generating RSS feeds from websites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zapier.com/&quot;&gt;Zapier&lt;/a&gt;, for automation: consuming RSS feeds and inserting the leads into Airtable.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://airtable.com/&quot;&gt;Airtable&lt;/a&gt;, for storing and organizing our leads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I mentioned earlier, we’ll have to find job posts and figure out which companies are posting them. After scouring the internet for the best job listing websites, we found &lt;a href=&quot;https://github.com/remotelist/remotelist&quot;&gt;an extensive list maintained in a Github repository&lt;/a&gt;. The list also shows which websites provide an RSS feed. Handy! However, RSS is not all that popular nowadays, so if a website doesn’t have an RSS feed, you’ll have to do some internet magic!&lt;/p&gt;
&lt;h2 id=&quot;use-rss-generators&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#use-rss-generators&quot; aria-label=&quot;use rss generators permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Use RSS generators&lt;/h2&gt;
&lt;p&gt;I tried several RSS feed generators and the one that worked best, aside from being the simplest, was &lt;a href=&quot;https://rss.app&quot;&gt;RSS.app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;RSS.app allows you to turn this:
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d3bdb7768f3fc64fd6c24af799ae5eb3/efb68/wwr-job-listings.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 97.8723404255319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAADJElEQVR42n2USW/rNhRG9f/RTRfvD3TRZYG+dtM2aJqmRfMcOGnsyEM8y3ZiO5Y1k9TE80DKGRtUwDE/3Xt1RVrk5yiVM5ktWCzXTKZzy8Jb87DZEUaJJQhj4kQQHHxKEaE11PURfeSonaoSSP8O6Y/I4ilFtqAQHnm6oBTLZyq5osw8tFpC8QDlBqpto4t7KNZ2dPw0Jly36LV+oNP+zHp6ytY7R4suyNv/oEUzJo8tHlfnoO7Id9+jtt+B7ODUdUae9oj3NwTbK7KgSx730OIOLT8GOaIWQ6psAGpEnbnU2a1t7qhwh/A7bLwvpH6XMh1CMbGFWo7sw6+xMTWiTAeoqGc1amzRcoCzcrtsp+dM+r8xcn9lOT5FHK6o0i5auG/gaVQ9Ur/N4f4CZO9V/goHc5VTZNinFmOqbESeDEFNoJih1eQNJq7lBMoZVIuXmJmhmuB88+0n2hc/slv+w359gX/fItxecnhoWZD9N2jRBzUg868JNpcvOdEDcYNz8vsJ87tT9usveOM/8cZnltX03DY3D5sm5v+xmIZyQBHfIoIbq5u4oXNcMopcJWbtQAHkz+hafghaHfMKqgSqGF3nOGbXh2FMp+synS2YLzyWq3u85Qopc/s6zcv1pKVU5HmTz6MWKjiz2tFaU1YVQgiyLEPrGhN74f39+1htX2KpaxwjqihiN5+z2e2Io8g2TpKEoihs6fuG5jCXZUlVlc0mkWsKMW9maH6EzFl4K2bzpTWGwyFku9v/75JVXlKUVdMwG1AkN08NK7Tak6dbCrWnyn3QcUMVocvwA4ImX0eNrgWYj1UGOMvljGjxNyv3FzbeXySPl9YAdNZtjEA0hvAapIsMriiif602RqKzDmRtnPCwIXq8xpucMx3+gf9wCbkxgSG8Qx8xJiDDLkXiWt3Umv3o4lBn1jlU1H+mFs2Bt8fJOosxhfErExhDPnnRxzpT78T+ksd1i9urz3TbP+Fe/2yNYj07YzY4sWZhyPw2qH6zZNUj3l0ig2urn4zDLllXKVU2REY9ROCSBS4idEkPtyR+lyq7ezMb/WpWb2NmhiO+Aqvv7I0Ti24/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of the jobs feed of WeWorkRemotely.com&quot;
        title=&quot;A screenshot of the jobs feed of WeWorkRemotely.com&quot;
        src=&quot;/static/d3bdb7768f3fc64fd6c24af799ae5eb3/1d69c/wwr-job-listings.png&quot;
        srcset=&quot;/static/d3bdb7768f3fc64fd6c24af799ae5eb3/4dcb9/wwr-job-listings.png 188w,
/static/d3bdb7768f3fc64fd6c24af799ae5eb3/5ff7e/wwr-job-listings.png 375w,
/static/d3bdb7768f3fc64fd6c24af799ae5eb3/1d69c/wwr-job-listings.png 750w,
/static/d3bdb7768f3fc64fd6c24af799ae5eb3/78797/wwr-job-listings.png 1125w,
/static/d3bdb7768f3fc64fd6c24af799ae5eb3/aa440/wwr-job-listings.png 1500w,
/static/d3bdb7768f3fc64fd6c24af799ae5eb3/efb68/wwr-job-listings.png 2032w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Into this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/34adf6ce5349446423adc1671f2ba166/3d22e/wwr-jobs-rss.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 106.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAADIElEQVR42qVUaZOjOgyc///bdquSGXIRIAmXsbE5A+ZKekvKsDP73pd3uEol+WrZVrffns8nqCmlsN/tsd/vcTgc4Ps+XNfF+XzGx8cHx6t3HIfXvb+/43g84nQ6IQxD3O93vD0fL8AkSbDZbuDsHN5ERsCe5/GGy+WCIAg4ASUjT2tonhLcbjfGeeMTPgGd5Wy1qWH7Hl3Xof/0/6QRzuPxwBt1xn6E9DI0qkVbdrB2wDgOmOcZ0zRhGAa2vrcYx5HNWgs7DOj6judWUAZcpgWZn6KQEoXJoKWAkgY6N0iSCFkmIETKpnIJKQVSkUDLHEZpdN39T8CpmyCdHNnhBnl1kVwiuK6E7wns9wGOxxt2HwECR8BzYiSJYVNJiTq3sPaBtp0wjssLcOgsokOMwK0Q3iqIuIWUHaTqkWUWmbRIkh5J0kGIHkJYVKVFo3PUJb31jK6bMc+fb1hnJYyXYZoeGKdXkf5L++MNVaggohRNWzMnjTEoyxLGFNBaQ6mcTWvDlaeKEsCXfQMc+4GrLM4CQzv861N9t7dVKUIIJjIRlOI0TRFFESuAfNM0TJWVn2REqb9deQWkK+52O2b9ZrNhcIpJXuSpv91uWSEkN5IeKYaSSSk5ISX4DZiJDD9//Py9edUubaSx6/XK42uCVctkdBCSYNu2X4AqV5ydNEu6pqvHccyeLMsyPkVd1yiKgmMqGsV0fVLVsnzycBomFDcDW1iMzYD/0xhwHmckXgytNExRIM9zpkpVVdA6R2EMisJAFzRveI7WlGXB70d98lS0F6CdoU85iluEIvWh0xhxXCCOJL/l5XKFf/YReiHSMGUwITJUeYu7oesurJJlWX8bOyFyBPytQBjEuHgKJzeHHxgcDpLj/U7i5Gi4e4Nb2EKkDVQsoUSDqhpRlOOXltu8hnITVPWCopwx2hfzlwfweOAVLwD9xWQkTy7mMuJJC/4qvb7uoS85mrLif/B+bzEM9IsQgTv+2qlP49Qnoz/x3r3IvTLlRWw88VyeSIME590ZKs9xvVz5nYgqaSoQhhHrm+hDlCIVUcEoJvp8B/wF6Mg47ZuZW7cAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of an RSS feed which was generated by RSS.app&quot;
        title=&quot;A screenshot of an RSS feed which was generated by RSS.app&quot;
        src=&quot;/static/34adf6ce5349446423adc1671f2ba166/1d69c/wwr-jobs-rss.png&quot;
        srcset=&quot;/static/34adf6ce5349446423adc1671f2ba166/4dcb9/wwr-jobs-rss.png 188w,
/static/34adf6ce5349446423adc1671f2ba166/5ff7e/wwr-jobs-rss.png 375w,
/static/34adf6ce5349446423adc1671f2ba166/1d69c/wwr-jobs-rss.png 750w,
/static/34adf6ce5349446423adc1671f2ba166/78797/wwr-jobs-rss.png 1125w,
/static/34adf6ce5349446423adc1671f2ba166/aa440/wwr-jobs-rss.png 1500w,
/static/34adf6ce5349446423adc1671f2ba166/3d22e/wwr-jobs-rss.png 2010w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You get all this with nothing more than the click of a few buttons:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/8ca3968ed158f9ddf9bbb17bcdfb2370/rss-app-generate-example.gif&quot; alt=&quot;A demonstration of how to create an RSS feed from a website using RSS.app&quot;&gt;&lt;/p&gt;
&lt;p&gt;There you have it! You now have a structured representation of the website with new job listings being represented as new RSS feed events. Let’s move on to the next bit of magic!&lt;/p&gt;
&lt;h2 id=&quot;prepare-your-airtable-base&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prepare-your-airtable-base&quot; aria-label=&quot;prepare your airtable base permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prepare your Airtable base&lt;/h2&gt;
&lt;p&gt;In our particular case, the data we get from the RSS feed generator is the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Job Title&lt;/li&gt;
&lt;li&gt;Job Description&lt;/li&gt;
&lt;li&gt;Pub Date&lt;/li&gt;
&lt;li&gt;Location (sometimes)&lt;/li&gt;
&lt;li&gt;Company (sometimes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s going to be enough to build out our database of leads and start feeding them into Airtable. So go to &lt;a href=&quot;https://airtable.com/&quot;&gt;Airtable&lt;/a&gt;, create your base and add two new tables: Jobs and Companies. For the Jobs table, we’ll use the above-listed fields. My table looks like this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f4ab907218d3306baebda7c08c8eb652/9b29b/airtable-jobs.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACBklEQVR42l2ST4/TMBDF80lRKQeQOHHlgthIqxUnTnwxkJAQbZptEv+3YzvpNm3RQ56kabqHkScZ582bXybrfnyG+/IG7mGNmK8R8jX6fI1jvsLxYYXT03v0Tx/Av64xpHf5is4hfzvFCsPjO5y+f8Lw7SMy6SMqJrBnAkoqaGNgjEFrLWLw6GMY89bjJUZ4a9E6hy4ERAqPGCNi1yH4FpkUAowxlGWJ3W4HzjmklGgYI/HLvwtsG3E8X3COPayQaDgHFwJVXaNuGso5T88NMqUUCSax7XZL+bVJCq0UlHbQNuDFenilwQWnxqmezjlnDJnWena4LQoqpiZCCHIagofSLUzb4eQ7EhRSUv0Wcr5PDpvXDhcfWGshtcNhOOESezipphH5nSjpNA0y4tU0JLjZbEhQzCOPPBnX6A4DzrGDEwpsEnw9doqFYEkOr53ZdMFoTQ7beMA5dGilnmtLl2lKqRQytWBYEMPR/nVs5ywxDP0LCXplIJQc61LS3ev90eE0+40hn4szG65Gh1eGU53x27hSSDKWpS5pl5K7xDCJj2xGPsZoSGVxOJ7IYWLIJ8YiNU88pQAn1/r+p9wxXAgKadEfp78skuNx53Zsj93zM0RRgW32YE2ZBMedq+sa+6oa92nBMK2NNg6h69E7j9ZYWOfgbYu/tsKfooD7VcL+LMGr3/gPk1m6M1KnUbYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;An example table which contains jobs extracted as sales leads and recorded in an Airtable base&quot;
        title=&quot;An example table which contains jobs extracted as sales leads and recorded in an Airtable base&quot;
        src=&quot;/static/f4ab907218d3306baebda7c08c8eb652/1d69c/airtable-jobs.png&quot;
        srcset=&quot;/static/f4ab907218d3306baebda7c08c8eb652/4dcb9/airtable-jobs.png 188w,
/static/f4ab907218d3306baebda7c08c8eb652/5ff7e/airtable-jobs.png 375w,
/static/f4ab907218d3306baebda7c08c8eb652/1d69c/airtable-jobs.png 750w,
/static/f4ab907218d3306baebda7c08c8eb652/78797/airtable-jobs.png 1125w,
/static/f4ab907218d3306baebda7c08c8eb652/aa440/airtable-jobs.png 1500w,
/static/f4ab907218d3306baebda7c08c8eb652/9b29b/airtable-jobs.png 3840w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A quick note about a possible improvement here: the URL is pretty much guaranteed to be unique, so use the URL as your primary key in the table. I’m using the title, but that’s much less likely to be unique.&lt;/p&gt;
&lt;p&gt;The company table contains a few more fields which I’ve added over time. The “final product” of our labor is a table with detailed company information which we find relevant.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dcf2107bf0e5e853733168dee0d69bea/9b29b/airtable-companies.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACIUlEQVR42mWSzW7VQAyF86BASxcIiQ1PAPTCoqzYI94MJJBAhdumyfz/Tz7kyb1SEZYsZyYe+5xjT+bLgeXzNerNE8zhOfrtU9z1BfFwQbx+Rr55gbt5ye93V+T3l6SzHy5Ih8uRkz5ckT69Jn18xXTvE3PuLEqzrBozHzHzH7TSeOswaiVYg9cK7+S8xxgCKUZi8OSUiCnhrGUKzsG20XrH1cKWMl07vK94m3He78ne40PAWEuIEbHa2rgrtY7zqh2TtRY2yLWyRs/WOltr9N5p8sB7cs4jCqpNmreGc46c0/gWF9PGMa1KjUMshV9GDfjBebwvBJfRWo/H2hikubVuIKy10lofb3vfEFTWBaZlWUZXga9TodlAnRVrKJRc/yuoREPvT4X6qfCO0LrINM/zuMylcFwVWy50Fwh1px1F+JMnET/GIcEAUStBNCzlpKFlWtd1/Cy14WISOdmJbOP+sW2PojST/5KyUwZt/V5wdGmNNUR6L/QWKaVRxWv9xwWNRCkmhfa4QzBS0BhDq22MfpaCztAfbompE31GGopuEiVXaJ8pi3YyoDNlI0ORvRIrY20qPSm6+YHoXEsdwxDdtD5P2Y7zoNt3Hdt2QihDkQmOJa2NmBp0z5bvSKERw2n/YhxRpLGPFtvVyKIUeXVsLrM83O8IhYIsbbSOlCspt7G0ueRBJ+cyovhYeBlI69zmhZ/HI/HbkfD1juXuO38Bj1Tg/yw8HAcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;An example table which contains companies extracted as sales leads and recorded in an Airtable base&quot;
        title=&quot;An example table which contains companies extracted as sales leads and recorded in an Airtable base&quot;
        src=&quot;/static/dcf2107bf0e5e853733168dee0d69bea/1d69c/airtable-companies.png&quot;
        srcset=&quot;/static/dcf2107bf0e5e853733168dee0d69bea/4dcb9/airtable-companies.png 188w,
/static/dcf2107bf0e5e853733168dee0d69bea/5ff7e/airtable-companies.png 375w,
/static/dcf2107bf0e5e853733168dee0d69bea/1d69c/airtable-companies.png 750w,
/static/dcf2107bf0e5e853733168dee0d69bea/78797/airtable-companies.png 1125w,
/static/dcf2107bf0e5e853733168dee0d69bea/aa440/airtable-companies.png 1500w,
/static/dcf2107bf0e5e853733168dee0d69bea/9b29b/airtable-companies.png 3840w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;automate-with-zapier&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#automate-with-zapier&quot; aria-label=&quot;automate with zapier permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automate with Zapier&lt;/h2&gt;
&lt;p&gt;So now that you have your RSS feed, how do you get the data into your Airtable? Well, that’s where &lt;a href=&quot;https://zapier.com/&quot;&gt;Zapier&lt;/a&gt; comes in. Zapier allows you to automate everyday business tasks with ease. The basic components of every Zapier task, or Zap as they call it, is a Trigger and an Action.&lt;/p&gt;
&lt;p&gt;In this case, our Trigger is the RSS feed and our Action is the Airtable. For a high-level overview of the Airtable integration see the &lt;a href=&quot;https://zapier.com/apps/airtable/integrations/rss/7330/save-rss-feed-entries-as-airtable-records&quot;&gt;integration documentation for Airtable&lt;/a&gt;. I won’t go through the entire setup process, but I’ll show you how one looks like once it’s all set:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/596febd8204fa262a788149954d55096/stackoverflow-zapier.gif&quot; alt=&quot;A screencaptured demonstration of a Zapier automation for the consumption of an RSS feed of StackOverflow job listings&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-steps-for-setting-up-your-trigger-are&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-steps-for-setting-up-your-trigger-are&quot; aria-label=&quot;the steps for setting up your trigger are permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The steps for setting up your trigger are:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Pick the RSS feed as your Trigger.&lt;/li&gt;
&lt;li&gt;Select the “New Item in Feed” as your trigger option.&lt;/li&gt;
&lt;li&gt;Inspect the RSS feed details collected by Zapier.&lt;/li&gt;
&lt;li&gt;Test: Zapier provides you with several samples, so inspect them and confirm that they contain the information you expect.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;the-steps-for-setting-up-your-action-are&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-steps-for-setting-up-your-action-are&quot; aria-label=&quot;the steps for setting up your action are permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The steps for setting up your action are:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select Airtable as your Action.&lt;/li&gt;
&lt;li&gt;Use the “Find Record” action. Note that “find” can be used to “create” a record if one is not found. I prefer this over create because it gives me the option to validate that the entry doesn’t exist in our database already.&lt;/li&gt;
&lt;li&gt;Connect your Airtable by supplying your API key (you’ll need to generate an Airtable API key from your &lt;a href=&quot;https://support.airtable.com/hc/en-us/articles/360004108013-Account-page-overview&quot;&gt;Airtable accounts page&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Select your options:
&lt;ul&gt;
&lt;li&gt;Base: mine is the “Lead Gen” base which I created in Airtable.&lt;/li&gt;
&lt;li&gt;Table: Jobs.&lt;/li&gt;
&lt;li&gt;Search Field: search by your primary field (I’m using the Title, but I recommend that you use the URL of the post).&lt;/li&gt;
&lt;li&gt;Search Value: the value you’ll search with from the Trigger result (again, I’m using the title, but I recommend using the URL instead).&lt;/li&gt;
&lt;li&gt;Check the “Create an Airtable Record if it doesn’t exist yet?” checkbox.&lt;/li&gt;
&lt;li&gt;For each Airtable field match the RSS element from the Trigger.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test: this step will insert an entry into your Airtable. This is usually the sample that Zapier obtained in step 4 of your Trigger setup.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Well, that’s it. Now comes the final touch.&lt;/p&gt;
&lt;h2 id=&quot;turn-your-airtable-into-a-pipeline-of-leads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#turn-your-airtable-into-a-pipeline-of-leads&quot; aria-label=&quot;turn your airtable into a pipeline of leads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn your airtable into a pipeline of leads&lt;/h2&gt;
&lt;p&gt;Now that you have your RSS feed generating new leads and Zapier feeding those leads into Airtable, let’s look at how you can make this into an actual sales process. You can make a pipeline for the job posts or for companies, the process is the same. I’ll only do it for the job posts.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a8f549cd5aee1971e78b02a7ae2057eb/748b0/airtable-status-field.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 129.7872340425532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAABYlAAAWJQFJUiTwAAADs0lEQVR42oWVyW7jRhCG9bw55EHyDgFySe5ZEMzVQSwjniVwMnYgWeIiiqu4NMkmeyGpP6iS6ZGFmXEBP7pNNj/X1qVFKxWUNjCqR1/lkOUBXZVD1xWUKHjfdRJd10FrDWPMZzUMA2ux8koUooWULbzdDo+bDTZbB5UQOOQ5XM+D4zjYbDaoqgpSSrRt+yzZtmiaBlmWIUkSLNqqhLED/xc6nGYZojhGXhQoqwpl+YqqioFhGCKOYyxUXeJ4BMZxZKjvuXj4+BGHLIVsajSiQlOLTxIv1daCHVmtVliv11j0osR0PGIcBs5lUEkEokfYata+OSl80uU+lhZSaQRBgN1udwKO04TBWvR2xC8fVvj9o4+fP6zx5r8Av/3j4M+wxfsaeCeOL9a35YSbVKHoNDzXgeO4WFjZYDZlDA6dRtYqJE2HlNceh84g7y2v9Iz2mVQo9Qg5Ab3W8Lh4LhZVlsELUvhBAik7ROEeSRQhjSNkSYxoH/D+kCa8JlEIURYIgx3yLMVoqW00Hh8fuSMWZZpi4yXYeiGU0tC9htIa2hj+u+97luw6Tr5Sit91Xc9tQ3sSFcR1XSzyOMb9ysd6tUPcprjr7yFricPhgLIsub+oqWejXnx4eGDd399ju90yeLVe836hmwrDdMRgR3SmhzA1dK/YG9J8Q6ZpwvF4ZA8JWhQFSwjBEVDj+75/AtJhujZ2GAGpYSuBoiz5g9kIRro0evYCaGXNL05AC6NGdI1GWZXI85y9mz88B88iZwjIOaSi5HEEf5/BWrrcT8DWoBIV8sNL4KXICEhpcFz3U1G84AzYT5C1QZom7OF5aJehktGVJSAVhHpxkYZ7PLrRE3CA1ob7kRJPlaakfy6Hlx5SDreOcyrKSFWmHNoB1mj0nURd1+whtcSrQK0ZyHdZ1RW/JKAZBqCXGESJ7JBzD54X40shU55pZj4BT9OGJ64d0Q4N8j5DXdV8+EsFOfeQgHT1OIemFWfAAcpINLJEXTecG4K+BqRzBOM+PAeeQjYYRYe8LBBFEQ/dr9nch9Q2YRRdAI2BqGsE+4AHJo10yguN+O5pOMxqW4mmlZBd/3xT+DflEkhVTdP0WeTlPGVI1tpTs4/qJGhYo+C63qko50A6/DXjCIRgwHdvRnz7k8U3P4648xX2/hZbGrDnQPJgBtPHc5XPjc4cjxN+/Rf4YQl8vwR2xYQkCuD7Zx7OE4cgtJJRyFdXV1gul7i+vn6xvru5wt37Jf6+/QN/3Vzj9vYtP/8f2SPB1CGiwM8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of the Airtable field options representing the leads pipeline stages&quot;
        title=&quot;A screenshot of the Airtable field options representing the leads pipeline stages&quot;
        src=&quot;/static/a8f549cd5aee1971e78b02a7ae2057eb/1d69c/airtable-status-field.png&quot;
        srcset=&quot;/static/a8f549cd5aee1971e78b02a7ae2057eb/4dcb9/airtable-status-field.png 188w,
/static/a8f549cd5aee1971e78b02a7ae2057eb/5ff7e/airtable-status-field.png 375w,
/static/a8f549cd5aee1971e78b02a7ae2057eb/1d69c/airtable-status-field.png 750w,
/static/a8f549cd5aee1971e78b02a7ae2057eb/748b0/airtable-status-field.png 868w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a new “single select” field to your Jobs table called “Status”.&lt;/li&gt;
&lt;li&gt;For the State field, enter several options which represent your pipeline stages.&lt;/li&gt;
&lt;li&gt;Click on the view and add a new Kanban view; select Status as your grouping field.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There you have it! Now you can view your lead as a pipeline, which looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e1476b4b1aa79df6ff09b47d9d132248/9b29b/airtable-kanban.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACL0lEQVR42lVTy5LTMBDUj0I2HKCKGzdusBsOy4kL/7apYiF2Ese2NHrLj5yamtFuCg4qtfXo6e6RVfr5GfHLG8SHLeL9nczTbovlYYP5/i2uj+9RHj/g8nWL626DdXeH9WFTx25b52/vcP3xCev3j1A6RIQQoPsB1hg470CaQCMhRY/oPCI5rCUhxQBLBiUllBSRSMtccobPXvaVHgZ472HJwjqPeZ7hnId1AcuywDqHrtcIMSPlDLIO0zyjTBPIkMw5ZwxaI5cCxepySnDOIcSIeZoQY4T3QQ5aa+GdxzLPSCnJOhctpdxwihHGGOFRMaabkhAi5rkSXnotiq0ljOShQxFLhixyLkLImO9zYca8prjKNE2w1gkBY1bdDxopZYzjgEPT4E/T4tJ1MMaKUr48aoNRk2Ciuq642rqucN4jpiw4SKMirtcr+n5A0zQ4ti26roNzQRTWwnxmrYKcRykTlA9B8mGFXJ2rsUKOgHHf90LYvhBqQxIJ72lNkiNjvs9YjaMWgqqw5lkJvWCt9X+EhpwoWZa55lnKTSFnqXKZxBqzv3aNFbA1ts9dvhGezxiNw8UExODleTE5E7qXJ6f6fhTJvDAMWqq8NqWGTTXD41FIeRwODc5M/o9lEsseKuWqUBoRs9jkblXLq7xPJjmdTrfB5NW+hfNRFBr5MQLUc3tBe76gOx2x/33EoT0Jfm6O+NWc0BwOeHp6wn6/vw3+ZtUcR9sTDBGIDJqe8BeF7sQUtAcM0wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of a simple Kanban board in Airtable containing jobs as example sales leads&quot;
        title=&quot;A screenshot of a simple Kanban board in Airtable containing jobs as example sales leads&quot;
        src=&quot;/static/e1476b4b1aa79df6ff09b47d9d132248/1d69c/airtable-kanban.png&quot;
        srcset=&quot;/static/e1476b4b1aa79df6ff09b47d9d132248/4dcb9/airtable-kanban.png 188w,
/static/e1476b4b1aa79df6ff09b47d9d132248/5ff7e/airtable-kanban.png 375w,
/static/e1476b4b1aa79df6ff09b47d9d132248/1d69c/airtable-kanban.png 750w,
/static/e1476b4b1aa79df6ff09b47d9d132248/78797/airtable-kanban.png 1125w,
/static/e1476b4b1aa79df6ff09b47d9d132248/aa440/airtable-kanban.png 1500w,
/static/e1476b4b1aa79df6ff09b47d9d132248/9b29b/airtable-kanban.png 3840w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Of course, you can edit what kind of information your Kanban cards contain and it can be even more useful. Here is ours:
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5bc3268126430ebbc925ee083c847ec5/9b29b/airtable-kanban-advanced.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACP0lEQVR42nWTW2sTQRTH8z2tthYEwRdffZE0CopPvvjV2gSx3VuSzczOda/ZTfKTmbR9sS4cODAz/9s5O6t/fcJ+vsDdXOEXbzGLN/j5Bf38Fd38Nftv72i+v2c7v2ZYXDJ8uTpX6BdXDDeX9F+v2f/8yPDjAzNtPd45lNbsthWlKqnEGpEVaKVovMOqitpomrrG64rGnnvrNLU3DF2H9x4vJTNTKbyvqZsGIRRt09G0LTuhEFLT9z2iUihj6foeYwxCVLRdh9aKnTKUyuGswVnHTGlL2/bxobWW8PXhslJM04HT6YTRmmk/xjNrHW3Xx77cbknTjCwvKIqcoiiY1XXN4XCg6zqU0lF6AK6qKvZBrVGKrm6YphFjPG17Bi/LkuThgSxLSdNzzYJ8X9c0TYOsFOM4nW1KyTiOHI9HKqUw1kZSa2wkDHeklCRJQpZlzzULYOEbhgHnLNM0EVRbY+j2UyQw2jA+W7ZYV8coXgQMIQd1TwplpWNO5XbDn2xLsSnRUtI3DdNhikMJhP8HtC4eBoXh8vF4iipDHlmakCYJOyGRStM2LcaEfFW0L4R4wbL3MSsXdlGpyB7U5nl+DjpLqaRkP+yfLff9EPsXFWptYsBBXbmT7PdjJAiHT5NTQtC1PcfT6XEDVCR9UWH9OJRgodKOE8TJhp0KKrMsR4gdaRkWvYrE4e8K0QRH/wCmWc4qWVOEx3nO73RDsV6zWq1YLpex7u6WrJZ33N7e8nB/T5JvSIrtOeOQ9aObAPgXk3vDvX5SO84AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A screenshot of an advanced Kanban board in Airtable containing jobs as example sales leads&quot;
        title=&quot;A screenshot of an advanced Kanban board in Airtable containing jobs as example sales leads&quot;
        src=&quot;/static/5bc3268126430ebbc925ee083c847ec5/1d69c/airtable-kanban-advanced.png&quot;
        srcset=&quot;/static/5bc3268126430ebbc925ee083c847ec5/4dcb9/airtable-kanban-advanced.png 188w,
/static/5bc3268126430ebbc925ee083c847ec5/5ff7e/airtable-kanban-advanced.png 375w,
/static/5bc3268126430ebbc925ee083c847ec5/1d69c/airtable-kanban-advanced.png 750w,
/static/5bc3268126430ebbc925ee083c847ec5/78797/airtable-kanban-advanced.png 1125w,
/static/5bc3268126430ebbc925ee083c847ec5/aa440/airtable-kanban-advanced.png 1500w,
/static/5bc3268126430ebbc925ee083c847ec5/9b29b/airtable-kanban-advanced.png 3840w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Our database of leads quickly filled up and we had to come up with a scoring mechanism, which ranks the leads based on how well they match our target profile. You’ll notice that in the image above the leads are ordered by their score. That’s very useful for prioritizing which leads to contact first. The scoring is a little more complicated and may require writing a few simple lines of code that can be executed in Zapier. I’ll skip that for now, since our focus here is on the “No Code” aspect of these tools.&lt;/p&gt;
&lt;h2 id=&quot;reap-the-benefits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reap-the-benefits&quot; aria-label=&quot;reap the benefits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reap the benefits&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/static/8a107cccb65dff40918bd991a3e5d3ee/make-it-rain.gif&quot; alt=&quot;TI, Michael Pena, and David Datsmalchain making it rain money&quot;&gt;&lt;/p&gt;
&lt;p&gt;It took me about a week to implement this entire solution and connect 10 different sources of job listings. For the first 10 days, we managed to get over 370 job listings and 177 companies. That increased to around 1500 job listings and 500 companies within the first month. The fast growth of the database has caused us to hit the Airtable limit for free usage. You may have noticed the “Over limits” warning on some of the screenshots. But upgrading to a paid plan is still cheaper than developing a crawler from scratch. Even as an elite team of software craftsmen, we’re still very cognizant of the cost of development. This is something we often try to communicate with our clients:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Software development is &lt;strong&gt;very&lt;/strong&gt; expensive. Be agile - build it in small iterative steps and make sure it is the best solution for the right problem.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s clear that today’s tools are becoming very powerful and you can now extract leads from many websites with minimal coding skills.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Crafting a Secure and Maintainable AWS Multi-Account Setup #3]]></title><description><![CDATA[Introduction In my previous blog post, I showed you how we at ST6 crafted our AWS Organization and the reasoning behind our choices. I also…]]></description><link>https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-3/</link><guid isPermaLink="false">https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-3/</guid><pubDate>Mon, 19 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 510px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/bb64db70072ae149e0867b7c02d44d5d/0abdd/terraform-and-aws.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.63829787234043%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAC4jAAAuIwF4pT92AAAClUlEQVR42o2U/UuTURTH9x+K6RwSbjP3qmwrp21DpBBRM1/ol9zWxBCjFzU1E6QcbRUitDZXOZoDF4E2UMG9icrmJ54Lz3x0pp1f7uE89/ne7/l+z70qgNPTU2mhXC6LXF7lujK/LlRKMCni8TgjIyOVDReBrjtIJRcDgQBerxeXy01t7Q3Gxsbo6+sTB1xkL+eXgapkZpOTk9TU1PAk8Jjwx/d0draj1Wo5ODgQ30ul0rkfZaCL4CopiUajuN1uRoYfEX5b5s9v+BLZxOGw4fP5yWazFaDl5WUWFxertJNBBaDf76e+Xs2bxVk2Y9CuSxNdz+B2d2KxWAWIFMViEZvNhl6vZ39/X9QSiQQnJydnDOWWp6amsFpNRCMbrAazzMw+w2azs7KygsFgoLe3F4/Hg06no6WlBafTSX9/P42NjYRCoYosFZeHhoZobm6mtdWK43abYGY0GgkGg3R1daFWqxkcfMC3+DqpzSTTr16i12lpbWsjk8lUjKsAJpNJodX09AwGg1G0tL29LTZ3dDgZfDhUpVvo8xoWi5mdnZ3zpijdy+VypFIpkYfDYWHWzSYtkdUP8Osdhe+vOVx/ztHXCYqJJe56ujEZDUKyqsGW9ZTD5/Oh0TSgu2UiHnxBKXSP3EoP+aU7FD8NU1zz0n2/lwa1mtHR0TOXlSzl2ZJFllw0m808nZioavlnMonZYiEWi50N9r/upFKGnp4empq0LCwskM/nOT4+YmPjh3DabrdzeHh4ZsplQEqW0tXTaDSCpTQFDocDl8slRkeq1dXVVeZUjM11DAuFAnNzc6TTaba2tjCZTOKASCTC3t4e8/Pz7O7unnf5f9qWY3x8nIGBgauv3lVg0iq1onwElOYpHw2J4V/WEKTKiC3JEgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terraform and AWS&quot;
        title=&quot;Terraform and AWS&quot;
        src=&quot;/static/bb64db70072ae149e0867b7c02d44d5d/0abdd/terraform-and-aws.png&quot;
        srcset=&quot;/static/bb64db70072ae149e0867b7c02d44d5d/4dcb9/terraform-and-aws.png 188w,
/static/bb64db70072ae149e0867b7c02d44d5d/5ff7e/terraform-and-aws.png 375w,
/static/bb64db70072ae149e0867b7c02d44d5d/0abdd/terraform-and-aws.png 510w&quot;
        sizes=&quot;(max-width: 510px) 100vw, 510px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-2/&quot;&gt;In my previous blog post&lt;/a&gt;, I showed you how we at ST6 crafted our AWS Organization and the reasoning behind our choices. I also explained that we use Terraform and that all repeatable configuration is modularized. Now I will walk you through the solution.&lt;/p&gt;
&lt;p&gt;I&apos;m not going to cover &lt;a href=&quot;https://learn.hashicorp.com/terraform&quot;&gt;Terraform basics&lt;/a&gt;, but having a good understanding of &lt;a href=&quot;https://www.terraform.io/docs/providers/&quot;&gt;providers&lt;/a&gt; and &lt;a href=&quot;https://www.terraform.io/docs/modules/index.html&quot;&gt;modules&lt;/a&gt; is essential for the solution. So, let&apos;s refresh our knowledge before we get to the good stuff.&lt;/p&gt;
&lt;h2 id=&quot;providers&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#providers&quot; aria-label=&quot;providers permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Providers&lt;/h2&gt;
&lt;p&gt;A provider in Terraform is responsible for API interactions and authentication. Each public cloud has a separate provider.&lt;/p&gt;
&lt;p&gt;The shortest way you can define an &lt;a href=&quot;https://www.terraform.io/docs/providers/aws/index.html&quot;&gt;AWS provider in Terraform&lt;/a&gt; is:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&apos;s best practice to lock the provider version so that you are in control of the updates. I have seen how an update can cause recreation of resources. To do that you have to add the &lt;code class=&quot;language-text&quot;&gt;version&lt;/code&gt; argument to the provider:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that your provider is defined and the version is locked, you need to initialize it by executing &lt;code class=&quot;language-text&quot;&gt;terraform init&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A good question at this point would be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How does Terraform know which region and what credentials to use?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are several ways to provide credentials to Terraform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Static credentials&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You should avoid static credentials at all cost. Having credentials hardcoded is against best practices as you risk a leak. You don&apos;t want your resources to be destroyed or sensitive data to be stolen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment variables&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Environment variables are one mechanism you can use. You just need to define &lt;code class=&quot;language-text&quot;&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;AWS_DEFAULT_REGION&lt;/code&gt; environment variables in your execution environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Credentials file&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The AWS CLI can store credentials in a configuration file. On macOS and Linux, the default file location is &lt;code class=&quot;language-text&quot;&gt;$HOME/.aws/credentials&lt;/code&gt;. To generate this file, you can create it manually or create one by executing &lt;code class=&quot;language-text&quot;&gt;aws configure&lt;/code&gt; and following the steps on the CLI prompts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ECS and CodeBuild Task Roles&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Terraform can use IAM Task Roles that are configured on ECS and CodeBuild. Terraform checks for the &lt;code class=&quot;language-text&quot;&gt;AWS_CONTAINER_CREDENTIALS_RELATIVE_URI&lt;/code&gt; environment variable. If it doesn&apos;t find this variable it will try to use the EC2 Instance Profile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EC2 Instance Profile with IAM Role&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An EC2 instance can assume an IAM Role if it is configured with an EC2 Instance Profile. The &lt;a href=&quot;https://aws.amazon.com/sdk-for-go/&quot;&gt;Go SDK&lt;/a&gt; (which is used by the Terraform AWS Provider) makes an API call to the metadata endpoint. If you are running Terraform on an EC2 instance, this is the preferred method as credentials are rotated. This approach reduces the chance of leakage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assume an IAM Role&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Terraform can also assume an IAM Role. You just need to supply it with a &lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html&quot;&gt;Role ARN&lt;/a&gt;. Keep in mind that to assume a role you need to be already authenticated.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One important thing to point out is that you can have more than one provider configured. You can achieve this with &lt;a href=&quot;https://www.terraform.io/docs/configuration/providers.html#alias-multiple-provider-instances&quot;&gt;provider aliases&lt;/a&gt;. When a provider doesn&apos;t have an &lt;code class=&quot;language-text&quot;&gt;alias&lt;/code&gt; argument, then it&apos;s considered the default provider which is named &lt;code class=&quot;language-text&quot;&gt;aws&lt;/code&gt;. Here is an example of a multiple provider definition:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;assume_role&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;role_arn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::123456789012:role/TerraformRole&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example configuration, we have a default provider &lt;code class=&quot;language-text&quot;&gt;aws&lt;/code&gt; and a second provider named &lt;code class=&quot;language-text&quot;&gt;aws.secondary&lt;/code&gt;. The default AWS provider is used to assume the IAM Role &lt;code class=&quot;language-text&quot;&gt;TerraformRole&lt;/code&gt; in account &lt;code class=&quot;language-text&quot;&gt;123456789012&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How do aliases help me?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Think of aliases as the different AWS accounts and regions that you have. When you define a resource, it uses the default provider unless you add the &lt;code class=&quot;language-text&quot;&gt;provider&lt;/code&gt; argument. This means that you can easily create two resources in different accounts and/or regions.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;assume_role&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;role_arn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::123456789012:role/TerraformRole&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_iam_user&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user1&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user1&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_iam_user&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user2&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user2&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;provider&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws.secondary
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, one IAM User will be created in the default provider account and/or region and one in the secondary.&lt;/p&gt;
&lt;p&gt;One interesting thing is that you can dynamically construct the providers. This means that you can create a new AWS account, construct the provider role ARN and create resources in the new account with a single step.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;assume_role&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;role_arn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;aws_organizations_account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;secondary&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;:role/OrganizationAccountAccessRole&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_organizations_account&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;email&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary@john.doe&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_iam_user&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;provider&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws.secondary
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The above example will create a new AWS Account and an IAM User in it. Please note that there needs to be an AWS Organization configured for this example to work.&lt;/p&gt;
&lt;h2 id=&quot;modules&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#modules&quot; aria-label=&quot;modules permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Modules&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.terraform.io/docs/modules/index.html&quot;&gt;Terraform module&lt;/a&gt; is a group of resources that are bundled together. They are used to abstract repeatable configuration. To create a module, you have to place its &lt;code class=&quot;language-text&quot;&gt;.tf&lt;/code&gt; files in a directory separated from the main working directory. Here is an example of a module file structure.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── modules
│   └── ec2_instance
│       └── main.tf
└── main.tf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Terraform modules act just like a resource. They too have arguments and attributes. All variables that you define in the module &lt;code class=&quot;language-text&quot;&gt;.tf&lt;/code&gt; files are treated as a module argument and the outputs are treated as attributes. Below you can see an example of what a typical module configuration looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;module&lt;span class=&quot;token type variable&quot;&gt; &quot;ec2_instance&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./modules/ec2_instance&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;ami_id&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ami-1234abcd&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;output&lt;span class=&quot;token type variable&quot;&gt; &quot;ec2_instance_id&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; module.ec2_instance.id
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./modules/ec2_instance/main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;variable&lt;span class=&quot;token type variable&quot;&gt; &quot;ami_id&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;variable&lt;span class=&quot;token type variable&quot;&gt; &quot;instance_type&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(Optional) EC2 instance type.&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;default&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;t2.micro&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_instance&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;instance&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;ami&lt;/span&gt;           &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; var.ami_id
  &lt;span class=&quot;token property&quot;&gt;instance_type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; var.instance_type
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;output&lt;span class=&quot;token type variable&quot;&gt; &quot;id&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_instance.instance.id
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, we instantiate the ec2_instance module with an AMI ID: &lt;code class=&quot;language-text&quot;&gt;ami-1234abcd&lt;/code&gt;. Then we output the EC2 instance ID which is available as a module attribute.&lt;/p&gt;
&lt;p&gt;Everything looks good so far. We have an easy way to abstract a large and/or repeatable configuration. One question might have popped in your mind.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Do Terraform modules support different providers?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The answer is &lt;strong&gt;yes&lt;/strong&gt;. You can override a &lt;a href=&quot;https://www.terraform.io/docs/configuration/modules.html#providers-within-modules&quot;&gt;provider for a module&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;assume_role&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;role_arn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::123456789012:role/TerraformRole&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;module&lt;span class=&quot;token type variable&quot;&gt; &quot;default_ec2_instance&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./modules/ec2_instance&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;ami_id&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ami-1234abcd&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;module&lt;span class=&quot;token type variable&quot;&gt; &quot;secondary_ec2_instance&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./modules/ec2_instance&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;ami_id&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ami-1234abcd&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;providers&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;aws&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws.secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The module code can remain unchanged from our previous example, because we are overriding the default provider with &lt;code class=&quot;language-text&quot;&gt;aws = &quot;aws.secondary&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This example creates two EC2 instances in two AWS accounts.&lt;/p&gt;
&lt;p&gt;You can even pass multiple providers to a module, which you have to map to internal aliases.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;= 2.18.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;assume_role&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;role_arn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token type variable&quot;&gt;secondary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;:role/OrganizationAccountAccessRole&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;module&lt;span class=&quot;token type variable&quot;&gt; &quot;secondary&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./modules/account&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;email&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary@john.doe&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;providers&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;aws&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws&quot;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;aws.account&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws.secondary&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# File: ./modules/account/main.tf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;aws&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;account&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;variable&lt;span class=&quot;token type variable&quot;&gt; &quot;name&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;variable&lt;span class=&quot;token type variable&quot;&gt; &quot;email&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_organizations_account&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; var.name
  &lt;span class=&quot;token property&quot;&gt;email&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; var.email
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_iam_account_password_policy&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;strict&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;minimum_password_length&lt;/span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;require_lowercase_characters&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;require_numbers&lt;/span&gt;                &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;require_uppercase_characters&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;require_symbols&lt;/span&gt;                &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;allow_users_to_change_password&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;provider&lt;/span&gt;                       &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws.account
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, we are passing two providers to the module. The default &lt;code class=&quot;language-text&quot;&gt;aws&lt;/code&gt; provider is mapped to the default provider for the module. The secondary provider is mapped to a module provider with alias &lt;code class=&quot;language-text&quot;&gt;account&lt;/code&gt;. Using this configuration Terraform will create a new AWS account and configure its IAM Account password policy once the account creation is complete.&lt;/p&gt;
&lt;h2 id=&quot;putting-the-solution-together&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#putting-the-solution-together&quot; aria-label=&quot;putting the solution together permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Putting the solution together&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;So how does this all fit together?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As described in my previous blog post, we decided to have a module for each repeatable configuration. This includes a new organizational unit, AWS account, IAM group, and IAM user.
The Terraform configuration is executed in our master account. The structure of such a configuration looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── modules
│   ├── account
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── group
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── ou
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── user
│       ├── main.tf
│       └── variables.tf
├── main.tf
└── variables.tf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;account&lt;/code&gt; module is responsible for creating a new AWS account and applying a baseline configuration in it. This means that we need to pass two providers to the module. One will be using the master account (default) provider to create the AWS account and a secondary provider that will be dynamically constructed to apply the baseline configuration in the new account. This module needs to output the account ID so that it can be referenced by the provider.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;ou&lt;/code&gt; module is pretty self-explanatory. It only uses the default provider to create a new OU (Organizational Unit) with the corresponding SCP. This module needs to output the OU ID so that it can be used when creating new AWS accounts in it.&lt;/p&gt;
&lt;p&gt;Modules &lt;code class=&quot;language-text&quot;&gt;group&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;user&lt;/code&gt; are used only for the Login account &lt;a href=&quot;/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-2/&quot;&gt;(you can refer to the previous blog post for the organization structure)&lt;/a&gt;. This means that the modules are configured with just one provider. The &lt;code class=&quot;language-text&quot;&gt;group&lt;/code&gt; module is responsible for creating IAM Groups for each project with the corresponding IAM Policy. The &lt;code class=&quot;language-text&quot;&gt;user&lt;/code&gt; module controls our IAM Users and their group membership. You can output the group name from the module so that you can reference it when you add users to it.&lt;/p&gt;
&lt;p&gt;Now that we have the configuration, let&apos;s talk about how you should execute it. Here is how our execution flow looks like:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/80d3ec377107b7ccb39cd350e0f8a7e6/21b4d/terraform-execution-flow.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.40425531914893%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABibAAAYmwFJdYOUAAABq0lEQVR42o2S22oUQRCG5y0EH0nQBO/ENxCEXGhAhID6Al4pXgTZ5EpcjMQFUSOsIhIUdnNwd426eNzg7jjjTM90T/XUSXpWg1diUTc//f1UNfVHpUdjnbGV8wTIuQVjq7x0pvJIpFjVYL0rlYDQV8iFg8KBQ0aWyIGP4zhJfniksmaTZ7PZLJ5NTVF6rFUwy02SpqoKYFE0z7I0TUmkQo4uPTxYWOsvrvWfj2Ou4fqz8cnWzonbvfuDKYvm/Tu2fdbePWO3bxJS9+3k9PrOqVb/ypP3nji68fLz0ubgQme0d2iEeWP/cLkzXO4MX3xMADyMu3ZrpXx8GUYPVGRv8vNiZ7S0OVx9/TWYkUWbQhbrqfQ8mKQH3zOHYkyuVOuf8uGnv2EWAeTIIxMLcRCiuvLo3bGrW8evPV199U28pRpUWAVV2YOrSbiBkRrz35NLTw75wyz/lBRA/zH5SNckNfHGm+m59u75e/vdcQq2EPT/XJtYROYCSW5tf1lo9RZbvfbuROpKEESk2Zw92CMYmcOpHBIQAwUR/OFNRRRF5iFR8vMOIWnIAFMIyS9oXSZGjmmsUAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terraform execution flow&quot;
        title=&quot;Terraform execution flow&quot;
        src=&quot;/static/80d3ec377107b7ccb39cd350e0f8a7e6/1d69c/terraform-execution-flow.png&quot;
        srcset=&quot;/static/80d3ec377107b7ccb39cd350e0f8a7e6/4dcb9/terraform-execution-flow.png 188w,
/static/80d3ec377107b7ccb39cd350e0f8a7e6/5ff7e/terraform-execution-flow.png 375w,
/static/80d3ec377107b7ccb39cd350e0f8a7e6/1d69c/terraform-execution-flow.png 750w,
/static/80d3ec377107b7ccb39cd350e0f8a7e6/78797/terraform-execution-flow.png 1125w,
/static/80d3ec377107b7ccb39cd350e0f8a7e6/21b4d/terraform-execution-flow.png 1280w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When you start to collaborate on a Terraform configuration, you need to have a clear process. I have seen situations, where two people execute Terraform in different Git branches which causes configuration collisions. If you want to use branching, make sure you only go as far as the validation and plan step. In some cases like backend updates, you should only do a style check, as you can unintentionally apply the changes by executing &lt;code class=&quot;language-text&quot;&gt;terraform init&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There should be a single source of truth for the execution of all Terraform commands and the best place for this task is the automated CI/CD pipeline. I also like to use AWS managed services as much as I can (as long as they fulfill my needs). So naturally, AWS CodePipeline is my first choice for this. Our pipeline is separated in two stages, one for creating a plan and another to apply the plan. There is a manual approval step after the plan is generated and reviewed. We also execute the plan phase when a pull request is created or updated.&lt;/p&gt;
&lt;p&gt;You should consider using the &lt;a href=&quot;https://www.terraform.io/docs/state/locking.html&quot;&gt;state locking&lt;/a&gt; feature of Terraform in order to limit concurrent executions. If you store your state in AWS S3, you can &lt;a href=&quot;https://www.terraform.io/docs/backends/types/s3.html&quot;&gt;create a DynamoDB table&lt;/a&gt; and use it for lock tracking.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;We started with an ambitions goal to create an AWS multi-account setup that is secure and maintainable. The final solution is a Terraform configuration that is easy to understand and modify because we didn&apos;t overengineer it. We have used many of the AWS security best practices which makes our setup secure. Another benefit is that we use infrastructure as code and version control. This makes it easy to keep a track of the changes that were done to the organization (including user management). We also limit configuration conflicts by using a pipeline for the execution of Terraform.&lt;/p&gt;
&lt;p&gt;I hope you enjoyed this series and you found something new that can make your life easier.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Crafting a Secure and Maintainable AWS Multi-Account Setup #2]]></title><description><![CDATA[In my previous blog post I talked about the advantages of using a multi-account setup and AWS Organizations. There are many things to…]]></description><link>https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-2/</link><guid isPermaLink="false">https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-2/</guid><pubDate>Thu, 18 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 338px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/033ff1b7ee93b4c5efbac7e3f186ac42/2b41d/st6-and-aws.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.82978723404256%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAC4jAAAuIwF4pT92AAACYUlEQVR42q1TS2gTURR9oAXxtxOVuHXbhHxJUhrMR6uCRJOsRGIUElFXVWkpuOjGHwUXYvxgkiZYBCNKUrAquMpKaMhO6UY3UlpsJnmZSUsynyMzYaZJpokbL9yZN9xzzzv3M0SSJMgmiiIEQcAw68eoud1GVOAwECD1YIbhiRpcX19HLBaD0+mEyWSC3W6H0TgKi9UOk3UMbrcbHo8H+XxeI91RoUoYDAZBCFE8Ho8r31PTM/COmREaJVpM9nK5rOTI5esUyg9KKQwGg5aQy+WQfPoEDx+/xItbZqzMjSBg3AOya68STyaTSjLP84NLjkQiGmE4HEYodAFGswPO4yO47Sc4um9bYaVSGaxQJaxWq0gkEnC5XEofzRYL7DYbbG4PrON+OMZPwOfzolAs6gYzdMo641hgbRXY+KObsqxOp7B7D+WeyG/F2+0OXzqFtYMHULtyGfIGCnxbI+omVM+ke5d6gPJayBfVaqhHo2iVSh1MXzWSKPdxWzHpjUr/WPDBppISfUDSgq3vBTQWQqApH+j8GdDMSdBMAHR+AjTlBU0H0Pw0BXGT0UiJjkzs/Kv872UwD46AeXQM3MdJhYTNXwL7/ioabyJofp0Ft3QH1dn94Io3hhAKvHLeWn6Fjbu70fw83fn+9gwC8wuS0FYua/1YhFD9iXrSgvpzB6QWpy+5R+FqBcz9w2DfXgT7IQ72XRRs4Rq4wnVFaWPhPDZLc2DuHQK3eHNnhf0Nbq0sKYk040cjdxY0OwGaPQWaPY3G63OgaR+aX2YgbtEBhH179d+m3F2+DFQnr3dJt4d/AXF34OQkaz8CAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ST6 and AWS&quot;
        title=&quot;ST6 and AWS&quot;
        src=&quot;/static/033ff1b7ee93b4c5efbac7e3f186ac42/2b41d/st6-and-aws.png&quot;
        srcset=&quot;/static/033ff1b7ee93b4c5efbac7e3f186ac42/4dcb9/st6-and-aws.png 188w,
/static/033ff1b7ee93b4c5efbac7e3f186ac42/2b41d/st6-and-aws.png 338w&quot;
        sizes=&quot;(max-width: 338px) 100vw, 338px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-1/&quot;&gt;In my previous blog post&lt;/a&gt; I talked about the advantages of using a multi-account setup and AWS Organizations. There are many things to consider when you go in this direction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How many accounts are needed? What structure should I use? What policies should I create? Who should have access to what?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this blog post, I will cover what we did here in ST6 and why.&lt;/p&gt;
&lt;h2 id=&quot;our-requirements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#our-requirements&quot; aria-label=&quot;our requirements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our requirements&lt;/h2&gt;
&lt;p&gt;Before I walk you through our setup, let&apos;s begin by listing the requirements that drove our decision:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We want to have our organization defined as code and use automation&lt;/li&gt;
&lt;li&gt;Our users should not need to juggle with multiple accounts and passwords so we want Single Sign-On (SSO)&lt;/li&gt;
&lt;li&gt;Different team members should have access to specific projects based on assignment&lt;/li&gt;
&lt;li&gt;Each user should have an individual sandbox account&lt;/li&gt;
&lt;li&gt;Project cost needs to be separate&lt;/li&gt;
&lt;li&gt;We want to have a central log archive&lt;/li&gt;
&lt;li&gt;We need to manage security and compliance in a centralized way&lt;/li&gt;
&lt;li&gt;We want the solution to scale well with the increase of projects and team members&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Remember to think about what you want to achieve and why, before starting the implementation. You don&apos;t want to overcomplicate the setup.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;our-solution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#our-solution&quot; aria-label=&quot;our solution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our solution&lt;/h2&gt;
&lt;p&gt;We evaluated our requirements and did some research after which we came up with a plan.&lt;/p&gt;
&lt;p&gt;This is how our ST6 multi-account setup looks like&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f5aa9c92390440e218e049b8428d5fa1/00172/st6-multi-account-setup.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 176.06382978723403%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAABibAAAYmwFJdYOUAAAFL0lEQVR42nWWaUxUVxTH+dikH5qmn5pWmjQxdrGmJpq6dIlWmpjWpaZFY2PsAqaGaNWqaQ2xdcGiVauARVTUagjWBUVKGwEF2QqyODDCwMAAAzPDrG/ect+97+4NDFIZh5P34b137++de8/9n39ekpSScy4fhxBCThfi/9HYTRJjzOFw9PT0tLa2ddgdQ2Mx+OTnpuBcUEI4Y7HHJCllIBBYtixlx3cZH78/a8f3OxFA0IQWtAhEGCKCLAyRYNzf796XsvHQJ+m753/6d+6lCVhVo6mpazM2b1q7fO7x7CzJqEAmh6YWjITcXqQDoKiWCT09rsyl6w+uSNu1YE35qcdwLHTDQISV9KpHat1Z1QOVLkVSaija5A654IYFNWDoEGBOJ2AxPmhB6A9FFuc1zMyuefngvbTrdkGJoaiTMEFW04079y/fqiq8NtLdNyUzhFBw7tPxg8FQh09XIBG6L+rq1Ia6tWAImdDZbNvw/NtbX/9o3TNvnN92IB5m42WEQKdMGvZSLW+OVrBIOTYTdV6TY0szmytqKq7crCi+Ner2JIaBCSiXHEaszmLLdhl3FHHDL6VEEHpGfQ/aW/sG+sORsBAiAWwCYFGJPDbzry1m+XZQ+i31tEgpKcEmAP5Rv6qqBJPEmU1gAIuBwSZwMw2UbTFufEmHG2MSidNMAlg3DIgpMcLY/ie2FeGOYg4CMU0ySmPXhDyfhhmxKJeavVTNn6cVLlVz5+CuG2MsI3EtEH9UukWHo2hEwwBTqXtY1MXVYclZjAi6vcPdfR6HCxkgDjaDofA7OQ0zDtXMyKpO+b1ODyiGauqKroUUBExns239c7PTX1m8Kim5cPv++MyU0hJ74GRNf17DUHm/MS7JsfXFmgwo6h+ZRy/+cLhg2/72itrEe0YmYFIy20VwbT0o+dosy+BmREqpaVpHl73H6XzU3TU4PJQYloIJKXFLAbjyuXFtA7iZLsxwnE8krnZpVyCn3p3XOFI3bMbMY3IqNlHluStlJ86XZJ/ub3s0BbYQdI8G3/y19sUD9174qWrluWYjohsa0hRdC4YRgD2N7anPzkpLXrgyKfnMlr1TYBNCzphLgTXO0UZ31KeZ0vAzzcthdKIlCXlQWdtcfrfhdoV/usawIKBM6HcytVNztbPvaoVLuOYdKySCDmdvV6/D7ugaDfinK9j4Pn3/4uZc3JJPHl4UBE7YZ6znKE2gbQOAPf/0rCuyrSt6mFXjwZbARFhEIBNSTIJDniOfZZz4YvvPH264e+H6FBhBqETVVRda5+c0zM9p3FhsMw1sWQJCbuqQWNhtd26dlbJ73ur0lxZd3Zcbn5lzhplwh1S/bmEMpa+Fu+v5SINA0fGC4ab6xqbq2rqqaq/Xm0CeXEpqIUKF0l2pnJyt5i9Qjr6K2i6MnTOCwWCwb8Dl8XkNw3g6MydchAAOGBggKIKd3NvKfW3C0mJzCMJaIKIHFYZpHIyoBXfe7nrreP28nIYP8ptGI5BSiSyJACQQ6eHonsWp22Yv35T83rHUrVNgzgXF6Ezj4FdXO9Ovd+4q71U0jC0OkYCQImAaUS03/cdf1mzev+Kbor2/TYEngzEKoSmpSdrP4sZjVt1h5q4df88Ghofs3V327kcevy8BzIXEmER1qAWG1Esr9KLV2rkl8H72eLMxYuGA3x8JhSkhU6z3icwMwjFJsdEO2l9JXVWTBjitez65bB2gqNcZPb1QK1gYPfGaWZk5ab1CiMnGTpr2N4AzMlhLestJTxmP9CfM/B+cazt0cYk9ZQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ST6 multi-account setup&quot;
        title=&quot;ST6 multi-account setup&quot;
        src=&quot;/static/f5aa9c92390440e218e049b8428d5fa1/1d69c/st6-multi-account-setup.png&quot;
        srcset=&quot;/static/f5aa9c92390440e218e049b8428d5fa1/4dcb9/st6-multi-account-setup.png 188w,
/static/f5aa9c92390440e218e049b8428d5fa1/5ff7e/st6-multi-account-setup.png 375w,
/static/f5aa9c92390440e218e049b8428d5fa1/1d69c/st6-multi-account-setup.png 750w,
/static/f5aa9c92390440e218e049b8428d5fa1/00172/st6-multi-account-setup.png 1044w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How did we get here?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, we evaluated our requirements, did some research, and arrived at this plan. Now, let&apos;s walk through our requirements one by one and see how this setup addresses each of them.&lt;/p&gt;
&lt;h3 id=&quot;1-support-automation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-support-automation&quot; aria-label=&quot;1 support automation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Support automation&lt;/h3&gt;
&lt;p&gt;In the previous blog post, we talked about &lt;a href=&quot;https://aws.amazon.com/organizations/&quot;&gt;AWS Organizations&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/solutions/aws-landing-zone/&quot;&gt;AWS Landing Zone&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/controltower/&quot;&gt;AWS Control Tower&lt;/a&gt;. AWS Organizations helps us to build a multi-account organization. It already has an API so the only missing part is some sort of orchestration.&lt;/p&gt;
&lt;p&gt;Enter AWS Landing Zone and AWS Control Tower. These solutions are the first ones that you should evaluate for this purpose. Unfortunately, both of them do not exactly address our needs. AWS Landing Zone is complex and due to the many moving parts of the solution, it&apos;s error-prone. Additionally, it&apos;s not easy to extend the solution if you need something that&apos;s not included. AWS Control Tower doesn&apos;t have an API and you can&apos;t use it for existing organizations (as is the case with ST6). To sum up, both AWS Landing Zone and AWS Control Tower, don&apos;t work for us.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;So where does this leave us?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AWS Organizations has an API, which means that we can use some infrastructure provisioning tools such as &lt;a href=&quot;https://aws.amazon.com/cloudformation/&quot;&gt;AWS CloudFormation&lt;/a&gt; and &lt;a href=&quot;https://www.terraform.io&quot;&gt;HashiCorp&apos;s Terraform&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s look at CloudFormation first since it comes from AWS. It uses JSON or YAML syntax to represent the resources that you want to create, which is not ideal but we can live with that. In my personal experience, I haven&apos;t seen any bugs in CloudFormation. A surprising drawback is that many services that are supported by rival tools are missing here. And as you might have guessed AWS Organizations is not supported.&lt;/p&gt;
&lt;p&gt;HashiCorp, the company behind Terraform, has gathered a huge traction in recent years and Terraform has been available for quite some time now. It uses &lt;a href=&quot;https://github.com/hashicorp/hcl2&quot;&gt;HCL (HashiCorp Configuration Language) version 2&lt;/a&gt; which is a derivate of JSON. It&apos;s easy to write and understand, and it&apos;s a lot shorter than CloudFormation&apos;s YAML and especially JSON. I have seen many bugs over the years and the fact that there still is no stable version available speaks for itself. Nevertheless, the tool is good and it gets the job done. An additional benefit of Terraform is that if you have an existing AWS Organization and you want to manage it with code, you can import the existing resources to your configuration.&lt;/p&gt;
&lt;p&gt;Both CloudFormation and Terraform use declarative syntax (HCLv2 has some limited functionalities on top). Sometimes when you write configuration you wish that you had the power of a full-blown programming language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;To me, using the same programming language for application code and infrastructure is perfectly logical.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At ST6 we love DevOps. Оne DevOps technique is to have cross-functional teams. What better way to achieve this than to have all team members use the same tools and languages. So let&apos;s see what we can use that can help us. &lt;a href=&quot;https://aws.amazon.com/cdk/&quot;&gt;AWS Cloud Development Kit (AWS CDK)&lt;/a&gt; and &lt;a href=&quot;https://www.pulumi.com&quot;&gt;Pulumi&lt;/a&gt; are tools that promise to deliver just that. Both of them provide the ability to abstract AWS resource provisioning using familiar languages like Python or JavaScript. Unfortunately, in our case, we can&apos;t use them because under the hood AWS CDK uses CloudFormation and Pulumi is free only for individual use. I&apos;m sure that in future projects we will try these tools and share our experience.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Considering all of the above, we chose to go with Terraform.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-single-sign-on&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-single-sign-on&quot; aria-label=&quot;2 single sign on permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Single Sign-On&lt;/h3&gt;
&lt;p&gt;Remembering many usernames and passwords is always hard. You can even say that it might lower your security as many people in such a position start to use weak passwords. At ST6 we want our team to focus on delivering value to customers and not trying to remember passwords when working in different AWS accounts.&lt;/p&gt;
&lt;p&gt;There are many approaches to this and many of them need Active Directory. As a relatively small company, we are using G Suite. Perhaps in the future, we might need to switch to something else that relies on Active Directory. For the time being it would be perfect if we can use the same G Suite users for our AWS infrastructure.&lt;/p&gt;
&lt;p&gt;You can set up federated access with G Suite, for more info see &lt;a href=&quot;https://aws.amazon.com/blogs/security/how-to-set-up-federated-single-sign-on-to-aws-using-google-apps/&quot;&gt;this AWS article&lt;/a&gt;. We don&apos;t like this solution as it requires a lot of manual work in the G Suite Admin Console and API. This approach is not very convenient if you use access keys often as you need to generate new ones when the session expires. It&apos;s not that apparent who has access and when they got it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;After some thought, we decided to have a central Login account (or Identity account if you wish).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Each developer has an IAM User which is able to assume an IAM Role in other accounts. This way we can manage the IAM Users with code and our developers have to remember just one additional password. Each user can create an access key and an MFA token which is required when assuming roles in other accounts with the AWS CLI.&lt;/p&gt;
&lt;h3 id=&quot;3-access-rights&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-access-rights&quot; aria-label=&quot;3 access rights permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Access rights&lt;/h3&gt;
&lt;p&gt;Since we are using &lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html&quot;&gt;IAM Roles to access different AWS accounts&lt;/a&gt;, each user needs to have an IAM Policy allowing an assume role API call to specific roles based on the current project assignment. A best practice is to use IAM Groups to assign such permissions. Each project has a corresponding IAM Group with an IAM Policy granting assume role permission on the IAM Role in that specific project account. Based on the current assignment, we just need to add each developer to the respective IAM Group.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d74c836b17d08a1acc48c818ac9e45a5/c0255/iam-group-access-rights.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 91.48936170212767%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAABibAAAYmwFJdYOUAAAC40lEQVR42oVTS2tTQRTOolvXIulCxK5dWKkgdiXEhSAiFCyK4NIX/gcXggupj0WCkmqtVZP0gX1YiVrERXdWNEmtNg9uUx993czce2fuvM6RuUlDRcTDcDmcuR/n+853Job/CUBE01iR5Tey/FbW3oOg7XqslYGxJyrtRALYKhk+tXljD0kf27q+i8/fsTdGRWAANDqCRYkx0A6jleAAIJbf+O9usvm7fP623liyYC0RIdbMQHgg/Ki0I3SoBAvIJg+F1AZBtXqqECVHFcZMsBHMXPOnrvpTV/yxC/7PpXLVqZTLlWpt41f98qWLZ/rP9vX1HU8kFhYWLNbSRMtRspjxfpBkD3l0nD4+0bh3gNQ+BEKThss4p+56z6Hu7oPdiUQiHo/n83lElFLawYBBxSLakhm2BcxFGTT5CiGMnYUIfG91ddVxHErpn6PUqHgMjVKVOVGakIsT8usMKG7BYWjBiiMYrTXnnFJaqVSq1Wq9XldaIxiwtLeq7q39jdRhcv/o1o3dm4tzXGPImeVmwVppvb62NjQ0lEqlBgcHBwYGlpfLVrUIYmi0KI6JT0/t93NGi8CaZt1FkCzqbHzfdxynUCiUSqViscgYt7/IpmYAUBwUs57v1LUNDoLgr8WLNBvvp5fp90bPe9lzdPgk+17UiFqp5iARjDGGUprP57PZ7Pj4eDabdRyn1RmCdfIwQZ+c8kZOk/u9ZKUgDbLAN2A1SxEKKT3Pm56eHh0dnZyczOVy1VqNsyCadkQ72m1or7YQoTYQ0dZ/LHqkywrxPdRhDLWUS9Phxyfhx2FRHIPI6rZVsy9nkslkKplMp9Ou67a2tg3etuoIedDr3uzcKL11vq/VquWVev1HvbZv3954Z2dXV1dHR8fzTAYRCaXU9y1t2xlAfnslCjmxOCm+TGkZum6j0WgQQhUjc69nn44MT72YyGWeEXcTjdIyNEqCfRtNq/4VWkaPfDuMRB22juJo9G8U3cC0udOYCAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IAM Group access rights&quot;
        title=&quot;IAM Group access rights&quot;
        src=&quot;/static/d74c836b17d08a1acc48c818ac9e45a5/1d69c/iam-group-access-rights.png&quot;
        srcset=&quot;/static/d74c836b17d08a1acc48c818ac9e45a5/4dcb9/iam-group-access-rights.png 188w,
/static/d74c836b17d08a1acc48c818ac9e45a5/5ff7e/iam-group-access-rights.png 375w,
/static/d74c836b17d08a1acc48c818ac9e45a5/1d69c/iam-group-access-rights.png 750w,
/static/d74c836b17d08a1acc48c818ac9e45a5/c0255/iam-group-access-rights.png 920w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you can see from the example User 1 is a member of Project 1 Group and has access to both Project 1 Dev and Prod accounts. Whereas User 2 is a member of both project groups and has access to all accounts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We use this method as it&apos;s easily achievable with code either for ST6 owned AWS accounts or customer-owned accounts.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using IAM Roles to access customer accounts is also safer and more convenient for our clients too as they just need to create a single role with the necessary permissions and create a trust relationship to our Login account.&lt;/p&gt;
&lt;h3 id=&quot;4-individual-sandbox-environments&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-individual-sandbox-environments&quot; aria-label=&quot;4 individual sandbox environments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Individual sandbox environments&lt;/h3&gt;
&lt;p&gt;We want to give our developers individual sandbox accounts so that they can test services and continuously improve their skills. Having such accounts creates a safe environment where people could experiment and level up their cloud knowledge.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/96f16e3bbbca56a745ee064c168169ac/5a190/sandbox-access-rights.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64.8936170212766%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAABibAAAYmwFJdYOUAAABvUlEQVR42o2Sy27TQBSG8zZVX4AFG6SuLBBix0XqojwRZYVoEicU5NqgSR4GJeAkTluo1LR2PLYn9nhu5yBfiAiVoL9mMTqjf/R/55wO3ksABTVsZdgKOEWEptr5j8toRBSTcXK8l9oH2dCib/bEZNw83c88HSdv97OPT7NPz5LjfTH9pxla1RctQEvMQ4gDiBdYhKglaIEItVmVZhNWPHmEqtz5RQsQDI0SnBdFzotclByNMoKBFh00irnP094j9uUwefeAeS+TOFosguUymM3m11eXiDifB4PBwPM+n525tj1YBEtEMJJ3QBUVzNBi5DU7fUwHVri6okkWxzGlSRpHoErf9227TwhxXbff7wVBUCFLXsWGItbhd72e68iHYr0TW4kaD6WUnPOyLKWULY4SNbNRUGZQ0Abvb+barLVWtbTW23rD/CLtHzDvVfr+4R3mH4i4PD93HGc0GhFCHMe5uLjcZf5gMXLETp/QoRVe/6xgW+ZqMJPpt263R8jI9byTk64/m/3BnEd69VXfTvXNBPKwybuNjXIDRrE0ptFNsr7dpDEYBe2o7izI1tnuiypBCQSFqKsD6ncj4BcH18YoqSemWwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Sandbox access rights&quot;
        title=&quot;Sandbox access rights&quot;
        src=&quot;/static/96f16e3bbbca56a745ee064c168169ac/1d69c/sandbox-access-rights.png&quot;
        srcset=&quot;/static/96f16e3bbbca56a745ee064c168169ac/4dcb9/sandbox-access-rights.png 188w,
/static/96f16e3bbbca56a745ee064c168169ac/5ff7e/sandbox-access-rights.png 375w,
/static/96f16e3bbbca56a745ee064c168169ac/1d69c/sandbox-access-rights.png 750w,
/static/96f16e3bbbca56a745ee064c168169ac/5a190/sandbox-access-rights.png 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Each user has an in-line policy that grants access to the user&apos;s own sandbox.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Again Terraform aids us with this. We use code to create a sandbox per developer and grant the appropriate permissions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One thing to point here is that you should implement some sort of cost monitoring on those accounts. You can use &lt;a href=&quot;https://aws.amazon.com/aws-cost-management/aws-budgets/&quot;&gt;AWS Budgets&lt;/a&gt; or &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html&quot;&gt;Billing Alarms&lt;/a&gt;, which can trigger some sort of automation that will stop or delete resources. You might want to implement some policy on the sandboxes so that only certain regions and services are available.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At ST6 we trust each other and we prefer not to limit innovation and creativity, so we just monitor the cost and send notifications.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;5-cost-separation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#5-cost-separation&quot; aria-label=&quot;5 cost separation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Cost separation&lt;/h3&gt;
&lt;p&gt;In my previous blog post I talked about cost separation. The solution is to create separate accounts for each project, product or environment. We want to be able to see precisely how much our projects and project environments (if such exist) cost.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Our solution is to create OU per project so that we can apply the necessary SCP on it and place all accounts (or account) in it. Then we can easily see the cost of each project and project environment.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;6-logging-archive&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#6-logging-archive&quot; aria-label=&quot;6 logging archive permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Logging archive&lt;/h3&gt;
&lt;p&gt;It&apos;s good practice to export logs containing security and compliance information to a different account. If you store your logs only in the account where they are created, you risk having them deleted by mistake or intentionally in case of a breach. A central archive guarantees you have a copy in a safe place. Some companies go one step further and set this archive as a standalone account outside of the organization and replicate the logs to at least two other regions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We chose to use &lt;a href=&quot;https://docs.aws.amazon.com/awscloudtrail/latest/userguide/creating-trail-organization.html&quot;&gt;CloudTrail for organization&lt;/a&gt; as it&apos;s straightforward to implement and it covers our immediate needs. Please note that organizational trail can be created only in the organization&apos;s master account.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;7-central-security-and-compliance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#7-central-security-and-compliance&quot; aria-label=&quot;7 central security and compliance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;7. Central security and compliance&lt;/h3&gt;
&lt;p&gt;Security and compliance are very important topics. It is a good practice to have an account that is dedicated to this. AWS can help you achieve proper governance with services like &lt;a href=&quot;https://aws.amazon.com/config/&quot;&gt;AWS Config&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/guardduty/&quot;&gt;GuardDuty&lt;/a&gt;. They are good candidates to enable in such account.&lt;/p&gt;
&lt;p&gt;AWS Config can be used to asses your current estate against rules that you define. The findings are stored and you can check historical data. You can use the integration between &lt;a href=&quot;https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-config.html&quot;&gt;AWS Config and AWS Organizations&lt;/a&gt; to ease your deployment. Keep in mind that this means the aggregated view will be in the organization&apos;s master account. It might be better to have this set up in the security account so that you limit the use of the master account.&lt;/p&gt;
&lt;p&gt;GuardDuty is a service that uses machine learning to detect threads and anomalies in your accounts. This is a regional service, meaning that analyzed data doesn&apos;t cross regional boundaries and you need to configure it in every region that you intend to use.&lt;/p&gt;
&lt;p&gt;All of this configuration can be done by code. Just make sure you grant access only to a subset of security and compliance experts to this account.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Our solution is to have a dedicated account for those services, though it&apos;s not yet implemented.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;8-ability-to-scale&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#8-ability-to-scale&quot; aria-label=&quot;8 ability to scale permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;8. Ability to scale&lt;/h3&gt;
&lt;p&gt;Using code to create and manage an organization is a step in the right direction. Using declarative language like HCL is not as flexible as using JavaScript or Python, but you can and should leverage modules. &lt;a href=&quot;https://www.terraform.io/docs/configuration/modules.html&quot;&gt;Terraform modules&lt;/a&gt; are a good way to abstract repeatable configuration like:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f9c30564cee54d78d2ad2f5c9dd3e02c/c0255/terraform-modules.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 95.74468085106382%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAABibAAAYmwFJdYOUAAAD1klEQVR42m1TWUxcZRS+Lxo1aHzQGImKNsYmLsUXTWxoLbGmbonx0QejNjw1bayJlaS2gsVSS1mUfWlrIcaADdAyAwzLADMMMECLLDIbDNxLp7PP3Lnr3P/+m/mhqSXx5Hv6z3/O+XK+73CUUvxAEELo7sAYI4T+N8sRQuLRcEjgE7FoaIuPhEP3cztfJUna2NjYunNHEARZlncVI0JSKsjoQM6aGQ0kFEOHmFJCMbrXglJMKEIQE/rfYIIowVwwqe35xfFW7fS7zbMHm2afLBmtdPKUYlOKoOgKiiyjyDJOeEk2g+MeFFliL9EVosYpzHL+mPLwSSt3/ObTP448dmqQ++p6ab+XUqoudqYrnpMuH8rU5Ys1e01hSqx+WWrZL7W8k76Ya/qtjHZaN6ucGxfGgh2379a6+JKhwDQvUkrNmDc7UwdWe4y/O7JzzVgOG7NNYLkLLHdl3fU4tU4J4iQDDvji48FUvzc+HEj2eWKemEIpgcl1Y741624w3A3GQjtWoqyLu95wNxpzzVjkKYacL6bknB7KLRvLKx/PKx/nTlpKbD5KqeaxSJcPyh0fSVcK5WsfwK0Zuf1DueNj6ff3pbYCM2hntP0J9fnz4/k1riNt84db53LODJ8fC1JKgRSBGxNQmDQ3HXBrmhgyFFyQd0J+Em46iJagyOQ8MeWpktH8Gte+6skDjTOPnh46a/NTSvVNl9pzVO0tUrq/VvuOodiqZjmu9hapPUeV7i9haJ5N1k00EUy5BfFWSFoKy/a15GZKYwvbmlGtJzTbd6r1G22oGCV8mu17zXZKHfhWtZ5A4QVWHFdA6fBa3RRf6dysdfFnbIGhQJJSDKWwGbQzrI9A3kmyosk7zODoziNWY4z2ts6WR4oHc34YfuLsCFfUXWL1MJ2X/hKr9jCd69/M1L4OBVem9jWptUBqelusesn097PJfFp/o3ryvda5z/9c/KJzKbfMXj8lsIWlBbDcaXr7wGov8NzAehqs9gDvTdNnBSvXsXSXSYUISWqmqMNMliGuAs1kroaRRX2ygkk9/Vt26leUWtedF/WJC/pEuTb2E4qtbns7pb1a6SxodB9qni1smc39eazGGdy2Z1fq3OOZ+nzx0gtiRR4UphnttgPS1cNi5YtmYJDRDiTUh4oHnzln31fjeqXCwR27UTq8Rik1kkHGcwc+C0r4mWGuHZH/+FS6UnjPJGtJbe8lx/6GmU+u3vqs/fazZfbtq4LQNB48XWJIwD8AfH3AZwE+C5ZCFAEuC/E/UWUxLC+EpMUwkzqqAHbCpkaAeh8U7epFEaAY/QvynZgM3sTZ7wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terraform modules&quot;
        title=&quot;Terraform modules&quot;
        src=&quot;/static/f9c30564cee54d78d2ad2f5c9dd3e02c/1d69c/terraform-modules.png&quot;
        srcset=&quot;/static/f9c30564cee54d78d2ad2f5c9dd3e02c/4dcb9/terraform-modules.png 188w,
/static/f9c30564cee54d78d2ad2f5c9dd3e02c/5ff7e/terraform-modules.png 375w,
/static/f9c30564cee54d78d2ad2f5c9dd3e02c/1d69c/terraform-modules.png 750w,
/static/f9c30564cee54d78d2ad2f5c9dd3e02c/c0255/terraform-modules.png 920w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You might also want to separate the state so that the organizational structure is in a different state than the IAM users.&lt;/p&gt;
&lt;p&gt;The configuration goes through code review and a deployment pipeline. You should limit all Terraform executions to a pipeline and only for code that is approved and merged. You don&apos;t want to have race conditions between branches and simultaneous executions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At ST6 we use Terraform modules for abstraction or repeatable configuration and &lt;a href=&quot;https://aws.amazon.com/codepipeline/&quot;&gt;AWS CodePipeline&lt;/a&gt; as a single point of execution.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;This setup covers our current needs, but as our company evolves our needs will change. We might even have made a wrong decision in the way we addressed something. &quot;The only constant is change&quot; so our solution will change in time as well.&lt;/p&gt;
&lt;p&gt;Your main takeaway from this blog post should be to make sure you tailor your AWS Organization to your needs and keep it simple. Having such flexibility at your fingertips is tempting for many people to overcomplicate things.&lt;/p&gt;
&lt;p&gt;In my next blog post, I will cover the automation side of this setup.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Crafting a Secure and Maintainable AWS Multi-Account Setup #1]]></title><description><![CDATA[AWS and other public clouds give developers huge flexibility and freedom to innovate so they can act faster on business requirements…]]></description><link>https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-1/</link><guid isPermaLink="false">https://st6.io/blog/crafting-secure-and-maintainable-multi-account-setup-in-aws-1/</guid><pubDate>Thu, 11 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AWS and other public clouds give developers huge flexibility and freedom to innovate so they can act faster on business requirements. However, such power doesn&apos;t come without a cost.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How do you implement a consistent least privilege access policy in a big and complex single AWS account or in a multi-account setup? How do you limit the blast radius in case of a security breach?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;securing-aws-resources-the-old-school-way&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#securing-aws-resources-the-old-school-way&quot; aria-label=&quot;securing aws resources the old school way permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Securing AWS resources the old-school way&lt;/h2&gt;
&lt;p&gt;AWS API authentication is something that is managed on a per-account level, and in case of a security compromise, someone can gain access to all resources in an account. A best practice is to limit each individual’s access to just the APIs and the API calls that they require to perform their daily work. This is all good and sounds perfectly logical until your team gets big and you need to implement more complex IAM policies.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html&quot;&gt;Tags to the rescue!&lt;/a&gt; One way to limit access to one service in a shared account between several teams is to use resource tags and conditions in the IAM policies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This approach is recommended by AWS, but speaking from personal experience this is not a silver bullet.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One problem with this approach is that not all resources support tags.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Which is weird since AWS tell you that you should tag everything.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As your environment gets more and more complex, so do your IAM policies which also increases the risk of errors in them. At this point, it’s a good idea to start thinking about limiting the scope of your credentials on an account level.&lt;/p&gt;
&lt;h2 id=&quot;introducing-aws-organizations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introducing-aws-organizations&quot; aria-label=&quot;introducing aws organizations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introducing AWS Organizations&lt;/h2&gt;
&lt;p&gt;To achieve this you basically create more accounts to separate different teams, projects or departments. This approach has several advantages in addition to limiting the scope.&lt;/p&gt;
&lt;p&gt;One big plus is that &lt;a href=&quot;https://aws.amazon.com/answers/account-management/aws-multi-account-billing-strategy/&quot;&gt;AWS cost can be separated&lt;/a&gt; by environment, project or business unit for example. When you use a single AWS account, some cost factors can’t be allocated to the corresponding cost center, for example, network traffic. Another advantage is that now you can’t have two teams interfering with each other due to something like resource limit exhaustion.&lt;/p&gt;
&lt;p&gt;As a negative, networking can become complex, but it depends on the use case. Managing several accounts doesn’t seem troublesome, but with the increase in the number of accounts, management can become a problem. This is where you might benefit from &lt;a href=&quot;https://aws.amazon.com/organizations/&quot;&gt;AWS Organizations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here are some example setups:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8ab23448bdbf29cb422e2df979254b76/a88f6/example-structures.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.76595744680851%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAABibAAAYmwFJdYOUAAACTklEQVR42k1STU8TURSdn2d0YWKMMSwkxkQTUAIJblyZuAIXJupSEqUmVOVDKYlgqB+gVARCp9PRoVJaWgodgc7M68z0fd5r5hWUs3sn5+Xcc+41PM/zfRIEgZQKNeI4Tjg/aLfbAICIABCGYUIGJIpiPIUxOvrwZu+l3FIWEaWUiHh83BoaHBi+fa1WKf8jTdPqu3X9wb2BTnzmc8E0J6enZn44a41QaHMhZO7b14npt7Nm3XJDxMQ8IOTj4sLL2fcLW0eVVqzHQQMR9/x4MLM1+M6KyBGKSCViXN31e9KFkayDtAW8oyOpqeKfy6n8m40dFL6S3JBSMka5QnZQ7MwPd3KPEZSUUnDKFPLtxTjTT+0pRGSUKimpALaZimb7RH3VAADOmUTkzWI4cyNeGkksFAjOBCIrzbdf91BzIonDmZJCANL1Z+1XV0VtJRm7RcLlXbLy04mtSbHzWTcMtaMguxOYxQ1upcX+ZhJS8l8H/odt73fhiyympVdNPpcPSW86P5RxKBeJRmf+VHIvPl9/tFxBlACqW8TY9+q5sbVpq4kICsDQnQNXKFw7WrjbyT1B6C5cJZnL2WjuTjcz6omYUCyfCjP9SeYuyxRGeyaZuBJn758sESRVGNoZMn6Bbr7QjAKlYoHhylMyfl5Ul0+cAVGFh7w0L2o5/dJSROVVuDMnXftEpfsQByZ3MsqvG90bsm17u1zBM2g0GoWCWSpXdRHYlTmOY1lWpb4vdQeGPilxqAFSnAZGSmmz2fRaLVT/SUKI67ptEiBIBPUXSFG9ap48YBIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Example organization structure&quot;
        title=&quot;Example organization structure&quot;
        src=&quot;/static/8ab23448bdbf29cb422e2df979254b76/1d69c/example-structures.png&quot;
        srcset=&quot;/static/8ab23448bdbf29cb422e2df979254b76/4dcb9/example-structures.png 188w,
/static/8ab23448bdbf29cb422e2df979254b76/5ff7e/example-structures.png 375w,
/static/8ab23448bdbf29cb422e2df979254b76/1d69c/example-structures.png 750w,
/static/8ab23448bdbf29cb422e2df979254b76/78797/example-structures.png 1125w,
/static/8ab23448bdbf29cb422e2df979254b76/aa440/example-structures.png 1500w,
/static/8ab23448bdbf29cb422e2df979254b76/a88f6/example-structures.png 1900w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/blogs/aws/category/aws-organizations/&quot;&gt;AWS Organizations was released in early 2017.&lt;/a&gt; It allows you to manage multiple accounts and have a central paying account called master.&lt;/p&gt;
&lt;p&gt;Additional pros are that volume discounts are shared between all the accounts in an organization and that you can use the so-called &lt;a href=&quot;https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scp.html&quot;&gt;Service Control Policies (SCP)&lt;/a&gt; to limit certain services and regions from being used in an individual account or a group of accounts. SCPs act more like a boundary, meaning they limit what you can use in a specific account. SCPs help you with security policy enforcement as they can’t be bypassed even by the root user of an AWS account.&lt;/p&gt;
&lt;p&gt;An SCP can be assigned on the organization root. This means that it’s inherited by all accounts in the organization. It can be assigned on an Organizational Unit (a group of accounts) or on an individual account.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0ab5cfce292262471647c806f7e61f73/b5a09/policy-scope.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.3404255319149%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAABibAAAYmwFJdYOUAAACUUlEQVR42oVSv08UQRS+v8JYWFnYa2K0wKiFnTZaGANBQ2JiYyxMpMBWxCuNDY1GY4AgohELgsrpnTH8EjwEs3fH4XG5BW+XuWN3Zuf3zDO7JxCRxJdJJm8m33vf+76Xgu0ghDiOMz09Mzf3tVqtUsrgf5FqXVprALjflz53tu3U0UOvR17F5ZphFJCdwyImuRCU40ZgjdkFW2sBwHXdTGbyy+eP6x6iwmhtwFpIvgCAkaix7tGQkK1QK7UL/lMCAIycKPjHHk4dSWcf5SpggBDJI4pRs/fC9RuHz3SfuORX3b9o74TgzA9ppljPlFF1Ja8rOV6b55iwMFqZzc+9nfyRnQk3G5ILa/8Bc86ttUIILan40EMGLuKXXVu1Na1tazwAoCHeh3YLrI2hjOOI0aVRnu2js4/x5qaSmobEGLOUmXpy+96z7nRl0dkHbIyJGxgtcr1kpBO/uUlR3QIoIQBgon+wp+3y3dNXFsY/7YJtS3EtJ52Nq8Pf24cW360044dttROf2F6fKaWFYrFUKrGkdrbsdwwstA/m35dQLL+x1ljJYofBgk1So401NsUFR3VvrViulSsNH3HBE/LCKC5zvfhFBx67xRqeFMpqs3fDpJTNX/66s7pRqAQeklJagIBQwiVdfs2yaTb/VNIo4W5bq1Jzym5hVTKe4kIEqOlV3fqa2/QR53FnpRQhBI/fwc/PB8OdqFKmhIUolmD0Qf+1A8e7Dp7MDY2llFJCCKWVUopzrhIDW47qoKbry6bxMx7RGJPsf+Ch4tS30mw+CvBvw8D2eQvufVYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Service Control Policies Scope&quot;
        title=&quot;Service Control Policies Scope&quot;
        src=&quot;/static/0ab5cfce292262471647c806f7e61f73/1d69c/policy-scope.png&quot;
        srcset=&quot;/static/0ab5cfce292262471647c806f7e61f73/4dcb9/policy-scope.png 188w,
/static/0ab5cfce292262471647c806f7e61f73/5ff7e/policy-scope.png 375w,
/static/0ab5cfce292262471647c806f7e61f73/1d69c/policy-scope.png 750w,
/static/0ab5cfce292262471647c806f7e61f73/78797/policy-scope.png 1125w,
/static/0ab5cfce292262471647c806f7e61f73/b5a09/policy-scope.png 1360w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;SCPs use the same syntax as IAM policies so it’s nothing that a typical engineer with some knowledge in IAM can’t understand. SCPs can be whitelists or blacklists. A best practice is to choose one type and make sure you stick with it as mixing them can lead to confusion.&lt;/p&gt;
&lt;p&gt;Another benefit of AWS organizations is that the account creation/management can be implemented entirely through code. Thus you are able to create as many accounts as needed (some companies have gone berserk and have thousands of accounts). This means that you can separate your infrastructure and thus limit the blast radius. More on this topic will be covered in a future blog post.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;The engineers at AWS have worked hard on making it easy to build and manage an organization. Currently, there are two major AWS products that can help you with this. The first one is &lt;a href=&quot;https://aws.amazon.com/solutions/aws-landing-zone/&quot;&gt;AWS Landing Zone&lt;/a&gt; and the second is the brand new &lt;a href=&quot;https://aws.amazon.com/controltower/&quot;&gt;AWS Control Tower&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;AWS Landing Zone has been available for a while. It provides standard multi-account patterns, the ability to apply a baseline to each account and some basic networking like VPC peering. While this solution works there are some cons to it. It’s not trivial to make changes and troubleshooting can be frustrating as there are many moving parts involved.&lt;/p&gt;
&lt;p&gt;At the time of writing this post (summer of 2019), AWS Control Tower was just released and it’s not a mature service. If you already have an AWS organization then you can’t use Control Tower and also there is still no API available. I’m sure that, in the future, AWS will polish Control Tower and it will become the standard.&lt;/p&gt;
&lt;p&gt;Stay tuned for our next post when we will share how we implemented AWS Organizations at ST6.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Deliberately Crafting an Organizational Culture]]></title><description><![CDATA[Back in the day when we started ST6 we knew we wanted to build a company that would be a catalyst for profound positive impact on the world…]]></description><link>https://st6.io/blog/deliberately-crafting-an-organizational-culture/</link><guid isPermaLink="false">https://st6.io/blog/deliberately-crafting-an-organizational-culture/</guid><pubDate>Wed, 19 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back in the day when we started &lt;a href=&quot;/&quot;&gt;ST6&lt;/a&gt; we knew we wanted to build a company that would be a catalyst for profound positive impact on the world. We knew that the only way to make this happen was to gather great people together.&lt;/p&gt;
&lt;p&gt;Soon after starting to look for our first hires we realized that having great people was just not enough. Coming from a fairly large enterprise we knew that &quot;standard&quot; organization methods would not work for our kind of people. We would have to reinvent the ways an organization operates in order to empower those great people.&lt;/p&gt;
&lt;p&gt;We needed to build an environment which would allow those people to flourish. We needed to deliberately craft an organizational culture that would reinforce our core values. We needed to make culture our strategy.&lt;/p&gt;
&lt;h2 id=&quot;culture-as-a-product&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#culture-as-a-product&quot; aria-label=&quot;culture as a product permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Culture as a Product&lt;/h2&gt;
&lt;p&gt;We have already discussed that &lt;a href=&quot;/blog/sst4-company-culture-is-a-product-on-its-own/&quot;&gt;culture is a product on its own&lt;/a&gt;. Unfortunately very few companies realize this. It is sad to see startups talking primarily about their products and not mentioning a word about their organizational cultures. They are so obsessed with product features and funding that they kind of forget that a company is its people, not its product. In a sense they should strive for People-Culture-Fit over Product-Market-Fit.&lt;/p&gt;
&lt;p&gt;On the other side of the spectrum are enterprises that try to enforce &quot;culture&quot; and &quot;values&quot; upon employees without realizing that they have lost any connection with them. C-level execs looking to digitally transform the organization, middle-level managers looking to hit the numbers and employees counting the working hours all floating in the same ship without clear purpose.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Why is it like this? Why do most organizations fail to build strong cultures? Why do very few organizations design their cultures deliberately?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before answering those questions we need to step back and look at what an organizational culture is at its core.&lt;/p&gt;
&lt;h2 id=&quot;it-starts-with-values&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-starts-with-values&quot; aria-label=&quot;it starts with values permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It starts with Values&lt;/h2&gt;
&lt;p&gt;In his &lt;a href=&quot;https://www.mikemcgarr.com/blog/understanding-culture.html&quot;&gt;Understanding Culture&lt;/a&gt; post (I highly recommend reading it) Mike McGarr visualizes culture using the following diagram:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c78023e5ffeec2a33c1335fac188f321/2cffa/culture.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.3404255319149%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADo0lEQVR42o3M60+bBRQG8NO9cYiY6QfHNmNdMqfBFUrL2vK2JUwQjbIIa2cT2CaUrrQdbemFtrTcBDcdhbfKXhDoepkrjrIWHJObQkrHxkicm6AbtIgEv/gnqBFrjxmLMSYk7vnynJwn+QFsk6nVq4CIcPOXMWIqPgT+GdruHnflX7nVD4EbvYR/hobHjiOghsEFN4S+8RGj316B3jFn7mRsCEeXAosAsENxQg09oU7GY4PS2jehe9jJmFwYheVYLKXvOrVMh8/jhdB59E5ccNKTH0DP9FnC87sJ2ob1/4P187bav+gkJjYCQI030PRXrfhR2LZJXW9M0l+3Yb1fdYT6shE+vGYmmoY0IGs/sj1W1lkA0k4hNI+oiY4ZC9CR9986d82Ipj550uZTJo298oS5X44dk7ZVxzlLmqVLA+a+Kga39OD2oMlbAfKuowxpUwEwX9u1y3q1YsMeVqA9XJWwh6rQMbx1bzaNKlHrk/V9utQIzdMKoh/Tgavf+18sr3U/+Md7oMwv3FHmFYPmcqlPPyLBclfhZkmjCCWtecnjZ/OTkra8pPJS8V+6kATVvtJ3TvQUgqwrj+Bo9kDmqfR/QaHjABS1sIiChlcg35RRInWRKKPFm1KX8E8JRSakLmFiqyky8e4noj9ktBhL2vk/7xY8+UxG+bNwWMVkZFXue4QVtSNwVMBgnQLgKA8dFNS9+JvAwkR+3QvIr2NiVtVefLU8HQ+d3IPs0/vwn22rjfsn/AhQ7O5mvFQCILLeByjoQiDtDoJv1QFHCeV8Q9qEwJQ6IDA9FeQZ0oLZp1OCWfKdwcyKnUFOdUqQb0wLPtwEptTBw/rULzJlcCCjshgylQoio2oFgHvmDsGuvgUseYTHVj9w52jXnWz1OpWtiVOkcYkSWeOU2BanxPWrlMgao0jDdxRHE6Oyqtc7c7RrLpZyqSv97bnnmMei8HL5HAOePzoFAPwnChtuP1D0BrHmYjfWeN0ocd5AoTWOubXzKNDPI187h6RhAUX1P+Gx9puo83tQ6+1BlWcQ32iYvqQcWIGRXzcYkNuCIDDcu/x6y/eo9XpQ7+lA42cfo8wVQdK8jNkVQcyuDGPWyc8xRzmGQts6Hu+cRfMAjXqPEw0BDxa13EXumTua7Jo4APu9IZbQdHeONN+f5erWZgXGeDRH/2OUZ4hFRZbFqNi2EhXXx6Li+kf98MczrES5urWooPaHKEd1L0Lqb8+TukiIWdD89N8bdayia02CPAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Culture Diagram&quot;
        title=&quot;Culture Diagram&quot;
        src=&quot;/static/c78023e5ffeec2a33c1335fac188f321/1d69c/culture.png&quot;
        srcset=&quot;/static/c78023e5ffeec2a33c1335fac188f321/4dcb9/culture.png 188w,
/static/c78023e5ffeec2a33c1335fac188f321/5ff7e/culture.png 375w,
/static/c78023e5ffeec2a33c1335fac188f321/1d69c/culture.png 750w,
/static/c78023e5ffeec2a33c1335fac188f321/2cffa/culture.png 1092w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://www.mikemcgarr.com/blog/understanding-culture.html&quot;&gt;Mike McGarr blog&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Values and core values are what drives and bonds an organization. Values can evolve over time as your organization grows but core values shouldn&apos;t change. &lt;a href=&quot;https://medium.com/the-mission/the-difference-between-principles-and-values-789b95452422&quot;&gt;Core values are the principles&lt;/a&gt; that establish purpose and shape the mission of your organization. If they change you are in a different organization now.&lt;/p&gt;
&lt;p&gt;Values are usually conceived by the founders and early employees when the organizational culture is incepted. It is critical to get those outlined early on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Does your organization have values and core values? Have they proven themselves over time?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;its-about-delivering-on-your-values&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-about-delivering-on-your-values&quot; aria-label=&quot;its about delivering on your values permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s about delivering on your Values&lt;/h2&gt;
&lt;p&gt;Having values defined is the &quot;easiest part&quot;. You need to deliver on those values. You need to act in line with your values. Everything you do, every little interaction, every message, every meeting, every pull request, every process, every tool should be aligned with your values. The same goes for the things you shouldn&apos;t do - if something is against your values just don&apos;t do it.&lt;/p&gt;
&lt;p&gt;For example, Volkswagen has &quot;We take on responsibility for the environment and society&quot; and &quot;We are honest and speak up when something is wrong&quot; as values but they failed miserably to deliver on them - remember &lt;a href=&quot;https://en.wikipedia.org/wiki/Volkswagen_emissions_scandal&quot;&gt;Dieselgate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to create a strong culture it is critical for the founders (and early hires) to act in line with the company&apos;s core values.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Are you delivering on your core values? Do your organization leaders act according to your values? What are you willing to give up to have a value-driven organization?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back to the main question: &lt;em&gt;Why do most organizations fail to build strong cultures?&lt;/em&gt; I believe we have an answer: &lt;strong&gt;they have failed to discover their core values and to deliver them through behavior&lt;/strong&gt;. It&apos;s that simple yet hard to execute. Everything else in your culture is derived from your values and your subsequent behavior.&lt;/p&gt;
&lt;p&gt;Stay tuned for our next post when we will share our core values and how we are delivering on them.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The Future of UI is... Functional]]></title><description><![CDATA[Yesterday Apple announced their next generation UI framework - SwiftUI. What strikes me is its React-inspired philosophy. Not because it's…]]></description><link>https://st6.io/blog/the-future-of-ui-is-functional/</link><guid isPermaLink="false">https://st6.io/blog/the-future-of-ui-is-functional/</guid><pubDate>Tue, 04 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday Apple announced their next generation UI framework - &lt;a href=&quot;https://developer.apple.com/xcode/swiftui/&quot;&gt;SwiftUI&lt;/a&gt;. What strikes me is its React-inspired philosophy. Not because it&apos;s component-based, not even for the declarative nature but due to its functional paradigm - the expression of UI structure in terms of composable functions with varying parameters.&lt;/p&gt;
&lt;p&gt;To understand how we got here we must go back in time.&lt;/p&gt;
&lt;h2 id=&quot;a-ui-component-is-born&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-ui-component-is-born&quot; aria-label=&quot;a ui component is born permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A UI component is born&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Visual_Basic&quot;&gt;Visual Basic&lt;/a&gt; was the first programming language to go mainstream with the concept of components in 1991. A couple of years later in 1997 VB got the capability to create custom user controls. Having custom components allows for two key aspects of component-based programming: &lt;strong&gt;encapsulation of logic and reusability&lt;/strong&gt;. It also unleashed an ecosystem of 3rd-party component vendors that were building and selling commonly used components.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8031ec317f85ed77daa21f9791eaa930/5a190/vb-5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAADKElEQVR42iWOWW8TVxiG50f175RKhRtuuiITOxmvAixuopAMXmbGnv3MeubM7rEzXhJTy41jTCKKAyZtiNOkEipBagkSiqdKLb3S+9x83/NidJnmKI4jWZ5ieZq/AZqrlWmmwtAlWqAFqS5KdUFmgcwCsSbyNC/SoiqoqqBigJFkFlBEubJJ8BRfeUJxpMhREkeCKlGrbNYqmzRF0BwpqrxuSBAwwJAMUzaRgjBV1jbWNzceb5FbVPVJuZBhf/yOvvc9de8H6u6d0u1bxJ1viNu3iG+/Jgp4SRE0VdSaThjaYRREWMP1WaoGZQuplgmgwMPiuqFLjsQoEqNpouUYYWh3Wl4Pytbrw+nx9PX+YHy4f/jlny9Yp9EFjOyZXjvodBuRIDXyhO87oaNbjm67ht2wgm7Y6Ue7lorOT87j6/jfD5+uPlwtrhaYC122ynrQb4ednWC7Zu5mwB5UkKUiW7Nv5vlR0222vJYu6edn53EcLxaL+KZiLEABS3Iu9Nphtxe0RPuXdXSoCLopw5bb8qDnQtc3/W7YNYCx19+bvZwdHRxNX0xfTV5hDQuxVS5AQafRaftR4EYGbDqGi1SE/pf7yHcMxzd9TdAggC5020G71+x5poc5ls2R/PJ3N+yZMixvPKVLVHWrShIkU2Vcw4UyVAVV4ZVtv3kwGh/sTaYvpoPeACMZtrJRGQ+eX3+6/vzx8+jZyFRMx3Bs3bY0K7ACz/QkRlI4haM4H7XHw99nv53Oj0/fvJxhkRcJtLC7vXv51+XFycXZ8dnp7HT+dj5/O3/35t37s/e+6Sd/SmZWMsXcI+opKhYs2+hfnJyNno2wftSX6hKewPOr+Vwql1/NF9YK+dX8EgprhWwym1nJ4An8UbZYK5MKzyPV4GneAAa209oR62Lq51T6fjp9P40ncDyBL3mZzEpmefww89BHAVLtSqkGBK3lNrHhzlAT1GwyW1gr5FK5pTaXyi2TXbnRZpNZPIE/SD+4vPj76I8/v8oVzV8ncRxjCifLvMJUGakuQQB5mpdZAAGEAAo1QeZkAxiqoDq64+jOZDjZH04UFPR7g+eD8X99ilvGPzNQiQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Microsoft Visual Basic 5.0&quot;
        title=&quot;Microsoft Visual Basic 5.0&quot;
        src=&quot;/static/8031ec317f85ed77daa21f9791eaa930/1d69c/vb-5.png&quot;
        srcset=&quot;/static/8031ec317f85ed77daa21f9791eaa930/4dcb9/vb-5.png 188w,
/static/8031ec317f85ed77daa21f9791eaa930/5ff7e/vb-5.png 375w,
/static/8031ec317f85ed77daa21f9791eaa930/1d69c/vb-5.png 750w,
/static/8031ec317f85ed77daa21f9791eaa930/5a190/vb-5.png 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://winworldpc.com/product/microsoft-visual-bas/50&quot;&gt;WinWord&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;There was one big issue though: it was very hard to create really complex UIs. The supported way was to use the provided visual designer which generated a lot of boilerplate resulting in unmaintainable code.&lt;/p&gt;
&lt;h2 id=&quot;enter-the-declarative-web&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enter-the-declarative-web&quot; aria-label=&quot;enter the declarative web permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enter the (declarative) web&lt;/h2&gt;
&lt;p&gt;In the late 90s the web took over and slowly but steadily made all desktop development obsolete. What the web introduced was a declarative syntax (in the form of markup) for defining components. As it turned out markup&apos;s tree-like nesting syntax was suited very well for defining UI elements. &lt;strong&gt;It also raises the level of abstraction due to its declarative nature.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Markup came with its own problems to solve - there is an impedance mismatch between the UI declaration and the logic that drives it. In order to solve this problem a new glue layer was introduced (by framework authors) in the form of data-binding with the sole purpose of connecting the view.&lt;/p&gt;
&lt;h2 id=&quot;its-functions-all-the-way-down&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-functions-all-the-way-down&quot; aria-label=&quot;its functions all the way down permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s functions all the way down&lt;/h2&gt;
&lt;p&gt;And then React happened: it was component-based, declarative and baked with functional concepts in mind. Initially React did not have function components, but those were added two years after the first public release and recently went mainstream with the introduction of React Hooks.&lt;/p&gt;
&lt;p&gt;React&apos;s functional philosophy is so influential that all new UI frameworks are inspired by it. Today, &lt;a href=&quot;https://flutter.dev/docs/development/data-and-backend/state-mgmt/declarative&quot;&gt;Flutter&lt;/a&gt; and &lt;a href=&quot;https://developer.apple.com/tutorials/swiftui/handling-user-input&quot;&gt;SwiftUI&lt;/a&gt; both have uni-directional dataflow, function components and state-driven interactions.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4f26ca6eea4aa69b420efbee9740c81c/a016c/ui-equals-function-of-state.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.17021276595745%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABzElEQVR42lXP30tTYRgH8O+Onu3sl+JxUBAVahDDH6TGoIikoEjYed/3rG04f+CNtr3HdtFKuqhFMIKulK0zK/oF5XZeJ2GIVwleFBqyzcuu6rp/IehiMaltPvDAlweeD8+DCoByS1cBfJUdmFxO42w4AyWUhzqxhMXN60gUGbhFYFj0MGd2LkHWXqAjmoUrZMIdMoEWUCoDgxXg6m6bfD7we8feqz/pc4bMWEc0e+rNd78SL7BhbhGfYdEzt1b1nj81tDn1fL83nPM0wDrWgt6pAu++OJTF6Qf3pkaj6ZhdX3l7YvZpb3I9+Jhb9AMX5LUhSClRpB9TGzfuYvzVZW8kN6iwPFw3TVsD/If6K0Bgr10+PrRdki+ylFvRzXNqbMl/f+vaQLzARrggV7gggXiBXXj0eey0nTwf9UZy3U7drINHrqvnzjJwch/w4aCKdsaUY9q4L10Akuuawi3axQVxGYJ4DEHkZCkI4Ce8kSwcdKUJfmuC7gqg7kmSWgMkR3je3U1mBlQypf6qjWHuPZUSRSoZgkjcotLtUtAG1NA1sdwE/9f+0dfxoz7MvMRGD+Bj0zbgIRbWCFKfNBiCYGFNO9zzhJ/Bqecb0F9/DZqIaTyrtgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;UI Equals Function of State&quot;
        title=&quot;UI Equals Function of State&quot;
        src=&quot;/static/4f26ca6eea4aa69b420efbee9740c81c/1d69c/ui-equals-function-of-state.png&quot;
        srcset=&quot;/static/4f26ca6eea4aa69b420efbee9740c81c/4dcb9/ui-equals-function-of-state.png 188w,
/static/4f26ca6eea4aa69b420efbee9740c81c/5ff7e/ui-equals-function-of-state.png 375w,
/static/4f26ca6eea4aa69b420efbee9740c81c/1d69c/ui-equals-function-of-state.png 750w,
/static/4f26ca6eea4aa69b420efbee9740c81c/a016c/ui-equals-function-of-state.png 762w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;small&gt;&lt;em&gt;Original image from &lt;a href=&quot;https://flutter.dev/docs/development/data-and-backend/state-mgmt/declarative&quot;&gt;Flutter Docs&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The other interesting aspect of those new generation frameworks is how they tackle the impedance mismatch between markup and code - by using the full power of their programming languages to declare the UI. And we are talking about three completely different languages: JavaScript, Dart and Swift. Isn&apos;t this great?!&lt;/p&gt;
&lt;p&gt;I&apos;m super excited about what the future holds for UI frameworks. Maybe the best way to predict it will be to (re)invent it starting with first principles. One thing is certain - it will be component-based, declarative and functional. Perhaps it&apos;s &lt;a href=&quot;https://en.wikipedia.org/wiki/Lisp_(programming_language)&quot;&gt;Lisp&lt;/a&gt; all over again.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Upgrading the ST6 Meme Generator to Create React App 3.0]]></title><description><![CDATA[This is the second post in the ST6 meme generator series. You can read the introductory post here. You probably know the saying "If it ain’t…]]></description><link>https://st6.io/blog/upgrading-the-st6-meme-generator-to-create-react-app-3/</link><guid isPermaLink="false">https://st6.io/blog/upgrading-the-st6-meme-generator-to-create-react-app-3/</guid><pubDate>Wed, 15 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This is the second post in the ST6 meme generator series. You can read the introductory post &lt;a href=&quot;/blog/crafting-the-st6-meme-generator/&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You probably know the saying &lt;em&gt;&quot;If it ain’t broke, don’t fix it&quot;&lt;/em&gt; but that&apos;s not true for JavaScript projects. You should always keep them up-to-date. The ecosystem is moving so fast that being away for a week could result in hundred of dependencies to update.&lt;/p&gt;
&lt;p&gt;A couple of weeks ago the Create React App maintainers &lt;a href=&quot;https://github.com/facebook/create-react-app/blob/0905b51525c4ef6154cfe579d51ff4f090e883ca/CHANGELOG.md&quot;&gt;released version 3.0&lt;/a&gt; of this great tooling so we decided to upgrade the &lt;a href=&quot;https://st6.io/meme&quot; target=&quot;_blank&quot;&gt;meme generator&lt;/a&gt;. Hooks support is now baked into Create React App so we needed no further reason.&lt;/p&gt;
&lt;h2 id=&quot;one-does-not-simply-upgrade-a-javascript-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#one-does-not-simply-upgrade-a-javascript-project&quot; aria-label=&quot;one does not simply upgrade a javascript project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;One does not simply upgrade a JavaScript project&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.04255319148937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADYklEQVR42j3S71MTdADA4W+NjR8OtzHGhAU02caYINMNg9hAB2swGFuCMcFAGBNiY0IHNBET8EQSRnmlWR3GdeUh5hWmZ51XV3ZXefSq68rjsO56k3dxXdadV3ddn643vXj+g0ccc2UxXZfNrDeHeV8uiUYds3UZnHQrmHMrGbGlMvn4Zg4XSwkXSbn7igs+amGpM4/FoJ77V9u4d9HPB2Ejn8VtiCmPltMNW/4368vh/NEQc0cijIdaOdofZiayn9G+EOFAPe+eG+fawgQvRJ5kqcvIryut8F2Mtdc83Bq1IvorVHTZFbRbFXTsVBEqU9MXqKK/cQ+LMT+rS2PcPN7Ch/EAz7isuOzlnIs28fX5dt4PF7Kxsh++j/HLpQYu9xgQDebNuA3peE0KfGYlTWYlNfkyxkrS+OdCHawP8eCter5pz2bRo6FCJljuLObva/t4r9vI79fb+e2Kn6/GdrI67UDUFMipNcjxFip4qjSD4I4MmiwqjpWpWYuXsfF6PT9OlLMasfHtoJWurZsYduax8fZervSY+OnVWj4fKWbj0l643YPYrU+nwawgsE1BozkdZ14ynoI0woWb+bjDwl9v+vjzzB646OfnyV1M2ZQ8a9fwQ8LF1T4Tyz0GbgyWcGe+ivWXqhGurXK2a5LJ3iRBmyqhu6qARIuFU85sztblcj/hZKVVz/VmPXciFhKOTAZLNUzVG5hpymc5ZGL9RTcPlgN8MlyCyEpNIl0qQSURBK3Z3DvTwO2ojRtBA71FKibtatYO2/ljopovDhppfiQZZ2YqioclKFNSOOTQkQjkMePbwpfP70LIJRIsShk6ieCNFiO3/Fo61YKX3Tre8erYliSYq5RzuUlDZ67ggE6GTSlFKgQWbTJ+ayaVBUoqCpT01eQh8tMkmOQPYc3JZOVUPzfjzXx6spO7FwYYryvF43TQEahn92NlHHBXE2+uZaDZTZvPzViPn2iblxaHBadJTWWhBmFUyHg0ReAw6zk9NsjC5CALJ0aIdHdRW1NDLDZAfHSY0Vgv08NR4u3NDHXvY+q5KOOjQ/R2BAlWFfHEf+WsWoQxXYohPYnyLBmHdqgZsKvwZAp0SYIkIRBCoEoW+K1qjtg0RPVyQlU6Djqy8W7XcjzyNGcnosyPR0mMRfkX7a7g4l6ABmkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;One does not simply upgrade a JavaScript project&quot;
        title=&quot;One does not simply upgrade a JavaScript project&quot;
        src=&quot;/static/d368db32bd2821553511da566cedee4e/1d69c/one-does-not-simply-upgrade-js-project.png&quot;
        srcset=&quot;/static/d368db32bd2821553511da566cedee4e/4dcb9/one-does-not-simply-upgrade-js-project.png 188w,
/static/d368db32bd2821553511da566cedee4e/5ff7e/one-does-not-simply-upgrade-js-project.png 375w,
/static/d368db32bd2821553511da566cedee4e/1d69c/one-does-not-simply-upgrade-js-project.png 750w,
/static/d368db32bd2821553511da566cedee4e/78797/one-does-not-simply-upgrade-js-project.png 1125w,
/static/d368db32bd2821553511da566cedee4e/f32b7/one-does-not-simply-upgrade-js-project.png 1136w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Upgrading to Create React App 3.0 is as simple as bootstrapping a new project with it (assuming you did not go wild and ejected the app). Executing:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--exact&lt;/span&gt; react-scripts@3.0.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...and that&apos;s it. Almost.&lt;/p&gt;
&lt;p&gt;Unfortunately it is rarely that easy in JavaScript projects. Running the app locally resulted in this strange and obscure error:&lt;/p&gt;
&lt;div class=&quot;custom-block error&quot;&gt;
  &lt;div class=&quot;custom-block-body&quot;&gt;
    &lt;p&gt;BrowserslistError: Unknown browser kaios&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed &lt;a href=&quot;https://github.com/facebook/create-react-app/blob/0905b51525c4ef6154cfe579d51ff4f090e883ca/CHANGELOG.md#browserslist-support-in-babelpreset-env&quot;&gt;one of the changes&lt;/a&gt; in Create React App was related to Browserslist but nothing to do with this mythical browser named kaios.&lt;/p&gt;
&lt;p&gt;Diving deeper into the issue it turned out that Browserslist is using &lt;a href=&quot;https://caniuse.com/&quot;&gt;Can I Use ... ?&lt;/a&gt; support tables under the hood which recently added support for a new browser: the one bundled in &lt;a href=&quot;https://en.wikipedia.org/wiki/KaiOS&quot;&gt;KaiOS&lt;/a&gt; - the spiritual successor of Firefox OS.&lt;/p&gt;
&lt;p&gt;Upgrading the app resulted in two versions of Browserslist, each using a different version of the &quot;Can I Use&quot; database. One of the database versions supports KaiOS, the other - doesn&apos;t. With yarn&apos;s philosophy to not upgrade locked sub-dependencies, we get the KaiOS error.&lt;/p&gt;
&lt;p&gt;The solution is quite simple. We just need to yarn like never before:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; yarn.lock
$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This ensures that yarn uses the latest matching versions of all sub-dependencies and magically we have a working app.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-the-configuration-setup-for-create-react-app-30&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#upgrading-the-configuration-setup-for-create-react-app-30&quot; aria-label=&quot;upgrading the configuration setup for create react app 30 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upgrading the configuration setup for Create React App 3.0&lt;/h2&gt;
&lt;p&gt;Setting the initial troubles aside, Browserslist config is now used for controlling the output of our JavaScript files. This means that we can use separate configurations for &lt;code class=&quot;language-text&quot;&gt;development&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;production&lt;/code&gt; ultimately resulting in quicker compile times locally. Here is the recommended configuration that we are using:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;browserslist&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;&gt;0.2%&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;not dead&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;not op_mini all&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;development&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;last 1 chrome version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;last 1 firefox version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;last 1 safari version&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This configuration ensures that our app works correctly on all relevant browsers in production, but locally in development it targets just the latest versions of Chrome, Firefox and Safari. A nice tweak especially if you develop on MacOS.&lt;/p&gt;
&lt;p&gt;The other big thing in Create React App is the built-in support for React Hooks. This comes in the form of bundling the &lt;a href=&quot;https://reactjs.org/docs/hooks-rules.html&quot;&gt;react-hooks&lt;/a&gt; ESLint plugin. If you remember from our &lt;a href=&quot;/blog/crafting-the-st6-meme-generator/&quot;&gt;last post&lt;/a&gt; we have already used the plugin so it will be better if we remove it from our configuration/dependencies and let Create React App manage it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;...
&quot;devDependencies&quot;: {
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   ...
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    &quot;eslint-plugin-react&quot;: &quot;7.12.4&quot;,
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    &quot;eslint-plugin-react-hooks&quot;: &quot;1.6.0&quot;,
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   ...
&lt;/span&gt;},
...
&quot;eslintConfig&quot;: {
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; ...
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &quot;plugins&quot;: [
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;     &quot;react-hooks&quot;
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   ],
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &quot;rules&quot;: {
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;     &quot;react-hooks/rules-of-hooks&quot;: &quot;error&quot;,
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;     &quot;react-hooks/exhaustive-deps&quot;: &quot;error&quot;
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   }
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; ...
&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;crafting-a-great-pull-request-description&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#crafting-a-great-pull-request-description&quot; aria-label=&quot;crafting a great pull request description permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Crafting a great pull request description&lt;/h2&gt;
&lt;p&gt;You can judge great developers by the pull request descriptions they are writing. Are they walking the last mile when the code is &quot;ready&quot; to craft a great description of the applied changes?&lt;/p&gt;
&lt;p&gt;A great pull request description is one that the reviewer would love to read. It&apos;s like an interesting book for a reader who is curious to read it and learn something new.&lt;/p&gt;
&lt;p&gt;Upgrading dependencies might not be the most interesting thing to read about in a pull request description but we can change that. To improve the reading (and learning) experience we can link to the changelog for the specific version of each updated package. Thus everyone reviewing the pull request can educate themselves what exactly has been changed in each dependency.&lt;/p&gt;
&lt;p&gt;We can use a Markdown table format in order to present those in a more digestible form. Here&apos;s how it&apos;s going to look in our case:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Old&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;th&gt;Changelog&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;react, react-dom&lt;/td&gt;
&lt;td&gt;16.8.4&lt;/td&gt;
&lt;td&gt;16.8.6&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/facebook/react/blob/master/CHANGELOG.md#1686-march-27-2019&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;react-scripts&lt;/td&gt;
&lt;td&gt;2.1.8&lt;/td&gt;
&lt;td&gt;3.0.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/facebook/create-react-app/blob/6cddf9cc09a16cfd40fb3a3e33c9f01f3ed89c02/CHANGELOG.md#300-april-22-2019&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;enzyme-adapter-react-16&lt;/td&gt;
&lt;td&gt;1.11.2&lt;/td&gt;
&lt;td&gt;1.12.1&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/airbnb/enzyme/releases/tag/enzyme-adapter-react-16%401.12.0&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;husky&lt;/td&gt;
&lt;td&gt;1.3.1&lt;/td&gt;
&lt;td&gt;2.1.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/typicode/husky/blob/master/CHANGELOG.md#210&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prettier&lt;/td&gt;
&lt;td&gt;1.16.4&lt;/td&gt;
&lt;td&gt;1.17.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://prettier.io/blog/2019/04/12/1.17.0.html&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;custom-block hint&quot;&gt;
  &lt;div class=&quot;custom-block-heading&quot;&gt;Tip&lt;/div&gt;
  &lt;div class=&quot;custom-block-body&quot;&gt;
    &lt;p&gt;
      You can use the online &lt;a href=&quot;https://www.tablesgenerator.com/markdown_tables&quot;&gt;Markdown tables generator&lt;/a&gt; to create nicely formatted tables.
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When adding the links to the changelogs, make sure that you are linking to the correct heading and anchor for the respective version. You might even have to link to the changelog in a specific commit because some changelogs contain information just for the latest version. For such changelogs, when a newer version is released, your links become obsolete. This, for example, is the case with Create React App.&lt;/p&gt;
&lt;p&gt;You can check out the &lt;a href=&quot;https://github.com/st6io/meme/pull/8&quot;&gt;final pull request&lt;/a&gt; in the Meme repo. It includes other goodies like adding linting for Markdown files and improving Jest coding experience by installing its types declarations.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Belonging Right from the Start]]></title><description><![CDATA[I dread being the new kid. On my first day on a new job, I suddenly become very self-aware of my every quirk, of every out-of-place hair, of…]]></description><link>https://st6.io/blog/belonging-right-from-the-start/</link><guid isPermaLink="false">https://st6.io/blog/belonging-right-from-the-start/</guid><pubDate>Tue, 23 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I dread being the new kid.&lt;/p&gt;
&lt;p&gt;On my first day on a new job, I suddenly become very self-aware of my every quirk, of every out-of-place hair, of every wrinkle on my dorky T-shirt. To quote Eminem: &quot;palms are sweaty, knees weak, arms are heavy&quot;. The only thing missing is the remnants of my mom&apos;s spaghetti.&lt;/p&gt;
&lt;p&gt;I yearn for a magic wand, a voodoo charm, anything that would dispel the curse of the newcomer. Anything that would get me to that point in time where I already belong.&lt;/p&gt;
&lt;p&gt;Funny thing. My first day at ST6 - I fit right in.&lt;/p&gt;
&lt;h2 id=&quot;even-before-i-started-i-knew-i-belonged&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#even-before-i-started-i-knew-i-belonged&quot; aria-label=&quot;even before i started i knew i belonged permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Even before I started, I knew I belonged&lt;/h2&gt;
&lt;p&gt;The first part of the recruiting process is a cultural screening. This isn&apos;t a place you grow a taste for, your mindset either belongs here or not.&lt;/p&gt;
&lt;p&gt;For me, it was an instant click with the people and the vibe. My tribe, my religion - only I didn&apos;t know they existed until then. I&apos;d call it &quot;belonging at first sight&quot; but that might be too cheesy.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dd09cb7c52dda7c3f63e3ce38877f17f/c1b63/cheesy.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEPElEQVR42gXBCUyTBwCA0X/JMo3OOTMFtHKkoFAq4NFyOORQ8WKZB7Fq5g6cWzTLnIlHtuiUIBOQQwVajjKQoy3IKbfQQgGhtIC0tmzoQMrs5pCwaNwWzbJ8e0943BbL/SIvSg77MN20jcmKd3iolTNZHcIL60Ee316IMcOdjtQltCcJTDUH8dKhwJS3jhGVCP78hqf6UCwF4dhqP0Jw1EYyrvPErpMze+9TJuvCcTaEMd+/D3NPFmXXEynJOIY662uuXVRQkn6IFNkizIVRPO3y5p/xXfxSuxJH41GGShUI1qpYrGVBmAs3MtV2kPEyP+aM8fyhl2FvPUpNeiCVyVIqk/3p1uykOc2fs2KB22c2MdOxiVdTCUzWB1CcGEhSiIBgrd6DrTqO8bod2EoDGM3x5UlHEObcRQzlLyc/QeBqnBs2rQ/zpghsPy6gJcWXugsbuF8ayJzlAM+Mmyn/wp/sPSKEEe1uGs6tZrQ4Gld7KHP98fzaGkLXZYG2lCUkRS/lUpQXrr6duLo30Zu9gObkFfSpJbRf9MSh2c2sQYK1IoLBW7EIY1VxVHwsYFFu4S/7fsY17gwXeHA3ZTFNyR7cSfGkT+XD7EAcDo0HxqwlnJe/yYWwt5lq2cvvvft40iRmRB1Mxw/eCI6a3cy07+K59RSuvu2YCxbTf/M97qaJaL3qSWemCHtNKLN9UfRnChgy3uNy9CLSdq7gxdgH/DtzGGftKoYLpQwWRyO4DIk8Hz6Gq38rA9eWcvesG47acDrS3em6KaXjmhf2mnhmWnzQXxHoTHOjJ2ctljIpzq71vJ7+DGfNaoYLgzAVyxHmh07zW080dt0a7mX5YUyVMKqV0ZMXhP6mBP0NCc6ufUxo3qI7dQGd6SvpVfoyWCSm7JiIZ5ZDTNf7YSuXYyqUITwzH+FBhRemgmAsFZEMlsrozpUwUBLKsHYjY7pA/p44w7x5D4M5CzFkiOjL98WQJSYlbDGz5kQeVS7ncUMkNm0UwkRjLMMlYehvBFOdtJnO3EjuFQfRcMUP1VEfJtsSeGndy0RNEFOtuxhSS+jJEWMplWBWr+OF4wQOtRvO5h080EUhjOoUmEq30pYVgvKrDXSoYtDnS1EeF3NylYC14kOe39/PqNqPh00JDBRJ6VEGMFq+ljlLHK+nT/KoOhirJg6bbjuCMT8GfW4ErTciaFdF0pgewufydznivYyxKgVPDBGM18oYq4piqEyGUeWPsUBKS8oyfmrcxn+u04wofag95c7PdxIQ2rLfp+X6FhozN3MnW07elz5cVPhxab8Y1+An2Ku86VP505oeQOFxDzqVYQzcklJ+6g06szbwalyBtcibAZUMQ54MoT41gvrMWDRX5FQkrUebup7bqWv4Nt4bszaGXqWI3iI5lWdXci5coD47hqrvReSf8ODp4AGcpu+w1J3AVH8efeUZ/gcTYAB4bFQ/xQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Too cheesy?!&amp;quot;&quot;
        title=&quot;&amp;quot;Too cheesy?!&amp;quot;&quot;
        src=&quot;/static/dd09cb7c52dda7c3f63e3ce38877f17f/1d69c/cheesy.png&quot;
        srcset=&quot;/static/dd09cb7c52dda7c3f63e3ce38877f17f/4dcb9/cheesy.png 188w,
/static/dd09cb7c52dda7c3f63e3ce38877f17f/5ff7e/cheesy.png 375w,
/static/dd09cb7c52dda7c3f63e3ce38877f17f/1d69c/cheesy.png 750w,
/static/dd09cb7c52dda7c3f63e3ce38877f17f/78797/cheesy.png 1125w,
/static/dd09cb7c52dda7c3f63e3ce38877f17f/c1b63/cheesy.png 1200w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Original image by &lt;a href=&quot;https://pixabay.com/users/lipefontes0-3076470/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1972744&quot; target=&quot;_blank&quot;&gt;lipefontes0&lt;/a&gt; from &lt;a href=&quot;https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=1972744&quot; target=&quot;_blank&quot;&gt;Pixabay&lt;/a&gt;. Edited with the &lt;a href=&quot;https://st6.io/meme/&quot; target=&quot;_blank&quot;&gt;ST6 Meme Generator&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;a-welcome-like-no-other&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-welcome-like-no-other&quot; aria-label=&quot;a welcome like no other permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A welcome like no other&lt;/h2&gt;
&lt;p&gt;I&apos;ve changed a few jobs in my time. I&apos;ve had first days planned to the minute. I&apos;ve had people handholding me through the induction. I&apos;ve been abandoned to my own devices. I&apos;ve been the exciting new curiosity and I&apos;ve been the invisible newcomer.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/164b1e73c315d9f0dce3839c265e6d15/6a068/first-day.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAQP/xAAXAQEAAwAAAAAAAAAAAAAAAAABAAID/9oADAMBAAIQAxAAAAHtMdmdsZYZl3g+AT//xAAcEAEBAAICAwAAAAAAAAAAAAACAQADERITIjH/2gAIAQEAAQUC6B3143Fl6H3mb3Ixab53i+//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAXEQADAQAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/ATWOf//EAB0QAAIBBAMAAAAAAAAAAAAAAAABEQIQEnEhMUH/2gAIAQEABj8CVVS6RGJw21s1aCUeW//EABsQAAMAAwEBAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/Ic3rhOMjWSeYJuQqFTQRVtwuGMTFx8M7ez//2gAMAwEAAgADAAAAEJfPQf/EABgRAAIDAAAAAAAAAAAAAAAAAAABEBFB/9oACAEDAQE/EGikZH//xAAXEQEBAQEAAAAAAAAAAAAAAAABADFB/9oACAECAQE/EBexG4v/xAAeEAEAAgICAwEAAAAAAAAAAAABABEhMVFhQYGRsf/aAAgBAQABPxBKoi3Zy8xRDrVDD5LRqEU0ZxcQbRQV1EgWvqFsgN9bl/v6QSZHyZTnCLVdz//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Welcome, Iva!&amp;quot;&quot;
        title=&quot;&amp;quot;Welcome, Iva!&amp;quot;&quot;
        src=&quot;/static/164b1e73c315d9f0dce3839c265e6d15/acb04/first-day.jpg&quot;
        srcset=&quot;/static/164b1e73c315d9f0dce3839c265e6d15/bc01b/first-day.jpg 188w,
/static/164b1e73c315d9f0dce3839c265e6d15/bf173/first-day.jpg 375w,
/static/164b1e73c315d9f0dce3839c265e6d15/acb04/first-day.jpg 750w,
/static/164b1e73c315d9f0dce3839c265e6d15/6a068/first-day.jpg 960w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What I haven&apos;t had was an ST6-style welcome. Picture a personalized greeting card on my desk. A desk with my preferred setup already in place (13-inch MacBook Pro, dual monitors, ergonomic chair). Some hugs. Gelato from one of the best ice cream spots in town. (No pics, since the gelato disappeared before I could Instagram it.) A team lunch. An invite to the team building that&apos;s about three months from now.&lt;/p&gt;
&lt;p&gt;My first day at ST6 felt like a celebration. Or like coming home.&lt;/p&gt;
&lt;h2 id=&quot;included-from-the-start&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#included-from-the-start&quot; aria-label=&quot;included from the start permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Included from the start&lt;/h2&gt;
&lt;p&gt;You know how your first week, first month, first six months are usually about patiently waiting to get accepted and included in the conversation? You&apos;re supposed to listen and observe, rather than express opinions.&lt;/p&gt;
&lt;p&gt;I can&apos;t hide from the conversation at ST6. Every internal meeting ends with a quick checkout round where even the freshest fish in the pond must provide feedback on the session. Checkouts are an opportunity to learn what went well and what didn&apos;t work and improve future sessions based on that.&lt;/p&gt;
&lt;p&gt;I am also welcome to join every internal focus group (circle) meeting to listen in, observe, or add an item to the agenda. Furthermore, attending these meetings is encouraged during the first few weeks, so that people can decide which circle to join and contribute to. (Yes, circles are internal focus groups governing certain aspects of the company - office, hires, operations, etc. Decision making is carried out based on consent from the circle or, when needed, from the entire organization.)&lt;/p&gt;
&lt;p&gt;As part of the full transparency culture here, there are no hidden conversations going on. Everything is right there on Slack for the whole team to see and provide feedback on. My feedback is important and sought after. It won&apos;t always be applied but it will always be considered. And since transparency breeds transparency, I quickly found myself sharing my work as well as providing thoughts and peer reviews on the spot.&lt;/p&gt;
&lt;h2 id=&quot;bonding-over-food&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bonding-over-food&quot; aria-label=&quot;bonding over food permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bonding over food&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d975d7109411dfa3fc15002071aebfdf/0f98f/social-eating.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAwABBf/EABUBAQEAAAAAAAAAAAAAAAAAAAMC/9oADAMBAAIQAxAAAAEybTTnSVn/AP/EABoQAAEFAQAAAAAAAAAAAAAAAAIAAQMREiH/2gAIAQEAAQUCvSCikKN9APDcRj0y/8QAFREBAQAAAAAAAAAAAAAAAAAAACL/2gAIAQMBAT8BS//EABURAQEAAAAAAAAAAAAAAAAAAAAi/9oACAECAQE/AVv/xAAdEAACAQQDAAAAAAAAAAAAAAAAAQIRITFhQUJx/9oACAEBAAY/AtYJSa8H22WEpVdeCx//xAAdEAEAAgICAwAAAAAAAAAAAAABABEhMUFhcbHR/9oACAEBAAE/IcVu5Y7gIguj9gQCl8oQlOd+YQgDT3ObI7n/2gAMAwEAAgADAAAAEJjf/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQARIUH/2gAIAQMBAT8QUK4Rb6z/xAAXEQEBAQEAAAAAAAAAAAAAAAABACER/9oACAECAQE/EAXoRjC//8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFBoWH/2gAIAQEAAT8QRC39DRbt8MsnMBIsFrqT7j/ggBb9yxCB4hLNe6cCLt1QSPXMX6NsRE/M/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Social eating&amp;quot;&quot;
        title=&quot;&amp;quot;Social eating&amp;quot;&quot;
        src=&quot;/static/d975d7109411dfa3fc15002071aebfdf/acb04/social-eating.jpg&quot;
        srcset=&quot;/static/d975d7109411dfa3fc15002071aebfdf/bc01b/social-eating.jpg 188w,
/static/d975d7109411dfa3fc15002071aebfdf/bf173/social-eating.jpg 375w,
/static/d975d7109411dfa3fc15002071aebfdf/acb04/social-eating.jpg 750w,
/static/d975d7109411dfa3fc15002071aebfdf/ec605/social-eating.jpg 1125w,
/static/d975d7109411dfa3fc15002071aebfdf/c58a3/social-eating.jpg 1500w,
/static/d975d7109411dfa3fc15002071aebfdf/0f98f/social-eating.jpg 1920w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Image by &lt;a href=&quot;https://pixabay.com/users/StockSnap-894430/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2602736&quot; target=&quot;_blank&quot;&gt;StockSnap&lt;/a&gt; from &lt;a href=&quot;https://pixabay.com/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2602736&quot; target=&quot;_blank&quot;&gt;Pixabay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am fond of all things food and cooking. I like watching YouTube videos about recipes, I like reading about food, I like staring at food in my Instagram. When I travel, I am more likely to check &quot;places to eat&quot; and &quot;must eat&quot; lists before googling any local sightseeing or looking for an actual hotel. I also love baking and bringing baked goods to people. I sincerely believe that food is one of the ultimate bonding devices that society has invented! (&lt;a href=&quot;http://www.ox.ac.uk/news/2017-03-16-social-eating-connects-communities&quot; target=&quot;_blank&quot;&gt;And the University of Oxford obviously thinks so too.&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;And, oh, boy, is social eating a part of the culture at ST6. Going out for lunch at 12 PM sharp is the law. On Fridays, the team goes out for a more lavish lunch experience and the company picks up the bill. Every early afternoon is &quot;Mezze-O-Clock&quot; - a magical sliver of time when people bond over a selection of cheeses and charcuterie, handpicked by our office fairy godmother Lidia (can we get some porchetta, btw?). It&apos;s a surprisingly efficient (and savory) way to blow off some steam and socialize.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict-three-weeks-in&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-verdict-three-weeks-in&quot; aria-label=&quot;the verdict three weeks in permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The verdict, three weeks in...&lt;/h2&gt;
&lt;p&gt;A picture is worth a thousand words. Just check out yours truly immortalized in an ST6 meme.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c7d58ccbf329e34fca0969acd3d7cbeb/e5166/meme-iva.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAP/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAAB5zNQs65HVJKmMVn/AP/EABwQAAIBBQEAAAAAAAAAAAAAAAECAAMREhMjIv/aAAgBAQABBQLO5ar52tOazmUOEpKNYUTUJ//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABURAQEAAAAAAAAAAAAAAAAAACBB/9oACAECAQE/AaP/xAAcEAACAQUBAAAAAAAAAAAAAAAAASECIjEyQXH/2gAIAQEABj8CiCGzhckzUyj0qR0//8QAGxABAAIDAQEAAAAAAAAAAAAAAQARITFRYZH/2gAIAQEAAT8heQlGx9qort+JipjkFSgp3yK+KYoLl2WW6MEbdx//2gAMAwEAAgADAAAAELvnw//EABkRAQACAwAAAAAAAAAAAAAAAAEAMRARIf/aAAgBAwEBPxAqpyAaMf/EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFh/9oACAECAQE/EHqYxXWv/8QAHhABAAIBBAMAAAAAAAAAAAAAAQARITFBkfBRodH/2gAIAQEAAT8QtAL3eisJwxbqyELQ9+ZZxmr3Z77jRNFOggGM2ZIGa5UW8xFPgOS2ERpNbfJ//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;quot;Meme Iva&amp;quot;&quot;
        title=&quot;&amp;quot;Meme Iva&amp;quot;&quot;
        src=&quot;/static/c7d58ccbf329e34fca0969acd3d7cbeb/acb04/meme-iva.jpg&quot;
        srcset=&quot;/static/c7d58ccbf329e34fca0969acd3d7cbeb/bc01b/meme-iva.jpg 188w,
/static/c7d58ccbf329e34fca0969acd3d7cbeb/bf173/meme-iva.jpg 375w,
/static/c7d58ccbf329e34fca0969acd3d7cbeb/acb04/meme-iva.jpg 750w,
/static/c7d58ccbf329e34fca0969acd3d7cbeb/ec605/meme-iva.jpg 1125w,
/static/c7d58ccbf329e34fca0969acd3d7cbeb/e5166/meme-iva.jpg 1200w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Crafting the ST6 Meme Generator]]></title><description><![CDATA[But why? At ST6 we believe that great people build great products. But having great people is not enough, you need to build an environment…]]></description><link>https://st6.io/blog/crafting-the-st6-meme-generator/</link><guid isPermaLink="false">https://st6.io/blog/crafting-the-st6-meme-generator/</guid><pubDate>Tue, 26 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACsElEQVR42j2Ra2vbdhSH/UX2ZozB1pIx3EIyaFPmJk7ixldJthPXknyLZVeWL1HsupIs+dpc2qWlG2Ojb/Y1Nf7PiBL24uF3XhwefocTSxwZ4f6xwX66LZIZg//JGiRzHY4K3Yi01EXVemiahVTu3e2zl26znzHYy7RFNGeNMCapfijrMxTdF4oeoNQCivUAWffRzTXz9W9cOJf8/fUfxhOH00qX4WiJdX6JornIqkNRc0VJdSnrXhgrqE4oqS6S6oqHjJA1j3z1Ha3mBYG7xu0NMI9TqK8U9Gof17vh4+aW1XRBcOGLxcRn+Ta4a+iGDwKhRE3vKdZ9cprHxWjJl+vPtDM5tJ04lZ2nnOZfY9kbvn75i983V3xaXooP/oLb5SaMyaoX3rVR9Nm9sDZDqfvIzYB8bcbY3vB5ecVUlqhs75CPxykmDrH6M957G7zBhEt3IdbTGe+dRRhTdD8s1vxIGGUjQG7OkVtzcjWP4WDJjTOnnzqmEn9CJ/ErRk5hYr2lo7/B1E3eWROxHHsE5+6dcBY+nBkJy/U5xYaP3PIpteb0+z627VB7mSTz6EdyB/uYmzW61qYqaZxV2tidkfAGU6bmOIxJmvtwsi9K9YByYxZxcuZSNmzyzR6pmsnRboIXj7+nMbHp/PmJ5wWVatWgUWowaFpiatrYxvD+KfdCT5TqHhENl2y9x66ssZ1TSVa7JGWV9FmTys2cX6qveZwscKB36XRthk1LjDtDztuDMFasBWGpPqfcWIiT1oJqZ0VWH/FM1njy6oSUarJeXLN2lxSdMfHTEt/tHrBdrPGs1CTdtOgNp8LSDUytE8aS2W54WDA5KvRESjLJnw54kS3x6PkhW4k0Fb3NdGCTz0h888MW3z7dZetllp/2cvy8l6Uxcljd/iE+rK74uLr+9z8dvOESS8zEpAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;But why?&quot;
        title=&quot;But why?&quot;
        src=&quot;/static/c0e2d815e6528c2c541a77c421129f48/1d69c/but-why.png&quot;
        srcset=&quot;/static/c0e2d815e6528c2c541a77c421129f48/4dcb9/but-why.png 188w,
/static/c0e2d815e6528c2c541a77c421129f48/5ff7e/but-why.png 375w,
/static/c0e2d815e6528c2c541a77c421129f48/1d69c/but-why.png 750w,
/static/c0e2d815e6528c2c541a77c421129f48/78797/but-why.png 1125w,
/static/c0e2d815e6528c2c541a77c421129f48/c1b63/but-why.png 1200w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;but-why&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-why&quot; aria-label=&quot;but why permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But why?&lt;/h2&gt;
&lt;p&gt;At &lt;a href=&quot;/&quot;&gt;ST6&lt;/a&gt; we believe that great people build great products. But having great people is not enough, you need to build an environment which will allow those people to flourish. You need to nurture a strong culture that will reinforce your core values.&lt;/p&gt;
&lt;p&gt;What can be more valuable than having your own meme generator that can be used to &lt;a href=&quot;https://en.wikipedia.org/wiki/Meme&quot;&gt;spread your ideas, behaviors, styles, or values&lt;/a&gt; within or outside of your organization. After all&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;&lt;em&gt;Every software organization should have its own meme generator&lt;/em&gt;&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;... but please don&apos;t quote me on that on your next all-hands meeting.&lt;/p&gt;
&lt;p&gt;Let&apos;s leave the cultural story for another blog post and focus on the technology. This was supposed to be a technical post.&lt;/p&gt;
&lt;p&gt;We love React and as soon as Hooks were &lt;a href=&quot;https://reactjs.org/blog/2019/02/06/react-v16.8.0.html&quot;&gt;officially released&lt;/a&gt; we knew we want to try them out. We were keen to rewrite all our code with Hooks (without bringing any value to our customers) but eventually decided to used them in a fresh project of ours because we love sarcasm and bad jokes.&lt;/p&gt;
&lt;p&gt;And that&apos;s how it came to be: &lt;code class=&quot;language-text&quot;&gt;Memes + Hooks = Awesomeness&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;TL;DR If you want to generate your own memes go to &lt;a href=&quot;https://st6.io/meme&quot; target=&quot;_blank&quot;&gt;&lt;a href=&quot;https://st6.io/meme&quot;&gt;https://st6.io/meme&lt;/a&gt;&lt;/a&gt;. The source code is at &lt;a href=&quot;https://github.com/st6io/meme&quot;&gt;https://github.com/st6io/meme&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;bootstrapping-the-meme-generator-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bootstrapping-the-meme-generator-app&quot; aria-label=&quot;bootstrapping the meme generator app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bootstrapping the meme generator app&lt;/h2&gt;
&lt;p&gt;It&apos;s 2019 and if you are not using &lt;a href=&quot;https://facebook.github.io/create-react-app/&quot;&gt;Create React App&lt;/a&gt; to bootstrap your next React app you are doing it wrong. Gone are the days when you have to spend weeks evaluating different starter kits, because none match your preferences. Create React App does all the configuration for you and comes with great defaults. With &lt;a href=&quot;https://reactjs.org/blog/2018/10/01/create-react-app-v2.html&quot;&gt;version 2&lt;/a&gt; there is even less need to &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/available-scripts#npm-run-eject&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;eject&lt;/code&gt;&lt;/a&gt; the tooling, because it comes with &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/adding-a-css-modules-stylesheet&quot;&gt;CSS modules&lt;/a&gt;, &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/adding-a-sass-stylesheet&quot;&gt;Sass&lt;/a&gt; and Babel macros support. Running&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; create react-app meme&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;... and we are done.&lt;/p&gt;
&lt;p&gt;After yarning the app with Create React App we are extending the setup with the following configurations.&lt;/p&gt;
&lt;h3 id=&quot;pinning-the-nodejs-version&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pinning-the-nodejs-version&quot; aria-label=&quot;pinning the nodejs version permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pinning the Node.js version&lt;/h3&gt;
&lt;p&gt;We want to pin the Node.js version in order to avoid hard to reproduce issues and ensure all two of us are using the same version of Node while working on the app. We are using &lt;code class=&quot;language-text&quot;&gt;.nvmrc&lt;/code&gt; (and &lt;a href=&quot;https://github.com/creationix/nvm&quot;&gt;nvm&lt;/a&gt;) that usually points to the latest LTS version of Node at the time of bootstrapping. Additional benefit of locking the version is that most popular CI providers do support it which yields that they will use the specified version of Node while running your CI pipeline.&lt;/p&gt;
&lt;h3 id=&quot;installing-code-formatting-tools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installing-code-formatting-tools&quot; aria-label=&quot;installing code formatting tools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installing code formatting tools&lt;/h3&gt;
&lt;p&gt;We are huge fans of &lt;a href=&quot;https://prettier.io&quot;&gt;Prettier&lt;/a&gt; and install it in every project we work on. It allow us to focus on the problems we are trying to solve instead of debating over the visual esthetics of the code. After all we are not painting an impressionist art, but rather crafting solutions for real world problems like generating memes.&lt;/p&gt;
&lt;p&gt;Prettier comes with great defaults but we like to tweak them in order to match our own preferences. There are a couple of ways you can configure prettier (it is using &lt;a href=&quot;https://github.com/davidtheclark/cosmiconfig&quot;&gt;cosmicconfig&lt;/a&gt;) but in our case we want to keep it simple by just adding the following key in our &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;prettier&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;singleQuote&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;trailingComma&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;all&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In addition to &lt;a href=&quot;https://prettier.io/docs/en/editors.html&quot;&gt;configuring our editors to support Prettier&lt;/a&gt; we also like to have a simple command that can be run in order to format the whole codebase. It is a one-liner that can be added to the &lt;code class=&quot;language-text&quot;&gt;scripts&lt;/code&gt; section:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
  &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;prettier --write \&quot;src/**/*.{js,json}\&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;configuring-linters&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-linters&quot; aria-label=&quot;configuring linters permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring linters&lt;/h3&gt;
&lt;p&gt;Create React App comes with &lt;a href=&quot;https://eslint.org/&quot;&gt;ESLint&lt;/a&gt; support out of the box. The default configuration comes from the &lt;a href=&quot;https://www.npmjs.com/package/eslint-config-react-app&quot;&gt;react-app&lt;/a&gt; package which has a good set of basic and accessibility rules defined. We would like to extend those with some React-specific rules recommended from &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-react&quot;&gt;eslint-plugin-react&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We better install the all new and fresh &lt;a href=&quot;https://reactjs.org/docs/hooks-rules.html&quot;&gt;react-hooks&lt;/a&gt; ESLint plugin as we are going to be using React Hooks. Hopefully Create React App will include it by default because everyone is using hooks nowadays (mainly for demos or funny blog posts).&lt;/p&gt;
&lt;p&gt;Here is the final linting configuration from our &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;eslintConfig&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;react-app&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;plugin:react/recommended&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;detect&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;plugins&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;react-hooks&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;rules&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react-hooks/rules-of-hooks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react-hooks/exhaustive-deps&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Additionally you can include other &lt;a href=&quot;https://github.com/dustinspecker/awesome-eslint&quot;&gt;awesome ESLint plugins&lt;/a&gt; for React Native, lodash or GraphQL. You can even include a &lt;a href=&quot;https://github.com/sindresorhus/eslint-plugin-unicorn&quot;&gt;unicorn&lt;/a&gt; 🦄.&lt;/p&gt;
&lt;p&gt;Finally we are going to add a new script for running the linter:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
  &lt;span class=&quot;token property&quot;&gt;&quot;lint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eslint src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;installing-pre-commit-hooks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installing-pre-commit-hooks&quot; aria-label=&quot;installing pre commit hooks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installing pre-commit hooks&lt;/h3&gt;
&lt;p&gt;The final step of the bootstrapping process is to install pre-commit hooks so that all configured tools will be run automatically before committing. We are going to call out for help from our good friends &lt;a href=&quot;https://github.com/typicode/husky&quot;&gt;husky&lt;/a&gt; and &lt;a href=&quot;https://github.com/okonet/lint-staged&quot;&gt;lint-staged&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is our &lt;code class=&quot;language-text&quot;&gt;lint-staged&lt;/code&gt; configuration in &lt;code class=&quot;language-text&quot;&gt;packages.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;lint-staged&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;src/**/*.js&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;prettier --write&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;eslint --max-warnings=0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;yarn test --bail --findRelatedTests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;git add&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;src/**/*.{json}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;prettier --write&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;git add&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A couple of things to note here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are running &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;--max-warnings=0&lt;/code&gt; option that specifies that we will treat warnings as errors. It is a nice trick if you are integrating new ESLint plugins and you want to gradually integrate their rules in your code base.&lt;/li&gt;
&lt;li&gt;We are running Jest tests with &lt;code class=&quot;language-text&quot;&gt;--findRelatedTests&lt;/code&gt; option which will find and execute just the tests related to our changes. That&apos;s another neat trick you can use if you have large test suites.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally we need to let the dogs out and configure &lt;code class=&quot;language-text&quot;&gt;husky&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;lint-stage&lt;/code&gt; before committing:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;husky&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;pre-commit&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cross-env CI=true lint-staged&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might be wondering why we are setting &lt;code class=&quot;language-text&quot;&gt;CI=true&lt;/code&gt;. Jest (our test runner) checks it under the hook and disables its default watch mode when it&apos;s present. Pure magic.&lt;/p&gt;
&lt;p&gt;We are also using &lt;a href=&quot;https://www.npmjs.com/package/cross-env&quot;&gt;cross-env&lt;/a&gt; in case Apple continues its downfall with MacBooks and we have to &lt;a href=&quot;https://www.youtube.com/watch?v=gZUSFda_W7k&quot;&gt;switch to Windows&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At that point you should be hooked. There are React Hooks, Git Hooks...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&apos;s hooks all the way down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;styling-the-meme-generator-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#styling-the-meme-generator-app&quot; aria-label=&quot;styling the meme generator app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Styling the meme generator app&lt;/h2&gt;
&lt;p&gt;Once the app has been bootstrapped comes another mission-critical decision we have to make: &lt;em&gt;What we are going to use for styling?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We have been successfully using &lt;a href=&quot;https://react.semantic-ui.com/&quot;&gt;Semantic UI&lt;/a&gt;, &lt;a href=&quot;https://material-ui.com/&quot;&gt;Material UI&lt;/a&gt;, &lt;a href=&quot;https://reactstrap.github.io/&quot;&gt;Bootstrap&lt;/a&gt; all along with CSS modules. We have even used &lt;a href=&quot;https://cssinjs.org&quot;&gt;JSS&lt;/a&gt; in one of our projects.&lt;/p&gt;
&lt;p&gt;This time we decided to be even more hipster and go with &lt;a href=&quot;https://www.styled-components.com&quot;&gt;styled-components &lt;code class=&quot;language-text&quot;&gt;&amp;lt;💅&gt;&lt;/code&gt;&lt;/a&gt;. We liked the simplicity of &lt;a href=&quot;https://rebassjs.org/&quot;&gt;Rebass&lt;/a&gt;&apos; primitive components and we were quickly &lt;del&gt;sold&lt;/del&gt; hooked.&lt;/p&gt;
&lt;p&gt;Having never used &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt; before we can definitely say that it is a very good alternative that you should be checking out. Especially if you are &lt;strong&gt;building your own design system (style guide)&lt;/strong&gt; from scratch.&lt;/p&gt;
&lt;p&gt;Another benefit of using Rebass is that it is built on top of &lt;a href=&quot;https://styled-system.com/&quot;&gt;styled-system&lt;/a&gt; and is easily &lt;a href=&quot;https://rebassjs.org/theming&quot;&gt;themeable&lt;/a&gt;. One of the highest priority requirements for our app was to have a dark theme, because memes are usually generated outside of working hours.&lt;/p&gt;
&lt;p&gt;You can check our &lt;code class=&quot;language-text&quot;&gt;light&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;dark&lt;/code&gt; theme definitions in &lt;a href=&quot;https://github.com/st6io/meme/blob/33bf0e52a22ec713eb1e59aa6b789bb47b3c3626/src/components/theme.js&quot;&gt;this&lt;/a&gt; file. In the future we might even want to support &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme: dark&lt;/code&gt;&lt;/a&gt; media query. You can try to find the hidden toggle (it&apos;s an Easter egg) that can be used to switch between the themes in our &lt;a href=&quot;https://st6.io/meme/&quot; target=&quot;_blank&quot;&gt;final app&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;implementing-the-meme-generator-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#implementing-the-meme-generator-app&quot; aria-label=&quot;implementing the meme generator app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implementing the meme generator app&lt;/h2&gt;
&lt;p&gt;We are approaching the mid of the post but haven&apos;t used React Hooks yet. It&apos;s time to &quot;enter the codebase and do whatever we want&quot;.&lt;/p&gt;
&lt;h3 id=&quot;adding-meme-labels&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#adding-meme-labels&quot; aria-label=&quot;adding meme labels permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adding meme labels&lt;/h3&gt;
&lt;p&gt;The essence of every meme generator is having top and bottom labels that can be changed from some inputs. Let see how can do that using Hooks:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;onLabelChange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;token parameter&quot;&gt;setter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; value &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;topLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setTopLabel&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Do the most meaningful meme...&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setBottomLabel&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;...of your life&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;imageSrc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setImageSrc&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRandomMeme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Card&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;mx&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;auto&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;pt&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Flex&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;flexDirection&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;column&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;px&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;pt&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Input&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Top text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;topLabel&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onLabelChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;setTopLabel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Input&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Bottom text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onLabelChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;setBottomLabel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Flex&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Meme&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; topLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; imageSrc &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Card&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🎉Congrats. That&apos;s your first usage of React Hooks right there. Good news is that they work as promised. We are storing the labels&apos; state via &lt;code class=&quot;language-text&quot;&gt;useState&lt;/code&gt; and then passing the values to the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;p&gt;A neat trick to remove code duplication is the extraction of the change handler logic into a new higher order function. It destructures the changed value from the input and passes it to the state setter function.&lt;/p&gt;
&lt;p&gt;Now let&apos;s look at the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;h3 id=&quot;visualizing-the-meme&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#visualizing-the-meme&quot; aria-label=&quot;visualizing the meme permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Visualizing the meme&lt;/h3&gt;
&lt;p&gt;There are a number of ways to implement the actual meme component including DOM elements, Canvas or SVG. Taking into a account that we have to export an image for the meme and we have to support all browser eliminates the DOM elements option (&lt;a href=&quot;https://www.npmjs.com/package/dom-to-image&quot;&gt;dom-to-image&lt;/a&gt; does not support Safari). Canvas solution was eliminated as well due to its imperative API which does not fit well into React&apos;s declarative nature. And we are left with the SVG as the only viable option.&lt;/p&gt;
&lt;p&gt;Using SVG comes with its own set of problems (sounds like &lt;a href=&quot;https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/&quot;&gt;choosing to use Regular Expressions&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The first issue we knew about was that there is no way to wrap text. It&apos;s coming in SVG 2.0 but for now we have to use the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;foreignObject /&gt;&lt;/code&gt; trick in order to insert some DOM elements into the SVG itself.&lt;/p&gt;
&lt;p&gt;The second issue comes from the fact that SVG is not using a CSS like box model, but rather its own canvas-like positioning system. Combining that with the fact that we have to display raster images and we end up in a situation where we have to dynamically adjust the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;svg /&gt;&lt;/code&gt; width and height based on the image&apos;s dimensions. Thankfully there is a hook for doing this: the almighty &lt;a href=&quot;https://overreacted.io/a-complete-guide-to-useeffect/&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;useEffect&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s look at the code of the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; MemeText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;styled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  position: absolute;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  width: 100%;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  bottom: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;props&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;verticalAlign &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;bottom&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  color: white;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  font-family: &apos;Impact&apos;, &apos;Oswald&apos;, sans-serif;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  font-weight: 700;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;  text-transform: uppercase;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
MemeText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;defaultProps &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;verticalAlign&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;top&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Meme&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; imageSrc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; topLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottomLabel &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dimensions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setDimensions&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; image &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; height &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; image&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;setDimensions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; height &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; imageSrc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;imageSrc&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;dimensions&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;image&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xlinkHref&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;imageSrc&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100%&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100%&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;switch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;foreignObject&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100%&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100%&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemeText&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;topLabel&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemeText&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemeText&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;verticalAlign&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bottom&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemeText&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;foreignObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;switch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Our hook logic is simple: once the image is loaded we take its width and height and pass them to the SVG. As loading images is an async operation we need to store the dimensions in the state. The key thing in using state and effect hooks in combination is specifying your dependencies (the second array argument of &lt;code class=&quot;language-text&quot;&gt;useEffect&lt;/code&gt;) otherwise you will end up in an infinite recursion. The effect is causing a re-render because it updates the state, but the render is causing a new effect and 💥. In our case, we want the effect to kick in only when the image source is changed.&lt;/p&gt;
&lt;p&gt;Another interesting part of this code snippet is the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;MemeText /&gt;&lt;/code&gt; component. It is a styled-component that has a custom property &lt;code class=&quot;language-text&quot;&gt;verticalAlign&lt;/code&gt; used to donate whether it&apos;s the top or the bottom label. The usage of tagged template literals really fits well into the styled-components&apos; philosophy.&lt;/p&gt;
&lt;div class=&quot;custom-block hint&quot;&gt;
  &lt;div class=&quot;custom-block-heading&quot;&gt;Note&lt;/div&gt;
  &lt;div class=&quot;custom-block-body&quot;&gt;
    &lt;p&gt;
      This example is simplified in order to be easily comprehendible. The actual code is a little bit more involved because it supports maximum width for the SVG element in case the image is large.
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;exporting-the-meme&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#exporting-the-meme&quot; aria-label=&quot;exporting the meme permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Exporting the meme&lt;/h3&gt;
&lt;p&gt;Turning SVGs into raster graphics is as simple as installing the &lt;a href=&quot;https://www.npmjs.com/package/save-svg-as-png&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;save-svg-as-png&lt;/code&gt;&lt;/a&gt; and calling its &lt;code class=&quot;language-text&quot;&gt;saveSvgAsPng&lt;/code&gt; function. The only interesting part is that the API expect an SVG DOM element as its first argument. In React words it&apos;s &lt;code class=&quot;language-text&quot;&gt;ref&lt;/code&gt; time, but unsurprisingly there is a hook for that as well: &lt;code class=&quot;language-text&quot;&gt;useRef&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We need to have the ref in the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;App /&gt;&lt;/code&gt; component so we can pass it to the &lt;code class=&quot;language-text&quot;&gt;saveSvgAsPng&lt;/code&gt; function. Here is the relevant part of the code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Card&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;mx&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;auto&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;pt&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &amp;lt;Button&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;        variant=&quot;primary&quot;&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;&lt;span class=&quot;token plain-text&quot;&gt;        onClick=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;saveSvgAsPng&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;meme.png&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;        title=&quot;Download image&quot;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;        Download&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      ...&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Meme&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; topLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; imageSrc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ref &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Card&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let&apos;s go to the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; component to see how are we going to handle the ref:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Meme&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; imageSrc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; topLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottomLabel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; forwardedRef &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;dimensions&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;forwardedRef&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;    ...&lt;/span&gt;
&lt;span class=&quot;token plain-text&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; MemeWithRef &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;forwardRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;props&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Meme&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token spread&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;forwardedRef&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We use the &lt;a href=&quot;https://reactjs.org/docs/forwarding-refs.html&quot;&gt;ref forwarding&lt;/a&gt; concept from React and we &lt;code class=&quot;language-text&quot;&gt;forwardRef&lt;/code&gt; the passed ref from the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;App /&gt;&lt;/code&gt; to the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; and down to the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;svg /&gt;&lt;/code&gt; itself.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There are even more hooks in the final version of the code because it handles responsive layout via &lt;a href=&quot;https://www.npmjs.com/package/use-media&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;useMedia&lt;/code&gt;&lt;/a&gt; hook.
Along with hooks, there is a neat trick that dynamically requires all meme images from the &lt;code class=&quot;language-text&quot;&gt;/memes&lt;/code&gt; folder, but let&apos;s leave all that for the curious reader to pursue in the &lt;a href=&quot;https://github.com/st6io/meme&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;testing-the-meme-generator-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#testing-the-meme-generator-app&quot; aria-label=&quot;testing the meme generator app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing the meme generator app&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Every well-crafted software should be guarded by well-crafted tests.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We are fans of radical unit testing which means having 100% code coverage. After all, why you have written a given piece of code if it is not being exercised? If you do not want to test (or can&apos;t for that matter) given part of your code you better be explicit about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I wanted to be clear that 100% code coverage is not an end in itself. It&apos;s just a great tool to force us to think three times before writing any piece of production code.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;configuring-the-test-runner&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-the-test-runner&quot; aria-label=&quot;configuring the test runner permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring the test runner&lt;/h3&gt;
&lt;p&gt;Create React App comes with &lt;a href=&quot;https://jestjs.io/&quot;&gt;Jest&lt;/a&gt; support out of the box and Jest is our preferred JavaScript testing framework. Apart from having a fast and reliable test runner being able to use snapshots is a great way to test your React components.&lt;/p&gt;
&lt;p&gt;We are going to extend the default setup by installing &lt;a href=&quot;https://airbnb.io/enzyme/&quot;&gt;Enzyme&lt;/a&gt;, along with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/jest-enzyme#assertions&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;jest-enzyme&lt;/code&gt;&lt;/a&gt; - provides some nice assertions on top of Enzyme (&lt;code class=&quot;language-text&quot;&gt;toExist()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;toIncludeText()&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/jest-styled-components&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;jest-styled-components&lt;/code&gt;&lt;/a&gt; - provides styled-components specific snapshot testing and assertion (&lt;code class=&quot;language-text&quot;&gt;toHaveStyleRule()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is our testing configuration in &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;jest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;snapshotSerializers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;enzyme-to-json/serializer&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;collectCoverageFrom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;src/**/*.js&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;coverageThreshold&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;global&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;branches&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;functions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;lines&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;statements&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And our &lt;code class=&quot;language-text&quot;&gt;setupTests.js&lt;/code&gt; (which &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/running-tests#src-setuptestsjs&quot;&gt;comes&lt;/a&gt; from Create React App):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; configure &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;enzyme&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Adapter &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;enzyme-adapter-react-16&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jest-enzyme&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jest-styled-components&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;configure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Adapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;writing-the-tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#writing-the-tests&quot; aria-label=&quot;writing the tests permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Writing the tests&lt;/h3&gt;
&lt;p&gt;One of the interesting challenges while writing the tests was how to mock the side-effect of loading images and reading their dimensions within the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Meme /&gt;&lt;/code&gt; component. Create React App configures Jest with &lt;a href=&quot;https://github.com/jsdom/jsdom&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;jsdom&lt;/code&gt;&lt;/a&gt; which yields that we cannot load images like we would normally do in a browser.&lt;/p&gt;
&lt;p&gt;Nevertheless there is a way to mock this on your own. If you remember our hook was reading an image&apos;s width and height once it is being loaded and that&apos;s exactly what we are going to mock:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// dimensions variable defined&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; spy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; jest
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;spyOn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;src&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;set&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mockImplementationOnce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dimensions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dimensions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are spying on the &lt;code class=&quot;language-text&quot;&gt;Image&lt;/code&gt; prototype object and when the &lt;code class=&quot;language-text&quot;&gt;src&lt;/code&gt; property is being set we assign the width and height of the image and call its &lt;code class=&quot;language-text&quot;&gt;onload&lt;/code&gt; handler.&lt;/p&gt;
&lt;div class=&quot;custom-block hint&quot;&gt;
  &lt;div class=&quot;custom-block-heading&quot;&gt;Note&lt;/div&gt;
  &lt;div class=&quot;custom-block-body&quot;&gt;
    &lt;p&gt;
      In the mock implementation we are not using an arrow function in order to be able to access the correct &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; - the one that points to the &lt;code class=&quot;language-text&quot;&gt;Image&lt;/code&gt; object being mocked.
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;reporting-code-coverage-results&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reporting-code-coverage-results&quot; aria-label=&quot;reporting code coverage results permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reporting code coverage results&lt;/h3&gt;
&lt;p&gt;Running &lt;code class=&quot;language-text&quot;&gt;yarn test&lt;/code&gt; will run Jest in watch mode that does not report code coverage results by default. In order to tell the runner we need coverage we have to pass &lt;code class=&quot;language-text&quot;&gt;--coverage&lt;/code&gt; switch to the command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--coverage&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jest bundles &lt;a href=&quot;https://istanbul.js.org/&quot;&gt;Istanbul&lt;/a&gt; as code coverage tool so we get a nice lines covered report after running the command in &lt;code class=&quot;language-text&quot;&gt;./coverage/lcov-report/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Integrating this with online tools for code coverage is even easier. Let&apos;s look at our final &lt;code class=&quot;language-text&quot;&gt;ci&lt;/code&gt; script that lints, tests with coverage and finally reports the coverage results to &lt;a href=&quot;https://codecov.io/&quot;&gt;Codecov&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
  &lt;span class=&quot;token property&quot;&gt;&quot;ci&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;yarn lint &amp;amp;&amp;amp; cross-env CI=true yarn test --coverage &amp;amp;&amp;amp; yarn codecov&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command is run on every CI build. But what do our CI and CD pipelines look like?&lt;/p&gt;
&lt;h2 id=&quot;deploying-the-meme-generator-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deploying-the-meme-generator-app&quot; aria-label=&quot;deploying the meme generator app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deploying the meme generator app&lt;/h2&gt;
&lt;p&gt;The beauty of client-side only apps is that you can literally deploy them everywhere including &lt;a href=&quot;https://awot.net/en/guide/tutorial.html&quot;&gt;5$ IoT boards&lt;/a&gt; that can serve HTTP requests.&lt;/p&gt;
&lt;p&gt;We decided to go with S3 and CloudFront because our site has already been using it and we can leverage some of the existing infrastructure like setting up SSL for the CloudFront distribution.&lt;/p&gt;
&lt;p&gt;I&apos;m not going to go over the process of setting up a S3 bucket and CloudFront distribution as it is already &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/deployment#s3-https-awsamazoncom-s3-and-cloudfront-https-awsamazoncom-cloudfront&quot;&gt;well documented&lt;/a&gt; but rather focus on some interesting challenges that we face due to the fact that the app should be hosted in a subfolder: &lt;a href=&quot;/&quot;&gt;st6.io&lt;/a&gt; hosts our website (which is a React app built with &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt;) and &lt;a href=&quot;https://st6.io/meme&quot; target=&quot;_blank&quot;&gt;st6.io/meme&lt;/a&gt; should host the meme generator.&lt;/p&gt;
&lt;h3 id=&quot;configuring-for-subfolder-hosting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-for-subfolder-hosting&quot; aria-label=&quot;configuring for subfolder hosting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring for subfolder hosting&lt;/h3&gt;
&lt;p&gt;The first thing we have to do is to tell Create React App that it should &lt;a href=&quot;https://facebook.github.io/create-react-app/docs/deployment#building-for-relative-paths&quot;&gt;build the app with relative paths&lt;/a&gt;. Let&apos;s do that by specifying the &lt;code class=&quot;language-text&quot;&gt;homepage&lt;/code&gt; in &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;homepage&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://st6.io/meme&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The second thing comes from the fact that we are reusing the same CloudFront distribution for both our site and the meme generator. CloudFront does support this but it requires configuring a second origin (in our case the meme generator S3 bucket configured for static site hosting) and adding a behavior to point to that origin. The cache behavior needs the following path pattern: &lt;code class=&quot;language-text&quot;&gt;meme*&lt;/code&gt;. That tells the CDN to reroute all requests to &lt;code class=&quot;language-text&quot;&gt;st6.io/meme*&lt;/code&gt; to our meme generator. There is one more caveat here and it comes from the fact that when the request is rerouted it will search for &lt;code class=&quot;language-text&quot;&gt;./meme/resource-name&lt;/code&gt; in our S3 bucket. This means that we have to upload our build artefact (static files) in a &lt;code class=&quot;language-text&quot;&gt;meme&lt;/code&gt; folder inside the bucket.&lt;/p&gt;
&lt;p&gt;The third thing to handle is the CDN invalidation once the bucket is being updated. It is a one-line command using the AWS CLI but there is a &lt;a href=&quot;https://www.npmjs.com/package/travis-ci-cloudfront-invalidation&quot;&gt;npm package&lt;/a&gt; just for this so we decided to go with it in order to not require the AWS CLI pre-installed.&lt;/p&gt;
&lt;p&gt;Here is our Travis CI configuration file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; node_js

&lt;span class=&quot;token key atrule&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yarn

&lt;span class=&quot;token key atrule&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn global add travis&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudfront&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;invalidation
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn

&lt;span class=&quot;token key atrule&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn ci &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; travis_terminate 1
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn build

&lt;span class=&quot;token key atrule&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; s3
  &lt;span class=&quot;token key atrule&quot;&gt;access_key_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $AWS_ACCESS_ID
  &lt;span class=&quot;token key atrule&quot;&gt;secret_access_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $AWS_SECRET_ID
  &lt;span class=&quot;token key atrule&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; st6&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;meme
  &lt;span class=&quot;token key atrule&quot;&gt;upload_dir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; meme
  &lt;span class=&quot;token key atrule&quot;&gt;local_dir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build
  &lt;span class=&quot;token key atrule&quot;&gt;skip_cleanup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; master

&lt;span class=&quot;token key atrule&quot;&gt;after_deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; travis&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudfront&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;invalidation &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;a $AWS_ACCESS_ID &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;s $AWS_SECRET_ID &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;c $CF_DISTRIBUTION_ID &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;i &apos;/meme/&lt;span class=&quot;token important&quot;&gt;*&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;b $TRAVIS_BRANCH &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;p $TRAVIS_PULL_REQUEST&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Some things to note from it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are not specifying the Node.js version. Travis is smart enough to read it from the &lt;code class=&quot;language-text&quot;&gt;.nvmrc&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;We haven&apos;t added the &lt;code class=&quot;language-text&quot;&gt;travis-ci-cloudfront-invalidation&lt;/code&gt; package as an app devDependency. We want to leave the deployment specifics outside of the app&apos;s configuration.&lt;/li&gt;
&lt;li&gt;We are specifying the S3 &lt;code class=&quot;language-text&quot;&gt;upload_dir&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;meme&lt;/code&gt; in order to handle the above mentioned caveat.&lt;/li&gt;
&lt;li&gt;We are telling CloudFront to issue an invalidation only for &lt;code class=&quot;language-text&quot;&gt;&apos;/meme/*&apos;&lt;/code&gt; resources in order to speed things up.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;do-the-most-meaningful-meme-of-your-life&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#do-the-most-meaningful-meme-of-your-life&quot; aria-label=&quot;do the most meaningful meme of your life permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Do the most meaningful meme of your life&lt;/h2&gt;
&lt;p&gt;We are nearing the end of our journey. We started with an ambitious goal to craft a meme generator and ended up with an app deployed at &lt;a href=&quot;https://st6.io/meme&quot; target=&quot;_blank&quot;&gt;&lt;a href=&quot;https://st6.io/meme&quot;&gt;https://st6.io/meme&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is one more thing we need to do before starting the promotion of the app with silly blog posts. We need to add badges to the readme, because&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Every craftsman signs his &lt;del&gt;work&lt;/del&gt; craft.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We are going to use the great service at &lt;a href=&quot;https://flat.badgen.net/&quot;&gt;Badgen&lt;/a&gt; to generate some cool badges and add them to our readme:&lt;/p&gt;
&lt;a href=&quot;/&quot;&gt;
  &lt;img src=&quot;https://flat.badgen.net/badge/crafted%20by/ST6/ffa60b&quot; alt=&quot;Craft&quot;&gt;
&lt;/a&gt;
&lt;p&gt;&lt;br&gt;
... and with that, we can declare &lt;em&gt;&quot;Let there be memes!&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s time to do the most meaningful meme of your life!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You can read the next post in the ST6 meme generator series &lt;a href=&quot;/blog/upgrading-the-st6-meme-generator-to-create-react-app-3/&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Looking to join the culture you&apos;ve been dreaming about? Ready to take the red pill? Want to have more fun with React Hooks? &lt;a href=&quot;/careers/&quot;&gt;Come and meet us&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Startup Survival Tip #4: Culture is a Product on Its Own]]></title><description><![CDATA[I feel like I'll be beating a dead horse here. So much has been said about building a strong company culture, yet so few companies succeed…]]></description><link>https://st6.io/blog/sst4-company-culture-is-a-product-on-its-own/</link><guid isPermaLink="false">https://st6.io/blog/sst4-company-culture-is-a-product-on-its-own/</guid><pubDate>Tue, 12 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center&quot;&gt;
  &lt;img src=&quot;/static/45f1198f12de8c4c763ac50ce8ac3733/dead-horse.gif&quot;&gt;
&lt;/div&gt;
&lt;p&gt;I feel like I&apos;ll be beating a dead horse here. So much has been said about building a strong company culture, yet so few companies succeed. When I read about &lt;a href=&quot;https://www.entrepreneur.com/article/249174&quot;&gt;other companies&apos; culture&lt;/a&gt; it&apos;s a bit strange to hear about the &quot;perks&quot; of the company as if that&apos;s actually the culture of a company. And I&apos;ve heard one too many companies talk about their &quot;great company culture&quot; when all we&apos;re told about is the perks. Let&apos;s take a look at what is &quot;Culture,&quot; how do you build it, and how not to be like everybody else.&lt;/p&gt;
&lt;h1 id=&quot;define-culture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#define-culture&quot; aria-label=&quot;define culture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Define Culture&lt;/h1&gt;
&lt;p&gt;If you don&apos;t consciously and meticulously think about the culture you&apos;re creating while you&apos;re building your company, you will have a very hard time building a successful company. Not that it&apos;s not possible, but the odds are highly against you.&lt;/p&gt;
&lt;p&gt;Identifying the key components of culture is crucial to building the right culture. &lt;a href=&quot;https://hbr.org/2013/05/six-components-of-culture&quot;&gt;Harvard Business School identifies these six components&lt;/a&gt; when it comes to culture:&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td&gt;1. Vision&lt;/td&gt;
    &lt;td&gt;4. Narrative&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;2. Values&lt;/td&gt;
    &lt;td&gt;5. People&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;3. Practices&lt;/td&gt;
    &lt;td&gt;6. Place&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;My take is slightly different. The reality is that if you have the first three items in the list (Vision/Mission, Values, and Practices), then the other three should fall into place. I guess you could say that these are your three pillars! Note that I&apos;m considering Mission and Vision to represent a single pillar, while they&apos;re two separate ideas. Exceptional Vision, Mission, Values, and Practices will allow you to attract exceptional people, to form a compelling narrative, and to build an exceptional place. There is also a feedback loop, where the people will also affect the Values and Practices.&lt;/p&gt;
&lt;p&gt;When I was building BitLendingClub, I honestly didn&apos;t think about any of those things. They existed in some form, they were great in my mind, but that&apos;s the only place they were great. If you actually looked at our company, I&apos;m almost certain that nobody could tell you what our mission was, yet I thought we&apos;re mission-driven. But here is the worst part:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We didn&apos;t agree on a single set of values.&lt;/li&gt;
&lt;li&gt;Our practices were whatever we inherited or picked up along the way.&lt;/li&gt;
&lt;li&gt;Turnover of talent, over the 3 years we existed, was high for a company of 10.&lt;/li&gt;
&lt;li&gt;The narrative was that of the founders, not the people within the company.&lt;/li&gt;
&lt;li&gt;The place we worked at was whatever we could scrap together.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t be like old me!&lt;/p&gt;
&lt;h1 id=&quot;pillar-1-formulate-a-vision-and-mission&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pillar-1-formulate-a-vision-and-mission&quot; aria-label=&quot;pillar 1 formulate a vision and mission permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pillar 1: Formulate A Vision (and Mission)&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ecf666d8f0c5b923f2947501799d84d2/21b4d/ethos-pathos-logos.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACWUlEQVR42lWT20vTcRiH/YeC7IAdzCzDqTu66aa4pjuxo9s0FZMMUiqyZhcWVGRH6EKhhGoeshVZREFBQXQRQnQREkR1ETG/729P/H6b6C6e24f3fT+ft+qgI0SdPch+q5995h7q7QF2WIJkYzEYdFJImlG9ZVIWJNOGzERQT9pRCx7UfFuJBQ+y2EGVLtOllq4UrT39NLljbG8JMBmLw4CDwqAHOeFDRn3IgAtJu5CZqCGURS/yLILkQ4ZMl1YdsAVpaIuQGpng3NRN/L2jbDN1czGRgD4r66djyPRZtDtZ5EwMSdqR2RhqyYk8T6B9vIy8P48sdm4IA5g8cToiw/iSoxyNj7DLFiYbjZUmHPIgY2FEFw93Imnn5oRLPuRFL7LsRy24K1fe1dhl0OAMU731htFGlE7kCCpuQvray0L9du3I0wCy5EXNu0pCXVZr9TN9b86gzuY3hJPxBGQsrF8bR5u9gvbwNjJ1HEnYyiu70D7fpfjjHdr3V8jLfkNaVd8aZrfJy4Nc3mBPk5ed1lBZaEa9yaN9eE1x7Rta/j4q2oLMRpG8l+KvLxT/fKX47yfap+uoR5aSUF/11IWrBjWmLkOY1VM+5qAw0I62kkObu4H0OUop6xMu2tFW5yj+XaP4exVZ6UflXKWV95q7mbh0y6DW0m300KjNkItCvBkZjyAn/ahk8+YN9ZSXg8Zk8nYMlXNWhlLT7DM43Bqi2rwllLQdlWwpFTtj21JsN2rejXpsQ+VaN3u48Sn66jqHHKHKlFM2VMaBZOyotLXiU2Sh0+jfRgd14X/ML1IKLYJfYQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Ethos, Pathos, Logos&quot;
        title=&quot;Ethos, Pathos, Logos&quot;
        src=&quot;/static/ecf666d8f0c5b923f2947501799d84d2/1d69c/ethos-pathos-logos.png&quot;
        srcset=&quot;/static/ecf666d8f0c5b923f2947501799d84d2/4dcb9/ethos-pathos-logos.png 188w,
/static/ecf666d8f0c5b923f2947501799d84d2/5ff7e/ethos-pathos-logos.png 375w,
/static/ecf666d8f0c5b923f2947501799d84d2/1d69c/ethos-pathos-logos.png 750w,
/static/ecf666d8f0c5b923f2947501799d84d2/78797/ethos-pathos-logos.png 1125w,
/static/ecf666d8f0c5b923f2947501799d84d2/21b4d/ethos-pathos-logos.png 1280w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m not just talking about your vision and mission statements. While the vision and mission statements are a great way to convey the vision/mission of a company with a short statement, everybody within the team needs to have a deep understanding of what they are. They need to be clear, concise, and most importantly- inspirational. It is the reason your company exists: it is the thing you&apos;re trying to change in the world, it is your Ethos, Pathos, and Logos.&lt;/p&gt;
&lt;p&gt;Carefully think about them and craft them to truly represent how your company is changing the world. It will be the shining beacon that sets the stage for everything within your business. It will drive the way you market yourself, how you distinguish yourself when recruiting employees, how you approach your customers, how the public perceives you, and everything that follows.&lt;/p&gt;
&lt;p&gt;Companies with a strong vision and mission will have a much tighter focus. Think of your Vision and Mission as a black hole: everything that gets sucked into the black hole will accelerate towards a single point: the singularity! &lt;strong&gt;Everybody that gets &quot;sucked into&quot; your company should accelerate towards the singularity!&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;pillar-2-identify-your-core-values&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pillar-2-identify-your-core-values&quot; aria-label=&quot;pillar 2 identify your core values permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pillar 2: Identify Your Core Values&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/916d1c1a76f6ce079259dfbd4cd231df/4b190/core-values.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.638297872340424%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHDvIiD/8QAFxAAAwEAAAAAAAAAAAAAAAAAAQIRA//aAAgBAQABBQKiNrTs4Z//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGH/8QAGRAAAwADAAAAAAAAAAAAAAAAAAFhAiIx/9oACAEBAAY/AkYyGvKj/8QAGRAAAgMBAAAAAAAAAAAAAAAAAREAITFB/9oACAEBAAE/ITRaI6lFniPd04T/2gAMAwEAAgADAAAAEHv/AP/EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8Q0brp/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAIf/aAAgBAgEBPxCHuCE3/8QAGRABAAMBAQAAAAAAAAAAAAAAAQARIaEx/9oACAEBAAE/EAgFa9Cvey/J+QkMwzkWsiAbDyf/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Core Values&quot;
        title=&quot;Core Values&quot;
        src=&quot;/static/916d1c1a76f6ce079259dfbd4cd231df/acb04/core-values.jpg&quot;
        srcset=&quot;/static/916d1c1a76f6ce079259dfbd4cd231df/bc01b/core-values.jpg 188w,
/static/916d1c1a76f6ce079259dfbd4cd231df/bf173/core-values.jpg 375w,
/static/916d1c1a76f6ce079259dfbd4cd231df/acb04/core-values.jpg 750w,
/static/916d1c1a76f6ce079259dfbd4cd231df/4b190/core-values.jpg 800w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is the second pillar on which you&apos;ll build your company. Values are your guiding principles, foundational beliefs, and core philosophy. Values define how you orient and conduct yourself in the world. Your decisions should be filtered through your values. When you engage with your clients, employees, prospective employees, and society in general, you will conduct those interactions with your core values in mind.&lt;/p&gt;
&lt;p&gt;Anybody that has worked in different companies will attest to the vast cultural difference that develops in the various companies. And not all cultures are the same, some are actually better than others. In those better cultures, employees are more satisfied, productive, and engaged.&lt;/p&gt;
&lt;p&gt;A couple of our team members came from a company in which the culture had developed in such a way that big egos were valued. Management regularly threw employees under the bus and belittled them when they spoke up about issues. It doesn&apos;t take long before resentment builds up. The moment things got heated up, as it happens when you&apos;re building a company which attempts to solve enormous challenges, people reach a breaking point and they quit. The company has 275 employees and has had a turnover of 200. So not only do you have to ensure you have the right values but you have to adhere to those values. One of the worst thing that can happen is to let people in the company subvert the culture and away from your core values. That leads me to the next pillar: Practices!&lt;/p&gt;
&lt;h1 id=&quot;pillar-3-build-strong-practices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pillar-3-build-strong-practices&quot; aria-label=&quot;pillar 3 build strong practices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pillar 3: Build Strong Practices&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ae2547522f5d05a1ce54915f47fe185c/8c557/build-measure-learn.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.91489361702128%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABJ0AAASdAHeZh94AAACr0lEQVR42o2R3U9SARjGn6NuLdfStm66ytQb6w/oxppt6bpo3XrVx52zmtPKyvxAREFQMxMtxK/Slp9DDVFxammYgoCgnCMo2CE8HhDEz2w5PQ233NC19bt/f3uf5wGOcC9VC17RDErLZ4kHGTpCWk2iUGSC9C2JmhY6lOM4aGdZ/HCvY8bmw7iBhcbAQmv2BIs0ehZTFg92ud/o6aOJfIERaY91kFaTpwUi07lqGRkh+0gjILR+d5/c3Nk6Y7b6LmgMbHhAOGlyBwv9Gxvwb27g/KUeQjVAI5dvjBIUm5NFZZakMulcWr7QnCJvd90c+eZu7B9dlqq/sjIj6eVNU54YI+WBkVohDmWva0zY298GUICoOAV0U8zFGjmZLJGYw/dsDgBi3H1Ghte0Oh+2q5aEXWqmsr6dFnapnHGlgSo+zBOBzw9RqR2oa3UQbUoa7zvsGT0DzhaF2pXe0sdcftPqROErMsRE+SFrdUE5toqxAdspIV8b+yJHF8/j68HL1xNBcUnbCry+dThdq2e/TDCCkVFX5ZBm+ZHGsHKtc2gZpXULAFKB0G7Uyi3ISB9HVp7+fh7fEJX5XIts3jGhF8ZZDzSTSxEctx/zqXfxdm0Dmc1x3MlAlJEJ963ez0yOYnAppb6eulokNuWJKywJvGIznubqCcazjWPCaYsHC7QP1gXfwZLil6Yb5VWzSbIG6rpSTTc1dzjkbX2uVEW3/c6TzMnEKwkqhIY1IKi7v1hsXlisK2A8a5iYYkOATGTl6iCpMEc0NVORM+blxDmKjef2dqI3f/2M5jguLHDHcbvQ6934J1UyC2obKbR1LkAkMYYUSKbR1mFDLIrA+DYjS94xB2sODjtPDA7RUPUv4r8xznkhKJlGt9IOIAz+rW2ohh3wrm3BaveBmvceVHWUP0gaj0VhCJOJAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Build, Measure, Learn&quot;
        title=&quot;Build, Measure, Learn&quot;
        src=&quot;/static/ae2547522f5d05a1ce54915f47fe185c/8c557/build-measure-learn.png&quot;
        srcset=&quot;/static/ae2547522f5d05a1ce54915f47fe185c/4dcb9/build-measure-learn.png 188w,
/static/ae2547522f5d05a1ce54915f47fe185c/5ff7e/build-measure-learn.png 375w,
/static/ae2547522f5d05a1ce54915f47fe185c/8c557/build-measure-learn.png 700w&quot;
        sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;At ST6, we regularly question the merits of conventional practices. One of the most common &quot;themes&quot; we see in businesses is the emergence of top-down organizational structure. The most successful companies in the world have a top-down structure, so it would be a bit crazy to think that we&apos;d reinvent the wheel. However, most professionals have experienced at least some of the pitfalls of this approach:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information Drip:&lt;/strong&gt; nearly every company talks about openness and transparency, but practically none of them are truly that open or transparent. The information is usually limited to a handful of people, and the most mission-critical information is limited to the leadership. Most companies have come up with all sorts of justifications for this, which do sound reasonable on the surface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Altitude Haze&lt;/strong&gt;: decisions are taken at the higher levels of the company and filtered down through the various layers of management. Coupled with the Information Drip, this often results in people feeling like the decision-making process is hazy. The decisions of leadership are frequently doubted, employees feel like the leadership doesn&apos;t consider relevant information from the &quot;front lines,&quot; and when changes in direction are taken, people feel like the original decisions were bad. That leads to frustration over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Talent Squash:&lt;/strong&gt; undoubtedly, you&apos;re trying to hire smart people in your company and they have exceptional talents which would greatly benefit the company if they&apos;re fully utilized. If the information that reaches your employees is restricted, then naturally, management wouldn&apos;t want to relegate important decisions to employees lower in the organizational structure. Not because they&apos;re not smart people, but simply because they lack the necessary information to make important decisions. That underutilizes the talents of the people you&apos;ve recruited, limits their learning potential, and causes resentment to build up. There is a great sense of empowerment with being given the ability to make important decisions and people take it seriously when they are given such responsibility.&lt;/p&gt;
&lt;p&gt;This structure is fairly rigid and it doesn&apos;t really evolve over time. Your business and your product do evolve over time, so it&apos;s strange that your organizational structure wouldn&apos;t. When you develop your practice, I strongly believe that you take the Lean Startup approach: &lt;strong&gt;Build → Measure → Learn&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Your company is going to evolve over time, so should your practices. At ST6 we have regular organizational meetings in which we devise organizational experiments (build), we monitor the results of these experiments (measure), and we make adjustments based on the results (learn). Our experiments have led us down an interesting path: flattening the organizational structure. Note that I don&apos;t mean that adopting a flatter organizational structure would eliminate the hierarchy. Even a flat organizational structure is a form of hierarchy. But I&apos;ll save this topic for another blog post!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Startup Survival Tips #3: Delegate Responsibility]]></title><description><![CDATA[If you're building a company, you're not building it by yourself so you shouldn't be doing all the work by yourself either. You're most…]]></description><link>https://st6.io/blog/sst3-failing-to-delegate/</link><guid isPermaLink="false">https://st6.io/blog/sst3-failing-to-delegate/</guid><pubDate>Wed, 10 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a7a4f9514d8fbba626d25390e58df65f/6a068/delegate.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.38297872340425%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAECAwT/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAAB7lCpDQkR/8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEgIf/aAAgBAQABBQJGz//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/Aaf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAAAASAx/9oACAEBAAY/AjHP/8QAGBABAQEBAQAAAAAAAAAAAAAAAQARURD/2gAIAQEAAT8hSOht15K2vW2//9oADAMBAAIAAwAAABDr3//EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAwEBPxAEjrv/xAAWEQEBAQAAAAAAAAAAAAAAAAABERD/2gAIAQIBAT8QRtM//8QAHRAAAgEEAwAAAAAAAAAAAAAAAREAEDFBsSFRcf/aAAgBAQABPxBm5gWAcIQ3GFRS5zqcB2eRu5//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Startup&quot;
        title=&quot;Startup&quot;
        src=&quot;/static/a7a4f9514d8fbba626d25390e58df65f/acb04/delegate.jpg&quot;
        srcset=&quot;/static/a7a4f9514d8fbba626d25390e58df65f/bc01b/delegate.jpg 188w,
/static/a7a4f9514d8fbba626d25390e58df65f/bf173/delegate.jpg 375w,
/static/a7a4f9514d8fbba626d25390e58df65f/acb04/delegate.jpg 750w,
/static/a7a4f9514d8fbba626d25390e58df65f/6a068/delegate.jpg 960w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re building a company, you&apos;re not building it by yourself so you shouldn&apos;t be doing all the work by yourself either. You&apos;re most likely building a team of smart people. Those people should be able to take responsibility for things, freely express their opinions, and have the necessary room to independently take impactful actions. Failing to facilitate such an environment will prevent your team members contributing to their fullest potential. That&apos;s not only bad for your business, but it&apos;s demotivational and unrewarding for them.&lt;/p&gt;
&lt;h1 id=&quot;delegate-responsibility&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#delegate-responsibility&quot; aria-label=&quot;delegate responsibility permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Delegate Responsibility&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c0ab671d107afb5946f8243dcbd03225/0a47e/delegating.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.51063829787234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADWUlEQVR42i2TXUybZRTH//2AgjDI6EZHP2hoGeva+rbvOc/b9mXLRD5Eg3ONWYouJNNEZ6ZxClu9WZAilXhFBmjiRt8WZnCNYTHq3NUmMVyYXYwbEy9UPtpGg5rsQm9MvHjNozw35znn/PM7yfP8D5i5jYgOMbOdmUFEMvYws0vmzHyQmRUiUoQQgeHh4QZd12W9jpn9zBwkIofURqMRSMAJZk7EYjGLpmkyl+JRImrfvzdLaDweb00mk4G+vj5KJBKyPkxEE0R0jZmfk8BUKmWFEOIVIcRLve5mJMNHQcwDxOIeCS2TiB4DCTFGQkyT0KZUoc2qIjGWDAWgisTTzOI8M2eIKCCHB4MBu5z0GTEvP5EULt/IeWhKNKwpkauaEnmjK/MmeoMdHr3bI/qdCAy6G4IDbehoffc2vC9Pwfw6bwl1B6HEYvD7fY95ve4msBo/MNgIR9eFfIPtxk8tME27o7jjbp287UGp5sYdsxnfmC58+kjUFbZOofyXAqOiWZa2BurnHzpxbROdoUij1+v2+3yeJuCT3/ux/OsYirXLMKqvY2k7CqMyjtIvl2BUzsKovI/CThbG7iUY1SuWwvbHFmO3hGL1HRR2n7Tm7sJzLOyTwCNHDgOWpa00SrXLKNamLMXKhLVUHbeVah/YS5W37aVq1laqjNcb26/ajZ1+W7EyiC/MXtz6+7i1WBGW6z+6IM4glkjKT/MJIRqAO6bz0I3vT/o+/O5k+/LPdLD8W4/vowd+NX+rQ6z+0AgAUx5gBEB6ImeLh7q16bdeO9r5+SPANGXbBcCRzWYxOjpqhd7tCQklcj1w9iJSPZ0slMjcU0C9FMcuvgd/R3v9uRdfeNbZ0tSyuLjovHf//p+GUXw4UvzWapomCoWltbW1tQeTk5PO2dlZSJtIi0xrjx+HqiUFCTFBQjtHQgzEoxFEFSWSyWTMZCqVufvVl9jb26utr6//o2laGwDLxsbGH5ubm+b8/PyJlZUVSNvcJKKufRMTEV1l5gvM/LyqqlAUpWFoaOgZXddd+Xwe5XL59Nzc3GkAdaurq8jlcmdmZmauAGi22Wz/AU/tr5hcpSgzx5jZw8zSrC4hhCMcDgdVVT2M/49Dvls6nbYuLCxYADRJmK7rB1KpFP4F+fQQM64XBH0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Delegating&quot;
        title=&quot;Delegating&quot;
        src=&quot;/static/c0ab671d107afb5946f8243dcbd03225/0a47e/delegating.png&quot;
        srcset=&quot;/static/c0ab671d107afb5946f8243dcbd03225/4dcb9/delegating.png 188w,
/static/c0ab671d107afb5946f8243dcbd03225/5ff7e/delegating.png 375w,
/static/c0ab671d107afb5946f8243dcbd03225/0a47e/delegating.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I consider myself to be a pretty lazy person and I avoid doing things unless they&apos;re absolutely necessary for me to do. Unfortunately, over time, everything I do in my company seems like it&apos;s absolutely necessary for me to do! It feels like I have to do the payroll, invoicing, marketing, advertising, branding, hiring, sales, customer success, and the list just keeps growing. And over time, it becomes easier to convince yourself that you shouldn&apos;t bother the rest of the team with those little things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The team member should focus on the core things.&lt;/li&gt;
&lt;li&gt;The fewer distractions for the team, the more productive they are.&lt;/li&gt;
&lt;li&gt;I&apos;m the only one that can do X since I have the most experience or domain knowledge.&lt;/li&gt;
&lt;li&gt;Nobody wants to do these boring things, so I&apos;ll do them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, at some point, this ends up eating too much of your time and you&apos;ll start losing focus. You&apos;ll get overwhelmed with things that you really shouldn&apos;t be doing. Ultimately, you may even sacrifice part of your competitive advantage you have compared to bigger companies: the opportunity to provide your team with the learning experience of building a startup from scratch. If you try to run your business like a big corporation where there are dozens of departments which take care of all of the distractions, then why would anybody bother to come and work for you?&lt;/p&gt;
&lt;p&gt;So work with your team members to delegate as many of your responsibilities as possible!&lt;/p&gt;
&lt;h1 id=&quot;empower-individuals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#empower-individuals&quot; aria-label=&quot;empower individuals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Empower Individuals&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9058c0814fa6c8d447e15da4f8ed531a/0a47e/empower.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.40425531914893%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHUlEQVR42o2SXUiTYRTHz7tNwo8ik0pGml1kon0wmdBuPAdqunBhEghLki4mVNTVwku7KCIw74ryI4KsIGokO2cQFSRteR67CTIMuigjMIwiiajLJ97XzQwk+sO5eP48/M4npLqj4Kq7NRw9FAnF4i27gy37DwCO3XcwOw3ICsQKyAZQjA9FHWQ3TNFzXI/YgBtATQ0Q3dN4Kta803buDdmuSCid3LIGIjPfgDLPNyObcyhmFEVrSTyAl2QFEFAUloHn+zph4FjHpWv9PfbuhaTNjaZSH68cBd/kolvZHWS1yGZk38MckJhKFLMBWUuRjUOi4L1Fw8RLYLAvh8G+H2/8kR/6tPD4ov1pLide58Yg+/RWCbEyii6i6CCJeUZs5lHMPLK+QTavSMwMirHIOlio0A/WWsdaC7n01ezsk/EvALA+Pvu1mlgfeNWJWUDWXhIzQqyW2FjyfH2HYu4hm7PIWlEcQ1HNB9vjv04kei0AJB5ZW44T+Q/EZhJZd5FMua1lUDzQbWKtR9Fyr+WV81wBrGqo3/E93NRo14Ujp9vyb4dbJ3JuG4GlwesmFG0nMTFi3eht3V2EqB9ZfasBSxyAgUDF2huhoevp2PRcW8fM52L2AC1vtABi9ReA3p/VVFVWu60v2HH4Zv3J/jPbj6eg7kjSh5kp797ozw36vRssgP+lytJgzdaymrpqAAi6Rk1Xj9P+Yu6vNv5HvwE68DnY2P6CJgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Empower Individuals&quot;
        title=&quot;Empower Individuals&quot;
        src=&quot;/static/9058c0814fa6c8d447e15da4f8ed531a/0a47e/empower.png&quot;
        srcset=&quot;/static/9058c0814fa6c8d447e15da4f8ed531a/4dcb9/empower.png 188w,
/static/9058c0814fa6c8d447e15da4f8ed531a/5ff7e/empower.png 375w,
/static/9058c0814fa6c8d447e15da4f8ed531a/0a47e/empower.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;At ST6 we have devised a flat company structure, which aims to empower each individual to utilize their maximum potential. Our structure is based on some of the core concepts from &lt;a href=&quot;https://sociocracy30.org/&quot;&gt;Sociocracy 3.0&lt;/a&gt;, with some adjustments to suit our team. The main idea behind sociocracy is to organize the company into cohesive groups, which are independently and interconnectedly responsible for various parts of the organization.&lt;/p&gt;
&lt;p&gt;The core building block of the organization is the circle. Within ST6, each circle has the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Champion&lt;/li&gt;
&lt;li&gt;Secretary&lt;/li&gt;
&lt;li&gt;Roles/responsibilities&lt;/li&gt;
&lt;li&gt;Accountabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;m not going to spend a whole lot of time going into how this is all organized, but the general idea is to be able to give up control of certain company efforts and focus on the things where each individual can contribute with maximum value. This provides individual team members with the ability to take ownership and make key contributions to the business. It also eliminates the &quot;fog of war&quot; so-to-speak, which usually exists in traditional organizations. Where the &quot;fog of war&quot; is the obfuscation which occurs due to the vertical hierarchical structure of the organization and the restriction of information flow. There is still a hierarchy within Sociocracy, despite what the proponents claim, but it&apos;s horizontal and it provides higher transparency.&lt;/p&gt;
&lt;p&gt;Finally, the most important part of the delegation of responsibility is to provide your employees with enough freedom to succeed and fail! Both are necessary because you&apos;re just as likely to fail as they are. Shielding them from failure is also shielding them from the opportunity to learn, and learning leads to success. Now, we should be very careful about what it means to fail: failing in a controlled experiment is good, but failing due to incompetence is bad! So fail successfully! :)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Startup Survival Tip #2: Always Have a Contingency Plan!]]></title><description><![CDATA[When I was at Boost VC, each meeting room had a brainy quote on the wall. One of the rooms had the following quote: "Startups are like paper…]]></description><link>https://st6.io/blog/sst2-always-have-a-contingency-plan/</link><guid isPermaLink="false">https://st6.io/blog/sst2-always-have-a-contingency-plan/</guid><pubDate>Mon, 01 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f0fd33182df9d03e56eb683027cce1ad/8b619/paper-plane-launcher-startup.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMBAgX/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgQD/9oADAMBAAIQAxAAAAG/VudpILGT1MJ7tAf/xAAdEAABAwUBAAAAAAAAAAAAAAABAAIDERITICFB/9oACAEBAAEFAvKcQidcYnBY36f/xAAbEQABBAMAAAAAAAAAAAAAAAASAAECEBExUf/aAAgBAwEBPwEXxpDLl//EABcRAAMBAAAAAAAAAAAAAAAAAAABERD/2gAIAQIBAT8BpVv/xAAXEAADAQAAAAAAAAAAAAAAAAAAIDEB/9oACAEBAAY/AtKkT//EAB0QAAIBBAMAAAAAAAAAAAAAAAERABAgIUExUWH/2gAIAQEAAT8hWR8a7hEMp8oMDATmmdt//9oADAMBAAIAAwAAABD7FwD/xAAYEQACAwAAAAAAAAAAAAAAAAAAEBFRYf/aAAgBAwEBPxCKw2P/xAAYEQACAwAAAAAAAAAAAAAAAAAAERAxYf/aAAgBAgEBPxBXZtP/xAAeEAEAAQMFAQAAAAAAAAAAAAABEQAhMRAgQWFxof/aAAgBAQABPxCE0CLcvFNS61mXSWIRLOSsQD00MT9Js//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Startup&quot;
        title=&quot;Startup&quot;
        src=&quot;/static/f0fd33182df9d03e56eb683027cce1ad/acb04/paper-plane-launcher-startup.jpg&quot;
        srcset=&quot;/static/f0fd33182df9d03e56eb683027cce1ad/bc01b/paper-plane-launcher-startup.jpg 188w,
/static/f0fd33182df9d03e56eb683027cce1ad/bf173/paper-plane-launcher-startup.jpg 375w,
/static/f0fd33182df9d03e56eb683027cce1ad/acb04/paper-plane-launcher-startup.jpg 750w,
/static/f0fd33182df9d03e56eb683027cce1ad/ec605/paper-plane-launcher-startup.jpg 1125w,
/static/f0fd33182df9d03e56eb683027cce1ad/c58a3/paper-plane-launcher-startup.jpg 1500w,
/static/f0fd33182df9d03e56eb683027cce1ad/8b619/paper-plane-launcher-startup.jpg 5000w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When I was at &lt;a href=&quot;https://boost.vc&quot;&gt;Boost VC&lt;/a&gt;, each meeting room had a brainy quote on the wall. One of the rooms had the following quote: &quot;Startups are like paper planes, they look better than they fly!&quot; To be honest, I never even liked the look of paper planes, but they are certainly a good metaphor for startups. Even if you build one that looks like it can fly, it will most likely end up in failure. So one should always prepare for failure!&lt;/p&gt;
&lt;h1 id=&quot;always-have-a-contingency-plan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#always-have-a-contingency-plan&quot; aria-label=&quot;always have a contingency plan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Always Have a Contingency Plan&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 472px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0c162a0b38e183debff774fff7244efd/c6f8e/backup-plan.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 110.10638297872339%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAWABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAME/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAMEAv/aAAwDAQACEAMQAAABzTrB82lRTLTOKNI2r//EABsQAAICAwEAAAAAAAAAAAAAAAACAREDEhMx/9oACAEBAAEFAmhhGqTIrC1ceanBCj//xAAaEQACAgMAAAAAAAAAAAAAAAABAgAhAxAR/9oACAEDAQE/AU4VhNxcjgUdf//EABkRAQACAwAAAAAAAAAAAAAAAAEAAhAREv/aAAgBAgEBPwG69QY1N4//xAAcEAACAgIDAAAAAAAAAAAAAAABIQAQQWEiMXH/2gAIAQEABj8CR63GQfaQU5haNZczX//EABsQAQEBAQEAAwAAAAAAAAAAAAERACExYYHB/9oACAEBAAE/IVVKCvjIzyOdOCg25LSY75pqUHOH7hzCcyG9ERj7j5H3gAB4b//aAAwDAQACAAMAAAAQ/wD3Pv/EABkRAQADAQEAAAAAAAAAAAAAAAEAESGBof/aAAgBAwEBPxAkcvl+zVsUinZbP//EABkRAQADAQEAAAAAAAAAAAAAAAEAEaEQIf/aAAgBAgEBPxAKpdrGeBFhTn//xAAeEAEBAAIBBQEAAAAAAAAAAAABEQAhYTFBUXGBwf/aAAgBAQABPxB8JCwg8yN+Z0TAAAdbkMpgoGhBwiaQn9PHOT4KAKXXpl1ARAbPuMzqtIHJ3wyiyePY8ZraAD1n/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Backup Plan&quot;
        title=&quot;Backup Plan&quot;
        src=&quot;/static/0c162a0b38e183debff774fff7244efd/c6f8e/backup-plan.jpg&quot;
        srcset=&quot;/static/0c162a0b38e183debff774fff7244efd/bc01b/backup-plan.jpg 188w,
/static/0c162a0b38e183debff774fff7244efd/bf173/backup-plan.jpg 375w,
/static/0c162a0b38e183debff774fff7244efd/c6f8e/backup-plan.jpg 472w&quot;
        sizes=&quot;(max-width: 472px) 100vw, 472px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;During our amazing run with BitLendingClub we had achieved some fantastic results. We went from the underdog to being the largest P2P Bitcoin lending platform in just two years. Even so, we faced the harsh reality: our revenues weren&apos;t enough to cover our burn rate. We were making half of what was necessary to cover our operating costs. That&apos;s why we had raised nearly $1 million in Seed funding, but the money was going to run out (as it eventually did). We had to find a way to generate revenue or raise more capital! Our competitors, BTCJam, had raised $10 million in Series A funding, and my assumption was that we could do the same since we had beat them on the market. We had achieved a bigger success with less funding and less time, so investors should consider us to be a better startup. It was a foolproof idea, what could go wrong?!&lt;/p&gt;
&lt;p&gt;Our strategy was simple: we knew that P2P Bitcoin lending wouldn&apos;t get us to be profitable anytime soon, so we had to pivot and pitch the new idea. Thus came the new effort with Loanbase. As I&apos;ve outlined in the previous blog posts: we made plenty of mistakes! The idea behind Loanbase was great: we had already built a software lending platform which in the hands of bigger lenders would provide massive reductions in costs, improvement in closing time, customer satisfaction, and ultimately: increased profits!&lt;/p&gt;
&lt;p&gt;But then comes the unanswered question: &quot;what if we fail?&quot; More experienced startup founders know that there is a need to be prepared for as many &quot;what if&apos;s&quot; as possible. We didn&apos;t! We took the path of building the Loanbase platform and we worked on raising Series-A funding, but we didn&apos;t plan what we&apos;ll do if either of those fails. Eventually, both failed and we were left with no fallback option.&lt;/p&gt;
&lt;h1 id=&quot;rely-on-the-fundamentals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rely-on-the-fundamentals&quot; aria-label=&quot;rely on the fundamentals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rely On The Fundamentals&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 506px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3ccd4682cb5a9b9ae8a47fb16c9c51dc/29f4e/fundamentals.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.27659574468085%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADj0lEQVR42o3Oa0xbBRQH8AObS/i0Bx2DJRuuqKiJUaJzU1SmIYsmxg+SmG2JM5gQYCyihk1jskTd6GJb+6KlD7rSDkfpbVcudJRSWsqlXUuht7cPKRRYCwWBdkCNwSxLGo9p/OSS6U7yT/45yfnlADzh/P59HfjZFYW+cjYEX3zp4tTRY3bqaLneUvl82cAxNoywKwqeCFpgASxVAGw3v14we7x8D1V0AOin2YM+FgvHillIlJQ9Q5SUguVgSeH/YjtXz8C9QwCpSoBsyxvw8JsqmKmuhCn2c+qJg6W5UdahFFF25DBRegQGSw7/94dFVZ9C2+cXQfDWCwVYC5D99oOW7Bc1+q3m6h/CXdcVtLx9ekpwhaTaL+2lrl0CL/e7x4MN587Dhfp6YH3yJQAiMG8/Bdtf1YxuNx3HTMNrmYien4z0S5EhxOtuHa/Yc5MHU3rB40Fx62cgv1wPxJXzu3rP1uxBAMi0vtufaTqJG40n4qFfeDHGIET6Fj/l1nIPuLVc8Pfw/w3GhjQQs2ogYOkplAoEuwFehfLTbariU62Z/dVNHr/mJ3dEx0H6xo/xQK8gShtEGOgTJSZ0gn0TOgFM3hI+Ct6AWasGkq4+eBg0Q8vlq1D05tc2ONGKUNW45TMq/VGLCgO3ZYshQhKLmGXImKT3xjW8vePdPPDrxf+Am/ezsLm1A2sLs4W1AJDwDFTFXaaPdsLWk6fq2mwvv38BXznduOrTS7wMIcZpvWAxZBDNhI0SDBo7FtwG1X5O7T7wdHMKVlJpAIIwwerKxi5EhCTthuiA0hkh5Rg0SZNRs3QyYpIgYxAuR0j5aLi/M4/EGYMwmgdpQjKXv1uKxSDsu7vbPe4BmJubh99W05DN3C/94wGenbFqZxhCmAfXQ2ZFgtYLMNAn3vp1qHs2mN/flqVDxo41pu9npE3StZVkqvnPB/js/PwyUGMUgMtFwcb65scb65sr6XQW6VESHVp+jiLUSBk1aFNxco6bEvSYdWjvas+5ejuR0neio+tajjKo/lqIJ3B5aW0nsbjc/N45M4DH460LhSIYYsLIMCEMTAdw0utFn9eLd90edDkdOO50IuV04Jjdhk7bMDqGrWi/Y0G71YoO2wiODA3jnQEL9mh7GkAkEr+jVquNcrncrFQqyS6VilTl80hXKhSkQq4gO2UyUiaVkjKpjOyQdJBikYjk83hmHpc7eL2d8+HfjVAQiHq/umoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Fundamentals&quot;
        title=&quot;Fundamentals&quot;
        src=&quot;/static/3ccd4682cb5a9b9ae8a47fb16c9c51dc/29f4e/fundamentals.png&quot;
        srcset=&quot;/static/3ccd4682cb5a9b9ae8a47fb16c9c51dc/4dcb9/fundamentals.png 188w,
/static/3ccd4682cb5a9b9ae8a47fb16c9c51dc/5ff7e/fundamentals.png 375w,
/static/3ccd4682cb5a9b9ae8a47fb16c9c51dc/29f4e/fundamentals.png 506w&quot;
        sizes=&quot;(max-width: 506px) 100vw, 506px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Obviously, you can spend a lot of time trying to figure out how you can fail at every step of your startup and how you can mitigate the risk, but that can be extremely time consuming and you can miss the big picture. There are some basic things that you can focus on, which can cover most of your bases. The fundamentals are your strongest foundation!&lt;/p&gt;
&lt;h2 id=&quot;run-controlled-experiments&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#run-controlled-experiments&quot; aria-label=&quot;run controlled experiments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Run Controlled Experiments&lt;/h2&gt;
&lt;p&gt;Your business is an experiment in itself. You have a hypothesis and you&apos;re trying to validate it on the market. You should plan ahead to make sure that you give yourself the opportunity to run the maximum number of experiments until you find out what works. Each experiment should be controlled, measured, and its failure shouldn&apos;t lead to the failure of the company. So the more such experiments you can run, the more you can explore the space of possible solutions for the problem you&apos;re trying to solve. Without this, you&apos;re relying on luck. You might as well play the lottery at that stage!&lt;/p&gt;
&lt;h2 id=&quot;generate-revenue&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#generate-revenue&quot; aria-label=&quot;generate revenue permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Generate Revenue&lt;/h2&gt;
&lt;p&gt;As &lt;a href=&quot;/blog/sst1-revenue-is-your-biggest-lifeline/&quot;&gt;I said in the previous post&lt;/a&gt;, revenue is your biggest lifeline and your biggest backup option! If you have a solid stream of revenue, you can sustain your business for a longer period during your experimentation phase. Your early experiments should be focused on finding the fastest path to revenue.&lt;/p&gt;
&lt;h2 id=&quot;raise-capital&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#raise-capital&quot; aria-label=&quot;raise capital permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Raise Capital&lt;/h2&gt;
&lt;p&gt;If you fail to generate revenue, your next backup option is to raise capital. At the various stages of your startup investors have a varying amount of tolerance for businesses without revenue. In the pre-seed stage, you are unlikely to have any revenue so investors are going to rely on, well… the fundamentals. They&apos;ll look at your team, your history, your idea, the opportunity, and what you&apos;ve executed so far. Unless you already have a successful exit, when you&apos;re at the seed stage it will be great to show some revenue. And if you don&apos;t have revenue, you better make sure you show some amazing traction from the pre-seed stage (a hockey stick chart going up and to the right). When you reach the Series-A stage, it&apos;s generally expected that you&apos;ll have between $1 million and $2 million of recurring revenue.&lt;/p&gt;
&lt;h2 id=&quot;have-an-exit-strategy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#have-an-exit-strategy&quot; aria-label=&quot;have an exit strategy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Have an Exit Strategy&lt;/h2&gt;
&lt;p&gt;If you&apos;ve reached this stage of the article, then you&apos;re looking at the end of your startup. You&apos;ve either failed to run enough experiments, you&apos;ve failed to generate enough revenue, and you&apos;ve failed to secure enough capital. What do you do next? Well, throughout the entire time you&apos;re running your startup, you should always keep an eye out for who can buy your company.&lt;/p&gt;
&lt;p&gt;You would have developed relationships with other founders in your space, hopefully, ones that are more successful than you are. These founders are running startups and one of their biggest problems is the growth of their teams. Recruiting is always their top priority and if they can take a shortcut by acquiring a smaller startup, they will! Remember, even the exit strategy will take several months to materialize. So always have a few startups who have made you an acquisition offer already which you politely turned down at the time. As long as they are growing, the door will remain open.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Startup Survival Tip #1: Revenue is Your Biggest Lifeline!]]></title><description><![CDATA[In the first installment of this series, I mentioned that the biggest reason for startup failure is lack of revenue! It should be a no…]]></description><link>https://st6.io/blog/sst1-revenue-is-your-biggest-lifeline/</link><guid isPermaLink="false">https://st6.io/blog/sst1-revenue-is-your-biggest-lifeline/</guid><pubDate>Mon, 23 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8ff8d5115fe1a03133255aa4a744d3e9/8b619/ideas-to-cash.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.48936170212765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDAf/EABYBAQEBAAAAAAAAAAAAAAAAAAECBP/aAAwDAQACEAMQAAABvNVrLUwT/8QAGBAAAwEBAAAAAAAAAAAAAAAAARARABL/2gAIAQEAAQUCjIu4C//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAIDAAAAAAAAAAAAAAAAABBBAAEh/9oACAEBAAY/AqwuMf/EAB0QAQABAwUAAAAAAAAAAAAAAAEAEDFBESGBkbH/2gAIAQEAAT8hVp43YI4Sg3PBgGe0Np//2gAMAwEAAgADAAAAEPgP/8QAGBEBAQADAAAAAAAAAAAAAAAAAQAhMUH/2gAIAQMBAT8QU5O8X//EABYRAQEBAAAAAAAAAAAAAAAAAAEAYf/aAAgBAgEBPxAI2//EABsQAQEAAwADAAAAAAAAAAAAAAERACExEFFx/9oACAEBAAE/EEaxCtaL3BWIPbfHNW7sMSEGN7wRKv1uf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Revenue&quot;
        title=&quot;Revenue&quot;
        src=&quot;/static/8ff8d5115fe1a03133255aa4a744d3e9/acb04/ideas-to-cash.jpg&quot;
        srcset=&quot;/static/8ff8d5115fe1a03133255aa4a744d3e9/bc01b/ideas-to-cash.jpg 188w,
/static/8ff8d5115fe1a03133255aa4a744d3e9/bf173/ideas-to-cash.jpg 375w,
/static/8ff8d5115fe1a03133255aa4a744d3e9/acb04/ideas-to-cash.jpg 750w,
/static/8ff8d5115fe1a03133255aa4a744d3e9/ec605/ideas-to-cash.jpg 1125w,
/static/8ff8d5115fe1a03133255aa4a744d3e9/c58a3/ideas-to-cash.jpg 1500w,
/static/8ff8d5115fe1a03133255aa4a744d3e9/8b619/ideas-to-cash.jpg 5000w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;/blog/startup-survival-tips/&quot;&gt;first installment of this series&lt;/a&gt;, I mentioned that the biggest reason for startup failure is lack of revenue! It should be a no-brainer, but many entrepreneurs (including myself) have failed to grasp this little idea. It&apos;s so obvious: &quot;DUH, of course, you have to try and generate revenue.&quot; One can lose track of this very simple idea while running a startup.&lt;/p&gt;
&lt;h2 id=&quot;value--revenue--profit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#value--revenue--profit&quot; aria-label=&quot;value  revenue  profit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Value → Revenue → Profit&lt;/h2&gt;
&lt;p&gt;Never, absolutely never, ever, EVER, forget that your product has to bring value to your customers. And there is only one way you will ever know that your product brings value to your customers: when they&apos;re willing to pay for it! No amount of clicks, page views, shares, likes, retweets, or karma points, are ever going to tell you if your customer is actually willing to pay for your product!&lt;/p&gt;
&lt;p&gt;If a customer has $100 in their hand and decides to buy your product, it means that the they value your product more than the $100 in their hand!&lt;/p&gt;
&lt;p&gt;If you&apos;re generating value, somebody will pay for it and that will be your revenue. And if you&apos;re generating more value than it cost you to run your business (profit), then you&apos;re ready to &lt;del&gt;retire&lt;/del&gt; solve big problems!&lt;/p&gt;
&lt;h2 id=&quot;but-my-product-isnt-ready-yet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-my-product-isnt-ready-yet&quot; aria-label=&quot;but my product isnt ready yet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But My Product Isn&apos;t Ready Yet&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7867db1fb80ae3cc6255614464541ff5/3bd10/loan.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.46808510638298%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAByYBiP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABgQAQADAQAAAAAAAAAAAAAAABEAATEg/9oACAEBAAE/IRyDks4//9oADAMBAAIAAwAAABBTz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAQACAgMAAAAAAAAAAAAAAAEAESExEEFx/9oACAEBAAE/EAEBSbzKaKreYk4KPYQ74//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Loanbase Loan&quot;
        title=&quot;Loanbase Loan&quot;
        src=&quot;/static/7867db1fb80ae3cc6255614464541ff5/acb04/loan.jpg&quot;
        srcset=&quot;/static/7867db1fb80ae3cc6255614464541ff5/bc01b/loan.jpg 188w,
/static/7867db1fb80ae3cc6255614464541ff5/bf173/loan.jpg 375w,
/static/7867db1fb80ae3cc6255614464541ff5/acb04/loan.jpg 750w,
/static/7867db1fb80ae3cc6255614464541ff5/ec605/loan.jpg 1125w,
/static/7867db1fb80ae3cc6255614464541ff5/c58a3/loan.jpg 1500w,
/static/7867db1fb80ae3cc6255614464541ff5/3bd10/loan.jpg 3948w&quot;
        sizes=&quot;(max-width: 750px) 100vw, 750px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The biggest mistake I ever made with Loanbase was to think that we need to build out a complete product to generate value. A little bit of a background story: Loanbase was a pivot from BitLendingClub. It took us two years to build BitLendingClub. Over those two years we had created scalable lending infrastructure which one would only see in (very) large banks. That infrastructure allowed two people to process over 8000 loans. Those two people were also responsible for answering the support inquiries.&lt;/p&gt;
&lt;p&gt;Nearly every step of the loan process was automated. We saw the massive value that our infrastructure offered and we wanted to provide the same value to our Loanbase clients. We wanted to offer our clients the complete solution we had built. The reality was that our clients would have paid for a fraction of the product. They were so far behind from a technological standpoint, that any improvement in their process would have been welcome. Instead of focusing on breaking up the features and selling them separately, we tried to rebuild our entire system from scratch and offer it as a complete product. &lt;strong&gt;Fatal mistake!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re not the first ones to make this mistake and we&apos;re not going to be the last ones. We were recently approached by a pre-seed startup, which wanted us to provide them with an estimate for an advertising platform. They had already invested about €5,000 EUR for the design and they were trying to estimate what their MVP would cost. They gave me the design and I did a rough estimate, which gave them a range of 5 to 11 months of engineering. It was going to cost them almost a year of engineering and upwards of $150K. And that&apos;s just to see if somebody would find their product useful. They wouldn&apos;t even know if advertisers would pay for it. Our team made a suggestion that they skip the entire engineering effort and run the first advertising campaign manually. Given their model of advertising, this was perfectly feasible approach. If they could run a single campaign, create a report for a single advertiser, then they could go with that report to the advertiser and see if the advertiser would be willing to pay for another campaign. All of that would cost them less than the €5,000 EUR it cost them to build out the designs!&lt;/p&gt;
&lt;h2 id=&quot;dont-be-a-unicorn-be-a-cockroach&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dont-be-a-unicorn-be-a-cockroach&quot; aria-label=&quot;dont be a unicorn be a cockroach permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don&apos;t Be a Unicorn, Be a Cockroach&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 640px; margin: 0;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87522d91c69a41a20190c3a570f7291a/c08c5/cockroach.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.59574468085106%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB6rWyxUZK/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIDExARMv/aAAgBAQABBQKawGxRmUDa8//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/AVn/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAgMBAAAAAAAAAAAAAAAAAQIhEBESUf/aAAgBAQAGPwKPHtlvMXoR/8QAGxAAAgIDAQAAAAAAAAAAAAAAAREAIRAxQaH/2gAIAQEAAT8hIncFAXIVgknhzWhvangn/9oADAMBAAIAAwAAABAjz//EABYRAAMAAAAAAAAAAAAAAAAAAAEQMf/aAAgBAwEBPxCAX//EABYRAAMAAAAAAAAAAAAAAAAAABAhMf/aAAgBAgEBPxCMf//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESFRMUGBkbH/2gAIAQEAAT8QQynyiberiQjKOR6giWNkQYMhvMC3zM79fk//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Be a Cockroach&quot;
        title=&quot;Be a Cockroach&quot;
        src=&quot;/static/87522d91c69a41a20190c3a570f7291a/c08c5/cockroach.jpg&quot;
        srcset=&quot;/static/87522d91c69a41a20190c3a570f7291a/bc01b/cockroach.jpg 188w,
/static/87522d91c69a41a20190c3a570f7291a/bf173/cockroach.jpg 375w,
/static/87522d91c69a41a20190c3a570f7291a/c08c5/cockroach.jpg 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When I joined Adam Draper&apos;s Boost.vc accelerator program in 2015, the first thing he told us was to be cockroaches, not unicorns. I still kick myself in the rear end for not following this advice feverishly enough. Being an entrepreneur means that you&apos;re always faced with the risk of your startup joining the millions of corpses of the startups who braved the world and failed! Cockroaches are resilient, they survive in the most adverse of conditions, and so should your startup!&lt;/p&gt;
&lt;p&gt;When you&apos;re running your startup it might feel like you&apos;re resilient and you&apos;re scrambling like a cockroach. Given how frequently startups fail, the statistics show that you&apos;re probably wrong! Indeed, you be paranoid, be afraid of failure, be prepared to weather the onslaught of challenges. Push yourself to be prepared for the absolute worst of days you can imagine. And when you&apos;re ready for that, then prepare for things to get 10 times worse! Which brings me back around to the topic of this discussion: REVENUE! Make sure that you have it, because when things get tough, you&apos;ll have something to fall back on and grind it out.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Startup Survival Tips]]></title><description><![CDATA[After two and a half failed startups, I’m starting to come up with a list of things which contributed to the downfall of my previous…]]></description><link>https://st6.io/blog/startup-survival-tips/</link><guid isPermaLink="false">https://st6.io/blog/startup-survival-tips/</guid><pubDate>Fri, 20 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After two and a half failed startups, I’m starting to come up with a list of things which contributed to the downfall of my previous startups. And boy, that list is long, really long! There are some critical things, which I have identified as the major causes of “startup cardiac arrest.” I’ve mulled them over for a long time, but never written them down. Writing down the reasons meant that there would be a permanent record in history of my own failure. It would mean that I would also have to sit down and think about that failure and what it actually meant. The startup shipwreck itself was enough of a gut wrenching but actually sitting down and analyzing it is almost as unpleasant. For the past year and a half I&apos;ve been on the board of our current startup, ST6 (&lt;a href=&quot;https://st6.io&quot;&gt;https://st6.io&lt;/a&gt;), and the experience has given me an opportunity to gather my thoughts.&lt;/p&gt;
&lt;p&gt;I’m going to take the top reasons and make a series of posts which act as a postmortem of sorts. Hopefully, they can also serve as tips for anybody who’s venturing into the wild world of startups! I’ll call them “Startup Survival Tips.”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reason #1: Not Generating (Enough) Revenue&lt;/li&gt;
&lt;li&gt;Reason #2: Failing to Have a Contingency Plan&lt;/li&gt;
&lt;li&gt;Reason #3: Failing to Delegate&lt;/li&gt;
&lt;li&gt;Reason #4: Company Culture Is a Product on Its Own&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the upcoming posts I’ll discuss how each one of those things contributed to the failure of the startups. I&apos;ll also highlight how we’re currently trying to avoid those problems.&lt;/p&gt;
&lt;p&gt;In the meantime, I’ll set the stage with a brief history on the startups I’ve tried to build. I’m going to skip the attempts, as they were too miserable to even consider now.&lt;/p&gt;
&lt;h2 id=&quot;bitlendingclub&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bitlendingclub&quot; aria-label=&quot;bitlendingclub permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;BitLendingClub&lt;/h2&gt;
&lt;p&gt;Birth: Mid 2013
Death: December 31, 2016
Cause of Death: Reason #1 through #4&lt;/p&gt;
&lt;p&gt;BitLendingClub was a P2P Bitcoin lending platform. It facilitated over 8,000 P2P loans which were worth over $8 million USD. We built the initial beta version in mid 2014 and by mid 2015 we had captured the majority market share. We were processing more than 50% of the P2P loans in the entire Bitcoin ecosystem.&lt;/p&gt;
&lt;h2 id=&quot;loanbase&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#loanbase&quot; aria-label=&quot;loanbase permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Loanbase&lt;/h2&gt;
&lt;p&gt;Birth: Mid 2015
Death: December 31, 2016
Cause of Death: Reason #1 through #4&lt;/p&gt;
&lt;p&gt;Loanbase was a pivot from BitLendingClub, which aimed to create a software platform for small business lenders. We discovered that our engineering approach has allowed us to achieve amazing results! Just two of our team members managed to process over tens thousands loan applications in the span of a year. That would be unheard of in a “normal” lending institution. This meant that our each of our team members spent approximately 2.5 hours to process a loan application. That’s quite an improvement over the industry standard 8 to 24 hours! We estimated that we can get it to as low as 15 minutes per loan application. That would translate in massive efficiency gains for the lenders and a reduction in loan acquisition costs. The savings of could be passed onto the borrowers.&lt;/p&gt;
&lt;h2 id=&quot;dramler&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dramler&quot; aria-label=&quot;dramler permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dramler&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dramler.com&quot;&gt;https://dramler.com&lt;/a&gt;
Birth: January 1, 2017
Death: May 3, 2017
Cause of Death: Reason #1&lt;/p&gt;
&lt;p&gt;The closing of the BitLendingClub/Loanbase chapter led to a new opportunity. I got together with my current co-founders, Ivaylo “Ivo” Bratoev and Stefan Dobrev, and we went on a “hunt” for a new startup idea. We took inspiration from Vivino and made Dramler. Dramler is a “social platform to discover, define, and share your whiskey experience.” We built a prototype in less than 2 months and we launched it for both Android and iOS. The app is still up and running, but it’s mostly used for demo purposes now.&lt;/p&gt;
&lt;p&gt;Stay tuned for the next installment of Startup Survival Tips!&lt;/p&gt;</content:encoded></item></channel></rss>