<?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: haimzlato</title>
    <description>The latest articles on DEV Community by haimzlato (@haimzlato).</description>
    <link>https://dev.to/haimzlato</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%2F1251231%2F21632ae4-d483-4b98-a52f-9100c9fb374f.JPG</url>
      <title>DEV Community: haimzlato</title>
      <link>https://dev.to/haimzlato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/haimzlato"/>
    <language>en</language>
    <item>
      <title>The Next Generation of No-Code: AI, Code, and Diagrams</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Tue, 08 Apr 2025 08:05:59 +0000</pubDate>
      <link>https://dev.to/haimzlato/the-next-generation-of-no-code-ai-code-and-diagrams-3lin</link>
      <guid>https://dev.to/haimzlato/the-next-generation-of-no-code-ai-code-and-diagrams-3lin</guid>
      <description>&lt;p&gt;Automation today is largely driven by no-code and low-code tools, enabling users to create workflows—sequences of tasks across multiple systems that achieve business goals—without needing to write code. However, no-code/low-code as it exists today is set to change. With AI advancements, the traditional approach of visually designing workflows will evolve into a more dynamic, AI-assisted paradigm. In this article, we propose a different way to build automations in the AI era—one that blends AI, visualization, and code for greater flexibility, reliability, and ease of use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strengths and Limitations of No-Code
&lt;/h2&gt;

&lt;p&gt;No-code tools like Zapier, n8n, and Workato make automation more accessible by removing the need to write code or manage execution behind the scenes. They’re great for building and managing relatively simple workflows, offering an intuitive, visual interface that makes automation easy to create and understand.&lt;/p&gt;

&lt;p&gt;However, these tools come with notable limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Limited flexibility&lt;/strong&gt; – Most no-code tools are based on static, linear flows (DAGs) and can only handle a limited number of steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow adoption of new APIs&lt;/strong&gt; – No-code platforms often lag in supporting emerging services, which can be a challenge in fast-moving areas like AI and modern digital tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited control&lt;/strong&gt; – No-code solutions are typically black boxes, offering limited support for error handling, retries, or recovery—making them less suitable for mission-critical applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High costs&lt;/strong&gt; – Pricing can quickly become expensive as usage scales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Low-code tools&lt;/strong&gt; improve on this by allowing developers to inject code into workflows, offering more flexibility and control. But by introducing code, they naturally become more developer-focused.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift Towards AI-Powered No-Code / Low-Code
&lt;/h2&gt;

&lt;p&gt;No-code/low-code automation is evolving from traditional drag-and-drop workflow builders to AI-powered prompt-based systems. This shift is evident in application builders like Lovable and Bolt, as well as automation platforms such as Zapier, 8n8, Workato, and others. These tools now allow users to define automations using natural language prompts, with AI generating initial workflow structures that users can refine and validate through visualization. Also, many automations will be done by AI Agents where the flow might be fuzzy sometimes, but good enough.&lt;/p&gt;

&lt;p&gt;I believe this is only the beginning — the real transformation lies ahead. With the rise of AI tools and prompt-based development (like vibe coding), traditional no-code platforms may start to feel limited and less relevant.&lt;/p&gt;

&lt;h2&gt;
  
  
  How No-code Automations Are Built Today
&lt;/h2&gt;

&lt;p&gt;Building automations—or applications in general—typically involves three main phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planning&lt;/strong&gt; – Defining the flow of what needs to be automated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creating the execution code&lt;/strong&gt;– The code under the hood that implements the automation logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt; – Tracking execution, debugging, and reviewing outcomes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In no-code platforms, from the user’s point of view, planning and creating the execution code are combined into a single step through the visual interface, and the monitoring can also be viewed on the same interface, indicating the execution progress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjnry3ncdqklkl9wbkmup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjnry3ncdqklkl9wbkmup.png" alt="Image description" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With AI-enhanced no-code tools, users describe their needs in a prompt, and AI translates them into an initial visual workflow. This process can be iterative, allowing users to refine and adjust as needed. Before execution, users can visually validate and fine-tune the workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F4houkrl8q93kp7yv9m0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4houkrl8q93kp7yv9m0r.png" alt="Image description" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Automation: AI with Text-based Interface, Visualization, and Code Generation
&lt;/h2&gt;

&lt;p&gt;As prompts become the primary interface for building automations, the value of traditional no-code tools comes into question. If users can describe what they want in natural language, AI can handle both the logic and the visualization. Visual representations are still useful—for review, validation, and explainability—but these too can be generated by AI.&lt;/p&gt;

&lt;p&gt;The future of automation is not about dragging blocks on a canvas. It’s about users interacting with AI through text, building high-level plans that are instantly translated into code and visual workflows. This hybrid model—&lt;strong&gt;textual interface, AI-assisted logic, and generated visuals—offers the flexibility of code with the accessibility of no-code&lt;/strong&gt;.&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s what that could look like:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Users interact with AI through prompts to define a high-level automation plan. The AI responds with a visual representation of the workflow in diagram form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftz1d0iuar1qcil7krpap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftz1d0iuar1qcil7krpap.png" alt="Image description" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the user is satisfied, the automation can be launched—just like in traditional no-code platforms. But unlike no-code tools, there’s no need for a proprietary automation infrastructure. Behind the scenes, the entire process is implemented in code (e.g. in Python) which brings many advantages: flexibility, transparency, version control, and long-term maintainability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdkrh7yzloabwqgz3yhnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdkrh7yzloabwqgz3yhnu.png" alt="Image description" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today’s large language models (LLMs) are capable of generating functional code for the vast majority of use cases currently handled by no-code platforms. And even when the output isn’t perfect, users can iterate with the AI to resolve issues. In edge cases, some basic coding skills may be needed—but that’s a small tradeoff for the added power and control.&lt;/p&gt;

&lt;p&gt;Beyond initial development, AI can further assist by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggesting and implementing error-handling strategies.&lt;/li&gt;
&lt;li&gt;Enhancing logging and monitoring capabilities.&lt;/li&gt;
&lt;li&gt;Acting as an advisor for optimizing workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Missing Piece: Tools and Execution
&lt;/h2&gt;

&lt;p&gt;If AI can generate both code and visual workflows from prompts, what else is needed? Why not just take the code and deploy it directly?&lt;/p&gt;

&lt;p&gt;The answer lies in what no-code platforms have always done well: they bring together critical components that make automation work in the real world—like integrations with third-party services (e.g., Gmail, Slack, and hundreds more), triggers like webhooks and schedulers, execution infrastructure, access controls, monitoring, and lifecycle management.&lt;/p&gt;

&lt;p&gt;Writing the code is often the easy part. Getting that code into production, running reliably at scale, with proper error handling, observability, and security—that’s the hard part. &lt;/p&gt;

&lt;p&gt;The future of automation may be in a platform that brings together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-assisted planning and code generation&lt;/li&gt;
&lt;li&gt;Seamless execution without infrastructure headaches&lt;/li&gt;
&lt;li&gt;Integrations to applications &lt;/li&gt;
&lt;li&gt;Webhooks, scheduled tasks&lt;/li&gt;
&lt;li&gt;Primitives and tools for supporting long-running workflows&lt;/li&gt;
&lt;li&gt;Workflow development and management tools &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid model offers the best of both worlds: the power and flexibility of code, combined with the simplicity of AI-driven automation. This approach is becoming increasingly important as &lt;strong&gt;APIs evolve rapidly&lt;/strong&gt; and new tools emerge—most of which are built for code first. In contrast, no-code platforms often lag behind, requiring time-consuming updates to support new integrations.&lt;/p&gt;

&lt;p&gt;As automation evolves, AI-assisted code generation isn’t just a replacement for no-code—it’s the next step forward. &lt;/p&gt;

&lt;p&gt;** With this in mind, we built &lt;a href="//www.autokitteh.com"&gt;AutoKitteh&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>nocode</category>
      <category>lowcode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Hacking the Python Import System and Rewriting the AST For Durable Execution</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Wed, 18 Dec 2024 13:02:44 +0000</pubDate>
      <link>https://dev.to/haimzlato/hacking-the-import-system-and-rewriting-the-ast-for-durable-execution-5fc9</link>
      <guid>https://dev.to/haimzlato/hacking-the-import-system-and-rewriting-the-ast-for-durable-execution-5fc9</guid>
      <description>&lt;p&gt;At &lt;a href="//www.autokitteh.com"&gt;AutoKitteh&lt;/a&gt;, we run users’ Python code as-is in a way that can redo parts of the execution in case of failures. &lt;br&gt;
This &lt;a href="https://autokitteh.com/technical-blog/hacking-the-import-system-and-rewriting-the-ast-for-durable-execution/" rel="noopener noreferrer"&gt;article&lt;/a&gt; explains the magic.&lt;/p&gt;

&lt;p&gt;In a nutshell, AutoKitteh uses &lt;a href="https://www.temporal.io" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt; to run the user code. It takes the user code and converts functions, such as ml.enrich, into temporal activities. The user code changes function call from event = ml.enrich(event) to event = _ak_call(ml.encrich, event) Where _ak_call does the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhwv6cepgj4rihkgr19l2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhwv6cepgj4rihkgr19l2.png" alt="Image description" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This magic is implemented by AST rewriting. &lt;br&gt;
For more information, read the article.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Build Limitless Automations in Python - "Zapier" for Developers</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Thu, 07 Nov 2024 08:14:16 +0000</pubDate>
      <link>https://dev.to/haimzlato/build-limitless-automations-in-python-zapier-for-developers-134o</link>
      <guid>https://dev.to/haimzlato/build-limitless-automations-in-python-zapier-for-developers-134o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://autokitteh.com/beta-signup/" rel="noopener noreferrer"&gt;Beta registration&lt;/a&gt;, &lt;a href="https://autokitteh.com" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://github.com/autokitteh/autokitteh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://github.com/autokitteh/kittehub" rel="noopener noreferrer"&gt;examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Autokitteh's Beta is now open!!! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://autokitteh.com" rel="noopener noreferrer"&gt;AutoKitteh&lt;/a&gt; is an automation platform specifically designed for Python developers. It's like "Zapier for developers," enabling you to build limitless automations with just a few lines of code.&lt;br&gt;
Unlike, low-code platforms like Zapier, Make, 8n8, and many others, it allows you to build automations in a very simple way, without the limitations of no-code. It's easily extendable and provides almost the full power of Python and the benefits of code such as versioning, enabling easy code reviews etc. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flwnxli4nc8x2ea00of1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flwnxli4nc8x2ea00of1u.png" alt="Image description" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main features of the product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate tasks using just basic Python code.&lt;/li&gt;
&lt;li&gt;Execute long-running, reliable workflows. It ensures your processes are durable and can resume exactly where they left off—even after server restarts.&lt;/li&gt;
&lt;li&gt;Easily connect to applications like Slack, Gmail, GitHub, and many more.&lt;/li&gt;
&lt;li&gt;Define custom triggers for your workflows.&lt;/li&gt;
&lt;li&gt;Deploy with a single click—no infrastructure required.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manage and monitor your workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can be easily extended to connect any API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The target audience is professional and citizen developers familiar with Python that build personal projects or enterprise solutions.&lt;/p&gt;

&lt;p&gt;AutoKitteh is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps, IT and MLOps automation&lt;/li&gt;
&lt;li&gt;Personal and office workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Comparison to other products&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
AutoKitteh is an integration platform similar to Zapier, Make, and Workato. However, instead of focusing on no-code solutions, it offers a low-code interface that leverages the power of Python for developing business logic.&lt;/p&gt;

&lt;p&gt;Additionally, it functions as a durable workflow engine like Temporal and Inngest, providing a transparent Python interface.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Availability&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-hosted, open-source - &lt;a href="https://github.com/autokitteh/autokitteh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SaaS (Free) - &lt;a href="https://autokitteh.com/beta-signup/" rel="noopener noreferrer"&gt;Register to SaaS Beta&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>automation</category>
    </item>
    <item>
      <title>Durable Python: Building Bullet-Proof Long-Running Workflows, Made Simple</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Wed, 04 Sep 2024 14:06:26 +0000</pubDate>
      <link>https://dev.to/haimzlato/durable-python-building-bullet-proof-long-running-workflows-made-simple-49h4</link>
      <guid>https://dev.to/haimzlato/durable-python-building-bullet-proof-long-running-workflows-made-simple-49h4</guid>
      <description>&lt;p&gt;In modern software development, creating robust workflows that connect APIs from various services and handle both synchronous and asynchronous events is a common challenge. The conventional approach involves using a mix of queues, microservices, and state management systems to build scalable applications. While effective, this architecture comes with significant overhead: setting up and maintaining infrastructure like message queues, running servers or lambda functions, managing state in databases, and implementing complex error-handling mechanisms.&lt;/p&gt;

&lt;p&gt;What if there was a simpler, more reliable way to handle long-running workflows without the hassle of managing all this infrastructure? That's the goal of Durable Python, to try it, &lt;a href="https://autokitteh.com/beta-signup/" rel="noopener noreferrer"&gt;register to Beta&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Naive Solutions for Long-Running Processes
&lt;/h2&gt;

&lt;p&gt;Imagine you want to monitor pull requests (PRs) in GitHub. Each time a new PR is opened, you’d like to create a dedicated Slack channel for discussion and send daily reminders until the PR is closed or merged. This sounds straightforward, so you might think you can solve it with a basic Python function (here’s a basic Python function generated by ChatGPT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/webhook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;github_webhook&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pull_request&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;opened&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;pr_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pull_request&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;pr_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pull_request&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;html_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# Create a new Slack channel for the PR
&lt;/span&gt;        &lt;span class="n"&gt;channel_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_slack_channel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pr_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;send_slack_notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Periodically check the PR status and send reminders until it's closed or merged
&lt;/span&gt;        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Wait for 1 hour before checking the status again
&lt;/span&gt;            &lt;span class="n"&gt;pr_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;check_pr_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pr_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pr_status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;send_slack_notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code snippet seems to handle the task, but it's only suitable for the “happy flow” scenario. In real-world applications, this naive approach falls short. The while loop relies on continuous server uptime, which isn’t guaranteed. Processes can crash, servers can restart, and suddenly, your workflow is broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Solution: Event-Driven Applications
&lt;/h2&gt;

&lt;p&gt;A more reliable approach involves building an event-driven application. Here, you would use queues to listen for GitHub events, cron jobs to send reminders, databases to store the PR and channel state, and functions to handle these events. Typically, this setup runs on cloud infrastructure, leveraging services like AWS Lambda for deployment and execution.&lt;/p&gt;

&lt;p&gt;While this method is feasible and robust, it also requires considerable setup, maintenance, and expertise. Managing the infrastructure, ensuring uptime, and handling error states demand significant resources and a skilled team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Durable Python: Simplicity Meets Reliability
&lt;/h2&gt;

&lt;p&gt;What if you could combine the simplicity of the naive Python code with the reliability of an asynchronous design? What if Python could guarantee that even if a process crashes or the server restarts, it would pick up right where it left off?&lt;/p&gt;

&lt;p&gt;&lt;a href="//www.autokitteh.com"&gt;AutoKitteh&lt;/a&gt; addresses precisely this challenge with Durable Python. Using Durable Python, the user writes Python code while the system ensures that if a process restarts, it continues running from the same point. While there are limitations (e.g., long downtime might not be ideal), for most use cases, this solution works perfectly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Durable-Python Offers
&lt;/h2&gt;

&lt;p&gt;Durable-Python saves you from managing state manually, allowing you to write your workflow as a continuous flow rather than an event-driven state machine, which can be challenging to build and debug. &lt;a href="//www.autokitteh.com"&gt;AutoKitteh&lt;/a&gt;, as an infrastructure, has built-in queues and integrations with external applications and APIs, making it easy to quickly develop robust workflows in Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;There’s no magic involved—just solid engineering. AutoKitteh is powered by &lt;a href="//www.temporal.io"&gt;Temporal&lt;/a&gt;, a framework for building durable workflows. Temporal requires a specific way of coding, including an understanding of determinism, idempotency, and other concepts to ensure reliability. AutoKitteh abstracts these complexities, allowing developers to write standard Python code. Under the hood, any function with side effects is converted into a Temporal activity. As a developer, you don’t have to worry about these details—just focus on writing the business logic.&lt;/p&gt;

&lt;p&gt;For more technical details, refer to the &lt;a href="https://docs.autokitteh.com/" rel="noopener noreferrer"&gt;AutoKitteh documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is There a Cost?
&lt;/h2&gt;

&lt;p&gt;Of course, every abstraction has a price. Under the hood, Durable Python records the flow of the workflow to enable recovery after failure, which incurs some storage and performance costs. &lt;/p&gt;

&lt;p&gt;Durable Python is designed for the orchestration of APIs rather than building data applications. If you need high-performance applications, you should consider building a custom solution. However, if you want to quickly develop reliable workflows with minimal development and infrastructure investment, Durable Python might be a good option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Applications
&lt;/h2&gt;

&lt;p&gt;Durable Python can be applied to a wide range of workflows, particularly in domains where reliability is crucial, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API orchestration - build internal reliable workflows. &lt;/li&gt;
&lt;li&gt;DevOps Automation: Automate deployment pipelines or code review automation with guaranteed recovery from failures.&lt;/li&gt;
&lt;li&gt;ChatOps: Integrate with chat platforms to automate team notifications and manage workflows.&lt;/li&gt;
&lt;li&gt;MLOps: Ensure long-running machine learning workflows continue seamlessly despite interruptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples to worflows can be found &lt;a href="https://github.com/autokitteh/kittehub/tree/main" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Less Code, Less Hassle
&lt;/h2&gt;

&lt;p&gt;Durable Python concept, implemented powered by AutoKitteh, empowers developers to build, deploy, and manage reliable workflow automation with minimal code. The durable execution and seamless recovery are handled behind the scenes, so you can focus on what truly matters—your business logic.&lt;/p&gt;

&lt;p&gt;While there are many excellent tools for achieving durability (like Temporal and &lt;a href="https://restate.dev/" rel="noopener noreferrer"&gt;Restate&lt;/a&gt;), Durable-Python provides a fast, simple, and cost-effective way to achieve the same results.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>Room Reservations for Last-Minute Meetings in Slack, Python Automation</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Fri, 30 Aug 2024 19:05:37 +0000</pubDate>
      <link>https://dev.to/haimzlato/room-reservations-for-last-minute-meetings-in-slack-python-automation-477e</link>
      <guid>https://dev.to/haimzlato/room-reservations-for-last-minute-meetings-in-slack-python-automation-477e</guid>
      <description>&lt;p&gt;Managing meeting room availability can be a challenge in busy organizations, especially when it comes to last-minute, ad-hoc bookings. To address this, I developed a Python-based automation tool that seamlessly integrates Slack with Google Calendar, allowing employees to quickly check room availability and book rooms for immediate meetings.&lt;/p&gt;

&lt;p&gt;The Python code is short and easy to modify, can be found &lt;a href="https://github.com/autokitteh/kittehub/tree/main/room_reservation" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;br&gt;
The code if designed for a platform called &lt;a href="https://autokitteh.com/" rel="noopener noreferrer"&gt;AutoKitteh&lt;/a&gt;, which is an open-source project, &lt;a href="https://github.com/autokitteh/autokitteh" rel="noopener noreferrer"&gt;repo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In many companies, meeting rooms are managed as resources within Google Calendar. Each room is associated with a unique email account, and employees can add these rooms to their calendar invites. &lt;/p&gt;

&lt;p&gt;We created a simple Slack interface that enables users to quickly and easily manage ad-hoc bookings, making it ideal for meetings that need to be scheduled within the next 30 minutes (it can be easily modified to any other time frame). The system utilizes three custom Slack slash commands:&lt;/p&gt;

&lt;p&gt;/availablerooms - This command lists all available meeting rooms within the next 30 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmxzqgnuvupfs6pmadoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmxzqgnuvupfs6pmadoa.png" alt="Image description" width="454" height="97"&gt;&lt;/a&gt;&lt;br&gt;
/roomstatus  - By entering room name, users can check the status of a particular room for the next couple of hours, including whether it's available or booked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe96p2p6ldioykkvcksy2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe96p2p6ldioykkvcksy2.png" alt="Image description" width="446" height="92"&gt;&lt;/a&gt;&lt;br&gt;
/reserveroom   - Allows users to reserve a specific room for their meeting, providing the room name and meeting title that will be added to the calendar invite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtyujmj15e3q9795i6nl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtyujmj15e3q9795i6nl.png" alt="Image description" width="457" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Invite in Calendar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjarphq6cw8r3xjyzpszd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjarphq6cw8r3xjyzpszd.png" alt="Image description" width="275" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Implementation: &lt;br&gt;
The automation listens for events in Slack and uses APIs to interact with Google Calendar and Google Sheets. Here’s a breakdown of the process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Room List Management: A Google Sheet serves as a simple database, listing all room email addresses. This setup can be easily modified to include additional details such as room aliases, locations, or capacities.
Example of Google Sheets setup:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1  room1@example.com
2  room2@example.com
3  room3@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integration: The Python scripts handles authentication and communication with Google Calendar, google Calendar and Slack APIs, processing user commands and updating the calendar in real-time.&lt;/p&gt;

&lt;p&gt;For additional useful automation examples, see &lt;a href="https://github.com/autokitteh/kittehub" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>automation</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>Useful automations using Slack, GitHub, Jira, Google tools and more</title>
      <dc:creator>haimzlato</dc:creator>
      <pubDate>Wed, 28 Aug 2024 11:38:23 +0000</pubDate>
      <link>https://dev.to/haimzlato/useful-automations-using-slack-github-jira-google-tools-and-more-3oj9</link>
      <guid>https://dev.to/haimzlato/useful-automations-using-slack-github-jira-google-tools-and-more-3oj9</guid>
      <description>&lt;p&gt;we built relatively simple but useful automations in Python deployed on &lt;a href="https://autokitteh.com/" rel="noopener noreferrer"&gt;AutoKitteh&lt;/a&gt; using integrations to various applications such as GitHub, Slack, Jira, Google Calendar, Google sheets and more. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Categorize new emails in your Gmail inbox using ChatGPT and send notifications to the appropriate Slack channel.&lt;/li&gt;
&lt;li&gt;Automatically set JIRA ticket assignees based on Google Calendar events.&lt;/li&gt;
&lt;li&gt;Scan your Copilot users and request them to free up licenses if not used for two weeks.&lt;/li&gt;
&lt;li&gt;"Break Glass" - Using Slack to orchestrate a temporal elevation of privileges in AWS. A developer asks for privileges in Slack using Slash command, the IT team can approve on deny in Slack form. If approved, the workflow elevates privileges in AWS and reduces back after some period of time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All are written in Python, very short and easy to modify, see &lt;a href="https://github.com/autokitteh/kittehub" rel="noopener noreferrer"&gt;code and additional automations&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You can install the &lt;a href="https://github.com/autokitteh/autokitteh" rel="noopener noreferrer"&gt;platform&lt;/a&gt; and run automation on your PC / Cloud or ask access for the cloud service.&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>devops</category>
      <category>lowcode</category>
    </item>
  </channel>
</rss>
