<?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: Tanish Raj</title>
    <description>The latest articles on DEV Community by Tanish Raj (@tanish-raj).</description>
    <link>https://dev.to/tanish-raj</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%2F1444556%2F011b5881-1304-4326-9d24-e74d8d85f244.jpeg</url>
      <title>DEV Community: Tanish Raj</title>
      <link>https://dev.to/tanish-raj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanish-raj"/>
    <language>en</language>
    <item>
      <title>I Tried Making HTML Dynamic (Without Frameworks) — Here’s What Happened ⚡</title>
      <dc:creator>Tanish Raj</dc:creator>
      <pubDate>Sun, 20 Jul 2025 15:28:40 +0000</pubDate>
      <link>https://dev.to/tanish-raj/build-dynamic-sites-with-just-html-introducing-zin-engine-10je</link>
      <guid>https://dev.to/tanish-raj/build-dynamic-sites-with-just-html-introducing-zin-engine-10je</guid>
      <description>&lt;p&gt;I’ve always loved how simple HTML is. Just open a file, write some tags, and you’ve got a page. No configs, no dependencies, no ceremony.&lt;/p&gt;

&lt;p&gt;But the moment you try to do something slightly more advanced — like reusing layouts or building components — HTML shows its limits. You either end up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy-pasting code all over the place (not fun 😅)&lt;/li&gt;
&lt;li&gt;Or dragging in a full-blown framework like React or Vue (also not fun for small projects)
So I started wondering: what if plain HTML could be just a little more dynamic?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That question turned into a little side project I’ve been hacking on: Zin Engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Zin Engine?
&lt;/h2&gt;

&lt;p&gt;It’s not a product. It’s not trying to compete with frameworks. It’s just me experimenting with how far I can stretch HTML with a minimal templating engine and server written in Go that gives plain old HTML some new tricks.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write regular HTML,&lt;/li&gt;
&lt;li&gt;Add a sprinkle of templating magic,&lt;/li&gt;
&lt;li&gt;And suddenly you can reuse layouts and build small dynamic sites… without leaving HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🗂️ Use plain .html files as your only source of truth — no framework or build step required&lt;/li&gt;
&lt;li&gt;🔧 Dynamic rendering with custom  tags&lt;/li&gt;
&lt;li&gt;📊 Render content from MySQL, JSON, CSV, Google Sheets (), APIs, and even .txt files&lt;/li&gt;
&lt;li&gt;🧩 Built-in support for layouts using template.html&lt;/li&gt;
&lt;li&gt;🔗 Clean URLs like /about → about.html&lt;/li&gt;
&lt;li&gt;🛠 Smart handling of 404/500 pages, .env files, and .zinignore&lt;/li&gt;
&lt;li&gt;⚡ Zero client-side JS — everything renders server-side in Go&lt;/li&gt;
&lt;li&gt;🌐 Runs on port 9001 by default (easy to use behind NGINX)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a quick taste 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Using Layouts, Including Partials, Markdown, and Text
&lt;/h3&gt;

&lt;p&gt;One of Zin’s best tricks is letting you define a single base layout (&lt;em&gt;template.html&lt;/em&gt;) that all your pages automatically inherit. That way, your header, sidebar, and footer stay consistent, and only the middle content changes.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;zin-include /&amp;gt;&lt;/code&gt; tag isn’t just for HTML snippets like a navbar or footer — it can also pull in &lt;strong&gt;Markdown (.md)&lt;/strong&gt; and &lt;strong&gt;text (.txt)&lt;/strong&gt; files. Markdown gets parsed into HTML automatically, so you can write docs in .md and drop them right into your layout.&lt;/p&gt;

&lt;p&gt;Example base template (&lt;em&gt;template.html&lt;/em&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Zin Engine Docs&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  ...
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;zin-include&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;"common/navbar.html"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Sidebar from HTML --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;zin-include&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;"common/sidebar.html"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ .children }}
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Inject .md file into content --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;zin-include&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;"common/footer.html"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, let’s say you create a page at /index.html:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Getting Started&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Welcome to the Zin Engine docs! 🚀&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Inject .md file (as parsed HTML) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-include&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;"data/examples.md"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Inject .txt file (injected as-is) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-include&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;"data/quote.txt"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you visit &lt;code&gt;http://localhost:9001&lt;/code&gt;, Zin will automatically wrap that page inside &lt;em&gt;template.html&lt;/em&gt;, replacing &lt;code&gt;{{ .children }}&lt;/code&gt; with the content of &lt;em&gt;index.html&lt;/em&gt; all stitched together seamlessly.&lt;/p&gt;

&lt;p&gt;So the final rendered page looks like your base template, but with the page (&lt;em&gt;index.html in this example&lt;/em&gt;) content injected into the content area.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pull in Data Anywhere 📊
&lt;/h3&gt;

&lt;p&gt;Zin makes it super easy to load data from multiple sources — files, APIs, databases, even Google Sheets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Load from file --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-data&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"file://data/users.csv"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"users"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Load from external API --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-data&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://jsonplaceholder.typicode.com/users"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"apiData"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Load from MySQL --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-data&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"mysql://SELECT * FROM users"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"dbUsers"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Load from Google Sheets using ENV var --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-data&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"sheets://SELECT * FROM {{process.env.SHEET_ID}}.Sheet1"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"sheetUsers"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Show any single value --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;App Title: {{process.env.APP_NAME}}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;User Name: {{users[0].name || "Guest"}}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Loop through users --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-repeat&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"users"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;{{name}}&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Email: {{email}}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Phone: {{phone}}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/zin-repeat&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can feed Zin data in multiple ways — then loop through it or drop values directly into your HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Handle Time Like a Pro ⏰
&lt;/h3&gt;

&lt;p&gt;Working with dates and times usually means importing a whole library. In Zin, it’s just a tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Default (now, datetime, unix ms) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-time&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Tomorrow in 12-hour format --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-time&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;"tomorrow"&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"datetime:12"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- 3 weeks ago from today --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-time&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;"today -3w"&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"dayname"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- First day of next month --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-time&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;"now +1m @startOf:month"&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Now in Tokyo timezone --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;zin-time&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"time:12"&lt;/span&gt; &lt;span class="na"&gt;tz=&lt;/span&gt;&lt;span class="s"&gt;"Asia/Tokyo"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need a timestamp, or the first day of next month? Done in one line.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Build Forms Without Pain 📝
&lt;/h3&gt;

&lt;p&gt;Zin even helps with forms, including validation and Google reCAPTCHA (Optional):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;zin-form&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"contact-form1"&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"{{process.env.CONTACT_FORM}}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"data-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"data-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;data-validator=&lt;/span&gt;&lt;span class="s"&gt;"required|email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"data-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Phone&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt; &lt;span class="na"&gt;data-validator=&lt;/span&gt;&lt;span class="s"&gt;"mobile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/zin-form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get clean HTML, built-in validation, and secure handling without writing extra JavaScript.&lt;/p&gt;

&lt;p&gt;And that’s just scratching the surface — Zin Engine also has tags for crypto, random values, environment variables, and more. You can check out the full list on the &lt;a href="https://github.com/zin-engine?utm_source=dev.to"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;Honestly? Curiosity.&lt;/p&gt;

&lt;p&gt;I love HTML for its simplicity, but I often found myself wishing I could do just a little more without setting up a whole toolchain. Zin Engine was my way of experimenting with that idea.&lt;/p&gt;

&lt;p&gt;It’s definitely not production-ready, and it’s not meant to compete with frameworks. It’s just a fun exploration into how far plain HTML can go if we give it a few extra powers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check It Out
&lt;/h2&gt;

&lt;p&gt;If you want to play with it, the code’s here:&lt;br&gt;
👉 &lt;a href="https://github.com/zin-engine?utm_source=dev.to"&gt;Zin Engine on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love feedback from fellow devs — whether you think this is neat, weird, or a bad idea altogether 😅.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>go</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Client Hook JS</title>
      <dc:creator>Tanish Raj</dc:creator>
      <pubDate>Wed, 28 Aug 2024 13:49:23 +0000</pubDate>
      <link>https://dev.to/tanish-raj/client-hook-js-g21</link>
      <guid>https://dev.to/tanish-raj/client-hook-js-g21</guid>
      <description>&lt;p&gt;I'm excited to share a lightweight library I developed for managing global state and reactive effects in JavaScript applications!&lt;/p&gt;

&lt;p&gt;Client Hook JS is designed to simplify state management and handle side effects in your projects. It’s similar to React hooks but operates with a global scope, making it a versatile tool for various applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  👉 Key Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global State Management:&lt;/strong&gt; Define and manage state variables with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reactive Effects:&lt;/strong&gt; Register and handle side effects based on state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic HTML Updates:&lt;/strong&gt; Seamlessly bind HTML elements to global state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Uses
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. useState
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates a global state variable with a specified name and initial value. Allows retrieval and updating of the state from anywhere in your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. useEffect
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Registers a callback function to be executed whenever any of the specified state variables change. The callback is called immediately with the current values of these variables and is triggered on subsequent updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automatic HTML Updates
&lt;/h3&gt;

&lt;p&gt;If you declare the client-hook attribute on an HTML element, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;client-hook=&lt;/span&gt;&lt;span class="s"&gt;"count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the value of the count state variable changes, the &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; tag will automatically update to reflect the new value of count. This provides a simple way to bind HTML elements to global state without needing additional code to manually update the DOM.&lt;/p&gt;

&lt;p&gt;Check it out and start coding with Client Hook JS! 🚀&lt;br&gt;
GitHub Repo: &lt;a href="https://github.com/cttricks/client-hooks-js" rel="noopener noreferrer"&gt;https://github.com/cttricks/client-hooks-js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👋 hey, I created this library primarily for my own learning and personal projects. If you’re looking for a simple and effective way to manage state and effects in your JavaScript apps, give it a try!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Feel free to explore, use, and modify it according to your needs. I welcome any feedback, contributions, or suggestions. Let’s make it even better together! 💪&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
