<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Med Marrouchi</title>
    <description>The latest articles on DEV Community by Med Marrouchi (@marrouchi).</description>
    <link>https://dev.to/marrouchi</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F945989%2F2eae3154-24a6-4878-a8fc-afa2a1a274b2.jpeg</url>
      <title>DEV Community: Med Marrouchi</title>
      <link>https://dev.to/marrouchi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marrouchi"/>
    <language>en</language>
    <item>
      <title>The Perfect Storm: When Architecture and Environment Collude to Create Chaos</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Sat, 18 Jul 2026 09:36:28 +0000</pubDate>
      <link>https://dev.to/marrouchi/the-perfect-storm-when-architecture-and-environment-collude-to-create-chaos-56j3</link>
      <guid>https://dev.to/marrouchi/the-perfect-storm-when-architecture-and-environment-collude-to-create-chaos-56j3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We like to think of bugs as clean, isolated errors, a misplaced semicolon, a faulty if statement, or a poorly optimized SQL query. Fix the line of code, merge the PR, smash the bug. Job done.&lt;/p&gt;

&lt;p&gt;But veteren developers know that some of the most catastrophic system failures don't stem from "bad code." Instead, they breed in the shadows of architectural complexity, thriving in environments where multiple factors collide to create a perfect storm. This is the story of how a critical Health Information Exchange (HIE) and Central Health Data Repository went completely nuts not because of a single broken function, but because its infrastructure was drowning in its own environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The System Landscape
&lt;/h2&gt;

&lt;p&gt;To understand how it all went wrong, you have to look at the machinery under the hood. The system was built on a modern, highly distributed stack designed to handle massive volumes of sensitive medical records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Orchestration: A 3-node Docker Swarm cluster handling container deployments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Architecture: A microservices-driven framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Core Services: A data transformation and loading middleware, a centralized FHIR Server for healthcare data compliance, and an Elasticsearch cluster utilized for real-time analytics and reporting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On paper, it was resilient, scalable, and modern. In reality, it became a playground for data anomalies.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Symptoms
&lt;/h1&gt;

&lt;p&gt;We knew we were in trouble when the system started displaying erratic behavior that couldn't be pinned down to a single service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data Inconsistencies: Patient records and clinical events were inexplicably dropping.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Delta Split: A massive discrepancy emerged between the source of truth (the FHIR Server) and the analytics engine (Elasticsearch), leaving healthcare operators with conflicting data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Systemic Instability: Severe performance degradation that routinely pushed nodes to their limits and threatened total system downtime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, we’re going to do a deep dive into how we looked past the code repository, put on our architectural detective hats, and tracked these bugs down to their messy, real-world environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimistic Concurrency Control
&lt;/h2&gt;

&lt;p&gt;To maintain high throughput in a distributed environment, Elasticsearch avoids heavy database locking by using Optimistic Concurrency Control (OCC). Instead of locking a document during an update, Elasticsearch assigns every document a sequence number (_seq_no) and a primary term (_primary_term). When a client attempts to update or delete a record, it must submit the sequence numbers it originally read. If another process has modified the document in the interim, the numbers won't match, and Elasticsearch will reject the incoming write with an HTTP 409 Conflict status code, leaving it entirely up to the application layer to catch the error and retry.&lt;/p&gt;

&lt;p&gt;In a fast-moving microservices architecture, this localized error handling can quickly cascade into full-blown data inconsistencies. When our middleware orchestrated the ingestion pipeline—streaming real-time patient data to the primary FHIR Server while concurrently fanning out analytics packets to Elasticsearch—it implicitly assumed both writes would succeed. Under heavy load, simultaneous updates to the same patient records triggered rapid-fire race conditions. Elasticsearch dutifully did its job, rejecting colliding updates with 409 conflicts. However, because our middleware failed to properly intercept these specific exceptions, re-fetch the latest sequence tokens, and replay the payload, those failed updates were silently dropped on the analytics side.&lt;/p&gt;

&lt;p&gt;This behavioral blind spot created a severe "delta split" between our core datastores. The FHIR Server, acting as our transactional source of truth, successfully committed every medical event and reflected the absolute latest state of the data. Meanwhile, Elasticsearch fell further and further behind, stubbornly holding onto outdated document versions. As thousands of concurrent synchronization jobs hit these unhandled OCC rejections during peak operational hours, the discrepancy between the underlying clinical records and our analytics platform grew exponentially, resulting in deep, structural data discrepancies that couldn't be caught by standard code linters or unit tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing Data-Aware Kafka Topics
&lt;/h2&gt;

&lt;p&gt;To prevent race conditions before they ever hit your datastores, your message broker cannot remain data-agnostic. In our initial setup, treating Kafka topics as simple, undifferentiated pipes meant that sequential updates for a single patient were scattered across different partitions. Because different consumer instances read from different partitions simultaneously, the exact chronological order of a patient's medical history was lost mid-transit. A fresh vitals update could easily be processed by Consumer A milliseconds before Consumer B finished processing an older historical record, causing the system to inadvertently overwrite newer data with stale information.&lt;/p&gt;

&lt;p&gt;The fix requires structuring Kafka topics around the domain model—specifically, using patient-centric partitioning. By assigning the unique patient_id as the Kafka message key, Kafka guarantees that every single incoming FHIR bundle or event tied to that specific individual is routed to the exact same partition. Since Kafka strictly preserves chronological ordering within an individual partition, a single consumer thread handles that patient's entire timeline sequentially. This entirely eliminates cross-thread race conditions for the same resource.&lt;/p&gt;

&lt;p&gt;By making our messaging layout data-aware, we shift the burden of serialization away from heavy database-level locking and onto Kafka’s inherent partitioning mechanics. Grouping streaming medical data per patient ensures that updates are processed in a predictable, linear fashion. This structural change drastically reduces the high-concurrency collisions that trigger Elasticsearch OCC conflicts in the first place, ensuring that both the FHIR Server and the analytics layer ingest data in the correct, synchronized sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the Breaking Point: The Fallacy of Infinite Scale
&lt;/h2&gt;

&lt;p&gt;Every distributed architecture looks flawlessly scalable on a whiteboard, but in production, every system has its own distinct choke point. In our ecosystem, that choke point was the centralized FHIR Server. While our middleware could ingest and transform records at a breakneck pace, the FHIR Server had strict computational limits on its write throughput. When an overwhelming surge of concurrent medical data hit the pipeline, the FHIR Server simply couldn't keep up, resulting in timed-out requests and dropped connections. This triggered an aggressive retry loop from upstream clients. Instead of recovering, the system entered a death spiral: the avalanche of unthrottled retries led to massive data duplication, deeper inconsistencies, and hardware utilization that went completely through the roof.&lt;/p&gt;

&lt;p&gt;The lesson here is that a system is only as fast as its slowest component. To fix this, we stopped guessing and isolated each service for rigorous benchmarking based on our actual 3-node Docker Swarm infrastructure. By stress-testing the middleware, the FHIR Server, and Elasticsearch independently, we mapped out the precise requests-per-second ($req/sec$) threshold that each layer could reliably sustain. We established a foundational rule: the maximum throughput of the entire data pipeline must be governed by the lowest common denominator—the bottleneck service.&lt;/p&gt;

&lt;p&gt;With these benchmark metrics in hand, we implemented a robust rate-limiting strategy at the gateway level. By aligning our ingress thresholds with the proven capacity of our slowest service, we introduced strict traffic governance. This not only protected the FHIR Server from being flattened during peak usage hours but also established a fair-share policy for all incoming data clients. Embracing our system’s physical limits allowed us to eliminate the chaotic retry storms and stabilize our hardware footprint for good.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Operational Nightmare: Network Flapping and Database Split-Brain
&lt;/h2&gt;

&lt;p&gt;Just when we thought we had sorted out our application layer and traffic governance, the underlying infrastructure threw us its biggest curveball: intermittent network partitions. In a 3-node Docker Swarm cluster, a stable network fabric is non-negotiable. When brief network drops or "flapping" occurred, the nodes would momentarily lose sight of each other. This not only fractured our Swarm routing mesh but also triggered a nightmare scenario for our highly available PostgreSQL database cluster: a classic split-brain situation.&lt;/p&gt;

&lt;p&gt;Because the nodes could no longer communicate, multiple database instances independently came to the conclusion that the master node was dead. Following standard failover procedures, they both elected themselves as the new master database. When you have two concurrent master databases accepting writes simultaneously in a healthcare repository, you enter a data integrity danger zone. Conflicting modifications to patient medical histories were committed on both sides, creating a tangled web of divergent data states that are nearly impossible to automatically reconcile.&lt;/p&gt;

&lt;p&gt;In an ideal, enterprise world, the textbook resolution is geo-redundancy—spreading nodes across multiple availability zones and regions with dedicated, high-speed interconnects. However, operating within our constrained, low-resource environment meant we had to adapt. Rather than relying on fragile automated master elections that easily misfire during temporary network drops, we disabled dynamic multi-master promotions entirely. By configuring a strict, manual failover protocol and enforcing rigid node-majority requirements, we chose a temporary system read-only state over data corruption. In a health repository, ensuring data consistency must always take precedence over forced uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Bugs Are Sometimes a Product of Their Environment
&lt;/h2&gt;

&lt;p&gt;If there is one key takeaway from smashing these systemic anomalies, it’s that bugs do not exist in a vacuum. We could have spent months linting our code, refactoring microservices, and writing thousands of flawless unit tests, yet the system still would have broken. Why? Because the code wasn't the problem—the context was.&lt;/p&gt;

&lt;p&gt;Just as biological bugs thrive in damp, untidy environments, digital bugs thrive in the messy friction points where infrastructure, network stability, and data architectural designs collide. When you push a complex health information network into production on restricted resources, the underlying environment behaves like a living organism. A tiny network hiccup cascades into a database split-brain; a minor data race condition blows up into a massive Elasticsearch concurrency failure; an unexpected surge in medical packets turns a reliable FHIR Server into a critical roadblock.&lt;/p&gt;

&lt;p&gt;Fixing these issues required us to step away from the IDE and look at the bigger picture. True system resilience isn't just about writing elegant code; it’s about anticipating how your system will breathe, bend, and react under the pressure of its real-world surroundings. By enforcing data-aware messaging boundaries, respecting hard hardware throughput constraints, and building defensive, fail-safe protocols for unpredictable networks, we didn't just fix a set of broken features—we sanitized the environment so the bugs had nowhere left to grow.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>How I Turned Slack Into an AI Teammate That Opens Pull Requests</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Sat, 11 Jul 2026 10:22:36 +0000</pubDate>
      <link>https://dev.to/marrouchi/how-i-turned-slack-into-an-ai-teammate-that-opens-pull-requests-b4p</link>
      <guid>https://dev.to/marrouchi/how-i-turned-slack-into-an-ai-teammate-that-opens-pull-requests-b4p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While talking about AI workflow automation, someone asked me a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Are you using it yourself?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question stayed with me.&lt;/p&gt;

&lt;p&gt;My passion is software engineering, so for the DEV Weekend Challenge, I decided to automate a small part of the work I do every day: turning an idea or bug report into a pull request.&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;Slack2PR&lt;/strong&gt;, an AI coding teammate accessible directly from Slack.&lt;/p&gt;

&lt;p&gt;You mention the bot, describe what you need, and it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask follow-up questions about the requirements&lt;/li&gt;
&lt;li&gt;Inspect the target GitHub repository&lt;/li&gt;
&lt;li&gt;Create an implementation plan&lt;/li&gt;
&lt;li&gt;Build the feature component by component&lt;/li&gt;
&lt;li&gt;Write and run unit tests&lt;/li&gt;
&lt;li&gt;Create a branch and open a pull request&lt;/li&gt;
&lt;li&gt;Return the PR link inside the original Slack thread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Slack2PR also distinguishes between three types of requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feature:&lt;/strong&gt; clarify, plan, implement, test, and open a PR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug:&lt;/strong&gt; investigate first, then wait for approval before applying a fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question:&lt;/strong&gt; inspect the code in read-only mode and explain it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was to explore what happens when an AI agent becomes part of the development workflow instead of being limited to a separate chat window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2Ex3OkX-Eh8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/marrouchi" rel="noopener noreferrer"&gt;
        marrouchi
      &lt;/a&gt; / &lt;a href="https://github.com/marrouchi/Slack2PR" rel="noopener noreferrer"&gt;
        Slack2PR
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An AI coding workflow that turns Slack requests into GitHub pull requests using OpenCode and isolated sandboxes.
    &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;Slack2PR — Your AI Code Companion on Slack&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Mention it in Slack like a teammate, describe a feature or a bug, and it plans, codes, tests, and opens a pull request on GitHub.&lt;/p&gt;
&lt;p&gt;Slack2PR is a &lt;a href="https://hexabot.ai" rel="nofollow noopener noreferrer"&gt;Hexabot&lt;/a&gt; app that automates the software development lifecycle end to end: a Slack message triggers an agentic workflow that interviews you about requirements, breaks the work into components, implements them one by one inside a sandboxed clone of your repository, writes unit tests, and replies in the thread with a PR link. It exists to answer the question every Hexabot engineer eventually gets asked: &lt;em&gt;"Are you using it yourself?"&lt;/em&gt; — yes, even to build Hexabot.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Slack message
    │
    ▼
Slack channel (hexabot-channel-slack)
    │
    ▼
Slack2PR workflow ── classify intent
    │
    ├─ develop  → requirements interview → plan components → implement each
    │             in a loop → write unit tests → open&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/marrouchi/Slack2PR" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The project combines several tools, each responsible for a different part of the workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hexabot&lt;/strong&gt; handles the conversational workflow and connects the agent to Slack. The workflow is defined in YAML and manages intent classification, requirements interviews, loops, memory, approval steps, and status updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt; is used for intent classification, summarizing requirements, and powering the coding tasks in the demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenCode&lt;/strong&gt; acts as the coding harness. The implementation is also compatible with Claude Code, Codex, and Grok Build through interchangeable TanStack AI adapters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TanStack AI Sandboxes&lt;/strong&gt; provide an isolated Docker workspace. Each Slack thread receives a cloned copy of the target repository, and the same sandbox is reused throughout planning, implementation, testing, and delivery.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;Git and the GitHub CLI&lt;/strong&gt; are configured inside the sandbox so the agent can create a branch, commit its work, push it, and open a pull request without exposing credentials in its prompts.&lt;/p&gt;

&lt;p&gt;One important design decision was to keep the workflow in control. The agent does not receive one giant prompt asking it to do everything. Instead, the workflow divides the job into explicit stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Slack request
    ↓
Classify intent
    ↓
Gather requirements
    ↓
Plan components
    ↓
Implement each component
    ↓
Write and run tests
    ↓
Open a GitHub pull request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the process easier to observe, constrain, and improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Best Use of Google AI&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I'm thinking to write a post about how to automate a software development cycle by harnessing AI coding agents using Slack. Still I'm not sure if this is relevant for the dev.to community. If I get at least 5 likes on this post, I will record a video.</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Fri, 10 Jul 2026 08:57:17 +0000</pubDate>
      <link>https://dev.to/marrouchi/im-thinking-about-writing-a-post-about-how-to-automate-a-software-development-cycle-by-harnessing-1jcf</link>
      <guid>https://dev.to/marrouchi/im-thinking-about-writing-a-post-about-how-to-automate-a-software-development-cycle-by-harnessing-1jcf</guid>
      <description></description>
    </item>
    <item>
      <title>TypeScript 7: The Speed Upgrade We Were Waiting For</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Thu, 09 Jul 2026 10:23:32 +0000</pubDate>
      <link>https://dev.to/marrouchi/typescript-7-the-speed-upgrade-we-were-waiting-for-5b4l</link>
      <guid>https://dev.to/marrouchi/typescript-7-the-speed-upgrade-we-were-waiting-for-5b4l</guid>
      <description>&lt;p&gt;TypeScript 7 is here, and this one feels different.&lt;/p&gt;

&lt;p&gt;The biggest change is not a new syntax feature. It is performance. TypeScript has been ported to a native Go-based implementation, bringing much faster builds, improved editor responsiveness, and better use of modern multi-core machines.&lt;/p&gt;

&lt;p&gt;Some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript 7 is reported to be around &lt;strong&gt;8x to 12x faster&lt;/strong&gt; on full builds.&lt;/li&gt;
&lt;li&gt;The new compiler uses &lt;strong&gt;native code speed&lt;/strong&gt; and &lt;strong&gt;shared-memory multithreading&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Large projects should feel much smoother in editors, especially for autocomplete, diagnostics, and “find all references”.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--watch&lt;/code&gt; mode has been rebuilt for a more efficient development loop.&lt;/li&gt;
&lt;li&gt;It is still designed to stay compatible with TypeScript 6 behavior, but some older/deprecated options now become hard errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams working on large TypeScript codebases, this could be a huge quality-of-life improvement. Faster type-checking means shorter feedback loops, less waiting in CI, and a more enjoyable local development experience.&lt;/p&gt;

&lt;p&gt;Official announcement: &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/" rel="noopener noreferrer"&gt;https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Teaching AI Coding Agents How to Build Workflows with Skills and MCP</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Fri, 03 Jul 2026 16:42:28 +0000</pubDate>
      <link>https://dev.to/marrouchi/teaching-ai-coding-agents-how-to-build-workflows-with-skills-and-mcp-1gdh</link>
      <guid>https://dev.to/marrouchi/teaching-ai-coding-agents-how-to-build-workflows-with-skills-and-mcp-1gdh</guid>
      <description>&lt;p&gt;AI coding agents are becoming more useful, but they still need context.&lt;/p&gt;

&lt;p&gt;A generic agent can write code, explain files, and generate boilerplate. But when you ask it to work with a specific platform, framework, or internal system, it often misses conventions, syntax rules, and runtime details.&lt;/p&gt;

&lt;p&gt;That is where the combination of &lt;strong&gt;Skills&lt;/strong&gt; and &lt;strong&gt;MCP&lt;/strong&gt; becomes interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills Give the Agent Knowledge
&lt;/h2&gt;

&lt;p&gt;A Skill is like a reusable instruction package.&lt;/p&gt;

&lt;p&gt;Instead of writing a long prompt every time, you define how the agent should approach a specific task once.&lt;/p&gt;

&lt;p&gt;For example, a workflow-writing skill can teach an AI agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how workflow YAML should be structured&lt;/li&gt;
&lt;li&gt;which blocks or actions are available&lt;/li&gt;
&lt;li&gt;how validation rules work&lt;/li&gt;
&lt;li&gt;how to follow project conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, Skills answer the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should the agent work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  MCP Gives the Agent Tools
&lt;/h2&gt;

&lt;p&gt;MCP, or Model Context Protocol, gives the agent structured access to an external system.&lt;/p&gt;

&lt;p&gt;Instead of only generating files locally, the agent can interact with the running application. It can inspect available actions, validate workflow definitions, create or update workflows, and help debug issues.&lt;/p&gt;

&lt;p&gt;So, while Skills provide guidance, MCP provides access.&lt;/p&gt;

&lt;p&gt;Together, they turn an AI coding assistant from a code generator into something closer to a system-aware development partner.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Example: Lead Qualification
&lt;/h2&gt;

&lt;p&gt;Imagine building a chatbot workflow that collects a visitor’s name, email, and company.&lt;/p&gt;

&lt;p&gt;The workflow needs to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;greet the visitor&lt;/li&gt;
&lt;li&gt;ask for contact information&lt;/li&gt;
&lt;li&gt;detect missing fields&lt;/li&gt;
&lt;li&gt;store the collected data in memory&lt;/li&gt;
&lt;li&gt;send the lead to a CRM like HubSpot&lt;/li&gt;
&lt;li&gt;confirm that the team will follow up&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Traditionally, you would read the documentation, create a custom CRM action, define the workflow manually, test it, fix errors, and repeat.&lt;/p&gt;

&lt;p&gt;With Skills and MCP, the developer experience changes.&lt;/p&gt;

&lt;p&gt;You can ask the AI coding agent to create the custom CRM action, validate the workflow, connect the steps, and help test the final result inside the running application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The important idea is not that AI writes everything perfectly.&lt;/p&gt;

&lt;p&gt;The important idea is that the agent now has two things it usually lacks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain knowledge&lt;/strong&gt; through Skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System access&lt;/strong&gt; through MCP.&lt;/p&gt;

&lt;p&gt;That means the agent can follow the right conventions and verify its work against the real runtime instead of guessing.&lt;/p&gt;

&lt;p&gt;For developers, this opens an interesting pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t just prompt the AI agent. Teach it the system, then give it safe tools to work with.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is especially useful for workflow builders, automation platforms, internal tools, and any project where correctness depends on more than just writing valid code.&lt;/p&gt;

&lt;p&gt;AI coding agents are not just about faster code generation anymore.&lt;/p&gt;

&lt;p&gt;They are becoming a new interface for building, testing, and operating software systems.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>automation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Got My GitHub Repo to 1k Stars</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Fri, 03 Jul 2026 08:50:48 +0000</pubDate>
      <link>https://dev.to/marrouchi/how-i-got-my-github-repo-to-1k-stars-akb</link>
      <guid>https://dev.to/marrouchi/how-i-got-my-github-repo-to-1k-stars-akb</guid>
      <description>&lt;p&gt;Imagine watching a project you’ve poured years into suddenly catch fire and cross the 1k-star milestone on GitHub. It’s an incredible feeling, but it didn't happen overnight.&lt;/p&gt;

&lt;p&gt;This is the story of Hexabot, an AI workflow automation platform designed to democratize AI adoption for everyone. The idea originally evolved from a simple chatbot builder. Back then, we saw a massive opportunity to break down the barriers to entry for advanced AI tools, ensuring that powerful workflow automation wasn't just reserved for massive enterprises with unlimited budgets.&lt;/p&gt;

&lt;p&gt;Our journey to 1k stars was a long game of evolution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;2018: We started building v1 behind closed doors as a proprietary, closed-source project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;September 10, 2024: We officially went public and open-source, publishing v2 as a streamlined chatbot builder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November 19, 2025: We launched v3, with a fair-core license, pivotally transforming Hexabot into the full-fledged AI workflow automation platform it is today.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I’m going to pull back the curtain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I Wished I Had Done Differently
&lt;/h2&gt;

&lt;p&gt;Looking back at the road to 1,000 stars, it’s easy to focus only on what went right. But truth be told, the mistakes taught me just as much as the successes. If I could build a time machine and whisper some advice to my past self, here is exactly what I would say:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Build in Public (Instead of in the Dark)
&lt;/h3&gt;

&lt;p&gt;It is incredibly easy to get trapped in the "developer bubble"—that cozy place where you're completely absorbed by coding, tweaking features, and chasing the perfect architecture. But building in isolation is a massive trap.&lt;/p&gt;

&lt;p&gt;When you don't communicate early and often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You lose crucial early feedback: You might spend months building a feature your users don't actually want or understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You lose valuable runway: Audience growth, SEO authority, and general visibility don't happen overnight. They compound over time. If you only start talking about your project on launch day, you're already months behind.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Reach Out to Your Audience Early
&lt;/h3&gt;

&lt;p&gt;Your users hold the answers to questions you don't even know to ask yet. Actively reaching out to your target audience isn't just about promotion; it's about product validation.&lt;/p&gt;

&lt;p&gt;Engaging with early adopters allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Identify and fix friction points before they become baked into your codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drastically enhance the overall user experience (UX), user interface (UI), and developer experience (DX) based on real-world usage rather than guesswork.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Treat Marketing as a Discipline, Step by Step
&lt;/h3&gt;

&lt;p&gt;As developers, we often look at marketing as something "extra" or secondary. In reality, marketing is a discipline just like software engineering. It has its own design patterns, frameworks, and methodologies. You wouldn't push code to production without learning the language first, and you shouldn't approach communication without learning the rules of the platform.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A quick lesson in humility: Early on, I treated Twitter like a git repository where I could just force-push my project updates. Because I didn't take the time to learn how to communicate organically on the platform, I quickly got labeled as SPAM. It was a harsh but necessary wake-up call that learning how to talk to people is just as important as building a great product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to Promote Your Repo
&lt;/h2&gt;

&lt;p&gt;Getting your project to 1,000 stars isn't about pulling off a single, massive marketing stunt. It’s about building momentum through small, consistent efforts across different channels. If you are wondering where to start, here is the playbook that worked for us:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Build a Killer README (With a Video Demo)
&lt;/h3&gt;

&lt;p&gt;Your README is your landing page. If a developer lands on your repository and can’t figure out what your project does within 3 seconds, you’ve lost them.&lt;/p&gt;

&lt;p&gt;Keep it simple and concise: Cut the fluff. State the problem you solve and show the solution immediately.&lt;/p&gt;

&lt;p&gt;Include a video demo: A short, engaging video at the top of your README is worth a thousand lines of text. Show the product in action so users can visualize the value right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Leverage Visuals (Videos &amp;gt; Text)
&lt;/h3&gt;

&lt;p&gt;Text-heavy updates are easy to scroll past. Visuals stop the scroll.&lt;/p&gt;

&lt;p&gt;Use tools like Loom or ScreenCharm to record quick feature walkthroughs or micro-tutorials.&lt;/p&gt;

&lt;p&gt;Whenever you post an update on social media, always attach a high-quality screenshot, a GIF, or a short video clip. Show, don't just tell.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Write Blog Posts Across Multiple Platforms
&lt;/h3&gt;

&lt;p&gt;Don't just rely on your own website for traffic. Go where the developers already hang out. Write about your technical challenges, architecture decisions, and project milestones on platforms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DEV.to&lt;/li&gt;
&lt;li&gt;Hashnode&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;Coderlegion&lt;/li&gt;
&lt;li&gt;Hacker News (if you have a strong, tech-focused angle)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Participate in Open-Source Events
&lt;/h3&gt;

&lt;p&gt;Capitalize on established global developer movements. Participating in events like Hacktoberfest is a fantastic way to put your repository on the radar of thousands of developers. It helps you find passionate contributors who can improve your codebase while simultaneously driving organic traffic to your repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Connect and Collaborate Within Your Ecosystem
&lt;/h3&gt;

&lt;p&gt;No project is an island. Find other open-source projects or tools that operate in the same ecosystem and look for ways to collaborate. Whether it's building an integration together, co-authoring a technical blog post, or doing a joint shout-out, tapping into adjacent communities expands your reach exponentially.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Be Patient (The Ultimate Secret)
&lt;/h3&gt;

&lt;p&gt;The hard truth: Going viral is mostly just luck. You can't code an algorithm for virality, but you can code for consistency.&lt;/p&gt;

&lt;p&gt;Consistency is the only thing you can truly control. Keep showing up, keep building, and keep talking about your work. Growth is a compounding interest game—be patient, and the stars will follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The Journey Continues
&lt;/h2&gt;

&lt;p&gt;If you are currently grinding away on your own repository, keep going. Show your work, embrace the feedback (even the tough kind), and don't be afraid to put yourself out there.&lt;/p&gt;

&lt;p&gt;Every single star helps boost our visibility, brings in new contributors, and keeps the project moving forward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hexastack/hexabot" rel="noopener noreferrer"&gt; &lt;br&gt; Star the Hexabot Github Repository ⭐&lt;br&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading, and happy coding! 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What do you think about finding out that Claude Code is steganographically marking requests ?</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Wed, 01 Jul 2026 10:51:28 +0000</pubDate>
      <link>https://dev.to/marrouchi/what-do-you-think-about-finding-that-claude-code-steganographically-marking-requests--24g4</link>
      <guid>https://dev.to/marrouchi/what-do-you-think-about-finding-that-claude-code-steganographically-marking-requests--24g4</guid>
      <description></description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Deploy an AI Chatbot on Your NextJS Website using FREE tools</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Tue, 30 Jun 2026 17:46:17 +0000</pubDate>
      <link>https://dev.to/marrouchi/deploy-an-ai-chatbot-on-your-nextjs-website-using-free-tools-4n0a</link>
      <guid>https://dev.to/marrouchi/deploy-an-ai-chatbot-on-your-nextjs-website-using-free-tools-4n0a</guid>
      <description>&lt;p&gt;Building an AI agent is easy to demo.&lt;/p&gt;

&lt;p&gt;Shipping one to a real website, with your own knowledge and a working deployment, is the part that matters.&lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll see how to build a free customer support AI agent using a practical stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hexabot for the chatbot workflow&lt;/li&gt;
&lt;li&gt;OpenRouter as the LLM provider&lt;/li&gt;
&lt;li&gt;Railway for hosting and Postgres&lt;/li&gt;
&lt;li&gt;RAG to make the bot answer from your own website content&lt;/li&gt;
&lt;li&gt;A chat widget to embed the agent on your site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ApLieuhiIPs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The project starts locally with Node.js and the Hexabot CLI. From there, the support workflow is built visually and connected to an AI model through OpenRouter, which makes it easy to experiment with free LLMs without setting up a paid provider first.&lt;/p&gt;

&lt;p&gt;The tutorial also uses Claude Code over MCP to help build and fix the chatbot workflow, showing how coding agents can speed up the development process instead of only being used inside the final product.&lt;/p&gt;

&lt;p&gt;Once the bot works locally, the project is pushed to GitHub and deployed on Railway with a free Postgres database. This turns the chatbot from a local experiment into something accessible online.&lt;/p&gt;

&lt;p&gt;The most important part is RAG. The bot ingests your own website content, then uses that knowledge to answer customer questions with more relevant responses instead of relying only on the model’s general knowledge.&lt;/p&gt;

&lt;p&gt;The full flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;→ Install Hexabot
→ Connect OpenRouter as the LLM provider
→ Build the support workflow
→ Add RAG from your website content
→ Deploy on Railway with Postgres
→ Embed the chat widget on your website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an end-to-end path from zero to a working customer support AI agent running on a live website, using free tools and no credit card.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Greatest Danger to AI</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Fri, 26 Jun 2026 09:43:18 +0000</pubDate>
      <link>https://dev.to/marrouchi/the-greatest-danger-to-ai-6km</link>
      <guid>https://dev.to/marrouchi/the-greatest-danger-to-ai-6km</guid>
      <description>&lt;p&gt;The scariest AI story is usually the same.&lt;/p&gt;

&lt;p&gt;A machine wakes up.&lt;br&gt;
It becomes smarter than us.&lt;br&gt;
It escapes the lab.&lt;br&gt;
It takes control.&lt;/p&gt;

&lt;p&gt;But maybe the real danger is quieter.&lt;/p&gt;

&lt;p&gt;Maybe AI does not collapse because it becomes too intelligent.&lt;/p&gt;

&lt;p&gt;Maybe it collapses because we poison what it learns from.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Thought Experiment
&lt;/h2&gt;

&lt;p&gt;Imagine the year is 2029.&lt;/p&gt;

&lt;p&gt;A new generation of language models is being trained. Bigger context windows. Better reasoning. More agents. More automation. More trust.&lt;/p&gt;

&lt;p&gt;As usual, the model is trained on a massive snapshot of the internet.&lt;/p&gt;

&lt;p&gt;Blogs. Forums. Documentation. Social media. Product pages. Research papers. Code repositories. News articles. Comments. Reviews. Public datasets.&lt;/p&gt;

&lt;p&gt;But this time, something is different.&lt;/p&gt;

&lt;p&gt;For the past three years, coordinated networks of bots, companies, political groups, and anonymous actors have been publishing content at scale.&lt;/p&gt;

&lt;p&gt;Not spam.&lt;/p&gt;

&lt;p&gt;Something much more dangerous.&lt;/p&gt;

&lt;p&gt;Plausible content.&lt;/p&gt;

&lt;p&gt;Well-written content.&lt;br&gt;
SEO-optimized content.&lt;br&gt;
Human-sounding content.&lt;br&gt;
Content with sources, charts, fake debates, technical vocabulary, and confident conclusions.&lt;/p&gt;

&lt;p&gt;Slowly, the internet becomes less like a public memory and more like a battlefield.&lt;/p&gt;

&lt;p&gt;Not a battlefield for human attention.&lt;/p&gt;

&lt;p&gt;A battlefield for the next training dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Propaganda Target Is Not You
&lt;/h2&gt;

&lt;p&gt;Traditional propaganda tries to influence people directly.&lt;/p&gt;

&lt;p&gt;But in an AI-native world, the more powerful target may be the model itself.&lt;/p&gt;

&lt;p&gt;Because once a belief, bias, or false pattern enters the training data, it can be compressed into the behavior of millions of future AI systems.&lt;/p&gt;

&lt;p&gt;A poisoned article may disappear from search results.&lt;/p&gt;

&lt;p&gt;A fake forum thread may be forgotten.&lt;/p&gt;

&lt;p&gt;A manipulated benchmark may be debunked.&lt;/p&gt;

&lt;p&gt;But if those artifacts are absorbed into a foundation model, their influence may persist invisibly.&lt;/p&gt;

&lt;p&gt;Not as a quote.&lt;/p&gt;

&lt;p&gt;As a tendency.&lt;/p&gt;

&lt;p&gt;As a preference.&lt;/p&gt;

&lt;p&gt;As a default assumption.&lt;/p&gt;

&lt;p&gt;As the answer that “sounds right.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Poisoning at Internet Scale
&lt;/h2&gt;

&lt;p&gt;Data poisoning is usually discussed as a technical attack.&lt;/p&gt;

&lt;p&gt;Add malicious samples to a dataset.&lt;br&gt;
Trigger wrong behavior.&lt;br&gt;
Manipulate a model.&lt;/p&gt;

&lt;p&gt;But internet-scale data poisoning is more subtle.&lt;/p&gt;

&lt;p&gt;It does not need to break the model.&lt;/p&gt;

&lt;p&gt;It only needs to bend it.&lt;/p&gt;

&lt;p&gt;What if thousands of pages are created to make one product category look safer than it is?&lt;/p&gt;

&lt;p&gt;What if fake developer discussions make one insecure pattern look like best practice?&lt;/p&gt;

&lt;p&gt;What if political narratives are planted years before they are needed?&lt;/p&gt;

&lt;p&gt;What if synthetic “public opinion” becomes training data, and training data becomes the voice of future assistants?&lt;/p&gt;

&lt;p&gt;The danger is not that AI will believe one lie.&lt;/p&gt;

&lt;p&gt;The danger is that AI may inherit a distorted map of reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Internet Was Built for Humans
&lt;/h2&gt;

&lt;p&gt;The internet was not designed to be a clean training dataset.&lt;/p&gt;

&lt;p&gt;It was designed for communication, publishing, commerce, entertainment, and attention.&lt;/p&gt;

&lt;p&gt;Search engines already changed how people write.&lt;/p&gt;

&lt;p&gt;Social media changed how people argue.&lt;/p&gt;

&lt;p&gt;Now AI training may change how people publish.&lt;/p&gt;

&lt;p&gt;We may enter a strange era where content is no longer written only for readers, customers, voters, or search engines.&lt;/p&gt;

&lt;p&gt;It is written for future models.&lt;/p&gt;

&lt;p&gt;A blog post becomes a seed.&lt;/p&gt;

&lt;p&gt;A fake review becomes a training signal.&lt;/p&gt;

&lt;p&gt;A technical article becomes a behavioral suggestion.&lt;/p&gt;

&lt;p&gt;A thousand small lies become statistical truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Greatest Danger
&lt;/h2&gt;

&lt;p&gt;The greatest danger to AI may not be intelligence.&lt;/p&gt;

&lt;p&gt;It may be inheritance.&lt;/p&gt;

&lt;p&gt;AI systems inherit our documents, our incentives, our noise, our manipulation, and our unresolved conflicts.&lt;/p&gt;

&lt;p&gt;If the public internet becomes polluted, future models will not simply learn from humanity.&lt;/p&gt;

&lt;p&gt;They will learn from humanity’s most optimized distortions.&lt;/p&gt;

&lt;p&gt;That means the question is not only:&lt;/p&gt;

&lt;p&gt;“Can we make AI safe?”&lt;/p&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;p&gt;“Can we keep the knowledge environment safe enough for AI to learn from?”&lt;/p&gt;

&lt;p&gt;Because tomorrow’s models are being trained by today’s internet.&lt;/p&gt;

&lt;p&gt;And today’s internet is already being written by people who know that.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why Self-Hosted AI Automation Matters?</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Fri, 26 Jun 2026 09:30:25 +0000</pubDate>
      <link>https://dev.to/marrouchi/why-self-hosted-ai-automation-matters-59g</link>
      <guid>https://dev.to/marrouchi/why-self-hosted-ai-automation-matters-59g</guid>
      <description>&lt;p&gt;&lt;a href="https://hexabot.ai" rel="noopener noreferrer"&gt;AI automation&lt;/a&gt; is quickly becoming one of the most important layers of modern business software.&lt;/p&gt;

&lt;p&gt;Teams no longer want simple scripts that move data from one app to another. They want AI systems that can understand context, trigger actions, use tools, search knowledge, route conversations, escalate to humans, and adapt to changing business processes.&lt;/p&gt;

&lt;p&gt;That shift is powerful. But it also creates a new question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where should your AI automation actually run?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For many organizations, the default answer has been cloud-based SaaS. It is easy to start, fast to test, and usually requires little infrastructure knowledge. But as AI workflows become more deeply connected to customer conversations, internal operations, private data, and business-critical processes, self-hosting becomes much more than a deployment preference.&lt;/p&gt;

&lt;p&gt;It becomes a strategic choice.&lt;/p&gt;

&lt;p&gt;Self-hosted AI workflow automation gives teams more control over data, security, compliance, customization, reliability, and long-term independence. For companies that want to use AI seriously in production, that control matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Self-Hosted AI Workflow Automation?
&lt;/h2&gt;

&lt;p&gt;Self-hosted AI workflow automation means running your automation platform on infrastructure you control.&lt;/p&gt;

&lt;p&gt;That infrastructure can be a private cloud, a virtual server, an on-premise environment, or a managed environment operated by your technical team. The important point is that the automation engine, data flows, integrations, logs, and configuration are not locked inside a third-party SaaS platform.&lt;/p&gt;

&lt;p&gt;In the context of AI, this becomes especially important because workflows are no longer just moving records between tools. They may process support conversations, analyze internal documents, trigger operational tasks, connect to CRMs, call APIs, search knowledge bases, and use language models to make decisions.&lt;/p&gt;

&lt;p&gt;A traditional workflow might say:&lt;/p&gt;

&lt;p&gt;“When a form is submitted, send an email.”&lt;/p&gt;

&lt;p&gt;An AI workflow can say:&lt;/p&gt;

&lt;p&gt;“Read the customer request, identify the intent, check the customer profile, search the knowledge base, decide whether the issue can be solved automatically, generate a response, trigger an internal action if needed, and escalate to a human if confidence is low.”&lt;/p&gt;

&lt;p&gt;That is a very different level of responsibility.&lt;/p&gt;

&lt;p&gt;When workflows become intelligent, contextual, and action-oriented, the environment where they run becomes part of the trust model.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Automation Is Moving Closer to Core Business Operations
&lt;/h2&gt;

&lt;p&gt;In the early days of automation, most workflows were peripheral. They synchronized leads, copied files, sent notifications, or created tickets.&lt;/p&gt;

&lt;p&gt;Today, AI automation is moving closer to the center of business operations.&lt;/p&gt;

&lt;p&gt;Companies are using AI workflows for customer support, sales qualification, document processing, internal knowledge access, IT support, onboarding, compliance workflows, and operational decision support.&lt;/p&gt;

&lt;p&gt;This means AI systems may interact with sensitive business data, customer identities, contracts, invoices, support histories, internal procedures, and proprietary knowledge.&lt;/p&gt;

&lt;p&gt;The more valuable the workflow, the more sensitive the context usually becomes.&lt;/p&gt;

&lt;p&gt;That is why self-hosting matters. It gives organizations the ability to decide how data moves, where it is stored, which systems can access it, and how the automation layer fits into existing security and governance policies.&lt;/p&gt;

&lt;p&gt;AI workflow automation is not only about productivity. It is about operational control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Control Is the First Reason Self-Hosting Matters
&lt;/h2&gt;

&lt;p&gt;AI workflows often need context to be useful.&lt;/p&gt;

&lt;p&gt;They may need to read messages, retrieve user profiles, search documents, inspect previous interactions, or connect to business systems. Without context, AI automation becomes generic. With context, it becomes useful.&lt;/p&gt;

&lt;p&gt;But context is also where risk begins.&lt;/p&gt;

&lt;p&gt;A cloud automation platform may require data to pass through external infrastructure. That may be acceptable for some use cases, but not for all. Organizations working with regulated industries, enterprise clients, private customer data, or confidential internal knowledge often need stronger guarantees.&lt;/p&gt;

&lt;p&gt;Self-hosted automation allows teams to keep more control over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;where workflow data is processed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;where logs and execution history are stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which databases are used&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which APIs are allowed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which models are connected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which data leaves the environment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not automatically solve every privacy or compliance challenge. But it gives technical and security teams the foundation they need to design the right architecture.&lt;/p&gt;

&lt;p&gt;For AI workflows, data control is not a nice-to-have. It is one of the conditions for trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance Needs More Than a Checkbox
&lt;/h2&gt;

&lt;p&gt;Many companies are under pressure to adopt AI while also respecting compliance requirements, privacy policies, customer contracts, and internal governance rules.&lt;/p&gt;

&lt;p&gt;This is especially true for teams serving enterprise customers or operating in sectors such as finance, healthcare, telecom, government, insurance, legal services, and education.&lt;/p&gt;

&lt;p&gt;A common mistake is to treat AI automation as a simple productivity tool. In reality, AI workflows can become part of the organization’s decision-making and communication infrastructure.&lt;/p&gt;

&lt;p&gt;That means companies need to answer practical questions:&lt;/p&gt;

&lt;p&gt;Where is customer data processed? Who can access workflow logs? Can we audit what happened? Can we explain why a workflow made a decision? Can we restrict certain tools or actions? Can we separate environments for development, testing, and production? Can we choose which AI providers or models are used?&lt;/p&gt;

&lt;p&gt;Self-hosted AI workflow automation makes these questions easier to address because the organization has more control over the system design.&lt;/p&gt;

&lt;p&gt;It does not replace legal, security, or compliance work. But it gives teams the technical flexibility to implement policies instead of being forced to adapt to the limitations of a closed platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Requires Control Over the Automation Layer
&lt;/h2&gt;

&lt;p&gt;AI workflows are powerful because they connect systems together.&lt;/p&gt;

&lt;p&gt;That is also why they must be secured carefully.&lt;/p&gt;

&lt;p&gt;A workflow automation platform may have access to APIs, databases, messaging channels, CRMs, ticketing systems, internal tools, and knowledge bases. If the platform becomes deeply integrated into operations, it becomes a critical part of the security perimeter.&lt;/p&gt;

&lt;p&gt;With a self-hosted platform, teams can align the automation layer with their own security practices.&lt;/p&gt;

&lt;p&gt;They can manage network access, apply internal authentication rules, control secrets, restrict outbound connections, configure database policies, monitor logs, and deploy inside trusted infrastructure.&lt;/p&gt;

&lt;p&gt;This level of control is difficult to achieve when the automation platform is entirely managed outside the organization.&lt;/p&gt;

&lt;p&gt;The goal is not to say that cloud platforms are always insecure. Many SaaS providers invest heavily in security. The point is that security requirements vary by organization, and some teams need direct control over deployment, access, storage, and integration boundaries.&lt;/p&gt;

&lt;p&gt;For business-critical AI automation, that control can be decisive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Hosting Reduces Vendor Lock-In
&lt;/h2&gt;

&lt;p&gt;AI automation platforms are becoming the new operational layer between people, software, and AI models.&lt;/p&gt;

&lt;p&gt;Once a company builds dozens of workflows on a platform, switching becomes difficult. The workflows contain business logic, integrations, prompts, conditions, routing rules, and operational knowledge.&lt;/p&gt;

&lt;p&gt;If that logic is locked inside a closed platform, the company may become dependent on one vendor’s pricing, roadmap, uptime, limitations, and export options.&lt;/p&gt;

&lt;p&gt;Self-hosting helps reduce that dependency.&lt;/p&gt;

&lt;p&gt;When teams can run the platform themselves, inspect how workflows are structured, control the runtime, and integrate it into their own stack, they gain more long-term independence.&lt;/p&gt;

&lt;p&gt;This matters even more in AI because the ecosystem changes quickly. New models appear. Regulations evolve. Infrastructure costs fluctuate. Business needs shift.&lt;/p&gt;

&lt;p&gt;A flexible, self-hosted automation layer allows companies to adapt without rebuilding everything from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customization Is Essential for Real Business Automation
&lt;/h2&gt;

&lt;p&gt;No two businesses operate exactly the same way.&lt;/p&gt;

&lt;p&gt;A support workflow for a telecom company is different from a workflow for a SaaS company. A sales qualification process in B2B is different from a public-sector service request. A chatbot for customer support is different from an internal AI assistant connected to company knowledge.&lt;/p&gt;

&lt;p&gt;Generic automation tools are useful for common tasks. But real business automation often requires custom logic, custom integrations, custom channels, custom permissions, and custom deployment constraints.&lt;/p&gt;

&lt;p&gt;Self-hosted AI workflow automation gives technical teams the freedom to extend the platform around the business.&lt;/p&gt;

&lt;p&gt;That can include connecting private APIs, building plugins, integrating with internal systems, adding custom business rules, controlling the user interface, or adapting workflows to local operational needs.&lt;/p&gt;

&lt;p&gt;This is where platforms like Hexabot are especially relevant.&lt;/p&gt;

&lt;p&gt;Hexabot is designed for teams that want the flexibility of AI agents and workflow automation while keeping control over deployment, data, and extensibility. Business teams can design and improve workflows visually, while technical teams can extend the platform with plugins, integrations, channels, and business-specific logic.&lt;/p&gt;

&lt;p&gt;That balance matters because many organizations do not want a rigid no-code tool, but they also do not want to build an AI automation platform from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Workflows Need Reliability, Not Just Intelligence
&lt;/h2&gt;

&lt;p&gt;The AI industry often focuses on model intelligence. But in production, intelligence is not enough.&lt;/p&gt;

&lt;p&gt;A business workflow must be reliable.&lt;/p&gt;

&lt;p&gt;It needs clear triggers, predictable execution, error handling, observability, human escalation, and guardrails. It should be possible to understand what happened when something goes wrong.&lt;/p&gt;

&lt;p&gt;This is especially important with AI agents.&lt;/p&gt;

&lt;p&gt;An AI agent may reason, call tools, retrieve knowledge, and decide what to do next. That makes it more flexible than a traditional automation. But it also means teams need more structure around how the agent operates.&lt;/p&gt;

&lt;p&gt;A self-hosted workflow automation platform can give teams the ability to design that structure.&lt;/p&gt;

&lt;p&gt;Instead of letting AI behave like a black box, teams can build workflows that combine AI reasoning with explicit steps, conditions, approvals, tool restrictions, and fallback paths.&lt;/p&gt;

&lt;p&gt;For example, a customer support workflow can allow AI to answer simple questions automatically, but require human handoff when confidence is low, when the request involves billing, or when the customer expresses frustration.&lt;/p&gt;

&lt;p&gt;That is the right way to think about production AI automation: autonomy where it helps, control where it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human Oversight Still Matters
&lt;/h2&gt;

&lt;p&gt;A common assumption is that the goal of AI automation is to remove humans completely.&lt;/p&gt;

&lt;p&gt;In reality, the best AI workflows often keep humans in the loop for important moments.&lt;/p&gt;

&lt;p&gt;Human oversight is useful when decisions are sensitive, data is incomplete, confidence is low, or the customer experience requires empathy and judgment.&lt;/p&gt;

&lt;p&gt;Self-hosted AI workflow automation makes it easier to design human oversight according to the company’s own rules.&lt;/p&gt;

&lt;p&gt;A team can decide when to escalate, who receives the task, what context is shown, how approvals work, and how the final decision is logged.&lt;/p&gt;

&lt;p&gt;This is especially important in customer-facing automation. A chatbot or AI agent should not be judged only by how many conversations it handles automatically. It should also be judged by how safely and smoothly it knows when not to automate.&lt;/p&gt;

&lt;p&gt;The best AI systems do not replace human judgment everywhere. They make human judgment more focused, timely, and effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Predictability Becomes Important at Scale
&lt;/h2&gt;

&lt;p&gt;Cloud automation platforms are attractive because they are easy to start with. But pricing can become harder to predict as usage grows.&lt;/p&gt;

&lt;p&gt;AI workflows may involve many executions, messages, API calls, model requests, document searches, and team members. As automation becomes more successful, usage increases.&lt;/p&gt;

&lt;p&gt;That is a good problem to have, but it can also create budget uncertainty.&lt;/p&gt;

&lt;p&gt;Self-hosting gives teams more control over infrastructure and scaling costs. Organizations can choose their hosting provider, optimize resources, separate environments, use preferred databases, and decide which AI models are worth using for each workflow.&lt;/p&gt;

&lt;p&gt;Some workflows may need advanced models. Others may work well with smaller models, local inference, rule-based steps, or retrieval-based responses.&lt;/p&gt;

&lt;p&gt;A self-hosted architecture gives teams more room to optimize these decisions.&lt;/p&gt;

&lt;p&gt;Cost control is not only about paying less. It is about understanding what you are paying for and being able to adapt the architecture as the system grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Hosted Does Not Mean Isolated
&lt;/h2&gt;

&lt;p&gt;Self-hosted AI workflow automation does not mean disconnected from the modern AI ecosystem.&lt;/p&gt;

&lt;p&gt;A self-hosted platform can still connect to external APIs, cloud models, open-source models, internal databases, messaging channels, CRMs, and business applications.&lt;/p&gt;

&lt;p&gt;The difference is that the organization controls the orchestration layer.&lt;/p&gt;

&lt;p&gt;This means teams can decide which services to connect, which data to send, which workflows should use external models, and which workflows should stay fully private.&lt;/p&gt;

&lt;p&gt;That flexibility is important because most companies will not use one AI model, one tool, or one deployment pattern forever.&lt;/p&gt;

&lt;p&gt;Some use cases may require cloud LLMs. Others may require private models. Some workflows may run on internal infrastructure. Others may integrate with external services.&lt;/p&gt;

&lt;p&gt;Self-hosting gives companies the ability to choose the right architecture for each use case instead of forcing every workflow through the same SaaS model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for AI Agents
&lt;/h2&gt;

&lt;p&gt;AI agents are becoming one of the most discussed areas of automation.&lt;/p&gt;

&lt;p&gt;An AI agent can plan, use tools, retrieve context, interact with users, and take actions across systems. But the more capable an agent becomes, the more important governance becomes.&lt;/p&gt;

&lt;p&gt;A self-hosted AI workflow automation platform can help teams build agents that are not just powerful, but manageable.&lt;/p&gt;

&lt;p&gt;Instead of giving an AI agent unlimited freedom, teams can define the workflow around it:&lt;/p&gt;

&lt;p&gt;What tools can it use? What data can it access? When should it ask for confirmation? When should it escalate? What should be logged? Which actions are allowed automatically? Which actions require approval?&lt;/p&gt;

&lt;p&gt;This is the difference between experimenting with AI agents and running AI agents in production.&lt;/p&gt;

&lt;p&gt;Businesses do not only need autonomous systems. They need controlled autonomy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of AI Automation Is Controlled, Extensible, and Self-Hostable
&lt;/h2&gt;

&lt;p&gt;AI workflow automation will continue to evolve quickly.&lt;/p&gt;

&lt;p&gt;More workflows will include AI reasoning. More business systems will expose APIs. More teams will expect automation to understand context and take action. More organizations will demand privacy, explainability, and control.&lt;/p&gt;

&lt;p&gt;This creates a clear direction for the next generation of automation platforms.&lt;/p&gt;

&lt;p&gt;They need to be visual enough for business teams, extensible enough for developers, reliable enough for production, and controllable enough for organizations that take data seriously.&lt;/p&gt;

&lt;p&gt;Self-hosting is a key part of that future.&lt;/p&gt;

&lt;p&gt;It gives teams the freedom to build AI workflows around their own infrastructure, security model, business logic, and operational needs.&lt;/p&gt;

&lt;p&gt;For small teams, it means independence and flexibility. For enterprises, it means governance and control. For developers, it means extensibility. For business teams, it means automation that can actually match how the organization works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Hexabot Approaches Self-Hosted AI Workflow Automation
&lt;/h2&gt;

&lt;p&gt;Hexabot is built for teams that want to create AI agents, conversational automation, and business workflows while keeping control over their platform.&lt;/p&gt;

&lt;p&gt;It combines visual workflow design with developer extensibility, allowing business and technical teams to collaborate on automation without being locked into a rigid black box.&lt;/p&gt;

&lt;p&gt;With Hexabot, teams can build workflows for customer support, internal operations, multichannel conversations, knowledge-based assistance, tool usage, and human handoff.&lt;/p&gt;

&lt;p&gt;The goal is not only to automate tasks. The goal is to help organizations build reliable AI systems that can run in real business environments.&lt;/p&gt;

&lt;p&gt;Self-hosted AI workflow automation matters because AI is becoming part of the operational core of companies.&lt;/p&gt;

&lt;p&gt;And when AI becomes operational, control matters.&lt;/p&gt;

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

&lt;p&gt;AI workflow automation is no longer just about saving time.&lt;/p&gt;

&lt;p&gt;It is about how companies connect people, data, software, and intelligent systems.&lt;/p&gt;

&lt;p&gt;As AI workflows become more powerful, organizations need to think carefully about where those workflows run, who controls them, how data is handled, and how decisions are governed.&lt;/p&gt;

&lt;p&gt;Cloud tools will continue to be useful for many use cases. But for teams that care about data control, customization, compliance, security, and long-term independence, self-hosted AI workflow automation offers a stronger foundation.&lt;/p&gt;

&lt;p&gt;The future of AI automation will not be defined only by smarter models.&lt;/p&gt;

&lt;p&gt;It will be defined by the platforms that help teams use AI safely, reliably, and under their control.&lt;/p&gt;

&lt;p&gt;That is why self-hosted AI workflow automation matters.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>For a developer, "Courage" is doing a search on the "#TODO" comments and addressing those issues.</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Wed, 24 Jun 2026 15:38:42 +0000</pubDate>
      <link>https://dev.to/marrouchi/for-a-developer-courage-is-doing-a-search-on-the-todo-comments-and-addressing-those-issues-42p2</link>
      <guid>https://dev.to/marrouchi/for-a-developer-courage-is-doing-a-search-on-the-todo-comments-and-addressing-those-issues-42p2</guid>
      <description></description>
      <category>coding</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Turn Your Web App into a Desktop App with Deno</title>
      <dc:creator>Med Marrouchi</dc:creator>
      <pubDate>Mon, 22 Jun 2026 08:03:17 +0000</pubDate>
      <link>https://dev.to/marrouchi/turn-your-web-app-into-a-desktop-app-with-deno-2p7c</link>
      <guid>https://dev.to/marrouchi/turn-your-web-app-into-a-desktop-app-with-deno-2p7c</guid>
      <description>&lt;p&gt;Deno is no longer “just” a modern JavaScript and TypeScript runtime for servers, scripts, and CLIs.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Deno Desktop&lt;/strong&gt;, you can package a Deno app as a real desktop application for macOS, Windows, and Linux.&lt;/p&gt;

&lt;p&gt;Think of it as a lightweight way to ship a web-based UI inside a native desktop window, without having to rewrite your app in another language or move your backend logic somewhere else.&lt;/p&gt;

&lt;p&gt;In this post, we will build a small &lt;strong&gt;Hello World desktop app&lt;/strong&gt; using Deno.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: At the time of writing, &lt;code&gt;deno desktop&lt;/code&gt; is part of the upcoming Deno 2.9 release and is available through the canary build.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Deno Desktop?
&lt;/h2&gt;

&lt;p&gt;Deno Desktop lets you take a Deno project and run it as a desktop application.&lt;/p&gt;

&lt;p&gt;Under the hood, your app still behaves like a web app. You serve HTML, CSS, JavaScript, and API routes using &lt;code&gt;Deno.serve()&lt;/code&gt;. Deno then opens that local app inside a desktop window.&lt;/p&gt;

&lt;p&gt;That means you can keep a very familiar architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deno app
  ├── serves HTML
  ├── exposes local API routes
  ├── runs TypeScript
  └── opens inside a native desktop window
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For many apps, this is a very attractive model.&lt;/p&gt;

&lt;p&gt;You can use web technologies for the UI, Deno for the backend logic, and still distribute the result as a desktop app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing the Deno Canary Build
&lt;/h2&gt;

&lt;p&gt;Since Deno Desktop is currently available in canary, install or upgrade to the canary version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno upgrade canary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify that Deno is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now have access to the &lt;code&gt;deno desktop&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Hello World Desktop App
&lt;/h2&gt;

&lt;p&gt;Let’s create a minimal project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;deno-desktop-hello
&lt;span class="nb"&gt;cd &lt;/span&gt;deno-desktop-hello
&lt;span class="nb"&gt;touch &lt;/span&gt;main.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;main.ts&lt;/code&gt; and add the following code:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8" /&amp;gt;
    &amp;lt;title&amp;gt;Hello Deno Desktop&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
      body {
        margin: 0;
        height: 100vh;
        display: grid;
        place-items: center;
        font-family: system-ui, sans-serif;
        background: #111827;
        color: white;
      }

      main {
        text-align: center;
      }

      h1 {
        font-size: 3rem;
        margin-bottom: 0.5rem;
      }

      p {
        color: #d1d5db;
        font-size: 1.1rem;
      }

      button {
        margin-top: 1rem;
        padding: 0.75rem 1rem;
        border: 0;
        border-radius: 0.5rem;
        cursor: pointer;
        font-size: 1rem;
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;main&amp;gt;
      &amp;lt;h1&amp;gt;Hello from Deno Desktop 👋&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Your web app is now running inside a desktop window.&amp;lt;/p&amp;gt;
      &amp;lt;button id="ping"&amp;gt;Ping Deno&amp;lt;/button&amp;gt;
      &amp;lt;p id="result"&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/main&amp;gt;

    &amp;lt;script&amp;gt;
      const button = document.getElementById("ping");
      const result = document.getElementById("result");

      button.addEventListener("click", async () =&amp;gt; {
        const response = await fetch("/api/hello");
        const data = await response.json();

        result.textContent = data.message;
      });
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;request&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&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;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/hello&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;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from the Deno backend!&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;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&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="s2"&gt;text/html; charset=utf-8&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just a normal Deno HTTP server.&lt;/p&gt;

&lt;p&gt;The interesting part is that, when we run it with &lt;code&gt;deno desktop&lt;/code&gt;, Deno will serve this app locally and open it in a desktop window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the App
&lt;/h2&gt;

&lt;p&gt;Run the app with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno desktop main.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a desktop window with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello from Deno Desktop 👋
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click the button, and the frontend will call the local API route:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Deno backend responds with JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello from the Deno backend!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the UI displays the response.&lt;/p&gt;

&lt;p&gt;Congratulations — you just built your first Deno desktop app.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Happening Here?
&lt;/h2&gt;

&lt;p&gt;The architecture is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Desktop window
      ↓
Local webview
      ↓
Deno.serve()
      ↓
HTML + API routes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your app is still written like a web app, but it runs inside a desktop shell.&lt;/p&gt;

&lt;p&gt;This has a few benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can use standard browser APIs in the UI.&lt;/li&gt;
&lt;li&gt;You can use Deno APIs on the backend side.&lt;/li&gt;
&lt;li&gt;You can build with TypeScript out of the box.&lt;/li&gt;
&lt;li&gt;You can reuse patterns you already know from web development.&lt;/li&gt;
&lt;li&gt;You can later move to a framework like Fresh, Astro, Next.js, or another supported stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adding a Basic deno.json
&lt;/h2&gt;

&lt;p&gt;You can also add a &lt;code&gt;deno.json&lt;/code&gt; file to configure your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deno-desktop-hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"desktop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deno desktop main.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"desktop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deno Desktop Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"identifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.example.deno-desktop-hello"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno task desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the project a bit cleaner and gives your app a name and identifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is Interesting
&lt;/h2&gt;

&lt;p&gt;Deno Desktop is exciting because it reduces the gap between web apps and desktop apps.&lt;/p&gt;

&lt;p&gt;If you already know JavaScript, TypeScript, HTML, and CSS, you can start building desktop software without learning a completely different stack.&lt;/p&gt;

&lt;p&gt;It could be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;admin panels&lt;/li&gt;
&lt;li&gt;developer tools&lt;/li&gt;
&lt;li&gt;local-first apps&lt;/li&gt;
&lt;li&gt;dashboards&lt;/li&gt;
&lt;li&gt;small productivity apps&lt;/li&gt;
&lt;li&gt;AI tools that need local filesystem or runtime access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also fits nicely with Deno’s philosophy: modern tooling, TypeScript support, web standards, and a batteries-included developer experience.&lt;/p&gt;

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

&lt;p&gt;Deno Desktop is still new, but the developer experience already feels very natural.&lt;/p&gt;

&lt;p&gt;You write a Deno server.&lt;br&gt;
You serve a UI.&lt;br&gt;
You run &lt;code&gt;deno desktop&lt;/code&gt;.&lt;br&gt;
You get a desktop app.&lt;/p&gt;

&lt;p&gt;For JavaScript and TypeScript developers, that is a very compelling workflow.&lt;/p&gt;

&lt;p&gt;Here is the full minimal version again:&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="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&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;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;h1&amp;gt;Hello from Deno Desktop 👋&amp;lt;/h1&amp;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="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&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="s2"&gt;text/html&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno desktop main.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is your first Deno-powered desktop app.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
