<?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: Gunnwook Ahn</title>
    <description>The latest articles on DEV Community by Gunnwook Ahn (@agw76638).</description>
    <link>https://dev.to/agw76638</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%2F3849092%2F59f8335d-fd05-4e06-a0b9-ba68b0c514f4.png</url>
      <title>DEV Community: Gunnwook Ahn</title>
      <link>https://dev.to/agw76638</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agw76638"/>
    <language>en</language>
    <item>
      <title>Building Sleek Korean Web Pages Using ONLY System Fonts (No Web Fonts!)</title>
      <dc:creator>Gunnwook Ahn</dc:creator>
      <pubDate>Tue, 07 Jul 2026 07:39:57 +0000</pubDate>
      <link>https://dev.to/agw76638/building-sleek-korean-web-pages-using-only-system-fonts-no-web-fonts-4ln6</link>
      <guid>https://dev.to/agw76638/building-sleek-korean-web-pages-using-only-system-fonts-no-web-fonts-4ln6</guid>
      <description>&lt;p&gt;Unlike English web fonts, Korean web fonts are notoriously heavy because they need to contain anywhere from 2,350 to 11,172 characters. Even with aggressive compression (like WOFF2 Subsets), they can heavily impact performance, causing text rendering delays (FOIT) or layout shifts (CLS) on slower networks.&lt;/p&gt;

&lt;p&gt;Inspired by modernfontstacks.com, I realized that we can build beautiful, blazing-fast web pages by smartly combining the pre-installed system fonts of major OS environments (Windows, Mac, iOS, Android) without downloading any external files. &lt;/p&gt;

&lt;p&gt;Here is my curated list of Korean font stacks tailored for different design styles.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. System UI (Standard Sans-Serif)
&lt;/h2&gt;

&lt;p&gt;These are default sans-serif fonts optimized by each OS for maximum screen readability. Since no font files are downloaded, pages load instantly with zero FOIT.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;-apple-system&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;BlinkMacSystemFont&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Apple SD Gothic Neo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Malgun Gothic'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;'맑은 고딕'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Dotum&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;돋움&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sans-serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mac / iOS: Apple SD Gothic Neo takes priority, rendering clean and crisp typography.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Malgun Gothic (맑은 고딕), the clean standard Windows font, is applied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android: Automatically maps to the system's default sans-serif (Noto Sans-based).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Legacy Devices: For older Windows versions without Malgun Gothic, it falls back to Dotum (돋움), a clean fixed-width legacy gothic font.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Neo-Grotesque / Geometric (Modern Sans-Serif)
&lt;/h2&gt;

&lt;p&gt;Great for large titles, banners, or brand landing pages where you want a more modern, neutral, and structural sans-serif feel rather than body text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;Helvetica&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Apple SD Gothic Neo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Malgun Gothic'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'맑은 고딕'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;sans-serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How it works: By placing Helvetica or Segoe UI at the front, English characters and numbers render in a sleek, geometric typeface. Since these fonts don't contain Korean glyphs, the browser automatically falls back to Apple SD Gothic Neo or Malgun Gothic for Korean text.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Classic Serif / Old Style (Traditional Myeongjo)
&lt;/h2&gt;

&lt;p&gt;A traditional serif font stack that provides a comfortable reading experience, resembling a printed book. Recommended for long-form reading such as blog posts, news articles, or columns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'AppleMyungjo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Apple 명조'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Batang'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'바탕'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mac / iOS: Applies AppleMyungjo, which offers excellent readability on Retina displays.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Applies Batang (바탕), the most ubiquitous default serif font on Windows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Modern Serif / Transitional (New Myeongjo)
&lt;/h2&gt;

&lt;p&gt;A modern, refined serif stack that feels sharper than traditional Myeongjo fonts. It targets "New Batang" for a cleaner appearance on Windows screens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;'Chosunilbo_myungjo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'조선일보명조'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'New Batang'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'새바탕'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Georgia&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How it works: If a user has office suites installed, the high-quality Chosunilbo_myungjo triggers first. Otherwise, it renders in New Batang (새바탕), which has improved screen readability over classic Batang. English is handled by the elegant Georgia typeface.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Monospace Code (Fixed-Width)
&lt;/h2&gt;

&lt;p&gt;A fixed-width font stack for code blocks, tables, or data screens where exact alignment of text columns is crucial. It keeps English, numbers, and Korean characters nicely balanced.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;ui-monospace&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;SFMono-Regular&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Consolas&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'GulimChe'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'굴림체'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;monospace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mac: ui-monospace and SFMono trigger, providing Apple's beautiful developer environment typography.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: The built-in English monospace font Consolas handles alphanumerics, while the Korean monospace font GulimChe (굴림체) handles Korean characters.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Handwritten / Casual
&lt;/h2&gt;

&lt;p&gt;For an organic, warm, or slightly playful handwritten feel, breaking away from rigid gothic and serif styles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Apple Chancery'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'GungsuhChe'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'궁서체'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;casual&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;cursive&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows: Calls GungsuhChe (궁서체), which brings out a traditional brush-calligraphy aesthetic.&lt;/p&gt;

&lt;p&gt;Android: Declaring the casual property automatically maps to the friendly, informal system handwriting font built into mobile devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  System Emojis
&lt;/h2&gt;

&lt;p&gt;You can also append system emoji fonts at the end of your stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI Emoji'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI Symbol'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Noto Color Emoji'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔗 Open Source
&lt;/h2&gt;

&lt;p&gt;You can find the repository and contribute here:&lt;/p&gt;

&lt;p&gt;👉 GitHub: &lt;a href="https://github.com/agw76638/modern-hangul-font-stacks" rel="noopener noreferrer"&gt;modern-hangul-font-stacks&lt;/a&gt;&lt;br&gt;
This article was originally published on my personal blog:&lt;br&gt;
👉 Original Post: &lt;a href="https://ahndev.com/building-sleek-korean-web-pages-using-only-system-fonts-no-web-fonts/" rel="noopener noreferrer"&gt;https://ahndev.com/building-sleek-korean-web-pages-using-only-system-fonts-no-web-fonts/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>korean</category>
    </item>
    <item>
      <title>Handling a 14-Hour Timezone Mismatch in NASA's APOD API</title>
      <dc:creator>Gunnwook Ahn</dc:creator>
      <pubDate>Sun, 29 Mar 2026 10:23:21 +0000</pubDate>
      <link>https://dev.to/agw76638/handling-a-14-hour-timezone-mismatch-in-nasas-apod-api-597d</link>
      <guid>https://dev.to/agw76638/handling-a-14-hour-timezone-mismatch-in-nasas-apod-api-597d</guid>
      <description>&lt;p&gt;While building a client-side calendar app using NASA's Astronomy Picture of the Day (APOD) API, I encountered a common but tricky challenge in global web development: timezone inconsistency.&lt;/p&gt;

&lt;p&gt;My app was designed to fetch and display the daily space image. Everything worked perfectly during my local development hours in Korea (KST). However, I started seeing undefined errors and broken UI elements specifically during the Korean morning hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: KST vs. EST
&lt;/h2&gt;

&lt;p&gt;After some debugging, I realized the root cause was the time difference.&lt;/p&gt;

&lt;p&gt;Client (Me): Korea Standard Time (KST, UTC+9)&lt;/p&gt;

&lt;p&gt;API Server (NASA): Eastern Standard Time (EST, UTC-5)&lt;/p&gt;

&lt;p&gt;Korea is 14 hours ahead of the US East Coast. When it was, for example, 10:00 AM on March 29th in Korea, it was still 8:00 PM on March 28th at NASA's headquarters.&lt;/p&gt;

&lt;p&gt;My initial code was request-driven by the client's local date. When the app requested data for "today" (March 29th KST), the NASA server responded that the data for that date did not exist yet. Trying to access properties of this non-existent data led to the dreaded TypeError: Cannot read properties of undefined.&lt;/p&gt;

&lt;p&gt;The Solution: Defensive Programming with data.length&lt;br&gt;
Instead of relying on the client-side date to drive the rendering loop, I refactored the logic to be data-driven. This is a classic example of defensive programming.&lt;/p&gt;

&lt;p&gt;Here’s the core of the fix:&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;// Before (Fragile)&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="nx"&gt;response&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="k"&gt;for &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;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;todayDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;liTag&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;createListItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for &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;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;todayDate&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;lastDateofMonth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;liTag&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;li class='grey-text'&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;`&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;// After (Robust)&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="nx"&gt;response&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="k"&gt;for &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;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;liTag&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;createListItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for &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;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;lastDateofMonth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;liTag&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;li class='grey-text'&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By switching to data.length, the loop automatically stops at the last available data point, completely bypassing the undefined error. Future dates are now handled by a separate loop that renders a clean placeholder, improving the overall User Experience (UX).&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Never Assume Data Exists: Especially when dealing with external APIs, always validate the data's existence and structure before trying to access its properties.&lt;/p&gt;

&lt;p&gt;Timezones Matter: In any global-facing application, always consider the offset between the client and the server.&lt;/p&gt;

&lt;p&gt;Data-Driven UI: Designing your UI rendering logic around the actual data received, rather than client-side assumptions, leads to more robust and error-resistant code.&lt;/p&gt;

&lt;p&gt;This was a fantastic learning experience that highlighted how a seemingly small detail like a timezone can impact real-world application stability.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
