<?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: Jamie Wright</title>
    <description>The latest articles on DEV Community by Jamie Wright (@wrightj).</description>
    <link>https://dev.to/wrightj</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%2Fuser%2Fprofile_image%2F450871%2Fd44f7bee-4b2a-4cc4-b5ea-b3d5e3346159.jpeg</url>
      <title>DEV Community: Jamie Wright</title>
      <link>https://dev.to/wrightj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wrightj"/>
    <language>en</language>
    <item>
      <title>Juvet Chronicles: Process Architecture</title>
      <dc:creator>Jamie Wright</dc:creator>
      <pubDate>Mon, 30 Nov 2020 22:41:46 +0000</pubDate>
      <link>https://dev.to/wrightj/juvet-chronicles-process-architecture-3dkf</link>
      <guid>https://dev.to/wrightj/juvet-chronicles-process-architecture-3dkf</guid>
      <description>&lt;p&gt;I spent the better half of the last month researching, architecting and implementing the process architecture for &lt;a href="https://github.com/juvet/juvet"&gt;Juvet&lt;/a&gt;. This is an important step when building Elixir applications since every bot in Juvet will be a process with state.&lt;/p&gt;

&lt;p&gt;A lot of the concepts in this architecture was modeled after the logic within &lt;a href="https://www.manning.com/books/the-little-elixir-and-otp-guidebook"&gt;The Little Elixir &amp;amp; OTP Guidebook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Starting the Juvet Application, the following processes are started up:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PSX0I8e9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dvs802o7dlwer26hq78u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PSX0I8e9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dvs802o7dlwer26hq78u.png" alt="Startup Process Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Juvet (Application)&lt;/code&gt; The &lt;code&gt;Application&lt;/code&gt; module for the whole Juvet application. This just starts the &lt;code&gt;BotFactory&lt;/code&gt; &lt;code&gt;Supervisor&lt;/code&gt; and passes the application configuration for &lt;code&gt;Juvet&lt;/code&gt; as the only argument.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BotFactory (Supervisor)&lt;/code&gt;A &lt;code&gt;Supervisor&lt;/code&gt; that is started by the &lt;code&gt;Juvet&lt;/code&gt; &lt;code&gt;Application&lt;/code&gt;. It receives the application configuration as a &lt;code&gt;Keyword&lt;/code&gt; list as it’s only argument. The &lt;code&gt;BotFactory&lt;/code&gt; is used to create and start additional bot processes through the &lt;code&gt;Superintendent&lt;/code&gt;. On initialize, the &lt;code&gt;BotFactory&lt;/code&gt; starts a &lt;code&gt;Superintendent&lt;/code&gt; as it’s only child using the &lt;code&gt;one_for_all&lt;/code&gt; strategy, passing in the config. If the &lt;code&gt;Superintendent&lt;/code&gt; process dies, then everything else should be restarted since it is the brains of the factory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Superintendent (GenServer)&lt;/code&gt; A &lt;code&gt;GenServer&lt;/code&gt; process that is started by the &lt;code&gt;BotFactory&lt;/code&gt; with the application config as it’s only argument. The &lt;code&gt;Superintendent&lt;/code&gt; is the “brains” of the factory and helps it keep running. If the &lt;code&gt;Superintendent&lt;/code&gt; is started with valid configuration, it allows the rest of the factory to start up. It starts an &lt;code&gt;Endpoint&lt;/code&gt; process and a &lt;code&gt;FactorySupervisor&lt;/code&gt; under the &lt;code&gt;BotFactory&lt;/code&gt; &lt;code&gt;Supervisor&lt;/code&gt; if the configuration is valid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the configuration is valid, then the &lt;code&gt;FactorySupervisor&lt;/code&gt; and &lt;code&gt;Endpoint&lt;/code&gt; are started up under the &lt;code&gt;BotFactory&lt;/code&gt; &lt;code&gt;Supervisor&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ibZ76Qmh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ln6q8mdzq3q5pac3bjog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ibZ76Qmh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ln6q8mdzq3q5pac3bjog.png" alt="Valid Configuration Process Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FactorySupervisor (Supervisor)&lt;/code&gt; A &lt;code&gt;Supervisor&lt;/code&gt; that will supervise all the bot processes within the factory. It can add bot processes (under a &lt;code&gt;BotSupervisor&lt;/code&gt;) with it’s functions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Endpoint (Supervisor)&lt;/code&gt;This &lt;code&gt;Supervisor&lt;/code&gt; starts a &lt;a href="https://github.com/ninenines/ranch"&gt;&lt;code&gt;Ranch Listenter&lt;/code&gt;&lt;/a&gt; which is responsible for receiving incoming bot messages from the platforms. For example, Slack will send it’s events, actions, and menu requests to the &lt;code&gt;ranch_listener&lt;/code&gt; child process.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EndpointRouter (Ranch Listener)&lt;/code&gt; The &lt;code&gt;Module&lt;/code&gt; that sets up the routes to the platform endpoints based on the application configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bot can be added to the supervision tree with the following function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{:ok, bot} = Juvet.create_bot(:my_bot_1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a bot is added to the process architecture, the process architecture now adds a &lt;code&gt;BotSupervisor&lt;/code&gt; and a &lt;code&gt;Bot&lt;/code&gt; underneath the &lt;code&gt;FactorySupervisor&lt;/code&gt;. Obviously more than one can be added. There will be one supervisor and one process for each new team that is added.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rWwwKoCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c1py4ugl6ev1ihpcdp24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rWwwKoCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c1py4ugl6ev1ihpcdp24.png" alt="Bot Process Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BotSupervisor (Supervisor)&lt;/code&gt; A &lt;code&gt;Supervisor&lt;/code&gt; that supports the &lt;code&gt;Bot&lt;/code&gt; process and any additional processes like a &lt;code&gt;SlackRTMReceiver&lt;/code&gt; which can listen for incoming messages on a websocket for that particular bot process.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Bot (GenServer)&lt;/code&gt; A &lt;code&gt;GenServer&lt;/code&gt; process that handles incoming and outgoing messages to and from various services. It holds onto conversations within it’s own state for each individual platform and team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the bot is connected to the Slack RTM, a listener is created under the &lt;code&gt;BotSupervisor&lt;/code&gt; and next to the &lt;code&gt;Bot&lt;/code&gt; process. This can be added to the &lt;code&gt;BotSupervisor&lt;/code&gt; with the following function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Juvet.connect_bot(bot, :slack_rtm, %{token: "MY_TOKEN", team_id: "T123456"})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zYPoISmJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ja2loyk7ra4yn1fi69h8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zYPoISmJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ja2loyk7ra4yn1fi69h8.png" alt="Bot with Slack RTM Process Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SlackRTMReceiver (GenServer)&lt;/code&gt; A &lt;code&gt;GenServer&lt;/code&gt; process that connects to Slack via it’s &lt;a href="https://api.slack.com/rtm"&gt;RTM API&lt;/a&gt; and routes incoming and outgoing messages to the &lt;code&gt;Bot&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Time will tell if this is the correct foundation to build an army of bots on. If this was helpful to you or you have suggestions, please email me at jamie AT brilliantfantastic.com. If you are interested in helping build an army of bots, check out my &lt;a href="https://github.com/sponsors/jwright"&gt;GitHub sponsor page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>chatbots</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Announcing Juvet: Working towards a more familiar chat bot framework</title>
      <dc:creator>Jamie Wright</dc:creator>
      <pubDate>Tue, 11 Aug 2020 18:53:24 +0000</pubDate>
      <link>https://dev.to/wrightj/announcing-juvet-working-towards-a-more-familiar-chat-bot-framework-13df</link>
      <guid>https://dev.to/wrightj/announcing-juvet-working-towards-a-more-familiar-chat-bot-framework-13df</guid>
      <description>&lt;p&gt;I have been a fan of chat bots for quite a while, going back to the &lt;a href="https://basecamp.com/retired/campfire"&gt;Campfire&lt;/a&gt; days when I built &lt;a href="https://github.com/github/hubot-scripts/commit/dfdb2805154c8f927ac9d8cee07890a64bda0531#diff-cd0614ffeae829469ec4cc2a9fe50202"&gt;my first plugin&lt;/a&gt;. Since then I have been hooked. I have been &lt;a href="https://www.youtube.com/watch?v=3De5_5Twnjc"&gt;talking about chat bots&lt;/a&gt;, &lt;a href="https://slack.com/apps/A04A2V1QU-tatsu"&gt;building chat bots&lt;/a&gt;, and &lt;a href="https://github.com/tatsuio/dialogue"&gt;providing tools&lt;/a&gt; for others to build chat bots.&lt;/p&gt;

&lt;p&gt;Chat bots are important. They are important to the consumer because they are familiar (you know how to text) and they are easy to access (you already have the software). Chat bots are important to developers and entrepreneurs because they can extend your services and offerings to platforms where the customers already are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers need more familiar tooling for building chat bots.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today I would like to announce &lt;a href="https://github.com/juvet/juvet"&gt;Juvet&lt;/a&gt;, an MVC framework for building chat bots written in Elixir. Its aim is to make the building of chat bots as familiar as building web applications.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/juvet"&gt;
        juvet
      &lt;/a&gt; / &lt;a href="https://github.com/juvet/juvet"&gt;
        juvet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The MVC framework for chat apps built on a platform designed for communication systems.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/juvet/juvet/blob/main/logo.svg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C3QesqG6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/juvet/juvet/raw/main/logo.svg" alt="juvet logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The MVC framework for chat apps built on a platform designed for communication systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
DESCRIPTION&lt;/h2&gt;
&lt;p&gt;Build chat bot applications for the major chat bot application platforms using familiar model-view-controller architecture patterns that developers have been using for decades.&lt;/p&gt;
&lt;p&gt;Juvet is an application framework that includes everything you need to build a chat application for all the major messaging platforms including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.slack.com/rtm" rel="nofollow"&gt;Slack RTM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.slack.com/events-api" rel="nofollow"&gt;Slack Events API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.slack.com/incoming-webhooks" rel="nofollow"&gt;Slack Incoming Webhook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/" rel="nofollow"&gt;Amazon Alexa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/messenger-platform/" rel="nofollow"&gt;Facebook Messenger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/docs/sms" rel="nofollow"&gt;Twillio SMS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Juvet offers all the features you need to build a scalable and maintainable chat application, including&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Wrappers&lt;/li&gt;
&lt;li&gt;Message Queuing&lt;/li&gt;
&lt;li&gt;Middleware and Plugins&lt;/li&gt;
&lt;li&gt;Conversation Support&lt;/li&gt;
&lt;li&gt;NLP Support&lt;/li&gt;
&lt;li&gt;more planned...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
THIS FRAMEWORK IS SPONSORWARE 👐
&lt;/h2&gt;
&lt;p&gt;This repository supports sustainable open source work via &lt;a href="https://github.com/sponsorware/docs"&gt;Sponsorware&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It will be fully open sourced but it is currently only available to people who &lt;a href="https://github.com/sponsors/jwright"&gt;sponsor me on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I want this framework to be supported for the community with…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/juvet/juvet"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;We have amazing tools to build web applications productively. The goal of Juvet is to borrow this same approach and help developers with building chat bots for platforms like Slack, Microsoft Teams, SMS, and more using familiar patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  MVC, you say?
&lt;/h2&gt;

&lt;p&gt;If you look at how chat bots work, you will see that you have a very familiar pattern.&lt;/p&gt;

&lt;p&gt;A conversation request is received from a chat bot platform endpoint (i.e. Slack). Then you, as the developer, process that request within your code, and send back a response to that endpoint.&lt;/p&gt;

&lt;p&gt;Sound’s familiar, right?&lt;/p&gt;

&lt;p&gt;The model-view-controller (MVC) pattern that is used in so many of the popular web frameworks today like Rails, Django, and Laravel, can be adopted to process conversational UIs from chat bots in a similar way.&lt;/p&gt;

&lt;p&gt;This MVC architecture and the organization of code helps developers reason about the system as a whole.&lt;/p&gt;

&lt;p&gt;As a freelancer, I have seen a lot of hard to understand code around the handling of chat bot requests. The request handler is often tied into the same code applying business logic to process the request. A good framework will remove this intertwined dependency from the code that matters to the business. As an early developer in this space, I have built my fair share of code like this.&lt;/p&gt;

&lt;p&gt;However, I recently built a similar MVC framework in Ruby for a chat bot client. The framework I built helped facilitate nimble iterative feature releases and quick bug fixes. I have been a much happier developer working in this familiar framework.&lt;/p&gt;

&lt;p&gt;From this experience, I know that a system like this excels in the real world.&lt;/p&gt;

&lt;p&gt;Juvet will have all the familiar pieces of an MVC framework that you have grown to love, like a router to route requests from a chat bot framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight viml"&gt;&lt;code&gt;defmodule Router &lt;span class="k"&gt;do&lt;/span&gt;
  use Juvet&lt;span class="p"&gt;.&lt;/span&gt;Router

  platform &lt;span class="p"&gt;:&lt;/span&gt;slack &lt;span class="k"&gt;do&lt;/span&gt;
    command&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; TaskController&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    action&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"delete_task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; TaskController&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    event&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"app_home_opened"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; HomeController&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;show&lt;span class="p"&gt;)&lt;/span&gt;

    view_submission&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"create_task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; TaskController&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;create&lt;span class="p"&gt;)&lt;/span&gt;
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A controller and action in Juvet will handle the incoming requests and prepare the data for the response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight viml"&gt;&lt;code&gt;defmodule TaskController &lt;span class="k"&gt;do&lt;/span&gt;
  use Juvet&lt;span class="p"&gt;.&lt;/span&gt;Controller

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;_bot&lt;span class="p"&gt;,&lt;/span&gt; %&lt;span class="p"&gt;{&lt;/span&gt; team_id&lt;span class="p"&gt;:&lt;/span&gt; team_id &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; params&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; Tag&lt;span class="p"&gt;.&lt;/span&gt;find_by_team_id&lt;span class="p"&gt;(&lt;/span&gt;team_id&lt;span class="p"&gt;)&lt;/span&gt;

    render&lt;span class="p"&gt;(:&lt;/span&gt;modal&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"new.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; %&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A view template will be used to describe what the user will see on their chat bot platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight viml"&gt;&lt;code&gt;template &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;title&lt;/span&gt; &lt;span class="s2"&gt;"Create a New Task"&lt;/span&gt;
  callback_id &lt;span class="p"&gt;:&lt;/span&gt;create_task

  blocks &lt;span class="k"&gt;do&lt;/span&gt;
    section &lt;span class="k"&gt;do&lt;/span&gt;
      text &lt;span class="s2"&gt;"Track your work with tasks."&lt;/span&gt;
    end

    divider

    plain_text_input &lt;span class="k"&gt;do&lt;/span&gt;
      block_id &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;title&lt;/span&gt;
      label &lt;span class="s2"&gt;"Title"&lt;/span&gt;
      hint &lt;span class="s2"&gt;"A short description of your task"&lt;/span&gt;
      optional false
      placeholder &lt;span class="s2"&gt;"Get milk"&lt;/span&gt;
    end

    plain_text_input &lt;span class="k"&gt;do&lt;/span&gt;
      block_id &lt;span class="p"&gt;:&lt;/span&gt;description
      label &lt;span class="s2"&gt;"Description"&lt;/span&gt;
      multiline&lt;span class="p"&gt;:&lt;/span&gt; true
      optional true
      placeholder &lt;span class="s2"&gt;" "&lt;/span&gt;
    end

    checkboxes_input &lt;span class="k"&gt;do&lt;/span&gt;
      label &lt;span class="s2"&gt;"Tags"&lt;/span&gt;
      &lt;span class="k"&gt;options&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;tag&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="k"&gt;tags&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
          text &lt;span class="k"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;name
          value &lt;span class="k"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;id
        end
      end
    end
  end

  submit &lt;span class="s2"&gt;"Save Task"&lt;/span&gt;
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The result is a beautifully crafted response that the user sees inside Slack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gEztRobQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://brilliantfantastic.com/static/cb246634fbe8fb3a0ed11a76da94880d/2d7ab/slack-modal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEztRobQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://brilliantfantastic.com/static/cb246634fbe8fb3a0ed11a76da94880d/2d7ab/slack-modal.png" alt="Slack modal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Elixir?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://elixir-lang.org/"&gt;Elixir&lt;/a&gt; is the perfect language and framework for building chat bots.&lt;/p&gt;

&lt;p&gt;First, Elixir runs on top of the &lt;a href="https://www.erlang.org/"&gt;Erlang&lt;/a&gt; virtual machine. Erlang was developed at Ericsson to handle communication systems. 90% of all internet traffic going through routers and switches controlled by Erlang.&lt;/p&gt;

&lt;p&gt;Sounds perfect.&lt;/p&gt;

&lt;p&gt;Erlang is used to build massively scalable soft real-time systems with requirements on high availability. Scalable real-time systems? High availability?&lt;/p&gt;

&lt;p&gt;Sounds like chat bots.&lt;/p&gt;

&lt;p&gt;Elixir can leverage the Erlang OTP library, which is a set of libraries which facilitate the scalability and fault tolerance properties of Erlang.&lt;/p&gt;

&lt;p&gt;Elixir developers can create small OTP processes that can hold state and these sandboxed processes can pass messages to other processes with no ceremony. Each process can represent a single sandboxed chat bot. If one process goes down, only one chat bot goes down. This is not possible in frameworks built in Ruby or Node without a lot of home-spun code to protect you from bringing down all the bots on your system.&lt;/p&gt;

&lt;p&gt;These OTP processes can fail and be spun up again automagically. Even new code can be deployed and these OTP processes will not be shut down, allowing you to deploy new Elixir code at any time without interrupting the bots.&lt;/p&gt;

&lt;p&gt;Sounds perfect.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can support this
&lt;/h2&gt;

&lt;p&gt;Juvet will be open source so that every developer and organization can take advantage of this framework to help develop for multiple chat bot platforms rapidly.&lt;/p&gt;

&lt;p&gt;I want the development on this framework to be sustainable for me as I plan on putting a lot of energy and effort into this project alongside my day to day work.&lt;/p&gt;

&lt;p&gt;Currently Juvet is being developed under the &lt;a href="https://github.com/sponsorware/docs"&gt;Sponsorware&lt;/a&gt; release strategy for open source. The project is open only to GitHub sponsors until the goal of 75 sponsors is reached. At that time, Juvet will be open sourced for all.&lt;/p&gt;

&lt;p&gt;If you are an early sponsor, you will help direct the project as you will have full access to the unreleased private repository where you can submit pull requests and open up issues. In addition, you will be able receive updates on the progress of the project, video tutorials on how to use Juvet, tips on chat bot development, and a few special surprises I have in mind.&lt;/p&gt;

&lt;p&gt;If you care about the chat bot industry or if you are interested in building chat bots for yourself or your organization, please &lt;a href="https://github.com/sponsors/jwright"&gt;consider supporting this endevor by sponsoring me on GitHub&lt;/a&gt;. I’d love to thank &lt;a href="https://github.com/keiththomps"&gt;Keith&lt;/a&gt; on being my very first sponsor on GitHub. 😍&lt;/p&gt;

&lt;p&gt;My hope is that Juvet will be my little dent in the chat bot development world. I hope it helps moves more developers to build such fun little programs.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>chatbots</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
