<?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: Harsha Dev </title>
    <description>The latest articles on DEV Community by Harsha Dev  (@harshasoldev).</description>
    <link>https://dev.to/harshasoldev</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%2F3925920%2F2d286bae-3219-470e-bad7-7801a360f440.jpeg</url>
      <title>DEV Community: Harsha Dev </title>
      <link>https://dev.to/harshasoldev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshasoldev"/>
    <language>en</language>
    <item>
      <title>I built a free browser-based character counter — here's what I learned</title>
      <dc:creator>Harsha Dev </dc:creator>
      <pubDate>Mon, 22 Jun 2026 05:54:52 +0000</pubDate>
      <link>https://dev.to/harshasoldev/i-built-a-free-browser-based-character-counter-heres-what-i-learned-1pfp</link>
      <guid>https://dev.to/harshasoldev/i-built-a-free-browser-based-character-counter-heres-what-i-learned-1pfp</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://webtoolsync.com/text-tools/character-counter" rel="noopener noreferrer"&gt;WebToolSync&lt;/a&gt; — &lt;br&gt;
a collection of free, privacy-focused browser tools that run entirely &lt;br&gt;
client-side. No uploads, no servers, no tracking.&lt;/p&gt;

&lt;p&gt;One of the first tools I built was a &lt;strong&gt;character counter&lt;/strong&gt;. Sounds simple, &lt;br&gt;
right? It mostly is — but I ran into a few things worth sharing.&lt;/p&gt;

&lt;p&gt;Why browser-only?&lt;/p&gt;

&lt;p&gt;Most online tools send your text to a server to process it. That's fine &lt;br&gt;
for public content, but if you're pasting a client email, a private document, &lt;br&gt;
or sensitive copy — you probably don't want that leaving your machine.&lt;/p&gt;

&lt;p&gt;Browser-only means the text never leaves your tab. Zero network requests &lt;br&gt;
after the page loads.&lt;/p&gt;

&lt;p&gt;The tricky parts&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Counting "characters" is not always counting characters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JavaScript's &lt;code&gt;.length&lt;/code&gt; property counts UTF-16 code units, not Unicode &lt;br&gt;
code points. Emojis like 🔥 are actually 2 units long in JS:&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🔥&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="c1"&gt;// → 2, not 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For most use cases (Twitter limits, meta descriptions, SMS) this doesn't &lt;br&gt;
matter. But it's worth knowing if you're building something that needs &lt;br&gt;
to be precise.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Real-time counting needs debouncing on large inputs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If someone pastes 50,000 words, recalculating on every keystroke is &lt;br&gt;
wasteful. A simple debounce of 100-200ms keeps it snappy:&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;let&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;textarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&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;ol&gt;
&lt;li&gt;"With spaces" vs "without spaces" matters more than you'd think&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copywriters, students submitting essays, and social media managers all &lt;br&gt;
think about character limits differently. Adding both counts (with and &lt;br&gt;
without spaces) doubled the usefulness of the tool overnight.&lt;/p&gt;

&lt;p&gt;Platform character limits I added as a reference&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twitter/X post&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram caption&lt;/td&gt;
&lt;td&gt;2,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn post&lt;/td&gt;
&lt;td&gt;3,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube title&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta description&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS (single)&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;Still adding tools — currently have 25 including a JSON formatter, &lt;br&gt;
percentage calculator, image compressor, and PDF utilities.&lt;/p&gt;

&lt;p&gt;If you've built browser-only tools, I'd love to hear what edge cases &lt;br&gt;
you ran into. Drop them in the comments.&lt;/p&gt;

&lt;p&gt;👉Try the character counter here(&lt;a href="https://webtoolsync.com/text-tools/character-counter" rel="noopener noreferrer"&gt;https://webtoolsync.com/text-tools/character-counter&lt;/a&gt;) &lt;a href="https://webtoolsync.com/text-tools/character-counter" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tools</category>
    </item>
    <item>
      <title>How I Built a 25-Tool Next.js Micro-SaaS in 24 Hours (and let an Hermes AI Agent handle my SEO)</title>
      <dc:creator>Harsha Dev </dc:creator>
      <pubDate>Mon, 11 May 2026 22:17:08 +0000</pubDate>
      <link>https://dev.to/harshasoldev/how-i-built-a-25-tool-nextjs-micro-saas-in-24-hours-and-let-an-hermes-ai-agent-handle-my-seo-3bco</link>
      <guid>https://dev.to/harshasoldev/how-i-built-a-25-tool-nextjs-micro-saas-in-24-hours-and-let-an-hermes-ai-agent-handle-my-seo-3bco</guid>
      <description>&lt;p&gt;Hey DEV community! 👋&lt;/p&gt;

&lt;p&gt;As a developer and digital marketer, I got sick of using random, ad-stuffed websites every time I needed to quickly format JSON, calculate a margin, or compress an image. Even worse, I hated the idea of uploading sensitive PDFs or client code to third-party servers just to split a page or convert a format.&lt;/p&gt;

&lt;p&gt;So, I decided to build my own privacy-first solution. In just 24 hours, I built and launched WebToolSync.&lt;/p&gt;

&lt;p&gt;It's a free suite of 25+ browser utilities designed for developers, creators, and operators.&lt;/p&gt;

&lt;p&gt;🛠️ The Tech Stack&lt;br&gt;
I wanted this to be lightning-fast and incredibly secure, so here is the architecture I went with:&lt;/p&gt;

&lt;p&gt;Frontend/Backend: Next.js (App Router)&lt;/p&gt;

&lt;p&gt;Hosting: Hostinger VPS (Ubuntu)&lt;/p&gt;

&lt;p&gt;Process Manager: PM2 (to keep the Node server alive)&lt;/p&gt;

&lt;p&gt;Reverse Proxy: Nginx&lt;/p&gt;

&lt;p&gt;Security: Certbot / Let's Encrypt for auto-renewing SSL&lt;/p&gt;

&lt;p&gt;The "Secret Sauce": Client-Side Processing&lt;br&gt;
The biggest feature of WebToolSync isn't what it does, but where it does it.&lt;/p&gt;

&lt;p&gt;For the Image Converters (JPG to PNG, Compressors) and the PDF Tools (Split, Merge, Rotate), everything happens locally inside the user's browser. By utilizing modern browser APIs and client-side processing, zero files are ever uploaded to a server. This means zero latency, no file size limits, and 100% data privacy.&lt;/p&gt;

&lt;p&gt;The Wild Part: Delegating SEO to an Autonomous Agent&lt;br&gt;
Building 25 tools in a day is fun. Writing 800 words of SEO-optimized content and FAQ schema for 25 different tool pages? Not fun.&lt;/p&gt;

&lt;p&gt;Instead of doing it manually, I spun up Hermes-Agent (an autonomous local LLM) directly on my VPS via SSH. I gave it access to my Next.js codebase and literally gave it the prompt: "Rewrite my SeoContent.tsx component to include 500+ words of educational content and Schema markup for all 25 tools so it ranks on Google."&lt;/p&gt;

&lt;p&gt;I sat back and watched the terminal as the AI navigated my directories, read my Next.js components, realized it made a truncation error, automatically deployed a sub-agent to fix its own mistake, and successfully rebuilt my codebase. &lt;/p&gt;

&lt;p&gt;Try It Out&lt;br&gt;
I'm building this entirely in public. You can check out the live site here:&lt;br&gt;
👉 WebToolSync.com &lt;a href="https://webtoolsync.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also recorded a full breakdown of how I built the SaaS without writing traditional code on my YouTube channel if you want to see the exact workflow!&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback on the UI/UX. What tool should I add to the platform next? Let me know in the comments! &lt;/p&gt;

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