<?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: yhc</title>
    <description>The latest articles on DEV Community by yhc (@yinhaoc).</description>
    <link>https://dev.to/yinhaoc</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%2F3572942%2F9ca094e9-9006-4432-ae12-356e3c4317c6.jpeg</url>
      <title>DEV Community: yhc</title>
      <link>https://dev.to/yinhaoc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yinhaoc"/>
    <language>en</language>
    <item>
      <title>Introducing Qyavix — a 155-byte DOM runtime</title>
      <dc:creator>yhc</dc:creator>
      <pubDate>Wed, 10 Dec 2025 02:42:17 +0000</pubDate>
      <link>https://dev.to/yinhaoc/introducing-qyavix-a-155-byte-dom-runtime-3h01</link>
      <guid>https://dev.to/yinhaoc/introducing-qyavix-a-155-byte-dom-runtime-3h01</guid>
      <description>&lt;p&gt;I recently built a tiny experiment: a minimal DOM runtime that provides hooks-style state and re-rendering… in just &lt;strong&gt;155 bytes&lt;/strong&gt;. Yes — bytes, not kilobytes.&lt;/p&gt;

&lt;h2&gt;🌿 What is Qyavix?&lt;/h2&gt;

&lt;p&gt;Qyavix is an extremely small JavaScript runtime that provides:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A simple state hook (&lt;code&gt;u&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;A tiny render function (&lt;code&gt;r&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;Zero dependencies&lt;/li&gt;
  &lt;li&gt;No bundler required&lt;/li&gt;
  &lt;li&gt;Full DOM rendering&lt;/li&gt;
  &lt;li&gt;Only ~10 lines of code (minified to 155 bytes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Ideal for micro-UIs, benchmarks, or experiments.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;⚡ The entire runtime (155 bytes)&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;let h = [], i, R;
export const u = v =&amp;gt; {
  let k = i++;
  return [h[k] ??= v, n =&amp;gt; (h[k] = n?.call ? n(h[k]) : n, R())];
};
export const r = (C, e) =&amp;gt; (R = () =&amp;gt; { i = 0; e.replaceChildren(C()) }, R());
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;🧩 How it works&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;u()&lt;/code&gt;&lt;/strong&gt; — state hook: creates state slots based on call order and triggers render when updated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;r()&lt;/code&gt;&lt;/strong&gt; — render function: resets state index, calls your component, replaces DOM. No virtual DOM or diff.&lt;/p&gt;

&lt;h2&gt;🚀 Quick example&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;import { u, r } from "./Qyavix.js";

function App() {
  const [count, setCount] = u(0);
  const btn = document.createElement("button");
  btn.textContent = "Count: " + count;
  btn.onclick = () =&amp;gt; setCount(c =&amp;gt; c + 1);
  return btn;
}

r(App, document.getElementById("root"));
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;🌐 Live demo / Official site&lt;/h2&gt;

&lt;p&gt;The official site &lt;a href="https://qyavix.pages.dev" rel="noopener noreferrer"&gt;qyavix.pages.dev&lt;/a&gt; uses Qyavix itself to render — no framework, no build step, pure JS + 155-byte runtime.&lt;/p&gt;

&lt;h2&gt;📦 GitHub Repository&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Yinhao-c/Qyavix" rel="noopener noreferrer"&gt;github.com/Yinhao-c/Qyavix&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;💬 Feedback welcome&lt;/h2&gt;

&lt;p&gt;If you try Qyavix or have ideas — suggestions, bugs, improvements — feel free to open issues or PRs. Every star / comment helps ❤️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How I Built CyhTabs — A Minimal, Privacy-Friendly Tab Manager That Just Works</title>
      <dc:creator>yhc</dc:creator>
      <pubDate>Sat, 18 Oct 2025 18:39:51 +0000</pubDate>
      <link>https://dev.to/yinhaoc/how-i-built-cyhtabs-a-minimal-privacy-friendly-tab-manager-that-just-works-4mp</link>
      <guid>https://dev.to/yinhaoc/how-i-built-cyhtabs-a-minimal-privacy-friendly-tab-manager-that-just-works-4mp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Tired of messy tab chaos? Meet &lt;strong&gt;CyhTabs&lt;/strong&gt; — a tiny, fast browser extension that saves your window as named tab groups and restores them instantly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Why I Built It
&lt;/h2&gt;

&lt;p&gt;Every time I switched tasks, I hated losing my browsing context — dozens of tabs scattered everywhere.&lt;br&gt;&lt;br&gt;
I wanted something that’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant to use
&lt;/li&gt;
&lt;li&gt;Privacy-first (no remote servers)
&lt;/li&gt;
&lt;li&gt;Lightweight and safe
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;CyhTabs&lt;/strong&gt;, a simple browser extension that saves and restores tab groups locally — with a single click.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What It Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🏷️ Save &amp;amp; name your tab groups (title + timestamp)
&lt;/li&gt;
&lt;li&gt;🚀 One-click restore (open all group tabs in a window)
&lt;/li&gt;
&lt;li&gt;💾 Local-only storage (nothing uploaded)
&lt;/li&gt;
&lt;li&gt;🧩 Lightweight popup UI
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No clutter, just productivity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔸 Firefox (recommended)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install from Mozilla Add-ons:
👉 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/cyhtabs/" rel="noopener noreferrer"&gt;https://addons.mozilla.org/en-US/firefox/addon/cyhtabs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pin the icon and try saving your first group!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔸 Chrome / Edge
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download from GitHub Releases:
👉 &lt;a href="https://github.com/Yinhao-c/CyhTabs/releases" rel="noopener noreferrer"&gt;https://github.com/Yinhao-c/CyhTabs/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://extensions/&lt;/code&gt; → enable &lt;strong&gt;Developer mode&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Load unpacked&lt;/strong&gt; → select the folder containing &lt;code&gt;manifest.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pin the extension and test Save → Name → Restore&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🌟 Why It's Useful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Restore your entire research/work session anytime
&lt;/li&gt;
&lt;li&gt;Keep your workflow private — all data stays local
&lt;/li&gt;
&lt;li&gt;No signup, no sync, no background bloat
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Under the Hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;chrome.storage.local&lt;/code&gt; (and Firefox equivalent)
&lt;/li&gt;
&lt;li&gt;Built with &lt;strong&gt;Manifest V3&lt;/strong&gt; service worker model
&lt;/li&gt;
&lt;li&gt;Event-driven background for reliability and low memory
&lt;/li&gt;
&lt;li&gt;Minimal permissions for security
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to peek under the hood, all code is open and commented in the repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 For Developers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simple example: restore saved group&lt;/span&gt;
&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;groups&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;groups&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="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧰 Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Popup blank? → Right-click → Inspect → Console for errors
&lt;/li&gt;
&lt;li&gt;Missing groups? → Check your browser’s storage settings
&lt;/li&gt;
&lt;li&gt;File an issue with steps &amp;amp; a short GIF if possible
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Contribute
&lt;/h2&gt;

&lt;p&gt;GitHub Repo → &lt;a href="https://github.com/Yinhao-c/CyhTabs/" rel="noopener noreferrer"&gt;https://github.com/Yinhao-c/CyhTabs/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Issues, PRs, and feedback are always welcome!&lt;/p&gt;

&lt;p&gt;Contact → &lt;code&gt;yihac1@outlook.com&lt;/code&gt;&lt;/p&gt;




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

&lt;p&gt;If you juggle multiple projects or research topics, give &lt;strong&gt;CyhTabs&lt;/strong&gt; a try.&lt;br&gt;&lt;br&gt;
Install it, save your sessions, and take back control of your tabs.&lt;/p&gt;

&lt;p&gt;If you find it helpful, please ⭐ the repo or leave a short review on AMO — it helps more users discover it!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/cyhtabs/" rel="noopener noreferrer"&gt;Firefox Add-on Page&lt;/a&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/Yinhao-c/CyhTabs/" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with love and too many tabs 💻&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
