<?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: Vy Quốc Vũ</title>
    <description>The latest articles on DEV Community by Vy Quốc Vũ (@vyquocvu).</description>
    <link>https://dev.to/vyquocvu</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%2F96447%2F65305a4a-b843-45b2-89d7-5a3891c1a49d.jpeg</url>
      <title>DEV Community: Vy Quốc Vũ</title>
      <link>https://dev.to/vyquocvu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vyquocvu"/>
    <language>en</language>
    <item>
      <title>I Built Rillio: A JSX UI Runtime Using Addressable DOM Instead of Virtual DOM</title>
      <dc:creator>Vy Quốc Vũ</dc:creator>
      <pubDate>Thu, 29 Oct 2026 01:25:37 +0000</pubDate>
      <link>https://dev.to/vyquocvu/i-built-rillio-a-jsx-ui-runtime-using-addressable-dom-instead-of-virtual-dom-noh</link>
      <guid>https://dev.to/vyquocvu/i-built-rillio-a-jsx-ui-runtime-using-addressable-dom-instead-of-virtual-dom-noh</guid>
      <description>&lt;p&gt;I've been working on a side project called &lt;strong&gt;Rillio&lt;/strong&gt;, a small TypeScript/JSX UI runtime.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/vyquocvu/rillio" rel="noopener noreferrer"&gt;https://github.com/vyquocvu/rillio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It started as an experiment. I was curious about one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if DOM nodes had stable identities, and we could update them directly without relying on a Virtual DOM tree as the main source of truth?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React and Preact already solve UI rendering really well. SolidJS also showed that fine-grained reactivity can work without a traditional Virtual DOM.&lt;/p&gt;

&lt;p&gt;So I'm not trying to reinvent React or claim I've built something faster than everything else.&lt;/p&gt;

&lt;p&gt;I just wanted to explore a different architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: Addressable DOM / Flat Index
&lt;/h2&gt;

&lt;p&gt;In Rillio, every managed DOM node gets a stable &lt;code&gt;NodeId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead of maintaining another authoritative component/VDOM tree describing the DOM structure, Rillio keeps a flat registry of nodes and their relationships.&lt;/p&gt;

&lt;p&gt;A simplified version looks like this:&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;FlatNode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;prevSibling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;nextSibling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;lastChild&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&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;The actual implementation has more fields for ownership, lifecycle, boundaries and other things.&lt;/p&gt;

&lt;p&gt;The important part is that a node can be accessed directly by ID.&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;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodeId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No need to walk through a component tree just to locate the record.&lt;/p&gt;

&lt;p&gt;Of course, looking up a node is only one small part of rendering. Structural changes, lifecycle management and keeping the registry in sync with the browser DOM are much harder problems.&lt;/p&gt;
&lt;h2&gt;
  
  
  One Patch Engine for DOM updates
&lt;/h2&gt;

&lt;p&gt;Another design decision was to keep DOM mutations behind a single Patch Engine.&lt;/p&gt;

&lt;p&gt;Something like:&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;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodeId&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&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;beforeId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodeId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The runtime validates operations and applies them through a shared mutation path.&lt;/p&gt;

&lt;p&gt;This gives Rillio a place to manage node ownership, ordering, versioning and cleanup.&lt;/p&gt;

&lt;p&gt;It also makes debugging more interesting, since DOM changes can be described as operations rather than just arbitrary mutations scattered across the runtime.&lt;/p&gt;

&lt;p&gt;But there is a tradeoff: transactions introduce their own complexity, especially around rollback, nested updates and callbacks.&lt;/p&gt;

&lt;p&gt;I'm still working on those edge cases.&lt;/p&gt;
&lt;h2&gt;
  
  
  JSX stays familiar
&lt;/h2&gt;

&lt;p&gt;I didn't want developers to learn a completely new syntax.&lt;/p&gt;

&lt;p&gt;You can write components like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rillio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Looks pretty familiar, right?&lt;/p&gt;

&lt;p&gt;But under the hood, Rillio uses its Flat Index and Patch Engine to manage DOM identity and updates.&lt;/p&gt;

&lt;p&gt;It also has an explicit reactive DOM API for cases where I want more direct control over updates.&lt;/p&gt;

&lt;p&gt;One thing worth mentioning: &lt;strong&gt;React-like syntax doesn't mean full React compatibility&lt;/strong&gt;. That's not the goal right now.&lt;/p&gt;
&lt;h2&gt;
  
  
  Some interesting algorithm problems
&lt;/h2&gt;

&lt;p&gt;This project turned out to involve more algorithms than I expected.&lt;/p&gt;

&lt;p&gt;A few examples:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Longest Increasing Subsequence (LIS)
&lt;/h3&gt;

&lt;p&gt;When reordering keyed lists, we want to preserve existing DOM nodes and avoid unnecessary moves.&lt;/p&gt;

&lt;p&gt;LIS helps determine which nodes can stay in place.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old: A B C D E
New: B D A C E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead of recreating the entire list, we can preserve the DOM nodes and move only the ones that need to change position.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Doubly linked siblings
&lt;/h3&gt;

&lt;p&gt;Instead of storing child relationships only in arrays, the Flat Index tracks previous and next siblings.&lt;/p&gt;

&lt;p&gt;This allows efficient linking and unlinking when the relevant nodes are already known.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Transaction validation
&lt;/h3&gt;

&lt;p&gt;Before changing DOM structure, the runtime needs to check whether operations are valid.&lt;/p&gt;

&lt;p&gt;For example, moving a parent into its own descendant should never be allowed.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Reactive dependency graphs
&lt;/h3&gt;

&lt;p&gt;When state changes, ideally only the affected computations should run.&lt;/p&gt;

&lt;p&gt;Things get tricky when dependencies change dynamically or multiple computations share the same dependencies.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Randomized consistency testing
&lt;/h3&gt;

&lt;p&gt;This is probably one of my favorite parts.&lt;/p&gt;

&lt;p&gt;I generate sequences of DOM updates and check whether the Flat Index still agrees with the actual DOM.&lt;/p&gt;

&lt;p&gt;It's basically algorithm practice, except a bug might make half the UI disappear :)&lt;/p&gt;
&lt;h2&gt;
  
  
  What about performance?
&lt;/h2&gt;

&lt;p&gt;I've been benchmarking Rillio against other UI runtimes, especially for keyed lists, text updates and DOM reordering.&lt;/p&gt;

&lt;p&gt;Some scenarios look promising, particularly updates that benefit from stable node identity and minimal moves.&lt;/p&gt;

&lt;p&gt;But there are also costs.&lt;/p&gt;

&lt;p&gt;Maintaining a Flat Index requires additional metadata, and initial mounting has its own overhead.&lt;/p&gt;

&lt;p&gt;So I don't think a single benchmark is enough to say one architecture is better.&lt;/p&gt;

&lt;p&gt;I'm more interested in understanding &lt;strong&gt;which workloads benefit from this design, and which don't&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Right now I'm focusing on correctness before adding more features.&lt;/p&gt;

&lt;p&gt;A few things I want to improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stronger transaction validation and rollback behavior&lt;/li&gt;
&lt;li&gt;More randomized and model-based testing&lt;/li&gt;
&lt;li&gt;Better handling of deeply nested DOM structures&lt;/li&gt;
&lt;li&gt;Exploring cost-aware DOM patch planning&lt;/li&gt;
&lt;li&gt;Investigating whether a compiler could optimize JSX into more direct DOM bindings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term idea is to keep Addressable DOM as the foundation, while everything else — JSX, components, state and reactivity — works around it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Building a UI runtime from scratch has made me appreciate how many difficult problems existing frameworks already solve.&lt;/p&gt;

&lt;p&gt;A simple counter is easy.&lt;/p&gt;

&lt;p&gt;Keyed lists, lifecycle cleanup, focus preservation, nested updates, error recovery and keeping everything consistent? Not so easy.&lt;/p&gt;

&lt;p&gt;I'm still not sure whether Addressable DOM will turn out to be a better architecture for real-world applications.&lt;/p&gt;

&lt;p&gt;But thats exactly why I'm building it.&lt;/p&gt;

&lt;p&gt;If you've worked on rendering engines, reactive systems or frontend frameworks, I'd really appreciate your thoughts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a Flat Index actually a useful abstraction for UI rendering, or am I just moving complexity from one place to another?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/vyquocvu/rillio" rel="noopener noreferrer"&gt;https://github.com/vyquocvu/rillio&lt;/a&gt;&lt;/p&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/vyquocvu" rel="noopener noreferrer"&gt;
        vyquocvu
      &lt;/a&gt; / &lt;a href="https://github.com/vyquocvu/rillio" rel="noopener noreferrer"&gt;
        rillio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Rillio is an experimental addressable-DOM runtime. It preserves familiar JSX authoring, while DOM identity, structure, ownership, and lifecycle are owned by a Flat Index rather than by a Virtual DOM tree.
    &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;Rillio&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@vyquocvu/rillio" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/af1b7439a5521feda7ce894c773b6d1af79b19c70e0cb9b5b65976fe67f9ca09/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f253430767971756f63767525324672696c6c696f" alt="npm version"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rillio is an experimental addressable-DOM runtime for client-side apps. JSX and explicit reactive views share one Flat Index and one transactional &lt;code&gt;PatchEngine&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/vyquocvu/rillio/docs/assets/rillio-studio-dashboard.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvyquocvu%2Frillio%2FHEAD%2Fdocs%2Fassets%2Frillio-studio-dashboard.png" alt="Rillio Studio workspace dashboard rendered with Rillio" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rillio Studio dashboard built with the Rillio runtime.&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Quick start&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Install the published package in an existing app:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install &lt;a class="mentioned-user" href="https://dev.to/vyquocvu"&gt;@vyquocvu&lt;/a&gt;/rillio&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;See the &lt;a href="https://www.npmjs.com/package/@vyquocvu/rillio" rel="nofollow noopener noreferrer"&gt;package on npm&lt;/a&gt; for
published versions and package details, or check out the standalone &lt;a href="https://github.com/vyquocvu/rillio/examples/quickstart/README.md" rel="noopener noreferrer"&gt;quickstart project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Or clone the repository to run the examples locally:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/vyquocvu/rillio.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; rillio
npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:5173/&lt;/code&gt; for the Rillio landing page, then follow its links to the showcases and docs.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚛️ JSX runtime&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-tsx notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;createRoot&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s1"&gt;useState&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;"&lt;a class="mentioned-user" href="https://dev.to/vyquocvu"&gt;@vyquocvu&lt;/a&gt;/rillio"&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-v"&gt;Counter&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-s1"&gt;count&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s1"&gt;setCount&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;useState&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
  &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-s1"&gt;button&lt;/span&gt; &lt;span class="pl-c1"&gt;onClick&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-en"&gt;setCount&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-s1"&gt;value&lt;/span&gt; &lt;span class="pl-c1"&gt;+&lt;/span&gt; &lt;span class="pl-c1"&gt;1&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s1"&gt;count&lt;/span&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/vyquocvu/rillio" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Ways to optimize your Lighthouse score</title>
      <dc:creator>Vy Quốc Vũ</dc:creator>
      <pubDate>Wed, 14 Dec 2022 18:08:12 +0000</pubDate>
      <link>https://dev.to/vyquocvu/ways-to-optimize-your-lighthouse-score-4che</link>
      <guid>https://dev.to/vyquocvu/ways-to-optimize-your-lighthouse-score-4che</guid>
      <description>&lt;p&gt;There are several ways to optimize your Lighthouse score, including the following:&lt;/p&gt;

&lt;p&gt;Minimize the size of your page's resources, such as HTML, JavaScript, and CSS files, by minifying them and reducing the number of files that your page loads. This can help improve your page's performance and reduce its loading time.&lt;/p&gt;

&lt;p&gt;Enable compression on your web server, which can help reduce the size of the files that your page loads. This can help improve your page's performance and reduce its loading time.&lt;/p&gt;

&lt;p&gt;Optimize your images by reducing their size and using the appropriate image file format for the type of image. This can help improve your page's performance and reduce its loading time.&lt;br&gt;
Use a content delivery network (CDN) to serve your page's static assets, such as images and JavaScript files. This can help improve your page's performance by reducing the distance that the assets have to travel to reach the user.&lt;/p&gt;

&lt;p&gt;Use caching to store frequently-used resources on the user's device, so that they don't have to be downloaded again on subsequent page visits. This can help improve your page's performance and reduce its loading time.&lt;/p&gt;

&lt;p&gt;Use asynchronous loading for your JavaScript and CSS files, so that they don't block the rendering of the page. This can help improve your page's performance and reduce its loading time.&lt;/p&gt;

&lt;p&gt;Use a web font service, such as Google Fonts, to serve your page's fonts, rather than hosting them on your own server. This can help improve your page's performance and reduce its loading time.&lt;/p&gt;

&lt;p&gt;Use a tool, such as Lighthouse, to audit your page and identify specific areas for improvement. This can help you identify specific steps that you can take to optimize your page and improve your Lighthouse score.&lt;/p&gt;

</description>
      <category>web</category>
      <category>optimize</category>
      <category>lighthouse</category>
    </item>
    <item>
      <title>Remove Vietnamese characters form string in JS</title>
      <dc:creator>Vy Quốc Vũ</dc:creator>
      <pubDate>Thu, 18 Aug 2022 16:57:37 +0000</pubDate>
      <link>https://dev.to/vyquocvu/remove-vietnamese-characters-form-string-in-js-39h</link>
      <guid>https://dev.to/vyquocvu/remove-vietnamese-characters-form-string-in-js-39h</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;_formatString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ì|í|ị|ỉ|ĩ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;i&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;u&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ỳ|ý|ỵ|ỷ|ỹ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;y&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/đ/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&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;



</description>
      <category>javascript</category>
      <category>unicode</category>
      <category>vietnamese</category>
    </item>
    <item>
      <title>I wrote a state management npm - Any State</title>
      <dc:creator>Vy Quốc Vũ</dc:creator>
      <pubDate>Tue, 16 Aug 2022 17:15:27 +0000</pubDate>
      <link>https://dev.to/vyquocvu/i-wrote-a-state-management-npm-any-state-291n</link>
      <guid>https://dev.to/vyquocvu/i-wrote-a-state-management-npm-any-state-291n</guid>
      <description>&lt;h3&gt;
  
  
  Features:
&lt;/h3&gt;

&lt;p&gt;Lightweight object state management&lt;br&gt;
Open Source Project&lt;br&gt;
Small App Size (~2Kb)&lt;br&gt;
Easy to use with nay framework, just a callback on change&lt;/p&gt;
&lt;h3&gt;
  
  
  About:
&lt;/h3&gt;

&lt;p&gt;AnyState is an open source programs built using Typescript (for a more secure environment).&lt;/p&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Initialize anyState object with createStore()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;anyState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&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;Set state&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;anyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&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;Get state&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set item&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// const path = 'name';&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;children[0].name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// the path to the item&lt;/span&gt;
  &lt;span class="nx"&gt;anyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get item&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;children[0]&lt;/span&gt;&lt;span class="dl"&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;child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watch onChange&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// path to item&lt;/span&gt;
  &lt;span class="nx"&gt;anyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prevState&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="c1"&gt;// do anything&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/vyquocvu/anystate/blob/main/examples/todo-react"&gt;React Todo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vyquocvu/anystate/blob/main/examples/todo-solid"&gt;Solid Todo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Links:
&lt;/h3&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/vyquocvu/anystate"&gt;https://github.com/vyquocvu/anystate&lt;/a&gt;&lt;br&gt;
Npm: &lt;a href="https://www.npmjs.com/package/anystate"&gt;https://www.npmjs.com/package/anystate&lt;/a&gt;&lt;br&gt;
MySite: &lt;a href="https://vyquocvu.co/"&gt;https://vyquocvu.co/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding! 🎉&lt;br&gt;
Accepted any advices.&lt;/p&gt;

</description>
      <category>typescrpit</category>
      <category>react</category>
      <category>solidjs</category>
      <category>statemanagement</category>
    </item>
  </channel>
</rss>
