<?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>Forem: Suhas Sunder</title>
    <description>The latest articles on Forem by Suhas Sunder (@suhassunder).</description>
    <link>https://forem.com/suhassunder</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%2F2248991%2Fb518b9da-82fe-40c4-9655-6e66daadc823.jpg</url>
      <title>Forem: Suhas Sunder</title>
      <link>https://forem.com/suhassunder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/suhassunder"/>
    <language>en</language>
    <item>
      <title>Why I Built 70+ Focused Timers Instead of One Big Timer</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Fri, 20 Feb 2026 18:42:20 +0000</pubDate>
      <link>https://forem.com/suhassunder/why-i-built-70-focused-timers-instead-of-one-big-timer-3lae</link>
      <guid>https://forem.com/suhassunder/why-i-built-70-focused-timers-instead-of-one-big-timer-3lae</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fandnt1vuqrgn6g5ec5oh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fandnt1vuqrgn6g5ec5oh.jpg" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  I Built a Timer Site Because I Kept Needing Slightly Different Timers
&lt;/h1&gt;

&lt;p&gt;I did not wake up one day thinking, “The world needs another timer website.”&lt;/p&gt;

&lt;p&gt;I kept building timers because I kept needing them.&lt;/p&gt;

&lt;p&gt;A clean countdown for presentations.&lt;br&gt;&lt;br&gt;
A fullscreen timer for workouts.&lt;br&gt;&lt;br&gt;
A silent timer that would not blast a notification.&lt;br&gt;&lt;br&gt;
A meeting timer that counts up instead of down.&lt;br&gt;&lt;br&gt;
A Pomodoro timer without clutter.  &lt;/p&gt;

&lt;p&gt;Every time I searched for one, it almost did what I wanted. Almost.&lt;/p&gt;

&lt;p&gt;So I started building them myself.&lt;/p&gt;

&lt;p&gt;That collection eventually became &lt;strong&gt;ilovetimers.com&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem With “Just a Timer”
&lt;/h2&gt;

&lt;p&gt;Timers sound simple.&lt;/p&gt;

&lt;p&gt;Set duration.&lt;br&gt;&lt;br&gt;
Start.&lt;br&gt;&lt;br&gt;
End.&lt;/p&gt;

&lt;p&gt;But real use cases are very different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A classroom timer needs to be large and readable from across the room
&lt;/li&gt;
&lt;li&gt;A presentation timer must not make sound unexpectedly
&lt;/li&gt;
&lt;li&gt;A workout timer needs intervals and repeat cycles
&lt;/li&gt;
&lt;li&gt;A meeting timer often needs to count up, not down
&lt;/li&gt;
&lt;li&gt;A study timer should feel minimal, not distracting
&lt;/li&gt;
&lt;li&gt;A cooking timer needs presets and fast adjustments
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One generic timer cannot serve all of those well.&lt;/p&gt;

&lt;p&gt;So instead of building one bloated “super timer,” I built focused routes.&lt;/p&gt;

&lt;p&gt;Each one solves a specific use case cleanly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Focused Timers Instead of One Complicated Tool
&lt;/h2&gt;

&lt;p&gt;The site now includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Countdown timer
&lt;/li&gt;
&lt;li&gt;Stopwatch
&lt;/li&gt;
&lt;li&gt;Pomodoro timer
&lt;/li&gt;
&lt;li&gt;HIIT timer
&lt;/li&gt;
&lt;li&gt;Tabata timer
&lt;/li&gt;
&lt;li&gt;EMOM and AMRAP timers
&lt;/li&gt;
&lt;li&gt;Presentation and classroom timers
&lt;/li&gt;
&lt;li&gt;Silent timer
&lt;/li&gt;
&lt;li&gt;Study and focus timers
&lt;/li&gt;
&lt;li&gt;Cooking, tea, and egg timers
&lt;/li&gt;
&lt;li&gt;Meditation and breathing timers
&lt;/li&gt;
&lt;li&gt;Speedrun and reaction time tools
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each page is intentionally simple and purpose-built.&lt;/p&gt;

&lt;p&gt;No feature overload. No unnecessary UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fullscreen Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;One thing I learned quickly is that fullscreen support changes everything.&lt;/p&gt;

&lt;p&gt;For workouts.&lt;br&gt;&lt;br&gt;
For classrooms.&lt;br&gt;&lt;br&gt;
For meetings projected on a screen.  &lt;/p&gt;

&lt;p&gt;A clean, distraction-free display is often more important than extra features.&lt;/p&gt;

&lt;p&gt;So fullscreen behavior became a first-class concern instead of an afterthought.&lt;/p&gt;




&lt;h2&gt;
  
  
  Count Up vs Count Down
&lt;/h2&gt;

&lt;p&gt;Another detail that kept coming up: people track time differently.&lt;/p&gt;

&lt;p&gt;Some want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“How much time is left?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“How long have we been going?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference sounds small, but it completely changes the mental model.&lt;/p&gt;

&lt;p&gt;So I built both countdown and count-up tools, including meeting-specific versions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Timers Are Really About Context
&lt;/h2&gt;

&lt;p&gt;The deeper I went, the more I realized timers are not about time.&lt;/p&gt;

&lt;p&gt;They are about context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Productivity
&lt;/li&gt;
&lt;li&gt;Focus
&lt;/li&gt;
&lt;li&gt;Rest
&lt;/li&gt;
&lt;li&gt;Training
&lt;/li&gt;
&lt;li&gt;Cooking
&lt;/li&gt;
&lt;li&gt;Study
&lt;/li&gt;
&lt;li&gt;Sleep
&lt;/li&gt;
&lt;li&gt;Presentations
&lt;/li&gt;
&lt;li&gt;Exams
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why there are separate routes instead of one universal tool.&lt;/p&gt;

&lt;p&gt;A workout timer should not look like a meditation timer.&lt;br&gt;&lt;br&gt;
A classroom timer should not behave like a chaos timer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond Timers: Clocks and Time Tools
&lt;/h2&gt;

&lt;p&gt;Eventually it expanded beyond timers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;World clock
&lt;/li&gt;
&lt;li&gt;UTC clock
&lt;/li&gt;
&lt;li&gt;Analog and digital clocks
&lt;/li&gt;
&lt;li&gt;Binary and hexadecimal clocks
&lt;/li&gt;
&lt;li&gt;Fibonacci clock
&lt;/li&gt;
&lt;li&gt;Atomic clock
&lt;/li&gt;
&lt;li&gt;Golden hour and moon phase clocks
&lt;/li&gt;
&lt;li&gt;Time zone converter
&lt;/li&gt;
&lt;li&gt;Work hours and billable hours calculators
&lt;/li&gt;
&lt;li&gt;Military time converter
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because once you are working with time as a concept, the ecosystem grows naturally.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Building This Taught Me
&lt;/h2&gt;

&lt;p&gt;A few things surprised me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Small UX details matter more than complex features.
&lt;/li&gt;
&lt;li&gt;Large readable typography beats decorative UI.
&lt;/li&gt;
&lt;li&gt;Silent mode is more important than people think.
&lt;/li&gt;
&lt;li&gt;Repetition patterns in workout timers require careful state handling.
&lt;/li&gt;
&lt;li&gt;Precision timing in the browser is not as trivial as it looks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Timers are simple conceptually, but state management, edge cases, and real-world expectations make them interesting to build.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Build Instead of Just Use Existing Ones?
&lt;/h2&gt;

&lt;p&gt;Because I wanted control over behavior.&lt;/p&gt;

&lt;p&gt;When does it auto-reset?&lt;br&gt;&lt;br&gt;
Does it keep state if the tab refreshes?&lt;br&gt;&lt;br&gt;
Does it drift over time?&lt;br&gt;&lt;br&gt;
Does it behave consistently across devices?  &lt;/p&gt;

&lt;p&gt;Building my own forced me to define those answers.&lt;/p&gt;

&lt;p&gt;And once you start defining behavior explicitly, you understand the problem space much better.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern Again
&lt;/h2&gt;

&lt;p&gt;I keep noticing the same pattern in my projects:&lt;/p&gt;

&lt;p&gt;I build small, focused tools around things I want to understand deeply.&lt;/p&gt;

&lt;p&gt;MorseWords helped me understand parsing and boundaries.&lt;/p&gt;

&lt;p&gt;ilovesvg helped me understand structured vector data.&lt;/p&gt;

&lt;p&gt;ilovetimers helped me understand time handling, state, UX minimalism, and precision in the browser.&lt;/p&gt;

&lt;p&gt;Building tools is how I explore systems.&lt;/p&gt;

&lt;p&gt;If you build small utilities like this, what have you learned from them that you would not have learned just using someone else’s tool?&lt;/p&gt;

&lt;p&gt;If you are curious, you can check it out here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ilovetimers.com" rel="noopener noreferrer"&gt;https://www.ilovetimers.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>timers</category>
      <category>ilovetimers</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built an SVG Toolkit Because I Needed to Actually Parse SVG Properly</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Fri, 20 Feb 2026 18:38:28 +0000</pubDate>
      <link>https://forem.com/suhassunder/i-built-an-svg-toolkit-because-i-needed-to-actually-parse-svg-properly-5de2</link>
      <guid>https://forem.com/suhassunder/i-built-an-svg-toolkit-because-i-needed-to-actually-parse-svg-properly-5de2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedizeqh23kkn6vogvv0u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedizeqh23kkn6vogvv0u.jpg" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  I Built an SVG Toolkit Because I Needed to Parse SVG Properly
&lt;/h1&gt;

&lt;p&gt;SVG looks simple.&lt;/p&gt;

&lt;p&gt;It is just XML.&lt;br&gt;&lt;br&gt;
It is just paths and shapes.&lt;br&gt;&lt;br&gt;
It is just vectors.&lt;/p&gt;

&lt;p&gt;Until you actually try to manipulate it.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;ilovesvg.com&lt;/strong&gt; because I kept running into real SVG parsing problems while working on projects. Not theoretical ones. Practical, annoying edge cases.&lt;/p&gt;

&lt;p&gt;I needed reliable SVG tooling. So I built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: SVG Is Simple Until It Isn’t
&lt;/h2&gt;

&lt;p&gt;The moment you try to do anything beyond display an SVG, things get complicated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;viewBox does not match width and height
&lt;/li&gt;
&lt;li&gt;Inline styles override attributes
&lt;/li&gt;
&lt;li&gt;Paths contain transforms
&lt;/li&gt;
&lt;li&gt;Colors are defined in multiple places
&lt;/li&gt;
&lt;li&gt;Stroke widths behave differently under scaling
&lt;/li&gt;
&lt;li&gt;Files contain unnecessary metadata
&lt;/li&gt;
&lt;li&gt;Embedded raster images bloat file size
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to resize, recolor, clean, minify, convert, or extract dimensions correctly, you cannot treat SVG as just a static file. You have to parse it deliberately.&lt;/p&gt;

&lt;p&gt;That is what pushed me to build proper tooling instead of relying on snippets.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;ilovesvg.com is not just a converter site.&lt;/p&gt;

&lt;p&gt;It is a collection of focused SVG utilities built around one idea:&lt;/p&gt;

&lt;p&gt;If you are going to manipulate SVG, you need predictable parsing and clear transformations.&lt;/p&gt;

&lt;p&gt;Each tool solves one specific problem cleanly.&lt;/p&gt;




&lt;h2&gt;
  
  
  SVG → Raster and PDF
&lt;/h2&gt;

&lt;p&gt;Sometimes you need vectors.&lt;br&gt;&lt;br&gt;
Sometimes you need a PNG for social, a JPG for legacy systems, or a PDF for print.&lt;/p&gt;

&lt;p&gt;So I built dedicated routes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SVG to PNG
&lt;/li&gt;
&lt;li&gt;SVG to JPG
&lt;/li&gt;
&lt;li&gt;SVG to WebP
&lt;/li&gt;
&lt;li&gt;SVG to PDF
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was consistent rendering, not hoping a browser interprets it the way you expect.&lt;/p&gt;




&lt;h2&gt;
  
  
  SVG Utilities I Personally Needed
&lt;/h2&gt;

&lt;p&gt;These came directly from real use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background editor
&lt;/h3&gt;

&lt;p&gt;Many SVGs are transparent. Sometimes you need a white background. Sometimes you need a specific hex color.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resize and scale editor
&lt;/h3&gt;

&lt;p&gt;Scaling correctly means respecting viewBox, transforms, and stroke behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recolor
&lt;/h3&gt;

&lt;p&gt;Changing fill and stroke values across nested groups requires structured parsing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minifier and cleaner
&lt;/h3&gt;

&lt;p&gt;Removing metadata and unnecessary attributes without breaking structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stroke width editor
&lt;/h3&gt;

&lt;p&gt;Scaling strokes intentionally instead of accidentally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flip and rotate
&lt;/h3&gt;

&lt;p&gt;Applying transformations without corrupting geometry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dimensions inspector
&lt;/h3&gt;

&lt;p&gt;Understanding intrinsic width, height, and viewBox quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  File size inspector
&lt;/h3&gt;

&lt;p&gt;Seeing what is actually contributing to weight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility and contrast checker
&lt;/h3&gt;

&lt;p&gt;SVG icons still need accessible contrast and structure.&lt;/p&gt;

&lt;p&gt;These are not flashy features. They are practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  SVG vs IMG and Embed Code
&lt;/h2&gt;

&lt;p&gt;When should you inline SVG?&lt;br&gt;&lt;br&gt;
When should you use an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag?&lt;br&gt;&lt;br&gt;
How should you embed for performance and styling flexibility?&lt;/p&gt;

&lt;p&gt;That became its own route because the answer depends on how you plan to use the graphic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Base64 Support
&lt;/h2&gt;

&lt;p&gt;If you have ever embedded SVG in CSS or HTML directly, you have dealt with Base64 encoding.&lt;/p&gt;

&lt;p&gt;So I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SVG to Base64
&lt;/li&gt;
&lt;li&gt;Base64 to SVG
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Predictable in, predictable out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Raster → SVG
&lt;/h2&gt;

&lt;p&gt;Vectorization is another rabbit hole.&lt;/p&gt;

&lt;p&gt;I added routes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PNG to SVG
&lt;/li&gt;
&lt;li&gt;JPG to SVG
&lt;/li&gt;
&lt;li&gt;WebP to SVG
&lt;/li&gt;
&lt;li&gt;Logo to SVG
&lt;/li&gt;
&lt;li&gt;Icon to SVG
&lt;/li&gt;
&lt;li&gt;Sketch, scan, and drawing to SVG
&lt;/li&gt;
&lt;li&gt;Image and photo outline extraction
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are controlled transformations designed for specific use cases.&lt;/p&gt;

&lt;p&gt;The important part was handling structure consistently instead of just wrapping an image inside an SVG tag.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Building This Taught Me About SVG
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;viewBox is everything.
&lt;/li&gt;
&lt;li&gt;Scaling without understanding stroke behavior causes visual bugs.
&lt;/li&gt;
&lt;li&gt;Inline styles complicate transformations.
&lt;/li&gt;
&lt;li&gt;Many SVG files contain unnecessary junk.
&lt;/li&gt;
&lt;li&gt;Clean parsing matters more than clever UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SVG is powerful because it is structured. But that structure only helps you if you respect it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Build Instead of Use Existing Tools?
&lt;/h2&gt;

&lt;p&gt;Because I wanted control over parsing behavior.&lt;/p&gt;

&lt;p&gt;When you rely on black box tools, you cannot predict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What gets stripped
&lt;/li&gt;
&lt;li&gt;What gets preserved
&lt;/li&gt;
&lt;li&gt;What gets rewritten
&lt;/li&gt;
&lt;li&gt;How transforms are applied
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building my own forced me to define rules explicitly.&lt;/p&gt;

&lt;p&gt;That clarity carries over into every project where I manipulate SVG.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Pattern
&lt;/h2&gt;

&lt;p&gt;I tend to build tools around topics I want to understand deeply.&lt;/p&gt;

&lt;p&gt;MorseWords helped me understand parsing and boundaries.&lt;/p&gt;

&lt;p&gt;ilovesvg helped me understand SVG as a structured language, not just a file format.&lt;/p&gt;

&lt;p&gt;Building small, focused utilities is one of the fastest ways to understand something technical at a deeper level.&lt;/p&gt;

&lt;p&gt;If you work with SVG regularly, what has been your biggest pain point?&lt;/p&gt;

&lt;p&gt;Parsing? Scaling? Cleaning? Converting?&lt;/p&gt;

&lt;p&gt;You can check out the toolkit here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ilovesvg.com" rel="noopener noreferrer"&gt;https://www.ilovesvg.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>svg</category>
      <category>ilovesvg</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built a Morse Code Tool to Help Me Actually Learn It</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Fri, 20 Feb 2026 18:35:26 +0000</pubDate>
      <link>https://forem.com/suhassunder/i-built-a-morse-code-tool-to-help-me-actually-learn-it-460h</link>
      <guid>https://forem.com/suhassunder/i-built-a-morse-code-tool-to-help-me-actually-learn-it-460h</guid>
      <description>&lt;p&gt;A while ago I decided I wanted to actually learn Morse code.&lt;/p&gt;

&lt;p&gt;Not just recognize “SOS.”&lt;br&gt;&lt;br&gt;
Not just paste text into a translator.&lt;br&gt;&lt;br&gt;
But understand how it works, how it sounds, and how spacing really matters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qfrodr0w0zpoi47on3u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qfrodr0w0zpoi47on3u.jpg" alt=" " width="800" height="888"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I did what I usually do when I want to understand something better.&lt;/p&gt;

&lt;p&gt;I built a tool around it.&lt;/p&gt;

&lt;p&gt;That project became &lt;strong&gt;MorseWords&lt;/strong&gt;, a small web app for translating, listening to, and practicing Morse code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Build It at All?
&lt;/h2&gt;

&lt;p&gt;Because building something forces you to understand the rules.&lt;/p&gt;

&lt;p&gt;If you are writing the encoder, you have to define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly counts as a letter break?&lt;/li&gt;
&lt;li&gt;What counts as a word break?&lt;/li&gt;
&lt;li&gt;How should spacing be handled?&lt;/li&gt;
&lt;li&gt;What happens when input is messy?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are writing the decoder, you cannot hand wave boundaries. You have to formalize them.&lt;/p&gt;

&lt;p&gt;That process taught me more than simply using a translator ever would.&lt;/p&gt;
&lt;h2&gt;
  
  
  Text to Morse
&lt;/h2&gt;

&lt;p&gt;The encoding side is intentionally predictable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input is normalized and uppercased
&lt;/li&gt;
&lt;li&gt;Each character maps to standard International Morse
&lt;/li&gt;
&lt;li&gt;Output formatting is strict

&lt;ul&gt;
&lt;li&gt;3 spaces between letters
&lt;/li&gt;
&lt;li&gt;7 spaces between words
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HELLO WORLD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;....   .   .-..   .-..   ---       .--   ---   .-.   .-..   -..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spacing is part of the output. That detail matters more than I realized when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Morse to Text
&lt;/h2&gt;

&lt;p&gt;Decoding made me appreciate how important boundaries are.&lt;/p&gt;

&lt;p&gt;The decoder reads chunks of dots and dashes and uses separators to decide where letters and words end.&lt;/p&gt;

&lt;p&gt;Rules are simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 to 6 spaces means a letter gap
&lt;/li&gt;
&lt;li&gt;7 or more spaces, a slash, or a new line means a word gap
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a sequence is not recognized, it becomes &lt;code&gt;?&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That choice was intentional. When you are learning, seeing mistakes clearly is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audio Made It Practical
&lt;/h2&gt;

&lt;p&gt;Reading Morse visually is one skill. Hearing it is another.&lt;/p&gt;

&lt;p&gt;So I added playback with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adjustable speed in WPM
&lt;/li&gt;
&lt;li&gt;Pitch control
&lt;/li&gt;
&lt;li&gt;Volume control
&lt;/li&gt;
&lt;li&gt;Repeat mode
&lt;/li&gt;
&lt;li&gt;Flashlight signaling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being able to slow things down and gradually increase speed made practice much more engaging.&lt;/p&gt;

&lt;p&gt;It stopped being just a translator and started feeling like a small training tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The most interesting part was not the interface. It was defining constraints.&lt;/p&gt;

&lt;p&gt;Morse looks simple, but once you start formalizing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Character maps
&lt;/li&gt;
&lt;li&gt;Spacing rules
&lt;/li&gt;
&lt;li&gt;Input normalization
&lt;/li&gt;
&lt;li&gt;Error handling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You realize how much structure is hiding under something that seems minimal.&lt;/p&gt;

&lt;p&gt;Building it made the system clearer in my head.&lt;/p&gt;

&lt;p&gt;And that was the entire goal.&lt;/p&gt;

&lt;p&gt;If you are learning something new, building a small focused tool around it is underrated. You understand the edges, not just the surface.&lt;/p&gt;

&lt;p&gt;If you are curious, the project is &lt;a href="https://www.morsewords.com" rel="noopener noreferrer"&gt;MorseWords&lt;/a&gt;&lt;/p&gt;

</description>
      <category>morse</category>
      <category>morsecode</category>
      <category>morsewords</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Small Rent Conversion Tool</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:04:53 +0000</pubDate>
      <link>https://forem.com/suhassunder/building-a-small-rent-conversion-tool-222p</link>
      <guid>https://forem.com/suhassunder/building-a-small-rent-conversion-tool-222p</guid>
      <description>&lt;p&gt;I wanted a simple way to compare rent listings that are billed on different schedules (weekly, every 4 weeks, monthly, annual). A lot of tools online convert between these using shortcuts that work “well enough,” but break down when you compare values across multiple periods.&lt;/p&gt;

&lt;p&gt;This started as a small personal utility, but it surfaced a few design and math issues that are easy to miss when building micro-calculators.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing a Consistent Conversion Model
&lt;/h2&gt;

&lt;p&gt;The biggest decision was how to handle time periods consistently.&lt;/p&gt;

&lt;p&gt;Instead of chaining conversions (for example, weekly → monthly → annual), everything goes through a per-day rate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 week&lt;/strong&gt; = 7 days
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biweekly&lt;/strong&gt; = 14 days
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every 4 weeks&lt;/strong&gt; = 28 days
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 year&lt;/strong&gt; = 365 days
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average month&lt;/strong&gt; = 365 ÷ 12
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hourly values&lt;/strong&gt; derived from days × 24
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This avoids small drift errors and makes conversions reversible. Weekly and 28-day rent can land on the same monthly equivalent if they imply the same daily rate, which is expected behavior when you normalize through a single base unit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Input Handling and Rounding
&lt;/h2&gt;

&lt;p&gt;Two things that took more time than expected:&lt;/p&gt;

&lt;h3&gt;
  
  
  Input parsing
&lt;/h3&gt;

&lt;p&gt;People paste values with commas, currency symbols, and decimals. It’s easy to accidentally misread values or silently “fix” them in a way that changes the number. I ended up being strict about what’s accepted and surfacing errors instead of guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rounding
&lt;/h3&gt;

&lt;p&gt;Rounding happens only at display time. All calculations keep full precision internally. This avoids small compounding errors when converting across multiple periods.&lt;/p&gt;




&lt;h2&gt;
  
  
  UX Decisions That Mattered
&lt;/h2&gt;

&lt;p&gt;The tool is intentionally simple visually. The important part is that assumptions are visible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How long a “month” is in the model
&lt;/li&gt;
&lt;li&gt;How 4-week periods differ from monthly billing
&lt;/li&gt;
&lt;li&gt;How the daily rate is derived
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything dealing with money, hiding these details makes the numbers hard to trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;The tool is live here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.rentconverter.com" rel="noopener noreferrer"&gt;https://www.rentconverter.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It converts between daily, weekly, biweekly, every-4-weeks, monthly, hourly, and annual using a consistent day-based model and shows a full breakdown so listings billed on different schedules can be compared directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaways for Small Utility Apps
&lt;/h2&gt;

&lt;p&gt;A few things I’d carry into the next build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick one canonical unit and normalize everything through it
&lt;/li&gt;
&lt;li&gt;Make assumptions visible in the UI
&lt;/li&gt;
&lt;li&gt;Keep rounding out of the calculation layer
&lt;/li&gt;
&lt;li&gt;Treat input parsing as a real feature, not a footnote
&lt;/li&gt;
&lt;li&gt;Add reversibility checks to tests (A → B → A should be stable)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>💀 Introducing WordSkull: A New Word Game with a Fantasy Twist! 🏰</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Thu, 24 Oct 2024 20:55:36 +0000</pubDate>
      <link>https://forem.com/suhassunder/introducing-wordskull-a-new-word-game-with-a-fantasy-twist-1gg0</link>
      <guid>https://forem.com/suhassunder/introducing-wordskull-a-new-word-game-with-a-fantasy-twist-1gg0</guid>
      <description>&lt;h1&gt;
  
  
  💀 Introducing WordSkull: A New Word Game with a Fantasy Twist! 🏰
&lt;/h1&gt;

&lt;p&gt;Hey devs!&lt;/p&gt;

&lt;p&gt;I’m excited to share my latest project, &lt;a href="https://wordskull.com" rel="noopener noreferrer"&gt;WordSkull&lt;/a&gt; a light and fun word game with a fantasy inspired theme! The concept revolves around &lt;strong&gt;skull shapes&lt;/strong&gt; that keep things playful and engaging, blending word puzzles with a touch of adventure. ⚔️&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 What’s WordSkull about?
&lt;/h3&gt;

&lt;p&gt;I’m starting off with a few game modes inspired by popular word games like &lt;strong&gt;crosswords, spelling bee&lt;/strong&gt;, &lt;strong&gt;Wordle&lt;/strong&gt;, etc. These modes put a twist on the classics and are designed to offer a familiar but refreshing challenge to players who love word puzzles. It’s a light, engaging experience with a unique twist on game design.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ What's next?
&lt;/h3&gt;

&lt;p&gt;I have plans to expand with more game modes down the line, including an &lt;strong&gt;indie-inspired mode&lt;/strong&gt; I’m particularly excited about! This will bring a new dimension to the gameplay, and I can’t wait to bring it to life. 🎮&lt;/p&gt;

&lt;h3&gt;
  
  
  Wallpapers
&lt;/h3&gt;

&lt;p&gt;I've also been working on sharing some 4k HD fantasy themed AI generated wallpapers which will soon be available on &lt;a href="https://wordskull.com/wallpaper" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 I’d love your feedback!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What would you like to see in a skull-shaped word game with a light fantasy theme?&lt;/li&gt;
&lt;li&gt;Any game mode ideas or unique twists you’d love to see?&lt;/li&gt;
&lt;li&gt;Any feedback on the direction I’m heading with the core modes?&lt;/li&gt;
&lt;li&gt;Is it actually fun?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While the repo for WordSkull is private, feel free to check out my open-source project, &lt;strong&gt;Emoji Kitchen Game&lt;/strong&gt;, which uses a similar tech stack: &lt;a href="https://github.com/suhas-sunder/EmojiKitchenGame" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;. You can also play the game here: &lt;a href="http://www.emojikitchengame.com/" rel="noopener noreferrer"&gt;Emoji Kitchen Game&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks in advance for your thoughts and time! 💀🧙‍♂️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🍳 Emoji Kitchen Game: Create Fun Emoji Combos! (Open Source Project) 🚀</title>
      <dc:creator>Suhas Sunder</dc:creator>
      <pubDate>Tue, 22 Oct 2024 06:10:26 +0000</pubDate>
      <link>https://forem.com/suhassunder/emoji-kitchen-game-create-fun-emoji-combos-open-source-project-1a3k</link>
      <guid>https://forem.com/suhassunder/emoji-kitchen-game-create-fun-emoji-combos-open-source-project-1a3k</guid>
      <description>&lt;p&gt;Hey Dev.to community! 👋&lt;/p&gt;

&lt;p&gt;I’m excited to introduce &lt;strong&gt;Emoji Kitchen Game&lt;/strong&gt; — a fun and interactive web app where you can mix and match emojis to create unique and sometimes hilarious emoji combinations. 🎉 Whether you’re a fan of emojis or just looking for a creative coding project to contribute to, I’d love to share this open-source project with you!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/suhas-sunder/EmojiKitchenGame" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.emojikitchengame.com/" rel="noopener noreferrer"&gt;Emoji Kitchen Game&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  What’s Emoji Kitchen Game? 🤔
&lt;/h3&gt;

&lt;p&gt;Inspired by the Google Emoji Kitchen, &lt;strong&gt;Emoji Kitchen Game&lt;/strong&gt; allows users to combine different emojis in playful ways. You can select two emojis and watch as they blend into an interesting hybrid. It’s a great way to bring a bit of fun and creativity to your daily emoji usage!&lt;/p&gt;

&lt;p&gt;Here’s what you can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Create combos&lt;/strong&gt; of different emojis
&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Share your creations&lt;/strong&gt; with friends on social media
&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Play around&lt;/strong&gt; with random combinations for some light-hearted fun!&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why I Built It 🎯
&lt;/h3&gt;

&lt;p&gt;I built &lt;strong&gt;Emoji Kitchen Game&lt;/strong&gt; as a side project to improve my learning skills and explore some new technologies in the process. By working on this project, I’ve been able to dive deeper into &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, and the &lt;strong&gt;Canvas API&lt;/strong&gt;, all while creating something fun and interactive!&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Built With
&lt;/h3&gt;

&lt;p&gt;This web app is powered by a modern tech stack to ensure a seamless experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remix.run&lt;/strong&gt; for server-side rendering and routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; for an interactive, component-driven UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express&lt;/strong&gt; as the backend engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for beautiful, responsive styling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; to keep everything type-safe and clean.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🏆 Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;strong&gt;100,000+ Emoji Mashups&lt;/strong&gt;: Mix two emojis and discover endless fun combinations.
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Super Fast&lt;/strong&gt;: Built with Remix for fast loads and dynamic routing.
&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Responsive Design&lt;/strong&gt;: Works great on any device — mobile, tablet, or desktop.
&lt;/li&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Unique Illustrations&lt;/strong&gt;: Delightful and playful emoji mashup graphics, inspired by Gboard’s Emoji Kitchen.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading! 🎉&lt;/p&gt;

</description>
      <category>emoji</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
