<?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: Amir Bettir</title>
    <description>The latest articles on DEV Community by Amir Bettir (@amiramir77).</description>
    <link>https://dev.to/amiramir77</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%2F4159570%2F94b54802-9b4b-48e8-85ed-7bf8c96689b4.png</url>
      <title>DEV Community: Amir Bettir</title>
      <link>https://dev.to/amiramir77</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amiramir77"/>
    <language>en</language>
    <item>
      <title>I wrote about building my first real project at 16.

The bugs, the wins, and the three moments I wanted to quit.

https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh</title>
      <dc:creator>Amir Bettir</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:09:43 +0000</pubDate>
      <link>https://dev.to/amiramir77/i-wrote-about-building-my-first-real-project-at-16-the-bugs-the-wins-and-the-three-moments-i-16mf</link>
      <guid>https://dev.to/amiramir77/i-wrote-about-building-my-first-real-project-at-16-the-bugs-the-wins-and-the-three-moments-i-16mf</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-story__hidden-navigation-link"&gt;I'm 16 and I Built an Interactive Wildlife Archive. Here's Everything That Went Wrong.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/amiramir77" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159570%2F94b54802-9b4b-48e8-85ed-7bf8c96689b4.png" alt="amiramir77 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/amiramir77" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Amir Bettir
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Amir Bettir
                
                
              
              &lt;div id="story-author-preview-content-4791753" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/amiramir77" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159570%2F94b54802-9b4b-48e8-85ed-7bf8c96689b4.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Amir Bettir&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" id="article-link-4791753"&gt;
          I'm 16 and I Built an Interactive Wildlife Archive. Here's Everything That Went Wrong.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-story__hidden-navigation-link"&gt;I'm 16 and I Built an Interactive Wildlife Archive. Here's Everything That Went Wrong.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/amiramir77" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159570%2F94b54802-9b4b-48e8-85ed-7bf8c96689b4.png" alt="amiramir77 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/amiramir77" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Amir Bettir
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Amir Bettir
                
                
              
              &lt;div id="story-author-preview-content-4791753" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/amiramir77" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159570%2F94b54802-9b4b-48e8-85ed-7bf8c96689b4.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Amir Bettir&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" id="article-link-4791753"&gt;
          I'm 16 and I Built an Interactive Wildlife Archive. Here's Everything That Went Wrong.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>beginners</category>
      <category>learning</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I'm 16 and I Built an Interactive Wildlife Archive. Here's Everything That Went Wrong.</title>
      <dc:creator>Amir Bettir</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:08:48 +0000</pubDate>
      <link>https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh</link>
      <guid>https://dev.to/amiramir77/im-16-and-i-built-an-interactive-wildlife-archive-heres-everything-that-went-wrong-3poh</guid>
      <description>&lt;p&gt;I'm 16. Last week I didn't know how to use a Figma plugin.&lt;/p&gt;

&lt;p&gt;Today, I have a live, installable Progressive Web App called &lt;strong&gt;Wildform&lt;/strong&gt; that showcases 69 animal species with scroll-driven animations, dark/light mode, and offline support.&lt;/p&gt;

&lt;p&gt;Here's the honest story of how I got there — and everything that broke along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I love animals. I always have. But every wildlife site I visited felt like a Wikipedia page — plain, dense, forgettable.&lt;/p&gt;

&lt;p&gt;I wanted to build something that felt like &lt;strong&gt;a museum at night.&lt;/strong&gt; Dark. Cinematic. Quiet. Where you scroll and creatures slowly emerge from the shadows instead of being dumped on you in a grid.&lt;/p&gt;

&lt;p&gt;So I opened Figma, sketched a hero with a leopard's eye, and started building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 19 + Vite&lt;/strong&gt; — because I wanted fast builds and hot reload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS 4&lt;/strong&gt; — because writing CSS by hand for 69 cards would be torture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — one-click deploy, free forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vite-plugin-pwa&lt;/strong&gt; — to make the whole thing installable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing fancy. No backend. No database. Just a static site that does a lot.&lt;/p&gt;

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

&lt;p&gt;The site has five main sections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hero&lt;/strong&gt; — A fullscreen leopard with a slow-breathing parallax effect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field Film&lt;/strong&gt; — A scroll-driven video that plays as you descend past it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Living Archive&lt;/strong&gt; — 69 species, filterable by habitat (Land, Ocean, Air, Wetlands)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field Test&lt;/strong&gt; — An interactive quiz with scoring and randomized questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field Notes&lt;/strong&gt; — A full magazine-style article inside a modal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every species opens into a detailed profile with diet, lifespan, size, conservation status, and a small "field observation" about its behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bugs that almost killed me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The &lt;code&gt;.webp&lt;/code&gt; vs &lt;code&gt;.jpg&lt;/code&gt; trap
&lt;/h3&gt;

&lt;p&gt;I spent &lt;strong&gt;four hours&lt;/strong&gt; debugging broken images.&lt;/p&gt;

&lt;p&gt;The images were on GitHub. The code referenced them. Everything looked right. But every image showed the broken-image icon.&lt;/p&gt;

&lt;p&gt;The problem? When I saved images from the internet, my browser gave me &lt;strong&gt;&lt;code&gt;.webp&lt;/code&gt;&lt;/strong&gt; files. But my code was looking for &lt;strong&gt;&lt;code&gt;.jpg&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I renamed the files on GitHub to &lt;code&gt;.jpg&lt;/code&gt; — and it worked instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Windows hides file extensions by default. Turn them on. Trust me.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Vercel build that wouldn't stop failing
&lt;/h3&gt;

&lt;p&gt;For a solid hour, every deploy failed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;tsconfig.json:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ERROR:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Unexpected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My &lt;code&gt;tsconfig.json&lt;/code&gt; on GitHub was &lt;strong&gt;perfect.&lt;/strong&gt; 22 valid lines of JSON. I checked it maybe ten times.&lt;/p&gt;

&lt;p&gt;The real problem? I was building on an &lt;strong&gt;old commit&lt;/strong&gt;. My fix was on a different branch. Vercel kept rebuilding the broken version because I hadn't actually merged my change to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; When Vercel fails, always check which commit it's building. The error is often in the wrong place. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. The dark mode that didn't exist
&lt;/h3&gt;

&lt;p&gt;I wanted a dark/light toggle. I spent an evening writing CSS overrides for every single color.&lt;/p&gt;

&lt;p&gt;Then I realized: my site was &lt;strong&gt;already dark.&lt;/strong&gt; The "light mode" was the new thing I had to build.&lt;/p&gt;

&lt;p&gt;I had to invert my entire mental model — designing for light first, then treating dark as the default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Sometimes your default assumption is the thing you need to question.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;If I started over, I'd make three changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use a JSON file for species data.&lt;/strong&gt; Right now, all 69 species are hardcoded in &lt;code&gt;App.tsx&lt;/code&gt;. Editing them means scrolling through a 700-line file. A simple &lt;code&gt;species.json&lt;/code&gt; would make updates painless.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the PWA from day one.&lt;/strong&gt; I added it last, which meant re-configuring things I'd already set up. Do it early.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test on a real phone earlier.&lt;/strong&gt; I designed on desktop for most of the build. Small problems on mobile (tiny text, cramped layouts) took hours to find and fix later.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I'm proud of
&lt;/h2&gt;

&lt;p&gt;The animations. The scroll-driven reveal on each species card. The dark/light mode toggle. The fact that you can install it on your phone and it works offline.&lt;/p&gt;

&lt;p&gt;But honestly? I'm most proud that &lt;strong&gt;I didn't quit.&lt;/strong&gt; There were three moments where I wanted to delete the repo and start something else. I'm glad I pushed through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://amir-wildform.vercel.app" rel="noopener noreferrer"&gt;amir-wildform.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works offline. Add it to your home screen. Open it on a plane.&lt;/p&gt;

&lt;p&gt;If you have feedback — especially on performance, mobile UX, or code structure — I'd love to hear it. I'm still learning and every comment helps.&lt;/p&gt;

&lt;p&gt;Thanks for reading. I'm Amir, 16, and I build things. 🐆&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>showdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
