<?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: Swrly</title>
    <description>The latest articles on DEV Community by Swrly (@swrly).</description>
    <link>https://dev.to/swrly</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%2F3862452%2Fe6202e6b-2cf9-4a2e-8a40-f5aaba5aafb8.png</url>
      <title>DEV Community: Swrly</title>
      <link>https://dev.to/swrly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/swrly"/>
    <language>en</language>
    <item>
      <title>Build a Daily Standup Digest with Swrly</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 05 Apr 2026 20:41:14 +0000</pubDate>
      <link>https://dev.to/swrly/build-a-daily-standup-digest-with-swrly-1ela</link>
      <guid>https://dev.to/swrly/build-a-daily-standup-digest-with-swrly-1ela</guid>
      <description>&lt;p&gt;Daily standups are useful in theory. In practice, half the team forgets to post, someone copies yesterday's update, and the channel fills with messages nobody reads. The information exists -- it is in your commits and your tickets. The problem is gathering it.&lt;/p&gt;

&lt;p&gt;This tutorial builds a Swrly workflow that runs every weekday morning, pulls the last 24 hours of activity from GitHub and Linear, summarizes it into a readable digest, and posts it to Slack. No one has to remember to write anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;A 5-node workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fires automatically at 8:00 AM on weekdays via a cron trigger&lt;/li&gt;
&lt;li&gt;Pulls recent commits from GitHub (last 24 hours)&lt;/li&gt;
&lt;li&gt;Pulls completed tickets from Linear (last 24 hours)&lt;/li&gt;
&lt;li&gt;Runs an AI agent that combines both data sources into a concise standup digest&lt;/li&gt;
&lt;li&gt;Posts the digest to &lt;code&gt;#standup&lt;/code&gt; in Slack&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a single Slack message every morning that tells the team what shipped yesterday. No meetings, no manual updates, no forgotten standups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Swrly account (Pro plan or higher -- cron triggers require a paid plan)&lt;/li&gt;
&lt;li&gt;A GitHub repository (or organization) with recent commit activity&lt;/li&gt;
&lt;li&gt;A Linear workspace with completed issues&lt;/li&gt;
&lt;li&gt;A Slack workspace with a &lt;code&gt;#standup&lt;/code&gt; channel&lt;/li&gt;
&lt;li&gt;Your Claude Code session token (Settings &amp;gt; API Keys)&lt;/li&gt;
&lt;li&gt;GitHub, Linear, and Slack integrations connected in Settings &amp;gt; Integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Create the Swirl and Add a Cron Trigger
&lt;/h2&gt;

&lt;p&gt;Create a new swirl from the dashboard and name it "Daily Standup Digest."&lt;/p&gt;

&lt;p&gt;Drag a &lt;strong&gt;Trigger&lt;/strong&gt; node onto the canvas. Click it and set the trigger type to &lt;strong&gt;Cron&lt;/strong&gt;. Configure the schedule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cron Expression:&lt;/strong&gt; &lt;code&gt;0 8 * * 1-5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; Your team's timezone (e.g., &lt;code&gt;America/New_York&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This expression means "at 08:00, Monday through Friday." The cron scheduler in Swrly uses standard 5-field cron syntax. Here is a quick breakdown:&lt;/p&gt;

&lt;p&gt;| Field | Value | Meaning |&lt;br&gt;
|&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>github</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Build a Customer Support Triage Agent in 15 Minutes</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 05 Apr 2026 20:41:10 +0000</pubDate>
      <link>https://dev.to/swrly/build-a-customer-support-triage-agent-in-15-minutes-5d5g</link>
      <guid>https://dev.to/swrly/build-a-customer-support-triage-agent-in-15-minutes-5d5g</guid>
      <description>&lt;p&gt;Every support team has the same bottleneck: someone reads each incoming ticket, decides how urgent it is, and routes it to the right channel. It is repetitive, time-sensitive, and easy to get wrong at 2am. An AI agent can do this classification in seconds, consistently, around the clock.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will build a support triage workflow in Swrly that reads incoming tickets, assigns a priority from P1 to P4, and routes them to the appropriate Slack channel. The whole thing takes about 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;A 5-node workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receives support tickets via a webhook from your support form or helpdesk&lt;/li&gt;
&lt;li&gt;Runs an AI classifier agent that reads the ticket and assigns a priority (P1-P4)&lt;/li&gt;
&lt;li&gt;Evaluates the priority with a condition node&lt;/li&gt;
&lt;li&gt;Routes P1/P2 tickets to &lt;code&gt;#urgent-support&lt;/code&gt; in Slack&lt;/li&gt;
&lt;li&gt;Routes P3/P4 tickets to &lt;code&gt;#support-queue&lt;/code&gt; in Slack&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the end, new support tickets will be automatically triaged and routed to the right people without anyone manually reading and sorting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Swrly account (free plan works)&lt;/li&gt;
&lt;li&gt;A Slack workspace with two channels: &lt;code&gt;#urgent-support&lt;/code&gt; and &lt;code&gt;#support-queue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your Claude Code session token (paste it in Settings &amp;gt; API Keys)&lt;/li&gt;
&lt;li&gt;Slack integration connected in Settings &amp;gt; Integrations&lt;/li&gt;
&lt;li&gt;A support form, helpdesk, or any system that can send webhooks (Typeform, Intercom, Zendesk, or even a simple HTML form with a backend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Create the Swirl and Add a Webhook Trigger
&lt;/h2&gt;

&lt;p&gt;Log into Swrly and click &lt;strong&gt;New Swirl&lt;/strong&gt; from the dashboard. Name it "Support Triage Bot."&lt;/p&gt;

&lt;p&gt;You will land on the visual builder with an empty canvas. Drag a &lt;strong&gt;Trigger&lt;/strong&gt; node onto the canvas. Click it to open the configuration panel and set the trigger type to &lt;strong&gt;Webhook&lt;/strong&gt;. Copy the generated webhook URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://swrly.com/api/v1/webhooks/trigger/wh_abc123def456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This URL is what your support form will POST to. The payload should include the ticket details. A typical payload looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ticket_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TKT-4821"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cannot access billing dashboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I have been trying to access the billing page for the last 3 hours. Every time I click on Settings &amp;gt; Billing, the page shows a white screen. I am on the Enterprise plan and this is blocking our team from updating payment details before our renewal tomorrow."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ops@acmecorp.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enterprise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"submitted_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-03T14:32:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point your support form's webhook to this URL. If you are using Zendesk, Intercom, or Freshdesk, check their webhook/automation settings to forward new tickets here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add the Classifier Agent
&lt;/h2&gt;

&lt;p&gt;Drag an &lt;strong&gt;Agent&lt;/strong&gt; node onto the canvas and connect it to the trigger node by drawing an edge from the trigger's output port to the agent's input port. Name this agent &lt;strong&gt;Ticket Classifier&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Click the agent node to configure it. The system prompt is the core of this workflow. Here is one that works well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a customer support triage specialist. You receive incoming
support tickets and classify them by priority.

Read the ticket subject, body, customer plan, and any other context
provided. Assign exactly one priority level:

- P1 (Critical): Service is down, data loss, security incident, or
  billing blocked for Enterprise customers. Immediate action required.
- P2 (High): Major feature broken, significant degradation, or
  billing issues for any paid plan. Response within 1 hour.
- P3 (Medium): Feature not working as expected, minor bugs, how-to
  questions from paid customers. Response within 4 hours.
- P4 (Low): General questions, feature requests, feedback, free-tier
  how-to questions. Response within 24 hours.

Consider the customer's plan when classifying. An Enterprise customer
reporting a broken feature is P2, not P3. A free-tier user asking a
how-to question is P4, not P3.

You MUST end your response with exactly one of these lines:
- "PRIORITY: P1"
- "PRIORITY: P2"
- "PRIORITY: P3"
- "PRIORITY: P4"

Before the priority line, write 2-3 sentences explaining your
reasoning. Reference specific details from the ticket.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under &lt;strong&gt;Agent Settings&lt;/strong&gt;, configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max Turns:&lt;/strong&gt; &lt;code&gt;3&lt;/code&gt; -- this agent does not need tools, it is doing pure classification based on the input text. Three turns is plenty of headroom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accumulate Context:&lt;/strong&gt; &lt;code&gt;enabled&lt;/code&gt; -- ensures the agent sees the full trigger payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output Format:&lt;/strong&gt; &lt;code&gt;text&lt;/code&gt; -- the condition node will parse the output text for the priority string.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This agent does not need any MCP tools. It is a reasoning-only agent that reads the ticket content from the trigger payload and produces a classification. No external API calls required.&lt;/p&gt;

&lt;p&gt;For the example ticket above (enterprise customer, billing page broken, renewal tomorrow), the agent would produce something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is an Enterprise customer reporting that the billing dashboard
is completely inaccessible, with a renewal deadline tomorrow. The
combination of a broken core feature and time-sensitive business
impact for a top-tier customer makes this critical.

PRIORITY: P1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Add the Condition Node
&lt;/h2&gt;

&lt;p&gt;Drag a &lt;strong&gt;Condition&lt;/strong&gt; node onto the canvas and connect it to the Ticket Classifier's output. This node decides which Slack channel receives the ticket.&lt;/p&gt;

&lt;p&gt;Click the condition node and configure the rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field:&lt;/strong&gt; &lt;code&gt;output&lt;/code&gt; (the classifier agent's text output)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operator:&lt;/strong&gt; &lt;code&gt;contains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value:&lt;/strong&gt; &lt;code&gt;PRIORITY: P1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait -- that only catches P1. You need P2 as well. Here is the approach: set the condition to check if the output contains &lt;code&gt;PRIORITY: P1&lt;/code&gt; or &lt;code&gt;PRIORITY: P2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Since condition nodes evaluate a single rule, use the &lt;code&gt;contains&lt;/code&gt; operator with the value &lt;code&gt;PRIORITY: P1&lt;/code&gt;. Then add a second condition rule with &lt;code&gt;PRIORITY: P2&lt;/code&gt; and set the rule logic to &lt;strong&gt;OR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Alternatively, you can use a simpler approach. Structure your agent prompt so that high-priority tickets output a specific keyword. Update the classifier prompt to also include this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After the PRIORITY line, add "ROUTE: URGENT" for P1/P2 or
"ROUTE: STANDARD" for P3/P4.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure the condition node as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field:&lt;/strong&gt; &lt;code&gt;output&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operator:&lt;/strong&gt; &lt;code&gt;contains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value:&lt;/strong&gt; &lt;code&gt;ROUTE: URGENT&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the output contains "ROUTE: URGENT," the workflow follows the &lt;strong&gt;true&lt;/strong&gt; branch (P1/P2). Otherwise, it follows the &lt;strong&gt;false&lt;/strong&gt; branch (P3/P4). Clean and reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add the Slack Integration Nodes
&lt;/h2&gt;

&lt;p&gt;Now add two &lt;strong&gt;Integration&lt;/strong&gt; nodes, one for each branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Urgent branch (true):&lt;/strong&gt; Drag a Slack integration node and connect it to the condition's true output port. Configure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Slack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; &lt;code&gt;slack_send_message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel:&lt;/strong&gt; &lt;code&gt;#urgent-support&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message template:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;:rotating_light: &lt;span class="ge"&gt;*P1/P2 Support Ticket*&lt;/span&gt;

&lt;span class="ge"&gt;*Ticket:*&lt;/span&gt; {{trigger.ticket_id}}
&lt;span class="ge"&gt;*Subject:*&lt;/span&gt; {{trigger.subject}}
&lt;span class="ge"&gt;*Customer:*&lt;/span&gt; {{trigger.customer_email}} ({{trigger.plan}} plan)

&lt;span class="ge"&gt;*AI Triage Summary:*&lt;/span&gt;
{{ticket_classifier.output}}

&lt;span class="ge"&gt;_Please respond within 1 hour. Triage powered by Swrly._&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Standard branch (false):&lt;/strong&gt; Drag another Slack integration node and connect it to the condition's false output port. Configure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Slack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; &lt;code&gt;slack_send_message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel:&lt;/strong&gt; &lt;code&gt;#support-queue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message template:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="ge"&gt;*P3/P4 Support Ticket*&lt;/span&gt;

&lt;span class="ge"&gt;*Ticket:*&lt;/span&gt; {{trigger.ticket_id}}
&lt;span class="ge"&gt;*Subject:*&lt;/span&gt; {{trigger.subject}}
&lt;span class="ge"&gt;*Customer:*&lt;/span&gt; {{trigger.customer_email}} ({{trigger.plan}} plan)

&lt;span class="ge"&gt;*AI Triage Summary:*&lt;/span&gt;
{{ticket_classifier.output}}

&lt;span class="ge"&gt;_Triage powered by Swrly._&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that &lt;code&gt;{{trigger.*}}&lt;/code&gt; pulls fields from the webhook payload, while &lt;code&gt;{{ticket_classifier.output}}&lt;/code&gt; pulls the AI agent's classification output. The template resolver handles the variable substitution at runtime using slugified node labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Test the Workflow
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; in the top bar. Before connecting real ticket sources, test the workflow end-to-end.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save and Run&lt;/strong&gt; and provide a test payload. Try a P1 scenario first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ticket_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TEST-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Production API returning 500 errors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"All API endpoints have been returning 500 errors for the past 20 minutes. Our entire application is down. We are on the Enterprise plan and this is affecting thousands of users."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cto@bigcorp.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enterprise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"submitted_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-03T15:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watch the execution overlay on the canvas. The trigger fires, the classifier agent thinks for a few seconds, the condition evaluates to true, and a message appears in &lt;code&gt;#urgent-support&lt;/code&gt;. The whole run should complete in under 15 seconds.&lt;/p&gt;

&lt;p&gt;Now test a P4 scenario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ticket_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TEST-002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How do I export my data?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hi, I am on the free plan and was wondering if there is a way to export my project data to CSV."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"free"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"submitted_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-03T15:01:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time the condition should evaluate to false, and the message lands in &lt;code&gt;#support-queue&lt;/code&gt;. Check both channels to confirm the messages look correct and the template variables resolved properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Once the basic triage is working, here are some ways to extend it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a database logging step.&lt;/strong&gt; Insert an integration node before the Slack notifications that writes the ticket ID, priority, and timestamp to a Postgres or Airtable table. This gives you a triage audit trail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wire it to your ticketing system.&lt;/strong&gt; Add integration nodes that call the Zendesk or Linear API to automatically set the priority field on the ticket. The AI classified it -- now the classification is reflected in your actual helpdesk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add an approval node for P1 tickets.&lt;/strong&gt; For critical incidents, insert an Approval node between the classifier and the Slack notification. A team lead confirms the P1 classification before the urgent alert fires. This prevents false alarms from waking someone up at 3am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a feedback loop.&lt;/strong&gt; Track cases where a human overrides the AI's classification. Over time, refine your system prompt based on the patterns. If the agent consistently over-classifies free-tier issues as P3, tighten the prompt guidance for that case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add sentiment analysis.&lt;/strong&gt; Extend the classifier prompt to also detect customer sentiment (frustrated, neutral, satisfied). Route frustrated customers to a senior support rep regardless of technical priority.&lt;/p&gt;

&lt;p&gt;The core pattern here -- webhook in, AI classification, conditional routing, notification out -- applies to far more than support tickets. Use it for lead scoring, content moderation, alert triage, or any workflow where you need fast, consistent categorization at scale.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Build a PR Reviewer Workflow in 10 Minutes</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 05 Apr 2026 15:39:30 +0000</pubDate>
      <link>https://dev.to/swrly/build-a-pr-reviewer-workflow-in-10-minutes-1cop</link>
      <guid>https://dev.to/swrly/build-a-pr-reviewer-workflow-in-10-minutes-1cop</guid>
      <description>&lt;p&gt;One of the most common tasks engineering teams automate with Swrly is PR review. Not replacing human reviewers — augmenting them. An AI agent reads the diff, flags potential issues, and routes the result to the right Slack channel. The human reviewer gets a head start. The team gets notified instantly.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will build this workflow from scratch. It takes about 10 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;A 5-node workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Triggers automatically when a PR is opened on GitHub&lt;/li&gt;
&lt;li&gt;Runs an AI code reviewer that analyzes the diff&lt;/li&gt;
&lt;li&gt;Checks whether the reviewer approved or flagged issues&lt;/li&gt;
&lt;li&gt;Posts to &lt;code&gt;#shipped&lt;/code&gt; if approved, or &lt;code&gt;#reviews&lt;/code&gt; if changes are needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the end, you will have a fully automated PR review pipeline running on your own Claude Code subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Swrly account (free plan works)&lt;/li&gt;
&lt;li&gt;A GitHub repository you own or have admin access to&lt;/li&gt;
&lt;li&gt;A Slack workspace with two channels: &lt;code&gt;#shipped&lt;/code&gt; and &lt;code&gt;#reviews&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your Claude Code session token (paste it in Settings &amp;gt; API Keys)&lt;/li&gt;
&lt;li&gt;GitHub and Slack integrations connected in Settings &amp;gt; Integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Create a New Swirl and Add a Webhook Trigger
&lt;/h2&gt;

&lt;p&gt;Log into Swrly and click &lt;strong&gt;New Swirl&lt;/strong&gt; from the dashboard. Name it "PR Review Bot."&lt;/p&gt;

&lt;p&gt;You will land on the visual builder — an empty canvas with a sidebar on the left showing available node types.&lt;/p&gt;

&lt;p&gt;Drag a &lt;strong&gt;Trigger&lt;/strong&gt; node onto the canvas. Click it to open the configuration panel. Set the trigger type to &lt;strong&gt;Webhook&lt;/strong&gt; and copy the generated webhook URL. It will look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://swrly.com/api/v1/webhooks/trigger/wh_abc123def456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go to your GitHub repository. Navigate to &lt;strong&gt;Settings &amp;gt; Webhooks &amp;gt; Add webhook&lt;/strong&gt;. Paste the Swrly webhook URL. Set the content type to &lt;code&gt;application/json&lt;/code&gt;. Under "Which events would you like to trigger this webhook?", select &lt;strong&gt;Pull requests&lt;/strong&gt; only. Save the webhook.&lt;/p&gt;

&lt;p&gt;Back in Swrly, your trigger node is now listening. Every time a PR is opened, reopened, or synchronized on that repo, this workflow will fire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add a Code Reviewer Agent
&lt;/h2&gt;

&lt;p&gt;Drag an &lt;strong&gt;Agent&lt;/strong&gt; node onto the canvas and connect it to the trigger node by drawing an edge from the trigger's output port to the agent's input port.&lt;/p&gt;

&lt;p&gt;Click the agent node to configure it. Set the name to &lt;strong&gt;Code Reviewer&lt;/strong&gt;. Now write the system prompt — this is the most important part. Here is a prompt that works well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a senior code reviewer specializing in TypeScript and React
applications. When given a pull request, you must:
&lt;span class="p"&gt;
1.&lt;/span&gt; Fetch the list of changed files using the github_list_pr_files tool
&lt;span class="p"&gt;2.&lt;/span&gt; For each changed file, fetch its content using github_get_content
&lt;span class="p"&gt;3.&lt;/span&gt; Analyze the changes for:
&lt;span class="p"&gt;   -&lt;/span&gt; Security vulnerabilities (SQL injection, XSS, credential exposure)
&lt;span class="p"&gt;   -&lt;/span&gt; Performance issues (unnecessary re-renders, missing memoization, N+1 queries)
&lt;span class="p"&gt;   -&lt;/span&gt; Error handling gaps (uncaught promises, missing try/catch blocks)
&lt;span class="p"&gt;   -&lt;/span&gt; Code style violations (inconsistent naming, dead code, missing types)
&lt;span class="p"&gt;4.&lt;/span&gt; Write a concise review summary

IMPORTANT: End your review with exactly one of these two lines:
&lt;span class="p"&gt;-&lt;/span&gt; "VERDICT: APPROVED" if the code is ready to merge
&lt;span class="p"&gt;-&lt;/span&gt; "VERDICT: NEEDS_REVISION" if changes are required

After the verdict, include a brief summary paragraph explaining your decision.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under &lt;strong&gt;Agent Settings&lt;/strong&gt;, configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max Turns:&lt;/strong&gt; &lt;code&gt;15&lt;/code&gt; — complex PRs may require multiple tool calls to fetch all files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accumulate Context:&lt;/strong&gt; &lt;code&gt;enabled&lt;/code&gt; — the agent retains context from the trigger payload, which includes the PR number and repository information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools:&lt;/strong&gt; Enable &lt;code&gt;github_list_pr_files&lt;/code&gt;, &lt;code&gt;github_get_content&lt;/code&gt;, and &lt;code&gt;github_get_pull_request&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;maxTurns&lt;/code&gt; setting is important here. A PR with 8 changed files requires at least 9 tool calls (one to list files, one per file). Setting it too low will cut the agent off mid-review. Setting it too high wastes tokens on edge cases. 15 is a good default for most review workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Understanding the GitHub Integration
&lt;/h2&gt;

&lt;p&gt;When the Code Reviewer agent runs, it has access to GitHub MCP tools. Here is what each one does in this workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;github_list_pr_files&lt;/code&gt;&lt;/strong&gt; — Returns the list of files changed in the PR, including the filename, status (added/modified/removed), and the number of additions and deletions. The agent uses this to know which files to inspect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;github_get_content&lt;/code&gt;&lt;/strong&gt; — Fetches the full content of a specific file from the repository. The agent calls this for each changed file to read the actual code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;github_get_pull_request&lt;/code&gt;&lt;/strong&gt; — Retrieves PR metadata: title, description, author, base branch, head branch, and labels. Useful for context about what the PR is supposed to do.&lt;/p&gt;

&lt;p&gt;You do not need to write any code to use these tools. The agent calls them automatically based on its system prompt. Swrly handles authentication using your connected GitHub integration — the agent uses your GitHub token, scoped to the repositories you have authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add a Condition Node for Branching
&lt;/h2&gt;

&lt;p&gt;This is where the workflow gets interesting. Drag a &lt;strong&gt;Condition&lt;/strong&gt; node onto the canvas and connect it to the Code Reviewer's output.&lt;/p&gt;

&lt;p&gt;Click the condition node and configure the rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field:&lt;/strong&gt; &lt;code&gt;output&lt;/code&gt; (the agent's text output)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operator:&lt;/strong&gt; &lt;code&gt;contains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value:&lt;/strong&gt; &lt;code&gt;VERDICT: APPROVED&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The condition node evaluates this rule against the Code Reviewer's output. If the output contains "VERDICT: APPROVED," the workflow follows the &lt;strong&gt;true&lt;/strong&gt; branch. Otherwise, it follows the &lt;strong&gt;false&lt;/strong&gt; branch.&lt;/p&gt;

&lt;p&gt;Swrly condition nodes support six operators:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;equals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exact string match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;not_equals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inverted exact match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;contains&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Substring search (what we are using)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;not_contains&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inverted substring search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;greater_than&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numeric comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;less_than&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numeric comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For this workflow, &lt;code&gt;contains&lt;/code&gt; is the right choice. The agent's output is free-form text, and we are looking for a specific verdict string within it. Using &lt;code&gt;equals&lt;/code&gt; would fail because the output contains much more than just the verdict line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Add Slack Notifications on Both Branches
&lt;/h2&gt;

&lt;p&gt;Now add two &lt;strong&gt;Integration&lt;/strong&gt; nodes — one for each branch of the condition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approved branch (true):&lt;/strong&gt; Drag a Slack integration node and connect it to the condition's true output port. Configure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Slack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; &lt;code&gt;slack_send_message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel:&lt;/strong&gt; &lt;code&gt;#shipped&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message template:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;:white_check_mark: &lt;span class="ge"&gt;*PR Auto-Review: APPROVED*&lt;/span&gt;

&lt;span class="ge"&gt;*Repository:*&lt;/span&gt; {{trigger.repository.full_name}}
&lt;span class="ge"&gt;*PR:*&lt;/span&gt; #{{trigger.pull_request.number}} — {{trigger.pull_request.title}}
&lt;span class="ge"&gt;*Author:*&lt;/span&gt; {{trigger.pull_request.user.login}}

The automated code review found no significant issues. This PR is ready for human review and merge.

&lt;span class="ge"&gt;_Review powered by Swrly_&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Needs revision branch (false):&lt;/strong&gt; Drag another Slack integration node and connect it to the condition's false output port. Configure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Slack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; &lt;code&gt;slack_send_message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel:&lt;/strong&gt; &lt;code&gt;#reviews&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message template:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;:warning: &lt;span class="ge"&gt;*PR Auto-Review: NEEDS REVISION*&lt;/span&gt;

&lt;span class="ge"&gt;*Repository:*&lt;/span&gt; {{trigger.repository.full_name}}
&lt;span class="ge"&gt;*PR:*&lt;/span&gt; #{{trigger.pull_request.number}} — {{trigger.pull_request.title}}
&lt;span class="ge"&gt;*Author:*&lt;/span&gt; {{trigger.pull_request.user.login}}

&lt;span class="ge"&gt;*Review Summary:*&lt;/span&gt;
{{steps.code_reviewer.output}}

&lt;span class="ge"&gt;_Review powered by Swrly_&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the template syntax: &lt;code&gt;{{trigger.*}}&lt;/code&gt; references the webhook payload from step 1, and &lt;code&gt;{{steps.code_reviewer.output}}&lt;/code&gt; references the Code Reviewer agent's output. Swrly's template resolver handles the variable substitution at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Save, Test, and Deploy
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; in the top bar (or press &lt;code&gt;Cmd+S&lt;/code&gt;). Your workflow is now persisted.&lt;/p&gt;

&lt;p&gt;Before connecting it to real PRs, test it with a single node. Click the Code Reviewer agent node, then click the &lt;strong&gt;Test&lt;/strong&gt; button in the configuration panel. Swrly will run just that node with a sample payload. Verify that it fetches files, analyzes them, and produces a verdict.&lt;/p&gt;

&lt;p&gt;You can also use &lt;strong&gt;Save and Run&lt;/strong&gt; to execute the entire workflow end-to-end with a test payload. The execution overlay will light up each node as it runs — you can watch the trigger fire, the agent think, the condition evaluate, and the Slack message send, all in real time on the canvas.&lt;/p&gt;

&lt;p&gt;Once you are satisfied, open a real PR on the connected repository. The webhook will fire, the workflow will run, and within 30-60 seconds you will see a message in the appropriate Slack channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for Production Use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tune &lt;code&gt;maxTurns&lt;/code&gt; based on your codebase.&lt;/strong&gt; If your PRs typically touch 15+ files, increase it to 20-25. Monitor token usage in the run history to find the sweet spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;accumulateContext&lt;/code&gt; for multi-agent chains.&lt;/strong&gt; If you add a second agent after the Code Reviewer (for example, a "Documentation Checker" that verifies README updates), enable context accumulation so the second agent can see the first agent's findings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add an approval node for critical repos.&lt;/strong&gt; For production repositories, insert an Approval node before the Slack notification. A team lead reviews the AI's verdict before it is posted. This adds a human checkpoint without losing the automation benefit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create separate workflows for different event types.&lt;/strong&gt; Rather than one workflow that handles &lt;code&gt;opened&lt;/code&gt;, &lt;code&gt;synchronize&lt;/code&gt;, and &lt;code&gt;closed&lt;/code&gt; events, create focused workflows for each. A review workflow for &lt;code&gt;opened&lt;/code&gt;, a re-review workflow for &lt;code&gt;synchronize&lt;/code&gt;, and a cleanup workflow for &lt;code&gt;closed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor with run history.&lt;/strong&gt; Every execution is logged with timestamps, token usage, and full input/output for each node. If the reviewer starts producing inconsistent verdicts, check the run history to see what changed in the PR payloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Built
&lt;/h2&gt;

&lt;p&gt;In about 10 minutes, you built an automated PR review pipeline that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Triggers on real GitHub events with no polling&lt;/li&gt;
&lt;li&gt;Runs an AI code reviewer with access to your repository&lt;/li&gt;
&lt;li&gt;Branches based on the review outcome&lt;/li&gt;
&lt;li&gt;Notifies the right people in the right channel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Python scripts. No cron jobs. No infrastructure to manage. Just a visual workflow running on your own Claude Code subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Sign up free at &lt;a href="https://swrly.com" rel="noopener noreferrer"&gt;swrly.com&lt;/a&gt; and build your first workflow. The PR reviewer is a great starting point, but teams are using Swrly for bug triage, documentation generation, deployment pipelines, customer support routing, and much more.&lt;/p&gt;




&lt;p&gt;Questions about this tutorial? Reach out at &lt;a href="mailto:hello@swrly.com"&gt;hello@swrly.com&lt;/a&gt; or open a discussion on &lt;a href="https://github.com/teamswrly" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introducing Swrly — Visual AI Agent Orchestration for Dev Teams</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 05 Apr 2026 15:38:31 +0000</pubDate>
      <link>https://dev.to/swrly/introducing-swrly-visual-ai-agent-orchestration-for-dev-teams-3258</link>
      <guid>https://dev.to/swrly/introducing-swrly-visual-ai-agent-orchestration-for-dev-teams-3258</guid>
      <description>&lt;p&gt;Hey Dev.to community!&lt;/p&gt;

&lt;p&gt;Excited to share &lt;strong&gt;Swrly&lt;/strong&gt; — an AI agent orchestration platform for engineering teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Building AI agent workflows usually means a tangle of Python scripts, each agent in its own cron job, no visibility into what is happening, and debugging means reading logs line by line.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Swrly does
&lt;/h2&gt;

&lt;p&gt;Swrly gives you a &lt;strong&gt;visual drag-and-drop builder&lt;/strong&gt; where you create named AI agent teams (we call them swirls). Each agent has a clear role — Code Reviewer, PR Summarizer, Incident Responder — and you wire them together with conditions, triggers, and integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual builder&lt;/strong&gt; — drag agents onto a canvas, connect them, set triggers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;47+ connectors&lt;/strong&gt; — GitHub, Slack, Linear, Jira, Notion, Sentry, PagerDuty, databases, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BYOK (Bring Your Own Key)&lt;/strong&gt; — use your own AI subscription. No per-token markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full observability&lt;/strong&gt; — watch every agent think in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart triggers&lt;/strong&gt; — manual, webhook, cron, API, or event-based&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free to start
&lt;/h2&gt;

&lt;p&gt;Starter plan is genuinely free — 50 runs/month, 5 agents, 5 swirls. No credit card required.&lt;/p&gt;

&lt;p&gt;We are just getting started and would love feedback. If you are automating anything with AI — PR reviews, incident triage, deploy notifications — I would love to hear what problems you are running into.&lt;/p&gt;

&lt;p&gt;Check it out at &lt;a href="https://swrly.com" rel="noopener noreferrer"&gt;swrly.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will be sharing tutorials here on building specific workflows. First up: building a PR review pipeline in 10 minutes.&lt;/p&gt;

&lt;p&gt;Happy building!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
