<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Capact Blog</title>
        <link>https://capact.io/blog</link>
        <description>Capact Blog</description>
        <lastBuildDate>Wed, 19 Jan 2022 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright © 2022 Capact authors.</copyright>
        <item>
            <title><![CDATA[Take Capact for a spin!]]></title>
            <link>https://capact.io/blog/take-capact-for-a-spin</link>
            <guid>take-capact-for-a-spin</guid>
            <pubDate>Wed, 19 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Our first blog post focused strongly on why_**—why we created Capact, what's the general concept behind it. Now it's time for showing how_**—how you can use it.]]></description>
            <content:encoded><![CDATA[<p>Our first blog post focused strongly on <strong><em>why</em></strong>—why we created Capact, what's the general concept behind it. Now it's time for showing <strong><em>how</em></strong>—how you can use it.</p><p>Although, there are many ways to <a href="/docs/getting-started">get started with Capact</a>, today we will focus on your perspective as a Capact User.</p><p>The recommended way to try out Capact quickly is to set up a local environment.</p><div class="terminal_bpxu" id="termynal" data-termynal="true"><span data-ty="input" class="lineDimmed_UoUA"># Create local k3d cluster</span><span data-ty="input">capact env create k3d</span><span data-ty="input" class="lineDimmed_UoUA"># Install Capact</span><span data-ty="input">capact install</span><span data-ty="input" class="lineDimmed_UoUA"># Log in interactively to the Capact Gateway</span><span data-ty="input">capact login https://gateway.capact.local</span><span data-ty="input" class="lineDimmed_UoUA"># You're all set! Enjoy using Capact!</span></div><br><p>Detailed instructions are already nicely described in our <a href="/docs/installation/local">local installation</a> tutorial. Once you have Capact up and running, we can start!</p><h3 class="anchor anchorWithStickyNavbar_mojV" id="what-you-will-learn">What you will learn<a class="hash-link" href="#what-you-will-learn" title="Direct link to heading">​</a></h3><div class="admonition admonition-info alert alert--info"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</h5></div><div class="admonition-content"><p>For this blog post, we will use Capact CLI. However, the described scenario can also be executed with our <a href="/docs/dashboard-ui/overview">brand-new UI</a>! 😎</p></div></div><p>In 5 minutes, by running examples from this blog post, you will learn about the following Capact concepts:</p><ul><li><a href="/docs/terminology#interface">Interface</a>—provides an option to abstract Implementations.</li><li><a href="/docs/terminology#implementation">Implementation</a>—defines the actual workflow that is executed.</li><li><a href="/docs/terminology#attribute">Attribute</a>—provides an option to <em>tag</em> manifests. Today we will use it to select a specific Implementation.</li><li><a href="/docs/terminology#type">Type</a> and <a href="/docs/terminology#typeinstance">TypeInstance</a>—provide a combined feature, where Type holds the schema and TypeInstance the <em>instance</em> for the Type.</li><li><a href="/docs/terminology#action">Action</a>—triggers Engine to render and run a given Interface.</li><li><a href="/docs/feature/policies/overview">Policy</a>—impacts the render process to select desired Implementations.</li></ul><p>Creating new workflows is not the concern of this article, and it will be covered in future blog posts.</p><p>Here we only briefly describe each part, but I encourage you to take a deeper look at our <a href="/docs/terminology">Terminology</a> section later.</p><h3 class="anchor anchorWithStickyNavbar_mojV" id="prerequisites">Prerequisites<a class="hash-link" href="#prerequisites" title="Direct link to heading">​</a></h3><ul><li><a href="/docs/cli/getting-started#install">Capact CLI</a> at least v0.6.0</li><li><a href="/docs/installation/">Capact cluster</a> at least v0.6.0</li><li><strong>(Optional)</strong> <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" target="_blank" rel="noopener noreferrer"><code>kubectl</code></a></li><li><a href="https://stedolan.github.io/jq/download/" target="_blank" rel="noopener noreferrer"><code>jq</code></a></li></ul><h3 class="anchor anchorWithStickyNavbar_mojV" id="scenario">Scenario<a class="hash-link" href="#scenario" title="Direct link to heading">​</a></h3><p>The key concepts were described in the <a href="https://capact.io/blog/introducing-capact#capact-concept-in-one-minute" target="_blank" rel="noopener noreferrer">Introducing Capact</a> blog post. There, we used Mattermost as an example. It was a real life scenario but at the same time more resource and time-consuming.</p><p>For the purpose of this blog post, we created an extremely simple Hello World example.</p><img src="/blog/2022-01-19/greet-manifests.svg" alt="Simplified architecture" class="themedImage_W2Cr themedImage--light_TfLj"><img src="/blog/2022-01-19/greet-manifests-dark.svg" alt="Simplified architecture" class="themedImage_W2Cr themedImage--dark_oUvU"><p>There are two Implementations for the <code>cap.interface.capactio.examples.say</code> Interface. Depending on the Policy, a different Implementation is selected. By default, Engine selects the Implementation which is first on the list (alphabetical order) and doesn't have any requirements regarding executions, such as requiring AWS credentials.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="camera-lights-action">Camera, Lights, Action!<a class="hash-link" href="#camera-lights-action" title="Direct link to heading">​</a></h2><p>Action is the entry point for executing any Interface. It allows you to define which Interface should be executed and with which parameters. This is later consumed by Capact Engine and the appropriate workflow is rendered. Later, you can review it and approve it for the execution.</p><img src="/blog/2022-01-19/capact-simplified-arch.svg" alt="Simplified architecture" class="themedImage_W2Cr themedImage--light_TfLj"><img src="/blog/2022-01-19/capact-simplified-arch-dark.svg" alt="Simplified architecture" class="themedImage_W2Cr themedImage--dark_oUvU"><h3 class="anchor anchorWithStickyNavbar_mojV" id="steps">Steps<a class="hash-link" href="#steps" title="Direct link to heading">​</a></h3><ol><li><p><a href="/docs/cli/getting-started#first-use">Make sure that you are logged into local cluster</a>.</p></li><li><p>List available Interfaces:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact hub interfaces get</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div><p>We are interested in this part:</p><div class="codeBlockContainer_I0IT language-text theme-code-block"><div class="codeBlockContent_wNvx text"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">                           PATH          LATEST REVISION                  IMPLEMENTATIONS</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">---------------------------------------+-----------------+-----------------------------------------------</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># ... trimmed ...</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">---------------------------------------+-----------------+-----------------------------------------------</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">cap.interface.capactio.examples.greet        0.1.0             cap.implementation.capactio.examples.greet</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">---------------------------------------+-----------------+-----------------------------------------------</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">cap.interface.capactio.examples.say          0.1.0             cap.implementation.capactio.examples.hello</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">                                                               cap.implementation.capactio.examples.ricky</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p>Create a new Action:</p></li></ol><div class="tab-container-nested"><div class="tabs-container"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LplD tabs__item--active">Default Execution</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LplD">Policy-Changed Execution</li></ul><div class="margin-vert--md"><div role="tabpanel"><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</h5></div><div class="admonition-content"><p>A Policy is not needed as we use the default behavior here.</p></div></div><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act create --name hello cap.interface.capactio.examples.greet</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></div><div role="tabpanel" hidden=""><p>First, save the Policy to the <code>/tmp/policy.yaml</code> file:</p><div class="codeBlockContainer_I0IT language-yaml theme-code-block"><div style="color:#bfc7d5;background-color:#292d3e" class="codeBlockTitle_BvAR">/tmp/policy.yaml</div><div class="codeBlockContent_wNvx yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">cat &lt;&lt;EOF </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> /tmp/policy.yaml</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">rules</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">interface</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cap.interface.capactio.examples.say</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">oneOf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">implementationConstraints</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">attributes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cap.attribute.capactio.examples.be</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">positive</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">revision</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 0.1.0</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">EOF</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div><p>Next, create the Action with the Policy:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act create --name hello cap.interface.capactio.examples.greet --action-policy-from-file /tmp/policy.yaml</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></div></div></div></div><ol start="2"><li><p>Wait for the Action to have the <code>READY_TO_RUN</code> status:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act get hello</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p>When the status is <code>READY_TO_RUN</code>, run the Action:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act run hello</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p>Watch the progress:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act </span><span class="token function" style="color:rgb(130, 170, 255)">watch</span><span class="token plain"> hello</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p><strong>(Optional)</strong> Once the Action is finished, copy the name of the Pod for the <code>print</code> workflow step (column <code>PODNAME</code>). To read its logs, run:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">kubectl logs </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">PODNAME</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> main</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div><p>Example output:</p></li></ol><div class="tab-container-nested"><div class="tabs-container"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LplD tabs__item--active">Default Execution</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LplD">Policy-Changed Execution</li></ul><div class="margin-vert--md"><div role="tabpanel"><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ____________________________</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain"> message: Hello from Capact </span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ----------------------------</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">                    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">##        .</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">              </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">## ## ##       ==</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">           </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">## ## ## ##      ===</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">       /</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token plain">___/ </span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  ~~~ </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">~~ ~~~~ ~~~ ~~~~ ~~ ~ /  </span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">- ~~~</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">______ o          __/</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">        __/</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">____</span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">______/</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></div><div role="tabpanel" hidden=""><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain"> __________________________________</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain"> message: Never gonna give you up </span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ----------------------------------</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">                    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">##        .</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">              </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">## ## ##       ==</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">           </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">## ## ## ##      ===</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">       /</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token string" style="color:rgb(195, 232, 141)">""</span><span class="token plain">___/ </span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  ~~~ </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">~~ ~~~~ ~~~ ~~~~ ~~ ~ /  </span><span class="token operator" style="color:rgb(137, 221, 255)">==</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">- ~~~</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">______ o          __/</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">        __/</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">____</span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain">______/</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></div></div></div></div><ol start="6"><li><p>Get the Action output (TypeInstance). Copy the <code>id</code> field value:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act get hello -ojson </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> jq </span><span class="token string" style="color:rgb(195, 232, 141)">'.Actions[0].output.typeInstances'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div><p>Example output:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">"id"</span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"08fcaa07-7846-47af-b6a7-7c3818c69656"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">"typeRef"</span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token string" style="color:rgb(195, 232, 141)">"path"</span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"cap.type.capactio.examples.message"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token string" style="color:rgb(195, 232, 141)">"revision"</span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"0.1.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p>Get the TypeInstance <code>value.message</code> field value:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact ti get </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> -ojson </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> jq -r </span><span class="token string" style="color:rgb(195, 232, 141)">'.[0].latestResourceVersion.spec.value.message'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li><li><p>Delete the Action:</p><div class="codeBlockContainer_I0IT language-bash theme-code-block"><div class="codeBlockContent_wNvx bash"><pre tabindex="0" class="prism-code language-bash codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token plain">capact act delete hello</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></li></ol><p>What if you wanted to output a different message, that reminds you about a masterpiece song you can listen to endlessly? With Capact that's really easy ✨</p><p>To choose a different Implementation for the <code>say</code> Interface, we need to prepare a dedicated Policy. The power of it is that you don't have to change the main workflow. You treat the step as a building block and just swap it for another existing one.</p><p><img alt="Here we go again GIF" src="/assets/images/reuse-you-must-e1062d2a4f831ee43a4d1f7555ae44de.gif" width="420" height="237"></p><p>To test it, execute <a href="#steps">steps</a> once again, but now select the <strong>Policy-Changed Execution</strong> tab.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-is-so-special-about-it">What is so special about it?<a class="hash-link" href="#what-is-so-special-about-it" title="Direct link to heading">​</a></h2><p>Our example was simplified to a minimum, but you could see that you can:</p><ul><li>chain different steps together,</li><li>and more importantly, write once and swap implementation details with ease.</li></ul><p>Capact is also great if you want to chain different tools together and keep the same entry point (UX) but that requires more complex examples. For now, we recommend you to take a look at our other examples described in the <a href="#how-can-i-get-involved-and-learn-more"><strong>How can I get involved and learn more?</strong></a> section.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="behind-the-cli">Behind the CLI<a class="hash-link" href="#behind-the-cli" title="Direct link to heading">​</a></h2><p>As you saw, you can use CLI to browse Hub manifests, create a specific Action for a given Interface and retrieve the output. CLI communicates with our Gateway via GraphQL calls, same as the UI (Capact Dashboard). You can read more in the <a href="/docs/architecture/e2e-architecture">E2E Architecture</a> document.</p><p>However, a more important question is, how did it happen?</p><div class="line-numbers"><div class="codeBlockContainer_I0IT language-yaml theme-code-block"><div style="color:#bfc7d5;background-color:#292d3e" class="codeBlockTitle_BvAR">Implementation Manifest</div><div class="codeBlockContent_wNvx yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_jd64 thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#bfc7d5"><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># ... trimmed ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">imports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">interfaceGroupPath</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cap.interface.capactio.examples</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">alias</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> examples</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">methods</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> say</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># ... trimmed ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">message</span><br></span><span class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">capact-action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> examples.say </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># dynamic step, rendered by Engine based on the Policy.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> print</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> print</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">arguments</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">artifacts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> message</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token key atrule">from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"{{steps.get-message.outputs.artifacts.message}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># ... trimmed ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> print</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">artifacts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> message</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /tmp/message.yaml</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">container</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> docker/whalesay</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"> sh</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">c </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"cowsay &lt; /tmp/message.yaml"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_wuS7 clean-btn">Copy</button></div></div></div><p>The snippet above shows the most important parts of the Implementation manifest. In lines <strong>4-7</strong>, we declare the import, which is later used in steps. In line <strong>12</strong>, we use <strong>capact-action</strong> to make a dynamic step with a given Interface.</p><div class="admonition admonition-tip alert alert--success"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</h5></div><div class="admonition-content"><p>Instead of providing the full Interface path, we use <strong>alias</strong> assigned to the imported Interface.</p></div></div><p>As a result, our Engine and, in particular, Argo Renderer has an option to put there an Implementation that fulfills the specified Interface. Thanks to that, this step is swappable based on the defined Policy.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="how-can-i-get-involved-and-learn-more">How can I get involved and learn more?<a class="hash-link" href="#how-can-i-get-involved-and-learn-more" title="Direct link to heading">​</a></h2><p>The <a href="/docs/getting-started">Getting Started</a> goes into more detail about how to start with Capact and use its more-advanced features. There are also <a href="/docs/example/rocketchat-installation">Rocket.Chat</a> and <a href="/docs/example/mattermost-installation">Mattermost</a> tutorials that we keep up-to-date for you to walk you through using Capact in real cases.</p><p>We appreciate any input you have about your experience with Capact!</p><p>There are plenty of options to contact us:</p><ul><li><a href="https://github.com/capactio/capact/issues" target="_blank" rel="noopener noreferrer">GitHub issues</a></li><li><a href="/community/slack">Slack</a></li><li>Email us at <a href="mailto:contact@capact.io" target="_blank" rel="noopener noreferrer">contact@capact.io</a></li></ul><p>Thank you for taking the time to learn about Capact 🙌</p>]]></content:encoded>
            <category>capact</category>
            <category>hello-world</category>
            <category>open-source</category>
            <category>go</category>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>dry</category>
            <category>getting-started</category>
            <category>cli</category>
        </item>
        <item>
            <title><![CDATA[Meet Capact maintainers and learn how to become one!]]></title>
            <link>https://capact.io/blog/maintainers-interview</link>
            <guid>maintainers-interview</guid>
            <pubDate>Mon, 13 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Did you know that it's already been 16 months since Capact was born?]]></description>
            <content:encoded><![CDATA[<p>Did you know that it's already been 16 months since Capact was born?</p><p>In a previous blog post, we discussed some of the problems Capact aims to solve. This time, Capact maintainers took some time to answer questions you might have if you're considering contributing to the project.</p><p>What's it like to build a cloud-native platform from scratch? What is it like to work in Capact? What are the biggest challenges? How to start with Go? Read on to get the answers!</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="tell-us-why-you-are-here-how-did-you-begin-your-adventure-in-it">Tell us why you are here. How did you begin your adventure in IT?<a class="hash-link" href="#tell-us-why-you-are-here-how-did-you-begin-your-adventure-in-it" title="Direct link to heading">​</a></h2><p><strong>Mateusz:</strong> In the past, I worked on similar projects that aimed to unify our developer tooling. In my opinion, it is something that awaits us in the future. It’s definitely worth being a part of it.</p><p>My journey with IT actually started thanks to my brother. He was really into technology, so besides playing games with me, he started to teach me how it all worked and gave me programming challenges. There was a big age difference between us (10 years), so the first program that I wrote was on Commodore 64 when I was about 8 years old. Since then, I have been involved in technology. From the beginning, I felt love for backends, but tolerated frontend 😁 During my studies, I got interested in the cloud. As a result, I started an internship, where from Java I switched to Go. Now it’s been 5.5 years that I’ve been connected with the cloud-native world and I certainly don’t regret that.</p><p><strong>Paweł:</strong> My adventure with computer science also started pretty early. When I got my first PC, I was 8 years old. Initially, I played games on it, but after a while, I was interested in doing more than that. When I was in primary school, I started to write some basic applications in Delphi and created my first HTML website. Obviously, the websites followed the trends at that time—they were loaded with GIFs and tons of text scrolling in different directions (remember the “MARQUEE” HTML tag?).</p><p>When I was 13, I began working as a freelancer in the web development area. Before getting a bachelor’s degree in computer science, I joined my first IT company as a UI developer. More than 4 years ago, I transformed from a front-end guy to a full-stack cloud developer, with JavaScript, Go, and Kubernetes. I was involved in building a project from the CNCF landscape, and over time I developed less and less front-end and more back-end stuff. In the meantime, I was a Scrum Master and was involved in promoting that previous project at conferences, meetups, and different events. Same as Mateusz, I joined Capact over a year ago to build an ambitious, cloud-native project from scratch.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="the-main-technologies-used-in-capact-are-go-and-kubernetes-why-such-a-choice-in-this-case">The main technologies used in Capact are Go and Kubernetes. Why such a choice in this case?<a class="hash-link" href="#the-main-technologies-used-in-capact-are-go-and-kubernetes-why-such-a-choice-in-this-case" title="Direct link to heading">​</a></h2><p><strong>Paweł:</strong> Both Go and Kubernetes are becoming more and more popular.</p><p>In the cloud-computing world, choosing the proper set of technologies is very crucial to ensure the final application is scalable, performant, and resilient. Kubernetes helps us orchestrate the deployed microservices, and make sure they operate without any issue, on any cloud provider, or even bare metal.</p><p>Go, on the other hand, is a great fit for such projects—its simplicity enables us to write such back-end services efficiently. They are fast to compile and consume much fewer resources than alternatives written in Java or JavaScript/TypeScript.</p><p><strong>Mateusz:</strong> It’s worth highlighting that the Go community already created a lot of powerful libraries. You don’t need to solve cloud-specific problems once again, and can focus on solving your domain/business problems instead.</p><p>As mentioned, Go is easy in terms of memory consumption, which is important in cloud environments. Of course, it doesn't come without a downside; the abstraction level in Go is quite low, but the <a href="https://tip.golang.org/doc/go1.18" target="_blank" rel="noopener noreferrer">upcoming Go 1.18</a> will be a significant release, especially with support for generics.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="can-you-give-us-more-background-on-what-capact-is">Can you give us more background on what Capact is?<a class="hash-link" href="#can-you-give-us-more-background-on-what-capact-is" title="Direct link to heading">​</a></h2><p><strong>Paweł:</strong> Capact is an open-source framework for running arbitrary workflows. Currently, we are focusing on day-one and day-two workflows for deploying, and managing applications and cloud-native infrastructure.</p><p>The main difference between Capact and alternative tools is its interchangeability of dependencies. The workflow may consist of dynamic steps, which are described by the interface. Such steps can resolve different implementations, depending on the user's preferences. It is the same concept taken from programming languages.</p><p><strong>Mateusz:</strong> As you can see, the idea for the Capact project is pretty bold: Create a platform that is a glue that you can use to chain e.g. Terraform, Helm, and Slack API. At the same time, ensure <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank" rel="noopener noreferrer">the DRY principle</a> at the global scale, so that you can reuse as many existing building blocks as you can. This idea is explained very well in our <a href="https://capact.io/blog/introducing-capact" target="_blank" rel="noopener noreferrer">Introductory blog post</a> :)</p><p>The best part of this project is that it's not a competitor to any other project. It gives an option to use tools that you like and trust in a unified and easy way.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-are-the-biggest-challenges-associated-with-it">What are the biggest challenges associated with it?<a class="hash-link" href="#what-are-the-biggest-challenges-associated-with-it" title="Direct link to heading">​</a></h2><p><strong>Mateusz:</strong> As I said, we try to make Capact as easy as possible.</p><p>Here is the thing: it's challenging to make it easy for the end-user, as gluing different tools together requires a lot of flexibility from our platform. It's not possible to gather all use-cases and implement them at once. We need to deliver that iteratively. If you have ideas for where we should go next, we'd love to hear them!</p><p>Personally, I like that this project is complicated and makes you rack your brain. We want to solve problems that are not trivial. We also try to strike a balance between the productization and the open-source side.</p><p><strong>Paweł:</strong> Apart from balancing between two scopes, open-source and commercial, these two are also separate challenges. We are about to start building an open-source community around Capact, which will definitely be a challenge to gain adoption—not only from hobbyists but also big tech companies.</p><p>There's also a commercial offering planned, which is based on Capact. And that's happening right now, so we need to ensure that the Capact user experience is seamless for every user profile (BTW they are described on <a href="https://capact.io/community/user-profiles" target="_blank" rel="noopener noreferrer">our website</a>) and that it works well in a production environment.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-kind-of-benefits-related-to-career-development-can-a-contributor-gain-in-this-project">What kind of benefits related to career development can a contributor gain in this project?<a class="hash-link" href="#what-kind-of-benefits-related-to-career-development-can-a-contributor-gain-in-this-project" title="Direct link to heading">​</a></h2><p><strong>Paweł:</strong> Capact consists of many technologies, and you can learn a lot. Even if you know some of them, while working on Capact, you will have an opportunity to dive deeply into some stuff you have never tried. Apart from <a href="https://go.dev/" target="_blank" rel="noopener noreferrer">Go</a> and <a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer">Kubernetes</a>, we use <a href="https://graphql.org/" target="_blank" rel="noopener noreferrer">GraphQL</a>, <a href="https://www.typescriptlang.org/" target="_blank" rel="noopener noreferrer">TypeScript</a>, <a href="https://www.terraform.io/" target="_blank" rel="noopener noreferrer">Terraform</a>, and plenty of projects and tools around Kubernetes, such as <a href="https://argoproj.github.io/argo-workflows/" target="_blank" rel="noopener noreferrer">Argo workflows</a>, and <a href="https://min.io/" target="_blank" rel="noopener noreferrer">MinIO</a>.</p><p>You will help design upcoming Capact features—starting from user experience, ending up on architectural challenges. There's also a lot to learn when it comes to soft skills—while building an open-source community, you will practice collaborating with external contributors, improve giving talks on meetups and conferences, etc.</p><p>Once you have made several valuable contributions, you will have an opportunity to become <a href="https://capact.io/community/governance#maintainers" target="_blank" rel="noopener noreferrer">Capact Maintainer</a>.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-type-of-maintainers-are-you-looking-for">What type of maintainers are you looking for?<a class="hash-link" href="#what-type-of-maintainers-are-you-looking-for" title="Direct link to heading">​</a></h2><p><strong>Mateusz:</strong> We're looking for open-minded people who want to be responsible for multiple parts of the platform that we develop. We have a small team, and we deliver features end-to-end. At this stage, we don't want to split into domain experts; all of us are responsible for the whole product. Don't worry, we will help you in onboarding to our technology stack.</p><p>On a daily basis, you will implement new functionality, write automated tests, build CI/CD pipelines, and provide documentation for it.</p><p><strong>Paweł:</strong> You will also have an opportunity to design architecture, create a proofs of concept, teach and evangelize the open-source community, and be involved in project roadmap planning.</p><p>We're looking for solid all-rounders, who are not afraid of new technologies and learn quickly. That's why we think about a true DevOps profile—solid programming skills and love for operations. We require Kubernetes experience, and some experience with Go—it doesn't have to be production-grade experience, but it would be good if you know the basic conventions. Any open-source contributions would be nice to have!</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="do-you-have-any-advice-for-beginners-in-go-how-can-developers-broaden-their-knowledge-in-this-area-and-what-benefits-does-this-language-offer">Do you have any advice for beginners in Go? How can developers broaden their knowledge in this area and what benefits does this language offer?<a class="hash-link" href="#do-you-have-any-advice-for-beginners-in-go-how-can-developers-broaden-their-knowledge-in-this-area-and-what-benefits-does-this-language-offer" title="Direct link to heading">​</a></h2><p><strong>Paweł:</strong> Go is great for writing lightweight backend applications and CLI tools. If you want to build modern cloud-native, apps, learn Go, as it is the right tool for the job.</p><p>I would recommend starting with some Go interactive tutorials. After learning new syntax (which is really easy), figure out an idea for a new hobby project. Maybe you're missing some tool you would like to use? It doesn't matter whether it is an HTTP service, CLI tool, or something else—start working on that! Open-sourcing, can give you an additional boost to work on it, and improve over time. Promote it on Reddit and other sites, and you'll see that people use it, and love it!</p><p>You can also contribute to some existing open-source projects written in Go. On GitHub, look for issues with the “good first issue” label, discuss it with project maintainers, and start coding! If you're interested in the Capact project, perhaps you can even contribute to our repositories? We also have “good first issues” :-)</p><p><strong>Mateusz:</strong> Personally, I can tell that for me the most efficient way to learn any language is by doing reviews and submitting PRs that will be reviewed by more experienced developers. This way, you learn how to solve real problems. It doesn't need to be directly within your current company. Same as Paweł, I'm a huge open-source enthusiast, so I also encourage you to contribute to various open-source projects, or start your own!</p><p>Additionally, I like to “spy” on other projects from the CNCF landscape and check their design. I also follow people connected with Go, e.g. <a href="https://github.com/dmitshur" target="_blank" rel="noopener noreferrer">@dmitshur</a>, <a href="https://github.com/ibuildthecloud" target="_blank" rel="noopener noreferrer">@ibuildthecloud</a>, <a href="https://github.com/mattn" target="_blank" rel="noopener noreferrer">@mattn</a>, <a href="https://github.com/rsc" target="_blank" rel="noopener noreferrer">@rsc</a>, <a href="https://github.com/alexellis" target="_blank" rel="noopener noreferrer">@alexellis</a>, <a href="https://github.com/bep" target="_blank" rel="noopener noreferrer">@bep</a>, <a href="https://twitter.com/peterbourgon" target="_blank" rel="noopener noreferrer">@peterbourgon</a>, and others, to learn how they solve a given problem, and to get familiar with different approaches. </p><p>It’s much harder to recommend a great project, as it depends on what you want to implement. For example, from my perspective, if you are going to write a more future-proof CLI, the <a href="https://github.com/cli/cli" target="_blank" rel="noopener noreferrer">github.com/cli/cli</a> repository is definitely worth checking. If you want to see some Go patterns in action, e.g. a more generic approach to functional options, see <a href="https://github.com/kubernetes-sigs/controller-runtime/blob/v0.11.0/pkg/client/options.go" target="_blank" rel="noopener noreferrer">sigs.k8s.io/controller-runtime</a>.</p><p>In our community, there are a lot of materials. It's good to start with the <a href="https://github.com/golang/go/wiki/" target="_blank" rel="noopener noreferrer">golang/wiki</a>, the <a href="http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang" target="_blank" rel="noopener noreferrer">50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs</a>, and the <a href="https://github.com/uber-go/guide" target="_blank" rel="noopener noreferrer">Uber Style Guide</a>. The <a href="https://www.ardanlabs.com/blog/" target="_blank" rel="noopener noreferrer">Ardan Labs</a> is also a good knowledge source.</p><p>Others:</p><ol><li>Read and follow: <a href="https://golang.org/doc/effective_go.html" target="_blank" rel="noopener noreferrer">https://golang.org/doc/effective_go.html</a></li><li>Try: <a href="https://gobyexample.com/" target="_blank" rel="noopener noreferrer">https://gobyexample.com/</a></li><li>Subscribe: <a href="https://golangweekly.com/" target="_blank" rel="noopener noreferrer">https://golangweekly.com/</a></li></ol><h2 class="anchor anchorWithStickyNavbar_mojV" id="get-involved">Get involved!<a class="hash-link" href="#get-involved" title="Direct link to heading">​</a></h2><p>Giving feedback, requesting a feature, reporting a bug—all of these are a great way to contribute. Just join our <a href="/community/slack"><strong>Slack</strong></a> and talk to us!</p><p>Are you participating in the <a href="https://24pullrequests.com/" target="_blank" rel="noopener noreferrer">24 Pull Requests</a> event? We've got your back. Check out issues with the <a href="https://github.com/capactio/capact/labels/good%20first%20issue" target="_blank" rel="noopener noreferrer"><code>good first issue</code></a> label and get our full support from the beginning to the merge of your pull request :)</p><p>Do you want to work with us on a daily basis? Contact us at <a href="mailto:contact@capact.io" target="_blank" rel="noopener noreferrer">contact@capact.io</a>!</p>]]></content:encoded>
            <category>capact</category>
            <category>open-source</category>
            <category>go</category>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>dry</category>
            <category>interview</category>
            <category>maintainers</category>
            <category>contributors</category>
            <category>career</category>
        </item>
        <item>
            <title><![CDATA[Introducing Capact, your new way to manage applications and infrastructure]]></title>
            <link>https://capact.io/blog/introducing-capact</link>
            <guid>introducing-capact</guid>
            <pubDate>Tue, 07 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Managing the lifecycle of infrastructure, applications, and processes in modern IT is problematic. There are a variety of tools and best practices, which are ever-changing. It's a struggle to stay up-to-date with these practices, and not everyone is an expert at everything. Technical debt is inevitable.]]></description>
            <content:encoded><![CDATA[<p>Managing the lifecycle of infrastructure, applications, and processes in modern IT is problematic. There are a variety of tools and best practices, which are ever-changing. It's a struggle to stay up-to-date with these practices, and not everyone is an expert at everything. Technical debt is inevitable.</p><p>We are ultimately all alone. We are siloed within the context of team, department, or company, locked-in in a particular ecosystem of tooling. To deliver end-to-end capabilities, we build them from scratch in a vacuum. We consume API calls, transform data, build and manage infrastructure and applications. Don't we spend too much time solving the same problems as others have?</p><p>Sharing expertise is something that already happens—we have plenty of libraries and frameworks out there. But what if we went a step further and have a way to create, use and share building blocks that are <strong>language-agnostic abstracted capabilities</strong>?</p><p>For example, if you're not a cloud expert, all you need to know is that you want a managed PostgreSQL database on AWS. Let the subject-matter experts take care of it, and simply focus on your business logic. Likewise, if you need any Kubernetes cluster—by saying "I want any Kubernetes cluster" and letting the magic happen, you could cover both local development and production scenarios…</p><p>What if I told you… <strong>now this is all possible</strong>?</p><p>Introducing Capact, crowdsourced expertise. Learn once, use everywhere.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-is-capact">What is Capact?<a class="hash-link" href="#what-is-capact" title="Direct link to heading">​</a></h2><p>Capact is a new way to manage applications and infrastructure and run arbitrary workflows. </p><p><img alt="Here we go again GIF" src="/assets/images/here-we-go-again-again-bc244caf02fd569599468499c1e48b1f.gif" width="498" height="333"> </p><center><small>source: <a href="https://tenor.com/view/here-wego-again-again-ohboy-sigh-captain-america-gif-15496881" target="_blank" rel="noopener noreferrer">tenor.com</a></small></center><p></p><p>Yes, we get it. You already know plenty of different tools for that. But Capact is different. How is it different?</p><p>Capact comes with a truly unique feature—<strong>interchangeability of dependencies</strong>. If you know the concept of interfaces from a variety of programming languages, you get the idea. Think about Capact as a way of executing workflows with steps, which are described with interfaces. An implementation for a given interface is resolved dynamically at runtime, according to your preferences. Also, these dynamic workflow steps are building blocks, which can be reused by others (or even nested within other workflows).</p><p>Initially, we focused on day-one and day-two operations for managing applications and infrastructure. However, Capact is built with universal concepts in mind, so you can run any arbitrary workflow you want. For example, you can do data processing, machine learning workloads, system configuration, cluster benchmarking, auditing, running serverless workloads—the possibilities are virtually endless.</p><p>The best thing is that Capact is <strong>fully open-source</strong> under the Apache 2.0 license. How cool is that? 😎</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="capact-concept-in-one-minute">Capact concept in one minute<a class="hash-link" href="#capact-concept-in-one-minute" title="Direct link to heading">​</a></h2><p>The whole concept sounds confusing? Let's see that in action.</p><p>Let's take <a href="https://mattermost.com/" target="_blank" rel="noopener noreferrer">Mattermost</a> installation as an example. Mattermost is an open-source alternative for Slack.</p><p>Mattermost is a Go server application, which uses a PostgreSQL database. If we want to install Mattermost, this how the workflow would look like:</p><p><img alt="Mattermost installation 1" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI3ODJweCIgaGVpZ2h0PSI0MTFweCIgdmlld0JveD0iLTAuNSAtMC41IDc4MiA0MTEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDtFbGVjdHJvbiZxdW90OyBtb2RpZmllZD0mcXVvdDsyMDIxLTA5LTA3VDExOjI1OjQ2Ljg5M1omcXVvdDsgYWdlbnQ9JnF1b3Q7NS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDExXzVfMikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgZHJhdy5pby8xNC45LjYgQ2hyb21lLzg5LjAuNDM4OS4xMjggRWxlY3Ryb24vMTIuMC4xNiBTYWZhcmkvNTM3LjM2JnF1b3Q7IHZlcnNpb249JnF1b3Q7MTQuOS42JnF1b3Q7IGV0YWc9JnF1b3Q7Tk5sYm1ZbVVnZDR4VlRZa3pZRngmcXVvdDsgdHlwZT0mcXVvdDtkZXZpY2UmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7V08yMXFMaHg4Y2JHbjlsNUVpVF8mcXVvdDsmZ3Q7MVZaTmo1c3dFUDAxWENPdytkZ2MyeVQ5a0hhbHRqbTBlM1RDQk53YUhCbVRRSDk5eDRrSmVDRlNwTTFLMnhNemIyWnMvT1o1d0tPTG92bXMyRDUva2lrSWovaHA0OUdsUjBoQS9RQWZCbWt0RWlUMGpHU0tweGJyZ1RYL0N4YjBMVnJ6RkNvblVVc3BOTis3NEZhV0pXeTFnekdsNU5GTjIwbmg3cnBuR1l5QTlaYUpNZnFUcHpvL281VDZmaC80QWp6TDdkWmgvR0JMQ3RabDI5UXFaNms4RGlDNjh1aENTYW5QVnRFc1FCajZPbUxPZFordVJDOXZwcURVdHhTUWM4R0JpZG9lemlPeHdOS1BHNFZXWml6N3BycnR6cTlrWGFaZ1Z2QXhmTXk1aHZXZWJVMzBpQzFITE5lRlFDOUFzOUpLL29HRkZGSWhVc29TTGtzZVFHbG9ycjU1Y09FRHBRU3lBSzFhVExFRm9XV3dFMUZzL1dQZmtlVEJZdm13R1oyS21GVkJkbG02NXdrTlM5VTBiWFNDdHZ1UjVCRzZKTXRvT2I4UFUyUWVPVlNSTUJsUlJaSUpxa2dZdlo2cThMckNPb0U5TWExQkZiTFNtUGkxckRRVGdta3V5eTRUOTloY1ZTTVNvMitRM0k0TDhRSmlnbWNsdWdKMlpnVkRNc2RiL3NIQ0JVOVRzOGxrODl6MnZrV1h5RmpRUVRqVnBUdm9PUnF4Q2ltT1BPdEtwWE9aeVpLSlZZKytZS0RQZVpSeWJ4dnhHN1J1N2Z4bXRaWnVtNkRoK3BjcG4wWFdleDVFbG8xZCtlUzBuVlBpeVFaRnhuMGV4dnF5azljNkRUS0hjdHBUeVZwdExSVGJMd2xUR1ZocWs1dWJxTUFvOXVDdS9wcU94S05yRTh6NjI0SFdON3d1bVlMMTkwZnpLV1dhYlZnRjczZ0tVZUlPYkpMTVo5RjREcEVKaGNkM1VIZ3k0cE1ZUG4vVU9HUjhad0JWb1BDZy94R1RkQjYrSVpQbzlyOGpwOWpndDQ2dS9nRT0mbHQ7L2RpYWdyYW0mZ3Q7Jmx0Oy9teGZpbGUmZ3Q7IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyI+PGRlZnMvPjxnPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI3ODAiIGhlaWdodD0iNDEwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogNzc4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjA1cHg7IG1hcmdpbi1sZWZ0OiAxcHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxiciAvPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSIzOTAiIHk9IjIwOSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxMnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48L3RleHQ+PC9zd2l0Y2g+PC9nPjxyZWN0IHg9IjI1NSIgeT0iODciIHdpZHRoPSIyNzAiIGhlaWdodD0iMjQ1IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiNkMmQ1ZDkiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIyNTUiIHk9IjYwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzOHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDcwcHg7IG1hcmdpbi1sZWZ0OiAyNTdweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxiPk1hdHRlcm1vc3QgSW5zdGFsbGF0aW9uPC9iPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSIyNTciIHk9Ijc0IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiPk1hdHRlcm1vc3QgSW5zdGFsbGF0aW9uPC90ZXh0Pjwvc3dpdGNoPjwvZz48cGF0aCBkPSJNIDM5MCAxNzkuNSBMIDM5MCAyMjguMTMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ic3Ryb2tlIi8+PHBhdGggZD0iTSAzOTAgMjMzLjM4IEwgMzg2LjUgMjI2LjM4IEwgMzkwIDIyOC4xMyBMIDM5My41IDIyNi4zOCBaIiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxyZWN0IHg9IjI4MCIgeT0iMTE5LjUiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iI2QyZDVkOSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAyMThweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNTBweDsgbWFyZ2luLWxlZnQ6IDI4MXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj4xLiBJbnN0YWxsIFBvc3RncmVTUUwgZGF0YWJhc2U8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMzkwIiB5PSIxNTMiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MS4gSW5zdGFsbCBQb3N0Z3JlU1FMIGRhdGFiYXNlPC90ZXh0Pjwvc3dpdGNoPjwvZz48cmVjdCB4PSIyODAiIHk9IjIzNC41IiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjYwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiNkMmQ1ZDkiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMjE4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjY1cHg7IG1hcmdpbi1sZWZ0OiAyODFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+Mi4gUnVuIE1hdHRlcm1vc3Qgc2VydmVyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM5MCIgeT0iMjY4IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjIuIFJ1biBNYXR0ZXJtb3N0IHNlcnZlcjwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjxzd2l0Y2g+PGcgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ii8+PGEgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNSkiIHhsaW5rOmhyZWY9Imh0dHBzOi8vd3d3LmRpYWdyYW1zLm5ldC9kb2MvZmFxL3N2Zy1leHBvcnQtdGV4dC1wcm9ibGVtcyIgdGFyZ2V0PSJfYmxhbmsiPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTBweCIgeD0iNTAlIiB5PSIxMDAlIj5WaWV3ZXIgZG9lcyBub3Qgc3VwcG9ydCBmdWxsIFNWRyAxLjE8L3RleHQ+PC9hPjwvc3dpdGNoPjwvc3ZnPg==" width="782" height="411"></p><p>We need a PostgreSQL database first to run a Mattermost server. It's pretty simple.</p><p>Now, what if we make the PostgreSQL database installation abstract? Think about that as an empty slot, where you can put a puzzle with a specific shape.</p><p><img alt="Mattermost installation 2" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI3ODFweCIgaGVpZ2h0PSI0MTFweCIgdmlld0JveD0iLTAuNSAtMC41IDc4MSA0MTEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDtFbGVjdHJvbiZxdW90OyBtb2RpZmllZD0mcXVvdDsyMDIxLTA5LTA3VDExOjI3OjQ3LjQ5MVomcXVvdDsgYWdlbnQ9JnF1b3Q7NS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDExXzVfMikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgZHJhdy5pby8xNC45LjYgQ2hyb21lLzg5LjAuNDM4OS4xMjggRWxlY3Ryb24vMTIuMC4xNiBTYWZhcmkvNTM3LjM2JnF1b3Q7IHZlcnNpb249JnF1b3Q7MTQuOS42JnF1b3Q7IGV0YWc9JnF1b3Q7aHQwcmFsbV9va09ab0hscVJNZW8mcXVvdDsgdHlwZT0mcXVvdDtkZXZpY2UmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7WXE4TlNsZlRNQnpUYXdKNWJrNlQmcXVvdDsmZ3Q7elZaTmo1c3dFUDAxWENOaUVnakhiWkorU0x2U3RqbTBlL1NHQ2JnMUdCbG5RL3JyT3c1RHdJRm9JeldWdXBmMVBNOFkrNzAzanIxZ21kZWZOQyt6SjVXQTlKaWYxRjZ3OGhpYlR2MFEvMW5rMkNCeEhEVkFxa1ZDU1Iyd0ViK0JRSi9RdlVpZ2NoS05VdEtJMGdXM3FpaGdheHlNYTYwT2J0cE9TZmVySlU5aEFHeTJYQTdSN3lJeFdZTUdnZTkzRTU5QnBCbDllaFl1cUNUbmJUYWxWaGxQMUtFSEJXc3ZXR3FsVERQSzZ5Vkl5MTVMVEZQMzhjcnNlV2NhQ25OTEFXc0szcmpjMCtFOEZrb3MvZkNxY1pUYUVlM1VITnZ6YTdVdkVyQXIrRGg5eUlTQlRjbTNkdmFBaWlPV21WeGlOTVZoWmJUNkJVc2xsVWFrVUFXY2wzd0RiYUMrdXZQcG1ROTBFcWdjakQ1aUNoWE1pRUh5VU5pU2YrZ1VpUmFFWlgweFdoZHhja0Y2WHJyakNRZEUxVGh0d1FodDl5UEpZOEdLcmVhcitENU1zWGp1VXJXSUJsU3hhSVFxTnB2L1BWV3o2dzVyRGZiRWpRR2RxOHBnNHBlaU1seEtib1FxMmt6OHh1dFZOeUl4NWdiTDdZU1VGeENYSWkwd2xMQ3pLMWlTQlhiNUE4RzVTQkw3a1ZIeFhIbi9oVXJoME5EVDJaaEtkL0R6Zk1BcUpIamxVYWkweVZTcUNpN1hIWHJCUUpmenFGUkpRdndFWTQ1MGYvTzlVYTVNVUF2enc1WlBabkZNOGNzcGpxT0k0bFZONjUrQ1l4c1VlTDZtZE42R0wvMjVydXdVSFh1TFBJTVd5QTlvUnpwN1hFZTRTdTMxbGlCcUY4TjFDa1I2ZUxPOEdxeVgzOXpWeDdTaTBtY2xDdE83NWdKLzR2ZittR09TS0lvbkZ6M2FiSnhXdVhEQWVWczNtU0ljZEM2YllQeHRqMzNwT3oxYmdVYnYvOGRYWU1EY1g0dEZNR3Q1NjErQ2JLUzl3anUwVnpSZ2NqcnByam9jUFNPUHFZYk4xMGY3TE9LR3YvSUtCbnppWTZHMFF6dzNsb0ZVcWVZNUVsVDJMTzNNOWJ6K0h2MDdVVVA3MUxKeHdxdnNKTjJvTnRINklWemY2ZUs3MUNaaXc0dnZYc3BnMkwydG1wYm9ucWpCK2c4PSZsdDsvZGlhZ3JhbSZndDsmbHQ7L214ZmlsZSZndDsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ij48ZGVmcy8+PGc+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9Ijc4MCIgaGVpZ2h0PSI0MTAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA3NzhweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAyMDVweDsgbWFyZ2luLWxlZnQ6IDFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGJyIC8+PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM5MCIgeT0iMjA5IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjwvdGV4dD48L3N3aXRjaD48L2c+PHJlY3QgeD0iMjU1IiB5PSI4NyIgd2lkdGg9IjI3MCIgaGVpZ2h0PSIyNDUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iI2QyZDVkOSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxyZWN0IHg9IjI1NSIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTM4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNzBweDsgbWFyZ2luLWxlZnQ6IDI1N3B4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGI+TWF0dGVybW9zdCBJbnN0YWxsYXRpb248L2I+PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjI1NyIgeT0iNzQiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCI+TWF0dGVybW9zdCBJbnN0YWxsYXRpb248L3RleHQ+PC9zd2l0Y2g+PC9nPjxwYXRoIGQ9Ik0gMzg5Ljc4IDE3OC42MiBMIDM4OS44IDIwNy4zIEwgMzg5Ljk1IDIyOC4xMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48cGF0aCBkPSJNIDM4OS45OSAyMzMuMzggTCAzODYuNDQgMjI2LjQxIEwgMzg5Ljk1IDIyOC4xMyBMIDM5My40NCAyMjYuMzYgWiIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIyODAiIHk9IjIzNC41IiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjYwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiNkMmQ1ZDkiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMjE4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjY1cHg7IG1hcmdpbi1sZWZ0OiAyODFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+Mi4gUnVuIE1hdHRlcm1vc3Qgc2VydmVyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM5MCIgeT0iMjY4IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjIuIFJ1biBNYXR0ZXJtb3N0IHNlcnZlcjwvdGV4dD48L3N3aXRjaD48L2c+PHBhdGggZD0iTSAyODAgMTgwIEwgMzAwIDEyMCBMIDUwMCAxMjAgTCA0ODAgMTgwIFoiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzdlYTZlMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIzIDMiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMjE4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTUwcHg7IG1hcmdpbi1sZWZ0OiAyODFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+MS4gSW5zdGFsbCBQb3N0Z3JlU1FMIGRhdGFiYXNlPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM5MCIgeT0iMTU0IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjEuIEluc3RhbGwgUG9zdGdyZVNRTCBkYXRhYmFzZTwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjxzd2l0Y2g+PGcgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ii8+PGEgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNSkiIHhsaW5rOmhyZWY9Imh0dHBzOi8vd3d3LmRpYWdyYW1zLm5ldC9kb2MvZmFxL3N2Zy1leHBvcnQtdGV4dC1wcm9ibGVtcyIgdGFyZ2V0PSJfYmxhbmsiPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTBweCIgeD0iNTAlIiB5PSIxMDAlIj5WaWV3ZXIgZG9lcyBub3Qgc3VwcG9ydCBmdWxsIFNWRyAxLjE8L3RleHQ+PC9hPjwvc3dpdGNoPjwvc3ZnPg==" width="781" height="411"></p><p>Assuming there are many puzzles pieces out there, you see that only a few of them fit in the slot:</p><p><img alt="Mattermost installation 3" src="/assets/images/capact-example3-7625a69fdd19f034ee7fb72ca4c0358d.svg" width="782" height="462"></p><p>In the case of PostgreSQL installation, four puzzle pieces fit:</p><p><img alt="Mattermost installation 4" src="/assets/images/capact-example4-e417822a2f8affd8abde3ebbaeaba93f.svg" width="781" height="411"></p><ol><li>Install PostgreSQL Helm chart on a Kubernetes cluster</li><li>Provision GCP CloudSQL for PostgreSQL database</li><li>Provision AWS RDS for PostgreSQL database</li><li>Reuse existing PostgreSQL database</li></ol><p>By default, for a workflow run, Capact picks the first puzzle piece that fits. However, by applying <a href="/docs/feature/policies/overview">Policy</a>, you are in complete control of which puzzle piece will be chosen. Moreover, you can select a different one for a specific scenario, such as local setup, CI/CD, stage, and production cluster.</p><p>What's great is that Mattermost installation itself is also a larger puzzle piece, which others can use! Maybe as a part of productivity stack installation, which could consist of Mattermost, <a href="https://about.gitlab.com/" target="_blank" rel="noopener noreferrer">GitLab</a> and <a href="https://jitsi.org/jitsi-meet/" target="_blank" rel="noopener noreferrer">Jitsi Meet</a>? 🤔</p><p><img alt="Mattermost installation 5" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI3ODFweCIgaGVpZ2h0PSI0NjFweCIgdmlld0JveD0iLTAuNSAtMC41IDc4MSA0NjEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDtFbGVjdHJvbiZxdW90OyBtb2RpZmllZD0mcXVvdDsyMDIxLTA5LTA3VDEyOjQ2OjQ1LjcwMVomcXVvdDsgYWdlbnQ9JnF1b3Q7NS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDExXzVfMikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgZHJhdy5pby8xNC45LjYgQ2hyb21lLzg5LjAuNDM4OS4xMjggRWxlY3Ryb24vMTIuMC4xNiBTYWZhcmkvNTM3LjM2JnF1b3Q7IHZlcnNpb249JnF1b3Q7MTQuOS42JnF1b3Q7IGV0YWc9JnF1b3Q7R21NSnc0QWZldjNreEl1RXBpSDYmcXVvdDsgdHlwZT0mcXVvdDtkZXZpY2UmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7Qmp1a1N5TTJoTGJpTlp0cmhiTkMmcXVvdDsmZ3Q7eFZqYmNwc3dFUDBhdnpJZ21kdGpmRXZiU1dZeWs0YzJqNnFSUWFsQWpKQmp1MS9mbFJFR0dkSXdzZDM2eGRyRHJpNW5WMmV4SjNpZTcrOGxLYk5Ia1ZBK1FXNnluK0RGQkNIUGN3UDQwc2loUnVJNHJJRlVzc1E0dGNBeiswME42QnAweXhKYVdZNUtDSzVZYVlOclVSUjByU3lNU0NsMnR0dEdjSHZWa3FTMEJ6eXZDZStqMzFtaXNockYySFhiQjE4b1N6T3o5RFNJVEVoT0dtL2pXbVVrRWJzT2hKY1RQSmRDcUhxVTcrZVVhL1lhWXVxNDFUdFBUenVUdEZCakFsQWQ4RWI0MWh6TzdFc2RtdE5Lc1MwU3F2M2RDWjd0TXFib2MwblcrdWtPOGd0WXBuSU9sZ2ZEU2tueGk4NEZGeEtRUWhUZ05qTnJVS25vL3QxOWVxZlRROTFRa1ZNbEQrQmlBcWFHTDFNeFhod1pZTmNtSUd5d3pPTGVnTVFrUFQzTjNkSUNBOFBNTUV2NHBpeE5FRjZnaGIrSXIwTVZpcWFPYjdHRjNEQjJQTndqRElVRGhLRW9ja0wvY3M2bUE1d0ZIQmFaL1lSQnFnZFBVaVRidFdKdlRPbjlreEx1TDB4UVZJcHdUaFFUUlJNQ2k1MmlldFFEVldwRUZXNFk1MmNRNFN3dHdPUjBvMmZRdERPNDVuY0d6bG1TNkVVRzAya24vRVo1ODlGUTNyeDRLRzlYcUhPL3h5MU5RUG1NS2FUS1JDb0t3cGN0ZXNaRDYvTWdSR25TOFVxVk9oZ1pKMXNsN0dUUlBWTS9kTGd6aldOanZ4enRPQXlOdmRpYitZL0dvVEVLT0Y4ZDZqZm1TL2RaRzNhMERwMUpucWhrd0ErVlZnTDFjYTMwVldJcjF3WXlUVW9SbVZKRGVqQTZ5WkxxaW42elp4L0tsUWw5RWd4bWJQWFBpeDNmYlQvSUxoUXY5SndBMjVQV1d6ZnpuTlhBYVdPanlpTG9YV1hrZ1AyMXZxZ3dlaVFLbU14RnBTN1R4WVJVMmRGM1VDU0Q4RzRXcjY1ejJiQWJuMTgyNkNrT2p2b2lpUVl1MnpXYVN0aGoxYk5adldmcWdmenNNUXF2REtVZXdtSEJqM0tSU3BJREsyV25vcTFublZML0tBRWJ0cWZOQzlmSENRbVhkOEh5U3VvM2xCQnZVUDF1bHBEb1l2VjczZVpsNDI5YXpFV0M2SGZrMFB1ckZMNGpYN2NYcHNEcmRTMUluQk5GbzhUb3M5UFZHbndOYll2L2I4c2JuK0hQTnJzUmplM2ZkVEVVTzgwMU85M3l5TzI5YjQ2dGxtTlhQS3VXS0x4aHRUUy9RRHVpalczUi9zWlV4WFJMcExUZkRCdnByaFF0enhSYlF4Y0lkVStiVjZ1Wkg3cm5FbjRib1VZUlBuSGVGV3JQdjRwUWc5bitJSzZUMXY2dmdKZC9BQT09Jmx0Oy9kaWFncmFtJmd0OyZsdDsvbXhmaWxlJmd0OyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsiPjxkZWZzLz48Zz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iNzgwIiBoZWlnaHQ9IjQ2MCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PHJlY3QgeD0iMjQ0LjUiIHk9Ijk5LjEzIiB3aWR0aD0iMjcwIiBoZWlnaHQ9IjI4OC43NSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjZDJkNWQ5IiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PHJlY3QgeD0iMjQ0LjUiIHk9IjcyLjEzIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDE4OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDgycHg7IG1hcmdpbi1sZWZ0OiAyNDdweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxiPlByb2R1Y3Rpdml0eSBhcHBzIGluc3RhbGxhdGlvbjwvYj48L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMjQ3IiB5PSI4NiIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxMnB4Ij5Qcm9kdWN0aXZpdHkgYXBwcyBpbnN0YWxsYXRpb248L3RleHQ+PC9zd2l0Y2g+PC9nPjxwYXRoIGQ9Ik0gMzc5LjI4IDE5MC43NSBMIDM3OS40NSAyMTIuMDEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ic3Ryb2tlIi8+PHBhdGggZD0iTSAzNzkuNDkgMjE3LjI2IEwgMzc1Ljk0IDIxMC4yOSBMIDM3OS40NSAyMTIuMDEgTCAzODIuOTQgMjEwLjIzIFoiIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PHJlY3QgeD0iMjY5LjUiIHk9IjIxOC4zOCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2MCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNjdhYjlmIiBzdHJva2UtZGFzaGFycmF5PSIzIDMiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMjE4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjQ4cHg7IG1hcmdpbi1sZWZ0OiAyNzFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+Mi4gSW5zdGFsbCBNYXR0ZXJtb3N0PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM4MCIgeT0iMjUyIiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjIuIEluc3RhbGwgTWF0dGVybW9zdDwvdGV4dD48L3N3aXRjaD48L2c+PHBhdGggZD0iTSAyNjkuNSAxOTIuMTMgTCAyODkuNSAxMzIuMTMgTCA0ODkuNSAxMzIuMTMgTCA0NjkuNSAxOTIuMTMgWiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjN2VhNmUwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMyIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAyMThweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNjJweDsgbWFyZ2luLWxlZnQ6IDI3MXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj4xLiBJbnN0YWxsIEdpdExhYjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSIzODAiIHk9IjE2NiIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxMnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4xLiBJbnN0YWxsIEdpdExhYjwvdGV4dD48L3N3aXRjaD48L2c+PHBhdGggZD0iTSAzNzkuNSAyNzguMzggTCAzNzkuNSAzMDEuNTEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ic3Ryb2tlIi8+PHBhdGggZD0iTSAzNzkuNSAzMDYuNzYgTCAzNzYgMjk5Ljc2IEwgMzc5LjUgMzAxLjUxIEwgMzgzIDI5OS43NiBaIiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gMjY5LjUgMzAzLjg4IEwgNDY0LjUgMzAzLjg4IEwgNDg0LjUgMzMzLjg4IEwgNDY0LjUgMzYzLjg4IEwgMjY5LjUgMzYzLjg4IEwgMjg5LjUgMzMzLjg4IFoiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iI2ZmYjU3MCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIzIDMiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMjEzcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMzM0cHg7IG1hcmdpbi1sZWZ0OiAyNzFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+My4gSW5zdGFsbCBKaXRzaSBNZWV0PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjM3NyIgeT0iMzM3IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjMuIEluc3RhbGwgSml0c2kgTWVldDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjxzd2l0Y2g+PGcgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ii8+PGEgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNSkiIHhsaW5rOmhyZWY9Imh0dHBzOi8vd3d3LmRpYWdyYW1zLm5ldC9kb2MvZmFxL3N2Zy1leHBvcnQtdGV4dC1wcm9ibGVtcyIgdGFyZ2V0PSJfYmxhbmsiPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTBweCIgeD0iNTAlIiB5PSIxMDAlIj5WaWV3ZXIgZG9lcyBub3Qgc3VwcG9ydCBmdWxsIFNWRyAxLjE8L3RleHQ+PC9hPjwvc3dpdGNoPjwvc3ZnPg==" width="781" height="461"></p><p>And that's Capact. You can build your own workflows with existing puzzles, which are available inside Capact Hub. You can also create your own puzzles. Share them with the community and enable <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank" rel="noopener noreferrer">DRY</a> at a global scale, together!</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="how-does-capact-differ-from-other-tools">How does Capact differ from other tools?<a class="hash-link" href="#how-does-capact-differ-from-other-tools" title="Direct link to heading">​</a></h2><p>Capact doesn't compete with tools you might already be familiar with, but it integrates them instead. Whether you are a <a href="https://helm.sh" target="_blank" rel="noopener noreferrer">Helm</a> or <a href="https://terraform.io" target="_blank" rel="noopener noreferrer">Terraform</a> user, you can still use your favorite tools. Mix and match your tooling or API of choice. For example, chain Terraform, Helm, and Slack API.</p><p>If you are familiar with <a href="https://kubevela.io/" target="_blank" rel="noopener noreferrer">Kubevela</a>, <a href="https://crossplane.io/" target="_blank" rel="noopener noreferrer">Crossplane</a>, and <a href="https://oam.dev/" target="_blank" rel="noopener noreferrer">Open Application Model</a>, you can see many similarities between the solution and Capact. Here are the main differences:</p><ul><li>Capact has unique built-in feature—interchangeable dependencies, which reduces the amount of duplicated code.</li><li>Capact is a process / workflow-based solution, which gives you more flexibility. Unlike Kubevela and Crossplane, Capact is not limited to just infrastructure and application deployment. You can use it for virtually everything.</li></ul><p>To read a detailed comparison between Capact and other tools, see our <a href="/docs/faq#how-does-capact-compare-to">FAQ</a>.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="get-started-with-capact">Get started with Capact<a class="hash-link" href="#get-started-with-capact" title="Direct link to heading">​</a></h2><p>Interested in trying out Capact? Awesome! The easiest way to do so is by installing it locally and trying out one of our examples to understand Capact basic concepts.</p><ol><li><a href="/docs/cli/getting-started">Install Capact CLI</a>,</li><li><a href="/docs/installation/local">Install Capact locally with Capact CLI</a>,</li><li><a href="/docs/example/mattermost-installation">Run different scenarios of Mattermost installation example</a>.  </li></ol><p>Here are other things to do: </p><p>⭐ <strong>Star our GitHub repository</strong>: If you like the idea, show your interest in the project and <a href="https://github.com/capactio/capact" target="_blank" rel="noopener noreferrer">give us a GitHub star</a>! You can also subscribe for new Capact releases. Thank you for your support!</p><p>👉 <strong>Follow us:</strong> Interesting in Capact updates? Follow us on <a href="https://twitter.com/capactio" target="_blank" rel="noopener noreferrer">Twitter</a>! Also, check out our <a href="https://www.linkedin.com/company/72586376" target="_blank" rel="noopener noreferrer">LinkedIn</a> page and <a href="https://www.youtube.com/channel/UCajXtDttqVuZ_Bl7M3_qA8w" target="_blank" rel="noopener noreferrer">YouTube</a> channel.</p><p>📖 <strong>Read our documentation:</strong> If you want to get familiar with other installation options, examples, content development, or contribution guides, check out the <a href="/docs/">Capact documentation</a>.</p><p>🤔 <strong>Get support:</strong> If you need any help, or you have a question for us, join our <a href="/community/slack">Slack channel</a> on the CNCF workspace and post a message—we'll do our best to get you sorted!</p><p>Currently, Capact is at an experimental stage. We open-sourced Capact as early as possible to get early feedback and build Capact together with the community.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="wait-theres-more">Wait, there's more!<a class="hash-link" href="#wait-theres-more" title="Direct link to heading">​</a></h2><p>In a series of future blog posts, we will highlight Capact features and cover various topics for all!</p><p>Also, as of September 20th 2021, <strong>a brand-new release</strong>, Capact 0.5.0, <strong>is here</strong>. We were working really hard to bring many UX improvements, both for Capact users and content developers. The list includes:</p><ul><li>Complete Action input validation and more advanced, concurrent Capact manifests validation with optional server-side checks,</li><li>Experimental content development tools for Helm and Terraform-based (AWS and GCP) manifest generation,</li><li>Policy syntax and behavior changes for improving consistency and usability,</li><li>Verbose output for Capact CLI,</li><li>Dependency updates, including migration to Argo 3,</li><li>Air-gapped Capact installation,</li><li><a href="https://k3d.io" target="_blank" rel="noopener noreferrer">k3d</a> support,</li><li>and much, much, more!</li></ul><p>To see the full list of features, read the <a href="https://github.com/capactio/capact/releases/tag/v0.5.0" target="_blank" rel="noopener noreferrer">release notes</a>.</p><p>Are you ready to start playing around with Capact?</p><p><img alt="Are you ready GIF" src="/assets/images/are-you-ready-73e3b58e3dbfc15e4d5a18bea0d5f45d.gif" width="300" height="170"> </p><center><small>source: <a href="https://tenor.com/view/are-you-ready-gif-5011220" target="_blank" rel="noopener noreferrer">tenor.com</a></small></center><p></p><p><em>This post was updated on 20.09.2021 to highlight that the Capact 0.5.0 release is publicly available.</em></p>]]></content:encoded>
            <category>capact</category>
            <category>introduction</category>
            <category>kubernetes</category>
            <category>release</category>
            <category>get-started</category>
            <category>release-sneak-peek</category>
        </item>
    </channel>
</rss>