<?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>I Spent the Last Few Days Testing AI Agents and Got Scared — So I Built Sentinel v0.3.0</title>
      <dc:creator>yhc</dc:creator>
      <pubDate>Sat, 30 May 2026 02:17:02 +0000</pubDate>
      <link>https://dev.to/yinhaoc/i-spent-the-last-few-days-testing-ai-agents-and-got-scared-so-i-built-sentinel-v030-30ll</link>
      <guid>https://dev.to/yinhaoc/i-spent-the-last-few-days-testing-ai-agents-and-got-scared-so-i-built-sentinel-v030-30ll</guid>
      <description>&lt;p&gt;Hey dev.to community 👋&lt;/p&gt;

&lt;p&gt;Over the past few days, I’ve been running dozens of AI Agent experiments. The more powerful they got, the more nervous I became.&lt;/p&gt;

&lt;p&gt;They can do amazing things, but they’re also shockingly easy to jailbreak, abuse tools, or quietly exfiltrate data. And once they go rogue? Traditional “safety inside the agent” approaches just don’t cut it.&lt;/p&gt;

&lt;p&gt;So I decided to solve it differently.&lt;/p&gt;

&lt;p&gt;The Solution: Sentinel v0.3.0 “The Shield Release”&lt;br&gt;
I pulled the entire security layer completely outside the agent using an independent Shield Sidecar process.&lt;br&gt;
The agent literally cannot see it or kill it. Every risky action (shell commands, file I/O, API calls, etc.) must request permission from the Shield first.&lt;/p&gt;

&lt;p&gt;Key Features&lt;br&gt;
•  Shield Sidecar — True out-of-band protection + instant SIGKILL + forensic snapshot&lt;br&gt;
•  Deterministic Shadow Sandbox — Preview any action safely before it touches your real system&lt;br&gt;
•  Red Team Engine — 34 attack vectors, auto scoring (0-100)&lt;br&gt;
•  EU AI Act Compliance — One-click report generation&lt;br&gt;
•  Python @protect decorator + LangChain plugin&lt;br&gt;
•  Clean dashboard for monitoring + one-click kill&lt;/p&gt;

&lt;p&gt;Full project here: &lt;a href="https://github.com/byte271/Sentinel" rel="noopener noreferrer"&gt;https://github.com/byte271/Sentinel&lt;/a&gt;&lt;br&gt;
Still very early (v0.3.0 just dropped), but I’m really happy with the direction — strong focus on determinism, auditability, and local-first.&lt;br&gt;
If you’re building AI Agents, I’d love your honest feedback. What safety problems are you running into the most?&lt;br&gt;
Let me know in the comments! 🔥&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <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>
