<?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: andersliuyang</title>
    <description>The latest articles on DEV Community by andersliuyang (@andersliuyang).</description>
    <link>https://dev.to/andersliuyang</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%2F3731372%2F15e5d33a-c008-4b71-b348-477a5a3cb94c.jpeg</url>
      <title>DEV Community: andersliuyang</title>
      <link>https://dev.to/andersliuyang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andersliuyang"/>
    <language>en</language>
    <item>
      <title># Implementing Automated Web Interaction: Deep Technical Analysis of the BlackEagle Plugin's WAOP</title>
      <dc:creator>andersliuyang</dc:creator>
      <pubDate>Tue, 27 Jan 2026 07:15:53 +0000</pubDate>
      <link>https://dev.to/andersliuyang/shi-xian-zi-dong-hua-wang-ye-jiao-hu-blackeagle-cha-jian-ji-zhu-fang-an-shen-du-jie-xi-3o4f</link>
      <guid>https://dev.to/andersliuyang/shi-xian-zi-dong-hua-wang-ye-jiao-hu-blackeagle-cha-jian-ji-zhu-fang-an-shen-du-jie-xi-3o4f</guid>
      <description>&lt;h1&gt;
  
  
  Implementing Automated Web Interaction: Deep Technical Analysis of the BlackEagle Plugin's WAOP
&lt;/h1&gt;

&lt;p&gt;Author: AndersLiu&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Preface&lt;/strong&gt;&lt;br&gt;
This article provides an in-depth analysis of the core technology behind the BlackEagle browser plugin: a powerful and robust Web Automation Operation Protocol (WAOP). We'll start from the macro architectural design, then dive into each module's implementation details, and finally reveal how it realizes an "interpretable, ordered sequence of automation steps" in the browser to drive complex web interactions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Macro Architecture: A Multi-layer Collaborative Automation System
&lt;/h2&gt;

&lt;p&gt;My goal is to build an automation system that can accurately simulate user behavior. It should not only perform basic actions like clicks and inputs, but also understand page context and interact intelligently with users (or AI). To that end I designed a layered collaborative architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Presentation Layer (UI - Sidebar)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility&lt;/strong&gt;: Serves as the main interface between users and the automation system. Here I present structured information extracted from the webpage and accept user commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Implementation&lt;/strong&gt;: &lt;code&gt;webcontentprocess.ts&lt;/code&gt; is responsible for turning raw webpage HTML and text into concise summaries and interactive element lists, providing high-quality context for decision-making (by either a user or an LLM).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Orchestration Layer (Background / Service Worker)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility&lt;/strong&gt;: Acts as the system brain: it manages open tabs, maintains snapshots of each page's content (&lt;code&gt;webcontent&lt;/code&gt;), and relays commands and data between the sidebar, content scripts, and external tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Implementation&lt;/strong&gt;: &lt;code&gt;background.js&lt;/code&gt; listens for browser events (tab switches, URL changes) and requests up-to-date page information from content scripts as needed. It also initializes a task module (&lt;code&gt;TaskModule&lt;/code&gt;) to process asynchronous tasks from various sources.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Execution Layer (Content Script)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility&lt;/strong&gt;: Executes operations directly in the target page's context. This is where automation commands are actually performed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Implementation&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;content.js&lt;/code&gt;: Injects the execution engine into the page, listens for commands from &lt;code&gt;background.js&lt;/code&gt;, and monitors page changes (URL updates, DOM mutations) to support single-page applications (SPAs).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;execute.js&lt;/code&gt;: The core execution engine of WAOP (Web Automation Operation Protocol). It interprets each protocol step (like &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;) and converts them into realistic user behavior simulations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Capabilities Layer (Tools)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility&lt;/strong&gt;: Provides standardized, callable atomic capabilities such as tab operations. This design allows the core logic to be extended like "function calls."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Implementation&lt;/strong&gt;: &lt;code&gt;browserTabsTool.ts&lt;/code&gt; exports a standard tool definition with operations like &lt;code&gt;open_tab&lt;/code&gt; and &lt;code&gt;close_tab&lt;/code&gt;. When &lt;code&gt;chrome.tabs&lt;/code&gt; APIs are unavailable in a given context, the tool gracefully falls back to &lt;code&gt;runtime.sendMessage&lt;/code&gt; so &lt;code&gt;background.js&lt;/code&gt; can perform the operation with higher privileges.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  WAOP: The Language of Automation
&lt;/h2&gt;

&lt;p&gt;WAOP (Web Automation Operation Protocol) is the core protocol we designed. It decomposes complex automation tasks into a clear, serializable sequence of steps.&lt;/p&gt;

&lt;p&gt;A typical WAOP task looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WAOP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&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;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#search-box"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BlackEagle AI"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"press"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enter"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waitForElement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".search-results"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5000&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"highlightText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Official Website"&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;h3&gt;
  
  
  Design Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Declarative Steps&lt;/strong&gt;: Each step is an instruction object with a &lt;code&gt;type&lt;/code&gt; and all data needed to execute (e.g., &lt;code&gt;selector&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;timeout&lt;/code&gt;). This makes tasks easy to read, build, and debug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust Selector Strategy&lt;/strong&gt;: The &lt;code&gt;waitForElement&lt;/code&gt; function in &lt;code&gt;execute.js&lt;/code&gt; implements intelligent lookup logic. It supports CSS selectors and also element lookup by visible text (for elements like &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;), improving stability on modern front-ends that generate dynamic classes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeouts &amp;amp; Error Handling&lt;/strong&gt;: Each step can specify a &lt;code&gt;timeout&lt;/code&gt;. The engine captures per-step execution errors, enabling optional steps or graceful task abortion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich Operation Types&lt;/strong&gt;: Beyond &lt;code&gt;click&lt;/code&gt; and &lt;code&gt;input&lt;/code&gt;, WAOP supports &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;wait&lt;/code&gt;, &lt;code&gt;assert&lt;/code&gt;, &lt;code&gt;highlightText&lt;/code&gt;, &lt;code&gt;press&lt;/code&gt;, and more to cover most web interaction scenarios.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implementation Details: Inspecting the Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Page Context Awareness &amp;amp; SPA Support (&lt;code&gt;content.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To make automation run smoothly in single-page applications, we must detect page changes even when the URL doesn't fully reload.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routing Change Detection&lt;/strong&gt;: We monkey-patch &lt;code&gt;history.pushState&lt;/code&gt; and &lt;code&gt;history.replaceState&lt;/code&gt; to intercept route changes caused by the History API. We also listen to &lt;code&gt;popstate&lt;/code&gt; and &lt;code&gt;hashchange&lt;/code&gt; events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOM Mutation Monitoring&lt;/strong&gt;: Use &lt;code&gt;MutationObserver&lt;/code&gt; to watch the document's DOM tree. When components load or the DOM updates, the observer triggers content refresh logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debounce&lt;/strong&gt;: To avoid flooding &lt;code&gt;background.js&lt;/code&gt; with messages during intensive DOM updates, we apply a 600ms debounce so refresh logic only runs after DOM changes settle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Core Execution Engine (&lt;code&gt;execute.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;This module translates WAOP into actual operations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event Simulation&lt;/strong&gt;: We go beyond &lt;code&gt;element.click()&lt;/code&gt; for realistic interactions. For typing and key events, we synthesize &lt;code&gt;keydown&lt;/code&gt;, &lt;code&gt;keypress&lt;/code&gt;, and &lt;code&gt;keyup&lt;/code&gt; via &lt;code&gt;new KeyboardEvent(...)&lt;/code&gt; to preserve compatibility with frameworks that rely on full event sequences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handling Rich Text Editors &amp;amp; &lt;code&gt;iframe&lt;/code&gt;s&lt;/strong&gt;: Finding the true editable surface is challenging. &lt;code&gt;resolveEditableTarget&lt;/code&gt; implements robust logic:

&lt;ol&gt;
&lt;li&gt;Check if the target is an &lt;code&gt;iframe&lt;/code&gt;; if so, enter its &lt;code&gt;document&lt;/code&gt; to find editable elements.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;contentEditable&lt;/code&gt; attributes.&lt;/li&gt;
&lt;li&gt;Handle editor implementations that hide a &lt;code&gt;textarea&lt;/code&gt; and expose an &lt;code&gt;iframe&lt;/code&gt; or &lt;code&gt;div[contenteditable]&lt;/code&gt; as the editing surface.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precise Text Highlighting&lt;/strong&gt;: The &lt;code&gt;highlightText&lt;/code&gt; feature uses a &lt;code&gt;TreeWalker&lt;/code&gt; to traverse text nodes under a target, locate matching text, and create a &lt;code&gt;Range&lt;/code&gt;. The range is wrapped in a highlight &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; and smoothly scrolled to the center of the viewport. A CSS animation performs a brief highlight then removes it to avoid permanently changing the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Background Orchestration &amp;amp; State Management (&lt;code&gt;background.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;background.js&lt;/code&gt; is the plugin's traffic controller.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Page Snapshot (&lt;code&gt;webcontent&lt;/code&gt;) Management&lt;/strong&gt;: &lt;code&gt;background.js&lt;/code&gt; keeps a &lt;code&gt;webcontent&lt;/code&gt; cache holding the active tab's latest snapshot. When a tab changes or the sidebar opens, &lt;code&gt;refreshWebcontent&lt;/code&gt; is invoked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Loading State&lt;/strong&gt;: &lt;code&gt;refreshWebcontent&lt;/code&gt; first sends an older snapshot with &lt;code&gt;loading: true&lt;/code&gt; to the sidebar so the UI can show a loading indicator immediately instead of stale or empty data. When updated content arrives, it updates again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Fallback Strategy&lt;/strong&gt;: As shown in &lt;code&gt;browserTabsTool.ts&lt;/code&gt;, if a module (e.g., sidebar JS) can't call &lt;code&gt;chrome.*&lt;/code&gt; APIs directly, it sends a &lt;code&gt;chrome.runtime.sendMessage&lt;/code&gt; to &lt;code&gt;background.js&lt;/code&gt;, which executes the request with the required privileges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Context Synthesis &amp;amp; Summarization (&lt;code&gt;webcontentprocess.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Raw page content is too noisy for AI or users. &lt;code&gt;WebContentProcess&lt;/code&gt; refines it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Change Detection&lt;/strong&gt;: To avoid unnecessary processing and spamming data, &lt;code&gt;hasContentChanged&lt;/code&gt; computes a signature for page content. Only when the signature or URL changes do we regenerate the summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Summary&lt;/strong&gt;: &lt;code&gt;extractStructuralSummary&lt;/code&gt; parses HTML and extracts key interactive elements (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, &lt;code&gt;h1-h6&lt;/code&gt;, etc.), producing a compact representation such as:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;input&amp;gt; [class=search-input, id=q, type=text, placeholder=Search...]
  &amp;lt;button&amp;gt; [class=btn.btn-primary] text="Confirm"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This high-quality context helps LLMs generate precise selectors or make task decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Engineering Trade-offs &amp;amp; Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modularity &amp;amp; Extensibility&lt;/strong&gt;: Encapsulate capabilities (e.g., &lt;code&gt;browserTabsTool&lt;/code&gt;) as independent tools that export definitions. This makes future integration with LLM Function Calling or plugin ecosystems straightforward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience&lt;/strong&gt;: Timeouts, retries, and optional steps are first-class citizens. Assume networks delay, page structures change, and selectors fail; handle these gracefully to improve automation success rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Considerations&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Least Privilege&lt;/strong&gt;: Request permissions only when necessary, and use mechanisms like &lt;code&gt;CHECK_ACTIVE_TAB&lt;/code&gt; to ensure automation runs only on the user's active page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-origin &lt;code&gt;iframe&lt;/code&gt;s&lt;/strong&gt;: Wrap access attempts in &lt;code&gt;try...catch&lt;/code&gt;. If cross-origin policies block access, log a warning and continue rather than crashing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Guards&lt;/strong&gt;: Use &lt;code&gt;chrome.runtime.lastError&lt;/code&gt; widely to check async API results and avoid uncaught exceptions that could crash the Service Worker.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;p&gt;BlackEagle's web automation is not the result of a single technique but a synthesis of protocol design, DOM manipulation, event simulation, state management, and fault-tolerant strategies. Through a layered architecture and a carefully designed WAOP, we deliver a powerful yet relatively reliable automation system. I hope this analysis helps you when building similar browser automation tools.&lt;/p&gt;

&lt;p&gt;My GitHub：&lt;a href="https://github.com/andersliuyang/BlackEagleAI%E3%80%82" rel="noopener noreferrer"&gt;https://github.com/andersliuyang/BlackEagleAI。&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>node</category>
    </item>
    <item>
      <title>Hello Dev</title>
      <dc:creator>andersliuyang</dc:creator>
      <pubDate>Sun, 25 Jan 2026 12:58:56 +0000</pubDate>
      <link>https://dev.to/andersliuyang/hello-dev-1iah</link>
      <guid>https://dev.to/andersliuyang/hello-dev-1iah</guid>
      <description>&lt;p&gt;Hey everyone, I’m new here, hope we get along!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
