<?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>Forem: Krisada Vivek</title>
    <description>The latest articles on Forem by Krisada Vivek (@3lvv0w).</description>
    <link>https://forem.com/3lvv0w</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%2F248142%2F7a27d60a-715e-45d6-80e4-bc6eb030399e.jpg</url>
      <title>Forem: Krisada Vivek</title>
      <link>https://forem.com/3lvv0w</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/3lvv0w"/>
    <language>en</language>
    <item>
      <title>ทำไม Vibe Coding คือหายนะที่ Senior Dev เห็น แต่คุณไม่: เจาะลึก 7 ขั้นตอนใช้ AI เขียนโค้ดแบบมืออาชีพ (Senior Approved)</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Tue, 31 Mar 2026 07:28:10 +0000</pubDate>
      <link>https://forem.com/3lvv0w/thamaim-vibe-coding-khuuehaaynathii-senior-dev-ehn-aetkhunaim-ecchaaaluek-7-khantnaich-ai-4m42</link>
      <guid>https://forem.com/3lvv0w/thamaim-vibe-coding-khuuehaaynathii-senior-dev-ehn-aetkhunaim-ecchaaaluek-7-khantnaich-ai-4m42</guid>
      <description>&lt;p&gt;ในยุคที่ &lt;strong&gt;Claude Code&lt;/strong&gt;, &lt;strong&gt;Cursor&lt;/strong&gt;, และเครื่องมือ AI เขียนโค้ดเบ่งบานราวดอกไม้ไฟ เรามักจะเห็น Hook ชวนฝันว่า:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"สร้างเว็บเสร็จใน 5 นาที เพียงแค่พิมพ์ Prompt เดียว!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;เทรนด์นี้ถูกเรียกว่า &lt;strong&gt;"Vibe Coding"&lt;/strong&gt; ซึ่งทำให้การเขียนโปรแกรมดูเป็นเรื่องง่ายและสนุก&lt;/p&gt;

&lt;p&gt;แต่ทำไม Software Engineer ประสบการณ์ 20 ปี และอดีต Director of Engineering อย่างคุณ &lt;strong&gt;Owain Lewis&lt;/strong&gt; ถึงมองว่านี่คือ &lt;strong&gt;"หายนะ" ที่รอวันระเบิด?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;วันนี้เราจะมาแกะรอยบทความของคุณ Owain และคุณเอฟ (เจ้าของโพสต์ต้นทาง) เพื่อทำความเข้าใจความแตกต่างระหว่าง &lt;strong&gt;"โค้ดที่รันได้ตอนทดสอบ"&lt;/strong&gt; กับ &lt;strong&gt;"โค้ดที่มีคุณภาพสำหรับ Production"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;และเปิดเผย &lt;strong&gt;7 ขั้นตอนการทำงาน&lt;/strong&gt; ที่บริษัทระดับโลกอย่าง Google หรือ Amazon ใช้ ซึ่งจะช่วยให้คุณใช้ AI ทำงานเสร็จไวขึ้น 300% โดยที่ระบบไม่พังเมื่อลูกค้าเริ่มใช้งาน&lt;/p&gt;




&lt;h2&gt;
  
  
  บทสรุปของ "Vibe Coding" คืออะไร?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt; คือการที่เราใช้ความรู้สึก (Vibe) นำทางการโค้ดดิ่ง เรามีไอเดียคร่าวๆ พิมพ์ลงไปใน AI ให้มันเสกโค้ดออกมา แล้วเราก็ก๊อปปี้แปะ ถ้ามันรันผ่านบนหน้าจอเรา เราก็รู้สึกว่า &lt;strong&gt;"เสร็จแล้ว"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;แต่ความจริงในโลก Engineering นั้นโหดร้ายกว่ามาก:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ทำเสร็จ ≠ ทำดี:&lt;/strong&gt; โค้ดที่รันผ่านในเครื่องเรา (Local) อาจจะมีช่องโหว่ด้าน Security, ก่อให้เกิด Technical Debt (หนี้ทางเทคนิค) มหาศาล, หรือไม่ได้ออกแบบมาให้รองรับคนใช้งานจำนวนมาก (Scaling Issue)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เมื่อถึง Production:&lt;/strong&gt; เมื่อลูกค้าเริ่มใช้จริง สิ่งที่ Vibe Coding ทิ้งไว้มักจะเป็น Error รัวๆ ที่แก้ได้ยากมาก เพราะคนสั่ง AI ไม่เคยอ่านโค้ด หรือไม่เข้าใจโครงสร้างที่ AI มั่วขึ้นมาให้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เครื่องมืออย่าง Claude หรือ Cursor ก็เป็นแค่เครื่องมือ พลังที่แท้จริงไม่ได้อยู่ที่ Prompt วิเศษ แต่อยู่ที่ &lt;strong&gt;Workflow การทำงานจริง&lt;/strong&gt; ซึ่ง AI ควรทำหน้าที่ &lt;strong&gt;"เร่งความเร็ว"&lt;/strong&gt; ไม่ใช่ &lt;strong&gt;"แทนที่กระบวนการคิด"&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  เจาะลึก Mental Model: 7 ขั้นตอนการทำงานร่วมกับ AI ระดับโปร
&lt;/h2&gt;

&lt;p&gt;เพื่อให้คุณเป็น Dev ที่เก่งกว่าคน 99% นี่คือ 7 ขั้นตอนที่คุณควรนำ AI ไปแทรกซึมเพื่อเร่งสปีด:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Requirements (คิดก่อนทำ)
&lt;/h3&gt;

&lt;p&gt;ก่อนจะตะโกนสั่ง AI ให้สร้าง "แอปส่งอาหารแบบ Lineman" อย่าพึ่งใจร้อนให้มันเขียนโค้ด ให้ AI ช่วยคิดและรีเสิร์ชข้อมูลก่อน โดยการให้ AI ช่วยเขียน &lt;strong&gt;Product Requirements Document (PRD)&lt;/strong&gt; ที่ดี ซึ่งควรประกอบด้วย:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; สิ่งที่จะสร้างคืออะไร&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; ทำไมเราถึงสร้างมัน&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who:&lt;/strong&gt; สร้างให้ใครใช้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope:&lt;/strong&gt; อะไรอยู่ในขอบเขต / นอกขอบเขตของการทำงานรอบนี้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI สามารถช่วยร่างต้นแบบ (&lt;strong&gt;Prototype&lt;/strong&gt;) หรือ &lt;strong&gt;Mockup&lt;/strong&gt; ได้ไวมาก เพื่อให้เราเห็นภาพตรงกันก่อนลงมือ&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Design (วางโครงสร้าง)
&lt;/h3&gt;

&lt;p&gt;Requirements บอกว่า &lt;strong&gt;"สร้างอะไร"&lt;/strong&gt; แต่ Design จะบอกว่า &lt;strong&gt;"สร้างอย่างไร"&lt;/strong&gt; ขั้นตอนนี้สำคัญที่สุดและแก้ยากที่สุด AI สามารถให้คำแนะนำได้ แต่ &lt;strong&gt;มนุษย์ต้องเป็นคนตัดสินใจ final&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; จะใช้ Microservices หรือ Monolith?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; SQL หรือ NoSQL?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; ระบบ Auth จะใช้เจ้าไหน (Firebase, Auth0)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;อย่าปล่อยให้ AI ตัดสินใจเรื่องเหล่านี้ให้ทั้งหมด&lt;/em&gt; เพราะมันอาจจะเลือกสิ่งที่ "เป็นที่นิยมในเน็ต" แต่ไม่ได้เหมาะกับ Business Context ของคุณจริงๆ&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Plan (หั่นงานเป็นชิ้นเล็ก)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;กฎเหล็ก: 1 งาน ต่อ 1 Agent&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;อย่าสั่ง AI แบบเหมาเข่งว่า "สร้างระบบอีคอมเมิร์ซให้หน่อย" เพราะ context จะมั่วและ AI จะเดา (Hallucinate) ทันที ให้คุณซอยงานเป็นข้อเล็กๆ (Sub-tasks) เช่น:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; ทำหน้า UI ลงทะเบียน&lt;/li&gt;
&lt;li&gt; ทำ API สำหรับ Register&lt;/li&gt;
&lt;li&gt; เขียนเทสต์เคสสำหรับหน้า Register&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ถ้าคุณไม่รู้ว่าจะซอยงานยังไง ให้สั่ง AI ว่า: &lt;em&gt;"ฉันมี requirements A และ Design B ช่วยซอยงานนี้เป็นข้อเล็กๆ ให้ฉันหน่อย"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Build (บรีฟให้ชัด ไม่ใช่แค่สั่ง)
&lt;/h3&gt;

&lt;p&gt;AI ไม่ใช่ผู้วิเศษที่จะรู้ใจคุณ ถ้าคุณไม่มี Context ที่ชัดเจน มันก็จะเดาและทำพลาด การเขียนระบุบริบท (&lt;strong&gt;Provide Context&lt;/strong&gt;) ให้ดีก่อนสั่งสร้าง จะช่วยให้คุณได้โค้ดที่ถูกต้องโดยไม่ต้องสั่งแก้ซ้ำซ้อน ซึ่งเปลือง Token และเสียเวลา&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Review (อย่าไว้ใจทาง อย่าวางใจ AI)
&lt;/h3&gt;

&lt;p&gt;นี่คือขั้นตอนที่ Vibe Coder ข้ามมากที่สุด การแค่กด "Accept" โค้ดที่ AI เขียนมาโดยไม่ดูด้วยตัวเอง คือการฝังระเบิดเวลาไว้ในโปรเจกต์&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ความจริง:&lt;/strong&gt; AI มักจะเขียนโค้ดที่ใช้งานได้ &lt;em&gt;ในกรณีทั่วไป&lt;/em&gt; แต่ไม่ได้คำนึงถึง Edge Case หรือความปลอดภัย&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;วิธีที่โปร:&lt;/strong&gt; สั่ง AI ตัวอื่นมา Review โค้ดนี้ หรืออย่างน้อยคุณต้องอ่านและทำความเข้าใจมันทุกบรรทัด&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Deploy (ปล่อยของ)
&lt;/h3&gt;

&lt;p&gt;การเอาเว็บขึ้นระบบจริงมักจะมีศัพท์เทคนิคอย่าง CI/CD, Pipeline, Containerization ที่น่าปวดหัว ถ้าคุณไม่ถนัด ให้สั่ง AI ช่วยอธิบายการตั้งค่า หรือสั่งให้มันนำทำทีละขั้น (&lt;strong&gt;Guided Steps&lt;/strong&gt;) จนเอาระบบขึ้นให้คนอื่นใช้งานได้จริงได้สำเร็จ&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Monitor (เฝ้าระวัง)
&lt;/h3&gt;

&lt;p&gt;เมื่อระบบรันอยู่บน Production ของจริงมัน &lt;strong&gt;"พังได้เสมอ"&lt;/strong&gt; เป็นเรื่องปกติ เราต้องตั้งระบบตรวจจับ Error และระบบแจ้งเตือน (&lt;strong&gt;Alerts&lt;/strong&gt;) เอาไว้ เพื่อที่คุณจะได้รู้ตัวและแก้ไขได้ทัน ก่อนที่ผู้ใช้งานจะทักมาด่าในแชท&lt;/p&gt;




&lt;h2&gt;
  
  
  บทสรุป
&lt;/h2&gt;

&lt;p&gt;ศัตรูที่แท้จริงของการพัฒนาซอฟต์แวร์ไม่ใช่ AI และไม่ใช่เทรนด์ใหม่ๆ แต่คือ &lt;strong&gt;"การไม่ยอมคิดเองตั้งแต่แรก"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;การ Vibe Coding คือการละทิ้งกระบวนการคิดและวางแผนทั้งหมด ซึ่งเป็นหัวใจหลักของงาน Engineering การที่คุณจะสั่ง AI แค่ว่า "สร้างมาให้หน่อย" โดยไม่มีแผน ไม่มีโครงสร้าง สุดท้ายคุณจะได้แค่โค้ดที่ใช้งานได้ แต่รอวันพัง และเมื่อมันพัง คุณก็แก้ไม่ได้เพราะคุณไม่ได้เป็นคน "สร้าง" มันจริงๆ&lt;/p&gt;

&lt;p&gt;แต่ถ้าคุณทำการบ้านมาดีและทำตาม 7 ขั้นตอนนี้ โดยให้ AI ช่วยเร่งความเร็วในแต่ละส่วน สุดท้ายคุณจะได้ซอฟต์แวร์ที่ทั้งมีคุณภาพ และที่สำคัญคือ คุณ &lt;strong&gt;"เข้าใจมันอย่างแท้จริง"&lt;/strong&gt; ค้าบ&lt;/p&gt;




&lt;p&gt;*ขอบคุณเนื้อหาต้นฉบับจาก Owain Lewis&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Modern IoT Part 2: Setting Up the LINE Bot &amp; Serverless Webhook (2026 Edition)</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Wed, 11 Feb 2026 04:00:00 +0000</pubDate>
      <link>https://forem.com/3lvv0w/modern-iot-part-2-setting-up-the-line-bot-serverless-webhook-2026-edition-8io</link>
      <guid>https://forem.com/3lvv0w/modern-iot-part-2-setting-up-the-line-bot-serverless-webhook-2026-edition-8io</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back to the &lt;strong&gt;IoT Weekend 2026&lt;/strong&gt; series!&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;&lt;a href="https://dev.toPUT_LINK_TO_PART_1_HERE"&gt;Part 1: The 2026 Architecture&lt;/a&gt;&lt;/strong&gt;, we established our foundation by setting up a secure, serverless &lt;strong&gt;HiveMQ Cloud Broker&lt;/strong&gt; for MQTT 5.0 communication. We decided to ditch the old, insecure ways of 2018 in favor of TLS encryption and scalable infrastructure.&lt;/p&gt;

&lt;p&gt;Today, in &lt;strong&gt;Part 2&lt;/strong&gt;, we are building the "brain" of our operation. We are moving away from long-running, expensive servers and deploying a high-performance &lt;strong&gt;TypeScript Webhook&lt;/strong&gt; on &lt;strong&gt;Vercel&lt;/strong&gt; to handle interactions from the &lt;strong&gt;LINE Messaging API&lt;/strong&gt;.&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%2F39pow7pti474x3itbfcl.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%2F39pow7pti474x3itbfcl.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Goal for Part 2
&lt;/h3&gt;

&lt;p&gt;By the end of this tutorial, you will have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Created a LINE Messaging API Channel.&lt;/li&gt;
&lt;li&gt; Designed a modern UI using LINE Rich Menus.&lt;/li&gt;
&lt;li&gt; Coded and deployed a Serverless Webhook on Vercel.&lt;/li&gt;
&lt;li&gt; Successfully published a secure MQTT message via a chat command.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1: Create your LINE Messaging API Channel
&lt;/h2&gt;

&lt;p&gt;To let users talk to our system, we need a LINE Official Account.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Log in to the &lt;a href="https://developers.line.biz/" rel="noopener noreferrer"&gt;LINE Developers Console&lt;/a&gt; with your LINE account.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create a new Provider:&lt;/strong&gt; If you don't have one, create one. Name it something like "My Smart Home".&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create a Messaging API Channel:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Select your provider and create a new channel of type "Messaging API".&lt;/li&gt;
&lt;li&gt;Give your Bot a name (e.g., "HomeController-26") and upload a nice profile picture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Get your Credentials:&lt;/strong&gt; Once created, navigate to the &lt;strong&gt;Messaging API&lt;/strong&gt; tab. Scroll down and issue a &lt;strong&gt;Channel access token (long-lived)&lt;/strong&gt;. Copy this token and your &lt;strong&gt;Channel secret&lt;/strong&gt; (found on the Basic settings tab) to a safe place. We need them for Step 4.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 2: Designing the 2026 UI (Rich Menu)
&lt;/h2&gt;

&lt;p&gt;In the old days, we asked users to type "ON" or "OFF". That's bad UX. In 2026, we use &lt;strong&gt;Rich Menus&lt;/strong&gt;—a persistent menu bar at the bottom of the chat screen.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to the &lt;a href="https://manager.line.biz/" rel="noopener noreferrer"&gt;LINE Official Account Manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Select your account from the list.&lt;/li&gt;
&lt;li&gt; Navigate to &lt;strong&gt;Home &amp;gt; Rich menus &amp;gt; Create new&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Design a simple menu with two large buttons.&lt;/li&gt;
&lt;li&gt; Set the &lt;strong&gt;Action type&lt;/strong&gt; for both buttons to &lt;strong&gt;Text&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;Button 1 Text: &lt;code&gt;ON&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Button 2 Text: &lt;code&gt;OFF&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; Save and activate the menu as the default for all users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, when you tap a button, it sends the text command automatically!&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Coding the Serverless Webhook
&lt;/h2&gt;

&lt;p&gt;We will use &lt;strong&gt;Next.js API Routes&lt;/strong&gt; hosted on Vercel. This function will wake up only when LINE sends an event, process it, and go back to sleep—saving immense costs compared to a 24/7 server.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Initialize the project
&lt;/h3&gt;

&lt;p&gt;Open your terminal and create a new Next.js project with TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest iot-webhook &lt;span class="nt"&gt;--ts&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;iot-webhook
npm &lt;span class="nb"&gt;install &lt;/span&gt;mqtt @line/bot-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create the Webhook Logic
&lt;/h3&gt;

&lt;p&gt;In a modern serverless environment, we want our function to be stateless and fast. Create a new file at &lt;code&gt;src/pages/api/webhook.ts&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This script performs three critical tasks: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verifies&lt;/strong&gt; the incoming request from LINE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connects&lt;/strong&gt; to HiveMQ using TLS (Port 8883).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publishes&lt;/strong&gt; the command and &lt;strong&gt;Replies&lt;/strong&gt; to the user.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/pages/api/webhook.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WebhookEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TextMessage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@line/bot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mqtt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mqtt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Initialize LINE SDK with environment variables&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lineConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;channelAccessToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LINE_ACCESS_TOKEN&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;channelSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LINE_CHANNEL_SECRET&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lineClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lineConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Only allow POST requests from LINE&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WebhookEvent&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Process events in parallel&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;replyToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replyToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Secure MQTT Connection (TLS 1.3)&lt;/span&gt;
    &lt;span class="c1"&gt;// We connect within the handler to ensure a fresh session for the serverless hit&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mqttClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mqtt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`mqtts://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MQTT_BROKER&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MQTT_USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MQTT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ON&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home/living-room/light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;qos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;lineClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replyMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;replyToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;💡 Light turned ON&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home/living-room/light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;qos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;lineClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replyMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;replyToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🌑 Light turned OFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MQTT/LINE Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// 3. Gracefully close MQTT connection to allow the Lambda to freeze&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Deployment &amp;amp; Security
&lt;/h2&gt;

&lt;p&gt;In 2026, we never hardcode credentials. We use environment variables to keep our secrets safe and our code clean.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Push to GitHub:&lt;/strong&gt; Create a private repository and push your Next.js project.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Connect to Vercel:&lt;/strong&gt; Import your repository into Vercel.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Configure Environment Variables:&lt;/strong&gt; In the Vercel Dashboard, navigate to &lt;strong&gt;Settings &amp;gt; Environment Variables&lt;/strong&gt; and add the following keys:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;LINE_ACCESS_TOKEN&lt;/code&gt; (Your Long-lived Channel Access Token)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LINE_CHANNEL_SECRET&lt;/code&gt; (Found in Basic Settings)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MQTT_BROKER&lt;/code&gt; (Your HiveMQ Cluster URL, e.g., &lt;code&gt;xxx.s1.eu.hivemq.cloud&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MQTT_USER&lt;/code&gt; (The MQTT credentials created in Part 1)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MQTT_PASSWORD&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Configure Webhook:&lt;/strong&gt; * Once deployed, copy your Vercel deployment URL (e.g., &lt;code&gt;https://iot-webhook.vercel.app/api/webhook&lt;/code&gt;).

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;LINE Developers Console &amp;gt; Messaging API tab&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Paste the URL into the &lt;strong&gt;Webhook URL&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Toggle &lt;strong&gt;"Use Webhook"&lt;/strong&gt; to &lt;strong&gt;Enabled&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 5: Testing the Logic
&lt;/h2&gt;

&lt;p&gt;Now it’s time to see the cloud-to-cloud communication in action.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open the LINE Bot&lt;/strong&gt; on your smartphone.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Tap the "ON" button&lt;/strong&gt; on your Rich Menu (which we designed in Step 2).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Check HiveMQ:&lt;/strong&gt; Open your &lt;a href="https://console.hivemq.cloud/" rel="noopener noreferrer"&gt;HiveMQ Cloud Web Console&lt;/a&gt;. Under the "Web Client" tab, you should see a message &lt;code&gt;1&lt;/code&gt; published to the topic &lt;code&gt;home/living-room/light&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Check LINE:&lt;/strong&gt; Your Bot should reply instantly: &lt;em&gt;"💡 Light turned ON"&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;By leveraging &lt;strong&gt;Serverless functions&lt;/strong&gt;, our bot only "lives" for the few milliseconds it takes to process a command. We’ve eliminated the need for a 24/7 running server, making this architecture highly cost-efficient, low-maintenance, and ready for the 2026 standard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Coming Up Next
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, we finally bridge the gap between bits and atoms! We will flash our &lt;strong&gt;ESP32-S3&lt;/strong&gt; with C++ code to listen to these secure MQTT messages and finally toggle a physical LED in your room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Coding!&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  IoT #LINEAPI #Vercel #TypeScript #MQTT #SmartHome #DeveloperExperience
&lt;/h1&gt;

</description>
      <category>iot</category>
      <category>mqtt</category>
      <category>arduino</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Modern IoT: Controlling Devices via LINE Bot, MQTT, and Serverless (2026 Edition)</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Fri, 06 Feb 2026 06:55:40 +0000</pubDate>
      <link>https://forem.com/3lvv0w/modern-iot-controlling-devices-via-line-bot-mqtt-and-serverless-2026-edition-3dal</link>
      <guid>https://forem.com/3lvv0w/modern-iot-controlling-devices-via-line-bot-mqtt-and-serverless-2026-edition-3dal</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Back in 2018, I started an &lt;a href="https://medium.com/linedevth/iot-weekend-%E0%B8%84%E0%B8%A7%E0%B8%9A%E0%B8%84%E0%B8%B8%E0%B8%A1%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%9B%E0%B8%B4%E0%B8%94-%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B8%AB%E0%B8%A5%E0%B8%AD%E0%B8%94%E0%B9%84%E0%B8%9F%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-line-bot-%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99-messaging-api-%E0%B9%81%E0%B8%A5%E0%B8%B0-mqtt-protocol-ver-93f703abecfc" rel="noopener noreferrer"&gt;"IoT Weekend"&lt;/a&gt; project using Heroku and CloudMQTT. Fast forward to 2026, the landscape has changed significantly. We have moved away from permanent virtual servers toward more robust serverless options, better security standards, and more efficient hardware. &lt;/p&gt;

&lt;p&gt;In this updated guide, I’ll show you how to build a smart-home controller using the &lt;strong&gt;LINE Messaging API&lt;/strong&gt; and &lt;strong&gt;MQTT&lt;/strong&gt;, modernized for today’s developer workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 2026 Architecture
&lt;/h3&gt;

&lt;p&gt;The flow remains elegant but is now more scalable and secure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User&lt;/strong&gt; triggers a command via a LINE Rich Menu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LINE Platform&lt;/strong&gt; hits a &lt;strong&gt;Serverless Webhook&lt;/strong&gt; (Vercel/Next.js).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook&lt;/strong&gt; publishes a secure message to a &lt;strong&gt;Cloud MQTT Broker&lt;/strong&gt; (HiveMQ/EMQX).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Device&lt;/strong&gt; (ESP32-S3) receives the command via a TLS-secured connection and toggles the hardware.&lt;/li&gt;
&lt;/ol&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%2Frlt4qszr19sfzq66zf47.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%2Frlt4qszr19sfzq66zf47.png" alt="The 2026 Architecture" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; ESP32-S3 (with built-in hardware security)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol:&lt;/strong&gt; MQTT 5.0 (The modern standard for low-latency IoT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Next.js / TypeScript (deployed on Vercel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broker:&lt;/strong&gt; HiveMQ Cloud (Serverless MQTT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; LINE Messaging API v2&lt;/li&gt;
&lt;/ul&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%2Fvj0x2qcz7u4j58d3tbec.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%2Fvj0x2qcz7u4j58d3tbec.png" alt="Key Tech Stack" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MQTT 5.0 in 2026?
&lt;/h2&gt;

&lt;p&gt;While REST APIs are great, MQTT 5.0 is the backbone of the "Matter" era. It offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary Data handling:&lt;/strong&gt; Highly efficient for tiny sensors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Subscriptions:&lt;/strong&gt; Better load balancing for multiple devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Auth:&lt;/strong&gt; We now use TLS/SSL by default to ensure no one "sniffs" your home commands.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LINE Developers Account:&lt;/strong&gt; To create your provider and channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HiveMQ Cloud (Free Tier):&lt;/strong&gt; Our modern MQTT broker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel Account:&lt;/strong&gt; For hosting our webhook without managing servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; ESP32-S3, an LED, and a 220-ohm resistor.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1: Setting up the Modern MQTT Broker
&lt;/h2&gt;

&lt;p&gt;We’re skipping the old Heroku add-ons for a dedicated IoT SaaS.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://www.hivemq.com/mqtt-cloud-broker/" rel="noopener noreferrer"&gt;HiveMQ Cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Serverless Cluster&lt;/strong&gt; (Free).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security First:&lt;/strong&gt; Create a "Database User" in the HiveMQ console. This credential will be used by your ESP32 and Webhook.&lt;/li&gt;
&lt;li&gt;Note your &lt;strong&gt;Cluster URL&lt;/strong&gt; (e.g., &lt;code&gt;xxxxxx.s1.eu.hivemq.cloud&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Deploying the Webhook (Serverless)
&lt;/h2&gt;

&lt;p&gt;Instead of a long-running server, we use a TypeScript function. It wakes up, sends the MQTT command, and goes back to sleep—saving costs and resources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// api/webhook.ts (Next.js / Vercel)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mqtt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mqtt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mqtt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mqtts://YOUR_CLUSTER_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_USER&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_PASSWORD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8883&lt;/span&gt; &lt;span class="c1"&gt;// Secure port&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ON&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home/living-room/light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Hardware Evolution (ESP32-S3)
&lt;/h2&gt;

&lt;p&gt;In 2026, we no longer use unencrypted connections (Port 1883). Modern IoT hardware like the &lt;strong&gt;ESP32-S3&lt;/strong&gt; features hardware acceleration for encryption, allowing us to use &lt;strong&gt;TLS/SSL (Port 8883)&lt;/strong&gt; with minimal impact on performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secure Connection Code (Arduino IDE Compatible)
&lt;/h3&gt;

&lt;p&gt;To run this in the &lt;strong&gt;Arduino IDE&lt;/strong&gt;, make sure you have installed the &lt;strong&gt;ArduinoMqttClient&lt;/strong&gt; library via the Library Manager. This code uses &lt;code&gt;WiFiClientSecure&lt;/code&gt; to handle the modern MQTT 5.0 encrypted handshake.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFiClientSecure.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;ArduinoMqttClient.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// WiFi &amp;amp; HiveMQ Credentials&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ssid&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"YOUR_WIFI_SSID"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"YOUR_WIFI_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;broker&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"YOUR_CLUSTER_URL.s1.eu.hivemq.cloud"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mqttUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"YOUR_DEVICE_USER"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mqttPass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"YOUR_DEVICE_PASS"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;WiFiClientSecure&lt;/span&gt; &lt;span class="n"&gt;wifiClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;MqttClient&lt;/span&gt; &lt;span class="nf"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wifiClient&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The LED pin - Pin 2 is common for built-in LEDs, adjust if using ESP32-S3 DevKit&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Connect to WiFi&lt;/span&gt;
  &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// In 2026, we prioritize TLS 1.3&lt;/span&gt;
  &lt;span class="c1"&gt;// For development, we can skip cert validation, but production should use setCACert()&lt;/span&gt;
  &lt;span class="n"&gt;wifiClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setInsecure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

  &lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ESP32_Line_Controller"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setUsernamePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mqttUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mqttPass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Attempting to connect to MQTT broker: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8883&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MQTT connection failed! Error code = "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connectError&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Connected to HiveMQ!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"home/living-room/light"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Keep the connection alive and check for messages&lt;/span&gt;
  &lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Listen for the '1' or '0' payload sent from your LINE Bot via Vercel&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;mqttClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Message received: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary: 2018 vs. 2026 Standards
&lt;/h2&gt;

&lt;p&gt;The transition from 2018 to 2026 represents a shift from "making it work" to "making it secure and scalable." Below is a comparison of how the tech stack has evolved over the years.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;2018 Approach&lt;/th&gt;
&lt;th&gt;2026 Modern Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Heroku (Monolithic)&lt;/td&gt;
&lt;td&gt;Vercel / Cloudflare (Serverless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MQTT Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MQTT 3.1.1 (Insecure)&lt;/td&gt;
&lt;td&gt;MQTT 5.0 (TLS/SSL Secured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ruby / Sinatra&lt;/td&gt;
&lt;td&gt;TypeScript / Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Broker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudMQTT&lt;/td&gt;
&lt;td&gt;HiveMQ / EMQX Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic Auth (Plaintext)&lt;/td&gt;
&lt;td&gt;Token-based / TLS 1.3 Encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The shift from 2018 to 2026 isn't just about different tools; it's about adopting a &lt;strong&gt;Security-First&lt;/strong&gt; and &lt;strong&gt;Scalable&lt;/strong&gt; mindset. By leveraging Serverless functions and TLS-secured MQTT, your IoT projects are now more responsive, cheaper to maintain, and significantly more secure against modern threats.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we will configure the &lt;strong&gt;LINE Rich Menu&lt;/strong&gt;. This will allow you to control your home with a polished UI—tapping physical icons on your phone screen instead of typing commands—and we'll set up Vercel environment variables to keep your credentials safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Coding!&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  IoT #MQTT5 #ESP32 #Serverless #LineAPI #Arduino #WebDev #SmartHome
&lt;/h1&gt;

</description>
      <category>iot</category>
      <category>mqtt</category>
      <category>esp32</category>
      <category>arduino</category>
    </item>
    <item>
      <title>Beyond Autocomplete: The 2026 AI Toolset Every Software Engineer Must Master</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Sat, 03 Jan 2026 10:34:15 +0000</pubDate>
      <link>https://forem.com/3lvv0w/beyond-autocomplete-the-2026-ai-toolset-every-software-engineer-must-master-349k</link>
      <guid>https://forem.com/3lvv0w/beyond-autocomplete-the-2026-ai-toolset-every-software-engineer-must-master-349k</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Krisada Vivek&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Date: 3rd January 2026&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The New Reality of Engineering
&lt;/h3&gt;

&lt;p&gt;It’s 2026. If you are still treating AI as just a slightly better version of IntelliSense, you aren’t just falling behind; you are actively increasing your own technical debt. &lt;/p&gt;

&lt;p&gt;The "hype cycle" has settled. We are no longer impressed that an LLM can write a Fibonacci sequence. Today, AI has moved from being an &lt;em&gt;assistant&lt;/em&gt; that sits beside us to becoming the &lt;em&gt;infrastructure&lt;/em&gt; through which we work. Our value as engineers has shifted from &lt;strong&gt;writing syntax&lt;/strong&gt; to &lt;strong&gt;system architecture, AI orchestration, and rigorous validation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To thrive today, there is a core competency you must master: &lt;strong&gt;AI Fluency.&lt;/strong&gt; ---&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Agentic IDE: Repository-Wide Context
&lt;/h3&gt;

&lt;p&gt;We’ve moved past simple plugins. The IDE itself is now an agentic system. Tools like &lt;strong&gt;Cursor&lt;/strong&gt;, &lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt;, and the matured &lt;strong&gt;JetBrains AI&lt;/strong&gt; are no longer passive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Shift:&lt;/strong&gt; In 2026, you don't just highlight a function to explain it. You use agents for &lt;strong&gt;multi-file refactoring&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Workflow:&lt;/strong&gt; You prompt: &lt;em&gt;"Update the auth flow to use biometric data, adjust the DB schema via a migration, and update the UI components."&lt;/em&gt; The tool generates a diff spanning ten files, runs existing tests, and proposes the migration script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Skill:&lt;/strong&gt; You must become a master of &lt;strong&gt;diff review.&lt;/strong&gt; The AI writes faster than you can read; your job is to spot logical flaws that emerge when AI touches complex business logic.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Autonomous QA and Test Agents
&lt;/h3&gt;

&lt;p&gt;If you are still manually writing &lt;code&gt;assertEqual&lt;/code&gt; for basic CRUD operations, you are wasting company time. Specialized testing agents integrated into &lt;strong&gt;GitLab/GitHub CI&lt;/strong&gt; have matured into fully autonomous units.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Shift:&lt;/strong&gt; These agents analyze your codebase and generate complete, meaningful test suites (unit, integration, and regression) without human intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Capability:&lt;/strong&gt; They don't just check for code coverage; they use AI to deduce the &lt;strong&gt;semantic intent&lt;/strong&gt; of your code and test for edge cases you likely forgot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Skill:&lt;/strong&gt; Defining &lt;strong&gt;semantic boundaries.&lt;/strong&gt; AI is great at testing &lt;em&gt;how&lt;/em&gt; the code works, but you must define &lt;em&gt;what&lt;/em&gt; the code is supposed to achieve for the business.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. AI-Powered Architectural Prototyping
&lt;/h3&gt;

&lt;p&gt;The gap between a whiteboard sketch and a running frontend prototype has shrunk to almost zero. Tools evolved from &lt;strong&gt;Vercel v0&lt;/strong&gt; allow for instantaneous foundational builds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Shift:&lt;/strong&gt; You can take a screenshot of a Figma design or a system diagram showing microservices connected by Kafka, and the AI generates the foundational, deployable code (Next.js/React, Docker Compose, or Kubernetes manifests).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Benefit:&lt;/strong&gt; It saves days of initial setup, allowing you to focus immediately on unique, high-difficulty business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Skill:&lt;/strong&gt; &lt;strong&gt;Prompting as System Design.&lt;/strong&gt; You must describe architectural patterns—like event sourcing or clean architecture—precisely so the AI generates a scalable foundation rather than a "monolithic mess."&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Infrastructure-as-Code (IaC) Generators
&lt;/h3&gt;

&lt;p&gt;Managing Cloud infrastructure manually (ClickOps) is extinct. Even writing raw Terraform is becoming rare for application engineers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Shift:&lt;/strong&gt; Tools like &lt;strong&gt;Pulumi Insights&lt;/strong&gt; generate IaC based on application requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Workflow:&lt;/strong&gt; You state your needs: &lt;em&gt;"I need a fault-tolerant REST API, PostgreSQL backend, AWS deployment, and a CDN."&lt;/em&gt; The AI agent generates the Pulumi or Terraform code, optimized for cost and security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Skill:&lt;/strong&gt; &lt;strong&gt;Security and Cost Audit.&lt;/strong&gt; The AI builds the infrastructure, but you own the bill and the data breaches. You must validate that the generated network configurations (VPCs, Security Groups) are truly secure.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion: The Synthesis Mindset
&lt;/h3&gt;

&lt;p&gt;In 2026, AI didn't take the job of the software engineer; it took the job of the &lt;em&gt;coder&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Our job today is *&lt;em&gt;Synthesis. *&lt;/em&gt; We take the business requirement, use architectural agents to scaffold the solution, agentic IDEs to implement logic, and QA agents to validate it. If you aren't comfortable directing agents and questioning their output, you aren't ready for the "Production Era" of AI.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The best time to start building these skills was two years ago. The second-best time is today. *&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>futureofwork</category>
    </item>
    <item>
      <title>🚀 Flutter Mobile Testing Methodologies Recap 2025</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Sat, 26 Jul 2025 07:28:35 +0000</pubDate>
      <link>https://forem.com/3lvv0w/flutter-mobile-testing-methodologies-recap-2025-523j</link>
      <guid>https://forem.com/3lvv0w/flutter-mobile-testing-methodologies-recap-2025-523j</guid>
      <description>&lt;p&gt;Flutter's momentum in 2025 has brought powerful upgrades to its testing ecosystem. Whether you're shipping production apps or contributing to side projects, structured testing is key to delivering reliable mobile experiences.&lt;/p&gt;

&lt;p&gt;Here's a quick, practical recap of modern Flutter testing practices for this year.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Unit Testing: Logic First
&lt;/h2&gt;

&lt;p&gt;Unit tests are still the fastest and most isolated way to validate business logic. Dart’s built-in &lt;code&gt;test&lt;/code&gt; package and mocking libraries like &lt;code&gt;mocktail&lt;/code&gt; remain the go-to tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best practices in 2025 emphasize:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear separation of business logic from UI
&lt;/li&gt;
&lt;li&gt;Value-based assertions over excessive mocking
&lt;/li&gt;
&lt;li&gt;Testing edge cases, not just the happy path
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Widget Testing + Golden Testing (with Alchemist)
&lt;/h2&gt;

&lt;p&gt;Widget testing is essential for verifying UI behavior and interactions. In 2025, &lt;a href="https://pub.dev/packages/alchemist" rel="noopener noreferrer"&gt;&lt;code&gt;alchemist&lt;/code&gt;&lt;/a&gt; has become the standard tool for golden testing—replacing the now-discontinued &lt;code&gt;golden_toolkit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Golden tests help detect visual regressions by comparing rendered UI to baseline images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Alchemist?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean syntax for building UI snapshots
&lt;/li&gt;
&lt;li&gt;Built-in theme/layout variations
&lt;/li&gt;
&lt;li&gt;CI-friendly performance
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for testing UI components in different device sizes and themes.&lt;/p&gt;




&lt;h2&gt;
  
  
  📱 Integration Testing with Patrol
&lt;/h2&gt;

&lt;p&gt;For full end-to-end testing, &lt;a href="https://pub.dev/packages/patrol" rel="noopener noreferrer"&gt;&lt;code&gt;patrol&lt;/code&gt;&lt;/a&gt; is leading the charge in 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes Patrol stand out:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interaction with both Flutter and native platform UI (e.g., permissions, alerts)
&lt;/li&gt;
&lt;li&gt;Cross-platform support (Android + iOS)
&lt;/li&gt;
&lt;li&gt;Smoother syntax and improved stability compared to &lt;code&gt;integration_test&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Patrol allows you to test the complete user journey—including system dialogs and background events.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 CI/CD: Automate Everything
&lt;/h2&gt;

&lt;p&gt;Testing is only as good as its automation. Most Flutter teams now integrate testing into their CI/CD workflows via platforms like &lt;strong&gt;GitHub Actions&lt;/strong&gt;, &lt;strong&gt;Codemagic&lt;/strong&gt;, or &lt;strong&gt;GitLab CI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended strategy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run unit and widget tests on every pull request
&lt;/li&gt;
&lt;li&gt;Schedule golden tests or run them on key merges
&lt;/li&gt;
&lt;li&gt;Execute Patrol tests on emulators or real devices post-merge
&lt;/li&gt;
&lt;li&gt;Send test failure alerts via Slack, Discord, or email
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Tooling&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unit Test&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;test&lt;/code&gt;, &lt;code&gt;mocktail&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Business logic validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget Test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flutter_test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UI interaction in isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Golden Test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;alchemist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Visual regression detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2E Test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;patrol&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-device, real-flow interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD Integration&lt;/td&gt;
&lt;td&gt;GitHub Actions, Codemagic&lt;/td&gt;
&lt;td&gt;Automation and team visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Final Thought
&lt;/h2&gt;

&lt;p&gt;Flutter testing in 2025 isn’t just faster—it’s smarter.&lt;br&gt;&lt;br&gt;
With tools like &lt;strong&gt;Alchemist&lt;/strong&gt; and &lt;strong&gt;Patrol&lt;/strong&gt;, developers can confidently ship clean, scalable code across devices and platforms.&lt;/p&gt;

&lt;p&gt;Start small. Automate early. Your users will thank you.&lt;/p&gt;




&lt;p&gt;✍️ &lt;em&gt;Written by Krisada Vivek&lt;/em&gt; &lt;br&gt;
🔗 Follow me on &lt;a href="https://github.com/3lVv0w" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; • &lt;a href="https://v0-krisada-vivek-portfolio.vercel.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  flutter #mobiledev #testing #alchemist #patrol #devtools2025
&lt;/h1&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>testing</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Automation in 2025: n8n vs The Alternatives (What Devs Should Know)</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Tue, 15 Jul 2025 12:00:00 +0000</pubDate>
      <link>https://forem.com/3lvv0w/-automation-in-2025-n8n-vs-the-alternatives-what-devs-should-know-4khl</link>
      <guid>https://forem.com/3lvv0w/-automation-in-2025-n8n-vs-the-alternatives-what-devs-should-know-4khl</guid>
      <description>&lt;p&gt;Tired of repeating tasks or manually syncing tools? You’re not alone.&lt;br&gt;&lt;br&gt;
In 2025, &lt;strong&gt;workflow automation is no longer just for ops teams&lt;/strong&gt; — it’s becoming a &lt;strong&gt;core developer skill&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I’ll break down &lt;strong&gt;n8n&lt;/strong&gt;, the go-to open-source automation tool, and compare it to key alternatives.&lt;br&gt;&lt;br&gt;
Let’s find the right fit for your next automation project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 What Is n8n?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;n8n&lt;/strong&gt; is a &lt;strong&gt;low-code, open-source automation platform&lt;/strong&gt; built for developers. It lets you visually build workflows to integrate APIs, services, and custom logic.&lt;/p&gt;

&lt;p&gt;✅ 350+ built-in integrations (REST, Webhooks, Databases, etc.)&lt;br&gt;&lt;br&gt;
✅ JavaScript anywhere (custom functions, expressions)&lt;br&gt;&lt;br&gt;
✅ Self-host or use n8n Cloud&lt;br&gt;&lt;br&gt;
✅ Advanced logic (if/else, wait, loops, error handling)  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Developers who want flexibility, transparency, and control.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚔️ n8n vs. The Competition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Zapier&lt;/strong&gt; (Cloud, No-code)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Non-tech users automating SaaS
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Easy UI, huge library
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Expensive at scale, limited logic, no self-hosting
🔗 &lt;a href="https://zapier.com" rel="noopener noreferrer"&gt;zapier.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Make (Integromat)&lt;/strong&gt; (Cloud, Visual-first)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Users needing advanced branching, data handling
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Flexible scenarios, robust filters
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; UI can get complex, pricing tiers grow fast
🔗 &lt;a href="https://make.com" rel="noopener noreferrer"&gt;make.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Pipedream&lt;/strong&gt; (Cloud, Code-first)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Developers writing quick API glue code
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Fast setup, serverless execution
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; No visual flow, cloud-only
🔗 &lt;a href="https://pipedream.com" rel="noopener noreferrer"&gt;pipedream.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Node-RED&lt;/strong&gt; (Open-source, IoT-friendly)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Hardware &amp;amp; IoT automations
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Low-resource, great for edge computing
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Lacks modern SaaS integrations
🔗 &lt;a href="https://nodered.org" rel="noopener noreferrer"&gt;nodered.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Activepieces&lt;/strong&gt; (Open-source, Zapier-style)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Teams needing self-hosted no-code flows
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Clean UI, growing ecosystem
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Still maturing vs. n8n’s depth
🔗 &lt;a href="https://activepieces.com" rel="noopener noreferrer"&gt;activepieces.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👨‍💻 Why Developers Prefer n8n (Still) in 2025
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;n8n&lt;/th&gt;
&lt;th&gt;Others&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Mostly ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ JS-native&lt;/td&gt;
&lt;td&gt;Limited (Zapier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visual editor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Free/Self&lt;/td&gt;
&lt;td&gt;Pay-per-run (cloud)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔥 Growing&lt;/td&gt;
&lt;td&gt;Mixed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 TL;DR: Choose Based on Your Stack
&lt;/h2&gt;

&lt;p&gt;🧑‍💻 &lt;strong&gt;n8n&lt;/strong&gt; – Best for devs who want control, custom logic, and open-source.&lt;br&gt;&lt;br&gt;
🧰 &lt;strong&gt;Make / Zapier&lt;/strong&gt; – Best for fast SaaS integrations with no code.&lt;br&gt;&lt;br&gt;
⚙️ &lt;strong&gt;Pipedream&lt;/strong&gt; – Best for quick backend automation with minimal setup.&lt;br&gt;&lt;br&gt;
🔌 &lt;strong&gt;Node-RED&lt;/strong&gt; – Best for IoT/edge workflows.&lt;br&gt;&lt;br&gt;
🌱 &lt;strong&gt;Activepieces&lt;/strong&gt; – Best for self-hosted Zapier-style automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Automation in 2025 is more developer-centric than ever.&lt;br&gt;&lt;br&gt;
Whether you’re scaling internal tools, building no-code platforms, or streamlining your own ops — the &lt;strong&gt;right tool saves hours every week&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My go-to for dev-first workflow building? &lt;strong&gt;Still n8n&lt;/strong&gt; — flexible, powerful, and made for coders.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;💬 &lt;strong&gt;Have you used n8n or any of the alternatives?&lt;/strong&gt; Drop your experiences in the comments 👇&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Follow me for more dev automation insights in 2025.&lt;/strong&gt; Let’s build smarter, not harder.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>n8n</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>Flutter vs React Native vs Kotlin Multiplatform (and More) in 2025 – What Should You Choose?</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Sat, 12 Jul 2025 04:09:04 +0000</pubDate>
      <link>https://forem.com/3lvv0w/flutter-vs-react-native-vs-kotlin-multiplatform-and-more-in-2025-what-should-you-choose-28i4</link>
      <guid>https://forem.com/3lvv0w/flutter-vs-react-native-vs-kotlin-multiplatform-and-more-in-2025-what-should-you-choose-28i4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Choosing the right mobile development framework in 2025 isn’t just about speed or performance — it’s about ecosystem, team skills, and future scalability. Here’s a concise breakdown of the top cross-platform players in today’s dev world.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚡ TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Drawbacks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flutter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;Fast UI, pixel-perfect apps&lt;/td&gt;
&lt;td&gt;Larger app size, Dart learning curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JavaScript/TypeScript&lt;/td&gt;
&lt;td&gt;Web-to-mobile teams, rapid dev&lt;/td&gt;
&lt;td&gt;UI inconsistency, performance bottlenecks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;Shared business logic, native UI&lt;/td&gt;
&lt;td&gt;Not full UI sharing, still maturing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SwiftUI + Jetpack Compose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Swift/Kotlin&lt;/td&gt;
&lt;td&gt;Platform-first UX&lt;/td&gt;
&lt;td&gt;No code reuse, platform-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;MAUI&lt;/strong&gt; (.NET MAUI)&lt;/td&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;Enterprise, .NET ecosystem&lt;/td&gt;
&lt;td&gt;Slow tooling, large footprint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Flutter (Google)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Use It?&lt;/strong&gt; Full UI control with a single codebase for iOS, Android, web, and desktop. Backed by Google and improving rapidly with Impeller and Dart 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; Startups, design-heavy apps, multi-platform launches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 Update:&lt;/strong&gt; Flutter 4 brings better compilation, new dev tools, and improved native interop.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Best choice for polished UIs and startups aiming to scale across platforms fast.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔸 &lt;strong&gt;React Native (Meta)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Use It?&lt;/strong&gt; Easy for JS/TS devs, wide community support, reusability with React ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; Teams already using React or building MVPs quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 Update:&lt;/strong&gt; Fabric and TurboModules are mature, improving perf &amp;amp; native bridges.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔁 Best for hybrid teams with strong web backgrounds.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Kotlin Multiplatform (JetBrains)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Use It?&lt;/strong&gt; Share business logic across iOS, Android, desktop, backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; Teams that want to keep native UIs but avoid duplicating logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 Update:&lt;/strong&gt; Stable KMP 1.1 and Kotlin 2.0 make it production-ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Great for native-first apps with shared logic, especially in fintech, health, and enterprise.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔸 &lt;strong&gt;.NET MAUI (Microsoft)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Use It?&lt;/strong&gt; Unified .NET framework for mobile and desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; Enterprise apps, existing C# teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 Update:&lt;/strong&gt; Better tooling and community, but still less traction outside enterprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🏢 For .NET shops looking to reduce code duplication.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Native (SwiftUI &amp;amp; Jetpack Compose)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Use It?&lt;/strong&gt; Best platform integration, smoothest UX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; When perfect native experience is required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 Update:&lt;/strong&gt; Declarative UI now stable and dev-friendly on both iOS and Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 Ideal for apps where UX trumps development speed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔍 Final Thoughts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You Are...&lt;/th&gt;
&lt;th&gt;Consider&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A startup or indie dev&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Flutter&lt;/strong&gt; or &lt;strong&gt;React Native&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An enterprise team&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt; or &lt;strong&gt;MAUI&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A native-focused product team&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SwiftUI&lt;/strong&gt; + &lt;strong&gt;Jetpack Compose&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A web-first dev team&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No one-size-fits-all. Choose what matches your &lt;strong&gt;team’s skill&lt;/strong&gt;, &lt;strong&gt;product needs&lt;/strong&gt;, and &lt;strong&gt;long-term roadmap&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;👨‍💻 &lt;em&gt;Follow me for more updates on mobile dev, architecture, and real-world implementation tips!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  flutter #reactnative #kotlinmultiplatform #mobiledevelopment #2025
&lt;/h1&gt;

</description>
      <category>flutter</category>
      <category>reactnative</category>
      <category>kotlin</category>
      <category>mobile</category>
    </item>
    <item>
      <title>📱Is Flutter Dying in 2025? A Deep Dive</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Tue, 15 Apr 2025 10:23:37 +0000</pubDate>
      <link>https://forem.com/3lvv0w/is-flutter-dying-in-2025-a-deep-dive-idm</link>
      <guid>https://forem.com/3lvv0w/is-flutter-dying-in-2025-a-deep-dive-idm</guid>
      <description>&lt;p&gt;Flutter has been a powerful cross-platform framework since 2017, but there’s been a lot of buzz in 2025. Let’s explore the facts, myths, and future of Flutter in depth.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What is Flutter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flutter&lt;/strong&gt; is an open-source UI framework by &lt;strong&gt;Google&lt;/strong&gt; that allows you to build apps for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iOS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All from a &lt;strong&gt;single Dart codebase&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Why Do Some People Think Flutter Is Dying?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Google’s Mixed Signals
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flutter’s promotion by Google has slowed.&lt;/li&gt;
&lt;li&gt;Some deprecated features have caused confusion.&lt;/li&gt;
&lt;li&gt;Focus seems to be shifting toward &lt;strong&gt;Flutter Web&lt;/strong&gt; and &lt;strong&gt;embedded systems&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Rise of Other Frameworks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Native&lt;/strong&gt;, &lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt;, and &lt;strong&gt;Jetpack Compose&lt;/strong&gt; are getting better.&lt;/li&gt;
&lt;li&gt;Developers are exploring &lt;strong&gt;native-first&lt;/strong&gt; approaches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Flock Fork
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A group of developers created &lt;strong&gt;Flock&lt;/strong&gt;, a community-led fork of Flutter.&lt;/li&gt;
&lt;li&gt;Aimed at addressing long-standing issues and improving Flutter’s build system.&lt;/li&gt;
&lt;li&gt;Some viewed this as a sign of Flutter weakening—but it actually shows &lt;strong&gt;growth and community resilience&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ What’s &lt;em&gt;Actually&lt;/em&gt; Happening in 2025?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔄 Flutter Is Evolving, Not Dying
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Flutter 4.0 + Impeller Engine
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;New rendering engine: &lt;strong&gt;Impeller&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Better performance: smoother animations, faster startup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Stable Web &amp;amp; Desktop Support
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Flutter Web and Desktop are now &lt;strong&gt;production-ready&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Widely used for:

&lt;ul&gt;
&lt;li&gt;Admin panels&lt;/li&gt;
&lt;li&gt;Enterprise tools&lt;/li&gt;
&lt;li&gt;Internal business apps&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Ecosystem Growth
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Mature packages:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;riverpod&lt;/code&gt;, &lt;code&gt;flutter_bloc&lt;/code&gt; (state management)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;go_router&lt;/code&gt; (navigation)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flutter_hooks&lt;/code&gt;, &lt;code&gt;animations&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Google is Still Supporting Flutter
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Regular updates.&lt;/li&gt;
&lt;li&gt;Ongoing investment in:

&lt;ul&gt;
&lt;li&gt;Web performance&lt;/li&gt;
&lt;li&gt;Material 3&lt;/li&gt;
&lt;li&gt;Dart improvements&lt;/li&gt;
&lt;li&gt;DevTools and Hot Reload&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 What is Flock and Should You Care?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flock&lt;/strong&gt; is a community-led fork of Flutter focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller SDK&lt;/li&gt;
&lt;li&gt;Faster build times&lt;/li&gt;
&lt;li&gt;Removing Google-specific code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flock is not a threat—it's a &lt;strong&gt;complement&lt;/strong&gt;. Think of it like &lt;strong&gt;Ubuntu vs. Debian&lt;/strong&gt; in the Linux world.&lt;/p&gt;




&lt;h2&gt;
  
  
  💼 Flutter in the Job Market (2025)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📊 Still in Demand For:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fintech&lt;/li&gt;
&lt;li&gt;E-commerce&lt;/li&gt;
&lt;li&gt;Government &amp;amp; enterprise apps&lt;/li&gt;
&lt;li&gt;Startup MVPs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Notable Flutter Apps in 2025:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;eBay Motors&lt;/li&gt;
&lt;li&gt;Google Classroom (portions)&lt;/li&gt;
&lt;li&gt;BMW in-car UIs&lt;/li&gt;
&lt;li&gt;Various internal corporate tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Should You Learn Flutter in 2025?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to build multi-platform UIs quickly.&lt;/li&gt;
&lt;li&gt;You work on apps that need high customizability or animation.&lt;/li&gt;
&lt;li&gt;Your team/company already uses Flutter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maybe not, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’re focused only on backend development.&lt;/li&gt;
&lt;li&gt;You prefer native APIs like SwiftUI or Jetpack Compose.&lt;/li&gt;
&lt;li&gt;You’re building hardware-heavy apps (AR, Bluetooth, etc.).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔚 TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is Flutter Dying in 2025?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;No. It’s evolving.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Still supported by Google.&lt;/li&gt;
&lt;li&gt;Actively used in the industry.&lt;/li&gt;
&lt;li&gt;Community is engaged and innovating (e.g., Flock).&lt;/li&gt;
&lt;li&gt;Remains a top choice for cross-platform UI.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Want a breakdown between &lt;strong&gt;Flutter vs React Native vs Kotlin Multiplatform&lt;/strong&gt; in 2025? Or details on how Flock technically differs from Flutter? Just let me know!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Summarized Flutter in 2024 and what's new for 2025.</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Wed, 25 Dec 2024 11:39:11 +0000</pubDate>
      <link>https://forem.com/3lvv0w/summarized-flutter-in-2024-and-whats-new-for-2025-27gd</link>
      <guid>https://forem.com/3lvv0w/summarized-flutter-in-2024-and-whats-new-for-2025-27gd</guid>
      <description>&lt;p&gt;Flutter in 2024:&lt;br&gt;
As of 2024, Flutter remains one of the leading frameworks for building cross-platform applications, enabling developers to create mobile, web, and desktop apps with a single codebase. Key features include:&lt;/p&gt;

&lt;p&gt;Unified Codebase: Write once and deploy to iOS, Android, web, and desktop, reducing time and resources needed for development.&lt;br&gt;
Improved Performance: Continued optimization of the framework and engine for faster, native-like experiences, especially on mobile devices.&lt;br&gt;
Mature Web &amp;amp; Desktop Support: While Flutter was initially focused on mobile, its support for web and desktop has become more robust, providing stable cross-platform experiences.&lt;br&gt;
Rich Widgets &amp;amp; Customization: A wide variety of highly customizable UI widgets, enabling developers to create beautiful, responsive apps.&lt;br&gt;
Strong Ecosystem: A large and growing collection of community-driven packages and plugins, as well as deep integration with services like Firebase.&lt;br&gt;
Active Development: Continuous updates and improvements, including Dart enhancements, tooling improvements, and expanded native integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New for Flutter in 2025:
&lt;/h2&gt;

&lt;p&gt;Looking ahead to 2025, several trends and updates are expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Flutter next (4.0) and Beyond: The upcoming major release, Flutter 4.0, will likely continue refining cross-platform performance, with even better native integrations and optimizations for mobile, web, and desktop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced Desktop Support: Expect even more advanced desktop capabilities with Flutter, possibly including better support for macOS, Linux, and Windows-specific features, as well as more desktop-native UI components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved Web Performance: Ongoing improvements in Flutter’s web capabilities, especially in rendering and responsiveness, to bring it closer to native web app performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tooling Enhancements: Flutter's developer tools, such as Flutter DevTools, will continue to evolve, making debugging, profiling, and testing even more powerful and user-friendly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration with AI and ML: As AI/ML capabilities become more pervasive, Flutter may see deeper integration with Google’s machine learning tools (like TensorFlow Lite), enabling app developers to easily implement AI-driven features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better State Management: There will likely be further advancements in state management techniques and tools, improving performance and scalability in large apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increased Adoption of Flutter on Embedded Devices: We could see Flutter making inroads into embedded system development, where lightweight UIs for IoT devices and hardware interfaces are needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary, Flutter in 2024 is a mature, cross-platform solution with broad support across mobile, web, and desktop. The future of Flutter in 2025 will likely include enhanced performance, better tooling, deeper AI integration, and expanded desktop and embedded capabilities.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Testing on Flutter: generate unit test badge using LCOV to your repository</title>
      <dc:creator>Krisada Vivek</dc:creator>
      <pubDate>Thu, 03 Sep 2020 10:48:00 +0000</pubDate>
      <link>https://forem.com/3lvv0w/testing-on-flutter-generate-unit-test-badge-using-lcov-to-your-repository-4ea4</link>
      <guid>https://forem.com/3lvv0w/testing-on-flutter-generate-unit-test-badge-using-lcov-to-your-repository-4ea4</guid>
      <description>&lt;h1&gt;
  
  
  TLDR; in this publication, I assumed that you all know how to write test and testing terminology and methods, no mentions here.
&lt;/h1&gt;

&lt;h1&gt;
  
  
  What is LCOV
&lt;/h1&gt;

&lt;p&gt;LCOV is a graphical front-end for GCC’s coverage testing tool gcov. It collects gcov data for multiple source files and creates HTML pages containing the source code annotated with coverage information. It also adds overview pages for easy navigation within the file structure. LCOV supports statement, function, and branch coverage measurement.&lt;/p&gt;

&lt;h1&gt;
  
  
  Installing LCOV
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install lcov
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Generating an example app — flutter counter app&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;example test scripts ./test/widget_test.dart&lt;br&gt;&lt;/p&gt;

&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Objective of lcov
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;To see the coverage of the code.&lt;/li&gt;
&lt;li&gt;To deliver the code with quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  To perform the test with coverage
&lt;/h1&gt;

&lt;p&gt;install &lt;a href="https://pub.dev/packages/test_coverage" rel="noopener noreferrer"&gt;test_coverage&lt;/a&gt; library in pubspec.yml under dev_dependencies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev_dependencies:
    flutter_test:
       sdk: flutter
    test_coverage: ^0.4.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;then run test command with flags
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter test --coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;when test complete it will generate folder ‘coverage” in the project directory, to see the result in visualized, run this commands
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;genhtml -o coverage coverage/lcov.info
# Open in the default browser (mac):
open coverage/index.html
this is the html report, that generated out looks like.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fcvnqr0w0zjcbe43x2pgf.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%2Fi%2Fcvnqr0w0zjcbe43x2pgf.png" alt="Alt Text" width="700" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;now you will get the coverage result, but I want to present in the GitHub repo how do I do that? you should get a badge!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  To generate badge image
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;assume that you are at the root of the project
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ yarn init
$ yarn add lcov2badge — more detail here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;then create a javascript script to generate a badge form the coverage file.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;what you get is the ./coverage_badge.svg that you can use inside the README.md file, like this.&lt;/li&gt;
&lt;/ul&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%2Fi%2F2o3d7otacll1v1eozhls.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%2Fi%2F2o3d7otacll1v1eozhls.png" alt="Alt Text" width="700" height="163"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![Coverage](./coverage_badge.svg?sanitize=true)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;the example Github code can be found &lt;a href="https://github.com/3lVv0w/test_lcov_bedge" rel="noopener noreferrer"&gt;here!&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/3lVv0w" rel="noopener noreferrer"&gt;
        3lVv0w
      &lt;/a&gt; / &lt;a href="https://github.com/3lVv0w/test_lcov_bedge" rel="noopener noreferrer"&gt;
        test_lcov_bedge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      this repo demonstrate how to generate coverage badge form lcov.info for unit testing
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;test_lcov_bedge&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/3lVv0w/test_lcov_bedge/./coverage_badge.svg?sanitize=true"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2F3lVv0w%2Ftest_lcov_bedge%2F.%2Fcoverage_badge.svg%3Fsanitize%3Dtrue" alt="Coverage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new Flutter project.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;This project is a starting point for a Flutter application.&lt;/p&gt;

&lt;p&gt;A few resources to get you started if this is your first Flutter project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://flutter.dev/docs/get-started/codelab" rel="nofollow noopener noreferrer"&gt;Lab: Write your first Flutter app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutter.dev/docs/cookbook" rel="nofollow noopener noreferrer"&gt;Cookbook: Useful Flutter samples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For help getting started with Flutter, view our
&lt;a href="https://flutter.dev/docs" rel="nofollow noopener noreferrer"&gt;online documentation&lt;/a&gt;, which offers tutorials,
samples, guidance on mobile development, and a full API reference.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/3lVv0w/test_lcov_bedge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;If you have any question/discussion with me, you can contact/ follow me&lt;br&gt;
FB: Krisada Vivek&lt;br&gt;
DEV.to: &lt;a class="mentioned-user" href="https://dev.to/3lvv0w"&gt;@3lvv0w&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me Krisada Vivek for a more upcoming tech publication&lt;/p&gt;

&lt;h1&gt;
  
  
  ThankYou! ❤
&lt;/h1&gt;

</description>
      <category>dartlang</category>
      <category>testing</category>
      <category>flutter</category>
      <category>tdd</category>
    </item>
  </channel>
</rss>
