<?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: DINESH S</title>
    <description>The latest articles on DEV Community by DINESH S (@dinraeus).</description>
    <link>https://dev.to/dinraeus</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%2F3603608%2F36cb2c73-d97a-4514-9fde-237d5eac4e76.jpg</url>
      <title>DEV Community: DINESH S</title>
      <link>https://dev.to/dinraeus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dinraeus"/>
    <language>en</language>
    <item>
      <title>How I Built DisasterWatch: A Real-Time Earthquake Monitoring System</title>
      <dc:creator>DINESH S</dc:creator>
      <pubDate>Sat, 20 Dec 2025 09:58:34 +0000</pubDate>
      <link>https://dev.to/dinraeus/how-i-built-disasterwatch-a-real-time-earthquake-monitoring-system-5eg5</link>
      <guid>https://dev.to/dinraeus/how-i-built-disasterwatch-a-real-time-earthquake-monitoring-system-5eg5</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%2Fuxho0pbq61nry8mgf2cz.png" 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%2Fuxho0pbq61nry8mgf2cz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&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%2F1tog2qard8dzdb97toam.png" 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%2F1tog2qard8dzdb97toam.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&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%2Fgubezi2knckfb3t1sev8.png" 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%2Fgubezi2knckfb3t1sev8.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&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%2Fz37gt231zelriaaepwu3.png" 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%2Fz37gt231zelriaaepwu3.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&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%2Fq5eu5kdeon9fratvemzy.png" 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%2Fq5eu5kdeon9fratvemzy.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I built a production-ready disaster monitoring app in 30 days using vanilla JavaScript. Here's what I learned about performance, API optimization, and shipping real products.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://dineshtm07.github.io/Disaster-Dashboard/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt; | &lt;a href="https://github.com/DINESHTM07/Disaster-Dashboard" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why I Built This&lt;/li&gt;
&lt;li&gt;Tech Stack &amp;amp; Architecture&lt;/li&gt;
&lt;li&gt;Key Features&lt;/li&gt;
&lt;li&gt;Technical Challenges&lt;/li&gt;
&lt;li&gt;Performance Optimization&lt;/li&gt;
&lt;li&gt;Lessons Learned&lt;/li&gt;
&lt;li&gt;What's Next&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Why I Built This {#why}
&lt;/h2&gt;

&lt;p&gt;Three months into learning JavaScript, I hit tutorial hell. I could follow along, but couldn't build anything independently.&lt;/p&gt;

&lt;p&gt;DisasterWatch was my "sink or swim" project. Here's why I chose it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Real data&lt;/strong&gt; - Working with live APIs (USGS, Open-Meteo)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex state&lt;/strong&gt; - Managing filters, pagination, caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance challenges&lt;/strong&gt; - Rendering 10,000+ data points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social impact&lt;/strong&gt; - Helping communities stay informed&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Tech Stack &amp;amp; Architecture {#tech-stack}
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zero dependencies.&lt;/strong&gt; Just vanilla JavaScript, HTML5, and CSS3.&lt;/p&gt;

&lt;p&gt;Why no frameworks?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master the fundamentals first&lt;/li&gt;
&lt;li&gt;Understand what frameworks abstract away&lt;/li&gt;
&lt;li&gt;Smaller bundle size (45KB total)&lt;/li&gt;
&lt;li&gt;Faster load times&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  File Structure
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;disaster-dashboard/
├── index.html          # Semantic HTML5
├── css/
│   └── style.css       # CSS Custom Properties + Grid
├── js/
│   ├── config.js       # API endpoints &amp;amp; constants
│   ├── utils.js        # 30+ helper functions
│   ├── api.js          # Data fetching &amp;amp; caching
│   └── app.js          # State management + UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Why this structure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separation of concerns.&lt;/strong&gt; Each file has one responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config.js&lt;/code&gt; - Configuration (what)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils.js&lt;/code&gt; - Utilities (how)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;api.js&lt;/code&gt; - Data layer (fetch)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app.js&lt;/code&gt; - Application logic (orchestrate)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Key Features {#features}
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Real-Time Data
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fetch earthquakes with caching&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchEarthquakes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;day&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`earthquakes_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;timeframe&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Check cache first&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cache&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="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Fetch from API&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EARTHQUAKE_API_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;earthquakes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Cache for 5 minutes&lt;/span&gt;
  &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;earthquakes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;earthquakes&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;p&gt;&lt;strong&gt;Why caching matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First load: 500ms (network request)&lt;/li&gt;
&lt;li&gt;Cached load: 5ms (memory read)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100x faster!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Smart Filtering
&lt;/h3&gt;

&lt;p&gt;Users can filter by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Magnitude (2.5+, 4.0+, 5.0+, etc.)&lt;/li&gt;
&lt;li&gt;Time period (hour, day, week, month)&lt;/li&gt;
&lt;li&gt;Location (search by place name)&lt;/li&gt;
&lt;li&gt;Proximity (earthquakes near user)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Performance Optimization
&lt;/h3&gt;

&lt;p&gt;The app handles 10,000+ earthquakes without lag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How?&lt;/strong&gt;&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="c1"&gt;// Pagination instead of rendering everything&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;displayedItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;earthquakes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Load more on button click&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadMore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;currentPage&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentPage&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;itemsPerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moreItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;earthquakes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;moreItems&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;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 0.9s initial load vs 8.2s rendering everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Accessibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ WCAG 2.1 compliant&lt;/li&gt;
&lt;li&gt;✅ Keyboard navigation&lt;/li&gt;
&lt;li&gt;✅ Screen reader support&lt;/li&gt;
&lt;li&gt;✅ Proper ARIA labels&lt;/li&gt;
&lt;li&gt;✅ Focus management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;button&lt;/span&gt; 
  &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Toggle dark mode"&lt;/span&gt;
  &lt;span class="na"&gt;aria-pressed=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"theme-toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fas fa-moon"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Technical Challenges &amp;amp; Solutions {#challenges}
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: API Rate Limiting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Free tier = 60 requests/hour&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Implement caching layer&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;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&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;span class="nx"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;data&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;span class="na"&gt;expires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ttl&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cache&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="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Check if expired&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expires&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Reduced API calls by 85%&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: Search Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Search fired on every keystroke = 10 calls per word&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Debouncing&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;function&lt;/span&gt; &lt;span class="nf"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&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;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;timeout&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;delay&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;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;debouncedSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handleSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;searchInput&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="nx"&gt;debouncedSearch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; 90% fewer API calls&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 3: Mobile Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Large datasets crashed mobile browsers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Progressive enhancement&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desktop: Show 50 items initially&lt;/li&gt;
&lt;li&gt;Mobile: Show 20 items initially&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;matchMedia&lt;/code&gt; to detect device
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isMobile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matchMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(max-width: 768px)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;itemsToShow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isMobile&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Performance Metrics {#performance}
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Optimization:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First Contentful Paint: 3.2s&lt;/li&gt;
&lt;li&gt;Time to Interactive: 8.1s&lt;/li&gt;
&lt;li&gt;Lighthouse Score: 62&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After Optimization:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First Contentful Paint: 0.8s ⚡&lt;/li&gt;
&lt;li&gt;Time to Interactive: 1.4s ⚡&lt;/li&gt;
&lt;li&gt;Lighthouse Score: 95 🎯&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key optimizations:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API caching&lt;/li&gt;
&lt;li&gt;Debounced search&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;DOM element caching&lt;/li&gt;
&lt;li&gt;Lazy loading images&lt;/li&gt;
&lt;li&gt;Minified CSS/JS&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Lessons Learned {#lessons}
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start Small, Iterate Fast
&lt;/h3&gt;

&lt;p&gt;Don't build everything at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: Basic UI + API connection&lt;/li&gt;
&lt;li&gt;Week 2: Filtering &amp;amp; search&lt;/li&gt;
&lt;li&gt;Week 3: Performance optimization&lt;/li&gt;
&lt;li&gt;Week 4: Polish &amp;amp; deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Test on Real Devices
&lt;/h3&gt;

&lt;p&gt;Chrome DevTools mobile emulator ≠ Real iPhone&lt;/p&gt;

&lt;p&gt;Issues I found only on real devices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Touch target too small&lt;/li&gt;
&lt;li&gt;Text too tiny&lt;/li&gt;
&lt;li&gt;API too slow on 3G&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Accessibility from Day 1
&lt;/h3&gt;

&lt;p&gt;Don't bolt it on at the end. Build it in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic HTML (&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Alt text on images&lt;/li&gt;
&lt;li&gt;ARIA labels on buttons&lt;/li&gt;
&lt;li&gt;Keyboard navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Read Documentation
&lt;/h3&gt;

&lt;p&gt;MDN &amp;gt; Stack Overflow &amp;gt; Random blogs&lt;/p&gt;

&lt;p&gt;When stuck:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read error message carefully&lt;/li&gt;
&lt;li&gt;Check MDN docs&lt;/li&gt;
&lt;li&gt;Console.log everything&lt;/li&gt;
&lt;li&gt;Then Google specific error&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5. Ship Imperfect
&lt;/h3&gt;

&lt;p&gt;Perfect is the enemy of done.&lt;/p&gt;

&lt;p&gt;I wanted to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive map (Leaflet.js)&lt;/li&gt;
&lt;li&gt;Historical charts&lt;/li&gt;
&lt;li&gt;Email alerts&lt;/li&gt;
&lt;li&gt;PWA support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I shipped with core features. Rest can come later.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next {#next}
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Short-term:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Add interactive map&lt;/li&gt;
&lt;li&gt;[ ] Implement service workers (PWA)&lt;/li&gt;
&lt;li&gt;[ ] Add Chart.js visualizations&lt;/li&gt;
&lt;li&gt;[ ] Multi-language support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Long-term:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Rebuild with React (for learning)&lt;/li&gt;
&lt;li&gt;[ ] Add Node.js backend&lt;/li&gt;
&lt;li&gt;[ ] MongoDB for historical data&lt;/li&gt;
&lt;li&gt;[ ] Real-time WebSocket updates&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Three months ago, I couldn't build a working button.&lt;/p&gt;

&lt;p&gt;Today, I shipped a production app that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handles 10,000+ data points&lt;/li&gt;
&lt;li&gt;Loads in under 1 second&lt;/li&gt;
&lt;li&gt;Works on all devices&lt;/li&gt;
&lt;li&gt;Helps communities stay safe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You can too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with something that scares you.&lt;br&gt;&lt;br&gt;
Break it into tiny pieces.&lt;br&gt;&lt;br&gt;
Ship something imperfect.&lt;br&gt;&lt;br&gt;
Iterate.&lt;/p&gt;

&lt;p&gt;That's how you learn.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Connect!
&lt;/h2&gt;

&lt;p&gt;I'm looking for junior developer roles or internships!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💼 &lt;a href="https://www.linkedin.com/in/dineshcreativedev/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐦 &lt;a href="https://x.com/DINRAEUS" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📧 &lt;a href="//duke02101@gmail.com"&gt;Email&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Found this helpful? Share it with someone learning web development! 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #javascript #webdev #beginners #tutorial #webperformance #learntocode&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;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
