<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Capact.io</title>
    <description>The latest articles on DEV Community by Capact.io (@capactio).</description>
    <link>https://dev.to/capactio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4730%2Fda945ee6-62da-4f86-8191-3c206fb54ed8.png</url>
      <title>DEV Community: Capact.io</title>
      <link>https://dev.to/capactio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/capactio"/>
    <language>en</language>
    <item>
      <title>Take Capact for a spin!</title>
      <dc:creator>Mateusz Szostok</dc:creator>
      <pubDate>Mon, 07 Feb 2022 13:59:23 +0000</pubDate>
      <link>https://dev.to/capactio/take-capact-for-a-spin-45j2</link>
      <guid>https://dev.to/capactio/take-capact-for-a-spin-45j2</guid>
      <description>&lt;p&gt;Our first blog post focused strongly on &lt;strong&gt;&lt;em&gt;why&lt;/em&gt;&lt;/strong&gt;—why we created Capact, what's the general concept behind it. Now it's time for showing &lt;strong&gt;&lt;em&gt;how&lt;/em&gt;&lt;/strong&gt;—how you can use it.&lt;/p&gt;

&lt;p&gt;Although, there are many ways to &lt;a href="https://capact.io/docs/getting-started"&gt;get started with Capact&lt;/a&gt;, today we will focus on your perspective as a Capact User.&lt;/p&gt;

&lt;p&gt;The recommended way to try out Capact quickly is to set up a local environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y3MD6_Id--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ubo9wgwd6cj3h4n87154.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y3MD6_Id--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ubo9wgwd6cj3h4n87154.png" alt="install" width="880" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Detailed instructions are already nicely described in our &lt;a href="https://capact.io/docs/installation/local"&gt;local installation&lt;/a&gt; tutorial. Once you have Capact up and running, we can start!&lt;/p&gt;

&lt;h3&gt;
  
  
  What you will learn
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; For this blog post, we will use Capact CLI. However, the described scenario can also be executed with our &lt;a href="https://capact.io/docs/dashboard-ui/overview"&gt;brand-new UI&lt;/a&gt;! 😎&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 5 minutes, by running examples from this blog post, you will learn about the following Capact concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/terminology#interface"&gt;Interface&lt;/a&gt;—provides an option to abstract Implementations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/terminology#implementation"&gt;Implementation&lt;/a&gt;—defines the actual workflow that is executed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/terminology#attribute"&gt;Attribute&lt;/a&gt;—provides an option to &lt;em&gt;tag&lt;/em&gt; manifests. Today we will use it to select a specific Implementation.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/terminology#type"&gt;Type&lt;/a&gt; and &lt;a href="https://capact.io/docs/terminology#typeinstance"&gt;TypeInstance&lt;/a&gt;—provide a combined feature, where Type holds the schema and TypeInstance the &lt;em&gt;instance&lt;/em&gt; for the Type.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/terminology#action"&gt;Action&lt;/a&gt;—triggers Engine to render and run a given Interface.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/feature/policies/overview"&gt;Policy&lt;/a&gt;—impacts the render process to select desired Implementations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creating new workflows is not the concern of this article, and it will be covered in future blog posts.&lt;/p&gt;

&lt;p&gt;Here we only briefly describe each part, but I encourage you to take a deeper look at our &lt;a href="https://capact.io/docs/terminology"&gt;Terminology&lt;/a&gt; section later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/cli/getting-started#install"&gt;Capact CLI&lt;/a&gt; at least v0.6.0&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/installation/"&gt;Capact cluster&lt;/a&gt; at least v0.6.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;(Optional)&lt;/strong&gt; &lt;a href="https://kubernetes.iohttps://capact.io/docs/tasks/tools/install-kubectl/"&gt;&lt;code&gt;kubectl&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stedolan.github.io/jq/download/"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📜 Scenario
&lt;/h3&gt;

&lt;p&gt;The key concepts were described in the &lt;a href="https://capact.io/blog/introducing-capact#capact-concept-in-one-minute"&gt;Introducing Capact&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;For the purpose of this blog post, we created an extremely simple Hello World example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z3tttFYU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/459y50wle6x1looj31hw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z3tttFYU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/459y50wle6x1looj31hw.png" alt="greet-manifest" width="880" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two Implementations for the &lt;code&gt;cap.interface.capactio.examples.say&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 Camera, Lights, Action!
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NnhjNDWC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cfdy6a0d77d0t49y7a19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NnhjNDWC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cfdy6a0d77d0t49y7a19.png" alt="capact-simplified-arch" width="861" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://capact.io/docs/cli/getting-started#first-use"&gt;Make sure that you are logged into local cluster&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;List available Interfaces:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;capact hub interfaces get
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;We are interested in this part:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                           PATH          LATEST REVISION                  IMPLEMENTATIONS
---------------------------------------+-----------------+-----------------------------------------------
# ... trimmed ...
---------------------------------------+-----------------+-----------------------------------------------
cap.interface.capactio.examples.greet        0.1.0             cap.implementation.capactio.examples.greet
---------------------------------------+-----------------+-----------------------------------------------
cap.interface.capactio.examples.say          0.1.0             cap.implementation.capactio.examples.hello
                                                               cap.implementation.capactio.examples.ricky
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new Action:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 A Policy is not needed as we use the default behavior here.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;capact act create &lt;span class="nt"&gt;--name&lt;/span&gt; hello cap.interface.capactio.examples.greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for the Action to have the &lt;code&gt;READY_TO_RUN&lt;/code&gt; status:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact act get hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the status is &lt;code&gt;READY_TO_RUN&lt;/code&gt;, run the Action:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact act run hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watch the progress:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact act watch hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;(Optional)&lt;/strong&gt; Once the Action is finished, copy the name of the Pod for the &lt;code&gt;print&lt;/code&gt; workflow step (column &lt;code&gt;PODNAME&lt;/code&gt;). To read its logs, run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs &lt;span class="o"&gt;{&lt;/span&gt;PODNAME&lt;span class="o"&gt;}&lt;/span&gt; main
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; ____________________________
&amp;lt; message: Hello from Capact &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;----------------------------&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="c"&gt;##        .&lt;/span&gt;
              &lt;span class="c"&gt;## ## ##       ==&lt;/span&gt;
           &lt;span class="c"&gt;## ## ## ##      ===&lt;/span&gt;
       /&lt;span class="s2"&gt;""""""""""""""""&lt;/span&gt;___/ &lt;span class="o"&gt;===&lt;/span&gt;
  ~~~ &lt;span class="o"&gt;{&lt;/span&gt;~~ ~~~~ ~~~ ~~~~ ~~ ~ /  &lt;span class="o"&gt;===&lt;/span&gt;- ~~~
       &lt;span class="se"&gt;\_&lt;/span&gt;_____ o          __/
        &lt;span class="se"&gt;\ &lt;/span&gt;   &lt;span class="se"&gt;\ &lt;/span&gt;       __/
          &lt;span class="se"&gt;\_&lt;/span&gt;___&lt;span class="se"&gt;\_&lt;/span&gt;_____/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the Action output (TypeInstance). Copy the &lt;code&gt;id&lt;/code&gt; field value:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact act get hello &lt;span class="nt"&gt;-ojson&lt;/span&gt; | jq &lt;span class="s1"&gt;'.Actions[0].output.typeInstances'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;
 &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"08fcaa07-7846-47af-b6a7-7c3818c69656"&lt;/span&gt;,
   &lt;span class="s2"&gt;"typeRef"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="s2"&gt;"path"&lt;/span&gt;: &lt;span class="s2"&gt;"cap.type.capactio.examples.message"&lt;/span&gt;,
     &lt;span class="s2"&gt;"revision"&lt;/span&gt;: &lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the TypeInstance &lt;code&gt;value.message&lt;/code&gt; field value:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact ti get &lt;span class="o"&gt;{&lt;/span&gt;ID&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-ojson&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[0].latestResourceVersion.spec.value.message'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete the Action:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; capact act delete hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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 ✨&lt;/p&gt;

&lt;p&gt;To choose a different Implementation for the &lt;code&gt;say&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFxH2Kyl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6gsp3de7nhb7w4om3vft.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFxH2Kyl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6gsp3de7nhb7w4om3vft.gif" alt="Here we go again GIF" width="420" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test it, create the Action again, and pass the Action Policy.&lt;/p&gt;

&lt;p&gt;First, save the Policy to the &lt;code&gt;/tmp/policy.yaml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /tmp/policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cap.interface.capactio.examples.say&lt;/span&gt;
    &lt;span class="na"&gt;oneOf&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;implementationConstraints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cap.attribute.capactio.examples.be-positive&lt;/span&gt;
            &lt;span class="na"&gt;revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create the Action with the Policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;capact act create &lt;span class="nt"&gt;--name&lt;/span&gt; hello cap.interface.capactio.examples.greet &lt;span class="nt"&gt;--action-policy-from-file&lt;/span&gt; /tmp/policy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can repeat steps starting from 4th point—so, once again, wait for the Action to have the &lt;code&gt;READY_TO_RUN&lt;/code&gt; status and run it!&lt;/p&gt;

&lt;p&gt;In the optional step no. 7, if you read the Pod logs, the output will be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; __________________________________
&amp;lt; message: Never gonna give you up &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;----------------------------------&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="c"&gt;##        .&lt;/span&gt;
              &lt;span class="c"&gt;## ## ##       ==&lt;/span&gt;
           &lt;span class="c"&gt;## ## ## ##      ===&lt;/span&gt;
       /&lt;span class="s2"&gt;""""""""""""""""&lt;/span&gt;___/ &lt;span class="o"&gt;===&lt;/span&gt;
  ~~~ &lt;span class="o"&gt;{&lt;/span&gt;~~ ~~~~ ~~~ ~~~~ ~~ ~ /  &lt;span class="o"&gt;===&lt;/span&gt;- ~~~
       &lt;span class="se"&gt;\_&lt;/span&gt;_____ o          __/
        &lt;span class="se"&gt;\ &lt;/span&gt;   &lt;span class="se"&gt;\ &lt;/span&gt;       __/
          &lt;span class="se"&gt;\_&lt;/span&gt;___&lt;span class="se"&gt;\_&lt;/span&gt;_____/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note also that the produced TypeInstance from no. 9 is valid against the same JSON Schema but the &lt;strong&gt;message&lt;/strong&gt; was changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is so special about it?
&lt;/h2&gt;

&lt;p&gt;Our example was simplified to a minimum, but you could see that you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chain different steps together,&lt;/li&gt;
&lt;li&gt;have a unified way of execution,&lt;/li&gt;
&lt;li&gt;built-in Type validation based on JSON Schema,&lt;/li&gt;
&lt;li&gt;and more importantly, write once and swap implementation details with ease.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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 &lt;strong&gt;How can I get involved and learn more?&lt;/strong&gt; section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behind the CLI
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://capact.io/docs/architecture/e2e-architecture"&gt;E2E Architecture&lt;/a&gt; document.&lt;/p&gt;

&lt;p&gt;However, a more important question is, how did it happen?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;1  spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;    &lt;span class="c1"&gt;# ... trimmed ...&lt;/span&gt;
&lt;span class="na"&gt;3    imports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;4      - interfaceGroupPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cap.interface.capactio.examples&lt;/span&gt;
&lt;span class="na"&gt;5        alias&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;examples&lt;/span&gt;
&lt;span class="na"&gt;6        methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;7          - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;say&lt;/span&gt;
&lt;span class="s"&gt;8&lt;/span&gt;  
&lt;span class="m"&gt;9&lt;/span&gt;    &lt;span class="c1"&gt;# ... trimmed ...&lt;/span&gt;
&lt;span class="na"&gt;10   steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;11     - - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get-message&lt;/span&gt;
&lt;span class="na"&gt;12         capact-action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;examples.say&lt;/span&gt; &lt;span class="c1"&gt;# dynamic step, rendered by Engine based on the Policy.&lt;/span&gt;
&lt;span class="na"&gt;13     - - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;print&lt;/span&gt;
&lt;span class="na"&gt;14         template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;print&lt;/span&gt;
&lt;span class="na"&gt;15         arguments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;16           artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;17             - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;message&lt;/span&gt;
&lt;span class="na"&gt;18             from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{steps.get-message.outputs.artifacts.message}}"&lt;/span&gt;
&lt;span class="m"&gt;19&lt;/span&gt;     &lt;span class="c1"&gt;# ... trimmed ...&lt;/span&gt;
&lt;span class="na"&gt;20     - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;print&lt;/span&gt;
&lt;span class="na"&gt;21       inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;22         artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;23           - name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;message&lt;/span&gt;
&lt;span class="na"&gt;24           path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/message.yaml&lt;/span&gt;
&lt;span class="na"&gt;25       container&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;26         image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/whalesay:latest&lt;/span&gt;
&lt;span class="na"&gt;27         command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;sh&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-c&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;28         args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cowsay&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/tmp/message.yaml"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The snippet above shows the most important parts of the Implementation manifest. In lines &lt;strong&gt;4-7&lt;/strong&gt;, we declare the import, which is later used in steps. In line &lt;strong&gt;12&lt;/strong&gt;, we use &lt;strong&gt;capact-action&lt;/strong&gt; to make a dynamic step with a given Interface.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Instead of providing the full Interface path, we use &lt;strong&gt;alias&lt;/strong&gt; assigned to the imported Interface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I get involved and learn more?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://capact.io/docs/getting-started"&gt;Getting Started&lt;/a&gt; goes into more detail about how to start with Capact and use its more-advanced features. There are also &lt;a href="https://capact.io/docs/example/rocketchat-installation"&gt;Rocket.Chat&lt;/a&gt; and &lt;a href="https://capact.io/docs/example/mattermost-installation"&gt;Mattermost&lt;/a&gt; tutorials that we keep up-to-date for you to walk you through using Capact in real cases.&lt;/p&gt;

&lt;p&gt;We appreciate any input you have about your experience with Capact!&lt;/p&gt;

&lt;p&gt;There are plenty of options to contact us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/capactio/capact/issues"&gt;GitHub issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/community/slack"&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email us at &lt;a href="//mailto:contact@capact.io"&gt;contact@capact.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for taking the time to learn about Capact 🙌&lt;/p&gt;

</description>
      <category>capact</category>
      <category>cloudnative</category>
      <category>kubernetes</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introducing Capact, your new way to manage applications and infrastructure</title>
      <dc:creator>Paweł Kosiec</dc:creator>
      <pubDate>Tue, 21 Sep 2021 12:55:17 +0000</pubDate>
      <link>https://dev.to/capactio/introducing-capact-your-new-way-to-manage-applications-and-infrastructure-mfj</link>
      <guid>https://dev.to/capactio/introducing-capact-your-new-way-to-manage-applications-and-infrastructure-mfj</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;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 &lt;strong&gt;language-agnostic abstracted capabilities&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;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…&lt;/p&gt;

&lt;p&gt;What if I told you… &lt;strong&gt;now this is all possible&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Introducing Capact, crowdsourced expertise. Learn once, use everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Capact?
&lt;/h2&gt;

&lt;p&gt;Capact is a new way to manage applications and infrastructure and run arbitrary workflows. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g9e0x2lr90rpfyy4tqm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g9e0x2lr90rpfyy4tqm.gif" alt="Here we go again GIF"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;center&gt;&lt;small&gt;source: &lt;a href="https://tenor.com/view/here-wego-again-again-ohboy-sigh-captain-america-gif-15496881" rel="noopener noreferrer"&gt;tenor.com&lt;/a&gt;&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;Yes, we get it. You already know plenty of different tools for that. But Capact is different. How is it different?&lt;/p&gt;

&lt;p&gt;Capact comes with a truly unique feature—&lt;strong&gt;interchangeability of dependencies&lt;/strong&gt;. 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).&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The best thing is that Capact is &lt;strong&gt;fully open-source&lt;/strong&gt; under the Apache 2.0 license. How cool is that? 😎&lt;/p&gt;

&lt;h2&gt;
  
  
  Capact concept in one minute
&lt;/h2&gt;

&lt;p&gt;The whole concept sounds confusing? Let's see that in action.&lt;/p&gt;

&lt;p&gt;Let's take &lt;a href="https://mattermost.com/" rel="noopener noreferrer"&gt;Mattermost&lt;/a&gt; installation as an example. Mattermost is an open-source alternative for Slack.&lt;/p&gt;

&lt;p&gt;Mattermost is a Go server application, which uses a PostgreSQL database. If we want to install Mattermost, this how the workflow would look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tom82qmpf5zs1qh4l0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tom82qmpf5zs1qh4l0d.png" alt="Mattermost installation 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need a PostgreSQL database first to run a Mattermost server. It's pretty simple.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9h0vcc8xrtcmmh3rsa8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9h0vcc8xrtcmmh3rsa8v.png" alt="Mattermost installation 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assuming there are many puzzles pieces out there, you see that only a few of them fit in the slot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0518vrr8of8gj7sqllf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0518vrr8of8gj7sqllf.png" alt="Mattermost installation 3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the case of PostgreSQL installation, four puzzle pieces fit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckj3l9mfq677j1jzy6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckj3l9mfq677j1jzy6v.png" alt="Mattermost installation 4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install PostgreSQL Helm chart on a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;Provision GCP CloudSQL for PostgreSQL database&lt;/li&gt;
&lt;li&gt;Provision AWS RDS for PostgreSQL database&lt;/li&gt;
&lt;li&gt;Reuse existing PostgreSQL database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By default, for a workflow run, Capact picks the first puzzle piece that fits. However, by applying &lt;a href="https://capact.io/docs/feature/policies/overview" rel="noopener noreferrer"&gt;Policy&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;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, &lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; and &lt;a href="https://jitsi.org/jitsi-meet/" rel="noopener noreferrer"&gt;Jitsi Meet&lt;/a&gt;? 🤔&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawhkofh5zuloqql7g3sj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawhkofh5zuloqql7g3sj.png" alt="Mattermost installation 5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="noopener noreferrer"&gt;DRY&lt;/a&gt; at a global scale, together!&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Capact differ from other tools?
&lt;/h2&gt;

&lt;p&gt;Capact doesn't compete with tools you might already be familiar with, but it integrates them instead. Whether you are a &lt;a href="https://helm.sh" rel="noopener noreferrer"&gt;Helm&lt;/a&gt; or &lt;a href="https://terraform.io" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;If you are familiar with &lt;a href="https://kubevela.io/" rel="noopener noreferrer"&gt;Kubevela&lt;/a&gt;, &lt;a href="https://crossplane.io/" rel="noopener noreferrer"&gt;Crossplane&lt;/a&gt;, and &lt;a href="https://oam.dev/" rel="noopener noreferrer"&gt;Open Application Model&lt;/a&gt;, you can see many similarities between the solution and Capact. Here are the main differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capact has unique built-in feature—interchangeable dependencies, which reduces the amount of duplicated code.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To read a detailed comparison between Capact and other tools, see our &lt;a href="https://capact.io/docs/faq#how-does-capact-compare-to" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started with Capact
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/cli/getting-started" rel="noopener noreferrer"&gt;Install Capact CLI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/installation/local" rel="noopener noreferrer"&gt;Install Capact locally with Capact CLI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://capact.io/docs/example/mattermost-installation" rel="noopener noreferrer"&gt;Run different scenarios of Mattermost installation example&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here are other things to do: &lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star our GitHub repository&lt;/strong&gt;: If you like the idea, show your interest in the project and &lt;a href="https://github.com/capactio/capact" rel="noopener noreferrer"&gt;give us a GitHub star&lt;/a&gt;! You can also subscribe for new Capact releases. Thank you for your support!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Follow us:&lt;/strong&gt; Interesting in Capact updates? Follow us on &lt;a href="https://twitter.com/capactio" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;! Also, check out our &lt;a href="https://www.linkedin.com/company/72586376" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; page and &lt;a href="https://www.youtube.com/channel/UCajXtDttqVuZ_Bl7M3_qA8w" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; channel.&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Read our documentation:&lt;/strong&gt; If you want to get familiar with other installation options, examples, content development, or contribution guides, check out the &lt;a href="https://capact.io/docs" rel="noopener noreferrer"&gt;Capact documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🤔 &lt;strong&gt;Get support:&lt;/strong&gt; If you need any help, or you have a question for us, join our &lt;a href="https://capact.io/community/slack" rel="noopener noreferrer"&gt;Slack channel&lt;/a&gt; on the CNCF workspace and post a message—we'll do our best to get you sorted!&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, there's more!
&lt;/h2&gt;

&lt;p&gt;In a series of future blog posts, we will highlight Capact features and cover various topics for all!&lt;/p&gt;

&lt;p&gt;Also, as of September 20th 2021, &lt;strong&gt;a brand-new release&lt;/strong&gt;, Capact 0.5.0, &lt;strong&gt;is here&lt;/strong&gt;. We were working really hard to bring many UX improvements, both for Capact users and content developers. The list includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete Action input validation and more advanced, concurrent Capact manifests validation with optional server-side checks,&lt;/li&gt;
&lt;li&gt;Experimental content development tools for Helm and Terraform-based (AWS and GCP) manifest generation,&lt;/li&gt;
&lt;li&gt;Policy syntax and behavior changes for improving consistency and usability,&lt;/li&gt;
&lt;li&gt;Verbose output for Capact CLI,&lt;/li&gt;
&lt;li&gt;Dependency updates, including migration to Argo 3,&lt;/li&gt;
&lt;li&gt;Air-gapped Capact installation,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://k3d.io" rel="noopener noreferrer"&gt;k3d&lt;/a&gt; support,&lt;/li&gt;
&lt;li&gt;and much, much, more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see the full list of features, read the &lt;a href="https://github.com/capactio/capact/releases/tag/v0.5.0" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Are you ready to start playing around with Capact?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5qwq1d4e4r3fcosazvr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5qwq1d4e4r3fcosazvr.gif" alt="Are you ready GIF"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;center&gt;&lt;small&gt;source: &lt;a href="https://tenor.com/view/are-you-ready-gif-5011220" rel="noopener noreferrer"&gt;tenor.com&lt;/a&gt;&lt;/small&gt;&lt;/center&gt;



&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://capact.io" rel="noopener noreferrer"&gt;https://capact.io&lt;/a&gt; on September 7, 2021 and updated on September 20th, 2021 to highlight that the Capact 0.5.0 release is publicly available.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudnative</category>
      <category>cloud</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
