<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Wilhelm Codes · Plantsm.art</title>
    <link>https://wilhelm.codes/tags/plantsm.art/</link>
    <description>Slinger of nibbles, bits and bytes. Over 25 years of professional experience as a software engineer. Love making glowing rectangles go &#34;beep-boop&#34;.</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <managingEditor>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</managingEditor>
    <webMaster>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</webMaster>
    <lastBuildDate>Sun, 30 Aug 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://wilhelm.codes/tags/plantsm.art/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Why I Rebuilt Plant Smart</title>
      <link>https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/</link>
      <pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate>
      <author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author>
      <guid>https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/</guid>
      <category>hugo</category>
      <category>plantsm.art</category>
      <category>woodpecker</category>
      <category>performance</category>
      <description>Back in June I wrote a little blurb that said, in its entirety, &amp;ldquo;I should update Plant Smart.&amp;rdquo; Bolder and more visionary words have never been written. So bold, in fact, I went right back to demolishing this blog instead and let the poor thing sit for another two months.&#xA;Well, I finally did the thing.&#xA;</description>
      <content:encoded><![CDATA[<p>Back in June I wrote <a href="https://wilhelm.codes/bits/blurb-i-should-update-plantsmart/">a little blurb</a> that said, in its entirety, &ldquo;I should update Plant Smart.&rdquo; Bolder and more visionary words have never been written. So bold, in fact, I went right back to <a href="https://wilhelm.codes/blog/some-long-overdue-demolition/">demolishing this blog</a> instead and let the poor thing sit for another two months.</p>
<p>Well, I finally did the thing.</p>
<p>Three and a half years ago I wrote <a href="https://wilhelm.codes/blog/why-i-built-plant-smart/">Why I Built Plant Smart</a>. A free and searchable database of plants that are toxic to pets. I built it over a holiday break to answer a simple question, &ldquo;Can I bring this plant home without endangering the fluffy little gremlin that runs our household?&rdquo; It was also my excuse to learn SvelteKit, TypeScript, TailwindCSS and Vite, because my frontend peers wouldn&rsquo;t shut the hell up about them.</p>
<p>The site then chugged along quietly and untouched for years, which sounds like a compliment to its architecture and very much is not one to the maintainer.</p>
<h2 id="the-toolchain-aged-like-fine-milk">
  <a class="heading-link" href="#the-toolchain-aged-like-fine-milk">The toolchain aged like fine milk.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>The thing no one really thinks about when they build something like this with shiny new frontend tools is that it doesn&rsquo;t rust, it <em>curdles</em>. When I finally came back to give Plant Smart a fresh coat of paint, the build no longer ran. Not &ldquo;a few deprecation warnings&rdquo; didn&rsquo;t run. It didn&rsquo;t run at all. Two years of an unattended <code>package.json</code> had fermented into something of a cheese-like consistency.</p>
<p>My original requirements list from 2022 said the site must be fast, static, ( almost ) free to run and open with its data. Nowhere did it say &ldquo;must still compile in two years&rdquo;.</p>
<p>So, I decided to spend a few weeks off and on to throw out the toolchain and give it a much-needed refresh. Just like this site, Hugo now builds the entire thing. There&rsquo;s a single hand-written stylesheet and a few small scripts of delicious vanilla JavaScript. No <code>npm install</code>, because there is no longer anything to install. If I disappear for another two years ( likely ), the site will build exactly the same the day I come back.</p>
<h2 id="first-things-first-absolute-parity">
  <a class="heading-link" href="#first-things-first-absolute-parity">First things first, absolute parity.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>The rebuild had one rule that saved me from myself: the first pass had to be a 1:1 replica of the old site. It needed the same pages, filters, URLs and quirks. The pass was meant to be boring on purpose. I had to resist the temptation of doing both the replatforming and redesigning all in one go.</p>
<p>My primary constraint was the plant data. Plant Smart&rsquo;s whole gimmick is what I called a &ldquo;dumb API&rdquo;. The entire primary database lives in <a href="https://plantsm.art/api/plants.json">one JSON file</a> with other, smaller, supplemental files you could use as lookup tables. Since this was all hosted on Cloudflare&rsquo;s CDN it was effectively free to use for others without keys or annoying rate limits. The old derivations were originally done by a pile of Go magefiles. The new site had to reproduce them exactly, down to the deliberately unsorted first-appearance ordering, or every downstream consumer would notice.</p>
<p>Hugo, it turns out, can do all of it. A content adapter reads the database and births every plant page directly with no intermediate files. A handful of templates re-implement the old Go derivation logic and regenerate the API on every build. I diffed the generated files against the originals and they came back value-identical on the first honest attempt.</p>
<p>Then came my favourite commit of the whole project:</p>
<div class="code-block">
  <pre tabindex="0"><code>retire the sveltekit stack: remove src, magefiles and the node toolchain
566 files changed, 112 insertions(+), 9905 deletions(-)</code></pre>
</div>
<p>I deleted nearly ten thousand lines and the site did more than before. This is every developer&rsquo;s <em>favourite</em> kind of commit.</p>
<h2 id="i-made-the-site-cute-on-purpose">
  <a class="heading-link" href="#i-made-the-site-cute-on-purpose">I made the site cute on purpose.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>With the replica shipped, the redesign could actually be fun. The old site was fine but it was very much &ldquo;2022 Tailwind starter&rdquo; vibe. A lot of cool greys, hard shadows and gradients on anything that stood still. Meanwhile the logo, a randomised squishy little pastel potted plant with a face, deserved better surroundings.</p>
<p>So, I set out to make the logo the design brief. Cream paper instead of white with warm espresso ink instead of a dull grey. Sage and moss greens with honey and clay accents were all lifted straight from the icon set. Every shadow is tinted warm because plain black shadows on cream look like stickers. The corners got a bit rounder and the controls became pills. The whole thing is set in <a href="https://fonts.google.com/specimen/Fredoka">Fredoka</a>, a rounded display face that weighs about <code>30kB</code> which I thought fit perfectly with the cute little mascot.</p>
<p>Here are a few before and after shots of the main content pages, with a bonus shot of the new pill navigation that smaller screens finally got:</p>
<div class="strip">
  
  <button type="button" class="zoom" aria-label="Zoom image: The homepage before the redesign.">
      <img
        src="https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/home-before.webp"
        alt="The homepage before the redesign."
        loading="lazy"
        
        
      />
    </button>
  <button type="button" class="zoom" aria-label="Zoom image: The homepage as it currently stands.">
      <img
        src="https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/home-after.webp"
        alt="The homepage as it currently stands."
        loading="lazy"
        
        
      />
    </button>
  <button type="button" class="zoom" aria-label="Zoom image: The plant details page before the redesign.">
      <img
        src="https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/details-before.webp"
        alt="The plant details page before the redesign."
        loading="lazy"
        
        
      />
    </button>
  <button type="button" class="zoom" aria-label="Zoom image: The plant details page as it currently stands.">
      <img
        src="https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/details-after.webp"
        alt="The plant details page as it currently stands."
        loading="lazy"
        
        
      />
    </button>
  <button type="button" class="zoom" aria-label="Zoom image: The new pill navigation for mobile users.">
      <img
        src="https://wilhelm.codes/blog/why-i-rebuilt-plant-smart/mobile-pill-navigation.webp"
        alt="The new pill navigation for mobile users."
        loading="lazy"
        
        
      />
    </button>

</div>

<h2 id="the-data-enrichments-will-continue-until-morella-improves">
  <a class="heading-link" href="#the-data-enrichments-will-continue-until-morella-improves">The data enrichments will continue until &ldquo;Morella&rdquo; improves.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>Get it? No? Ok, I&rsquo;ll see myself out.</p>
<p>The database had severity ratings for every plant, computed from symptom groupings and the old site displayed them precisely nowhere. Now, every card has a severity pill rated from Mild to Critical. The pills are also clickable filters on the main page&rsquo;s plant cards. Search happens as you type and if you fumble the Latin a bit, a little <a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein</a> pass offers &ldquo;Did you mean <em>Lilium</em>?&rdquo;. I thought this was a little bit more helpful than what the old site did after literally joking about spelling mistakes in its empty state.</p>
<p>A few other mentionable updates:</p>
<ul>
<li>A <a href="https://plantsm.art/safe/">safe plants list</a>, because the site only ever told you what <em>not</em> to buy. Every entry has to clear the ASPCA non-toxic list and be absent from my own toxic database before it&rsquo;s allowed in.</li>
<li>A <a href="https://plantsm.art/symptoms/">symptom finder</a> that allows you to perform a plant search backwards. You can click on multiple symptoms and it&rsquo;ll filter accordingly.</li>
<li>An emergency strip on every plant page with the poison-control hotlines. Unfortunately, for now, these are US numbers. Localising them by region is on the roadmap.</li>
<li>Wikipedia descriptions for nearly every plant credited under CC BY-SA.</li>
<li>Around 3,000 common-name redirects, so <code>/plant/peace-lily/</code> finally lands somewhere useful.</li>
<li>Because it made sense, the whole thing is now a PWA and works completely offline. So, now you can use the site in a greenhouse with no signal, which is precisely where this site is most likely to get used.</li>
</ul>
<figure class="pull-quote">
  <span class="pull-quote-mark" aria-hidden="true"><span class="icon "><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><g fill="currentColor"><path d="M108 72v72H40a8 8 0 0 1-8-8V72a8 8 0 0 1 8-8h60a8 8 0 0 1 8 8m108-8h-60a8 8 0 0 0-8 8v64a8 8 0 0 0 8 8h68V72a8 8 0 0 0-8-8" opacity=".2"/><path d="M100 56H40a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h60v8a32 32 0 0 1-32 32a8 8 0 0 0 0 16a48.05 48.05 0 0 0 48-48V72a16 16 0 0 0-16-16m0 80H40V72h60Zm116-80h-60a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h60v8a32 32 0 0 1-32 32a8 8 0 0 0 0 16a48.05 48.05 0 0 0 48-48V72a16 16 0 0 0-16-16m0 80h-60V72h60Z"/></g></svg></span></span>
  <blockquote>
    <p>My friends can no longer accuse me of trying to teach people how to poison their neighbour's pets.</p>
  </blockquote>
  <figcaption>
    <cite>J'Accuse...!</cite>
  </figcaption>
</figure>

<p>Once I started auditing the data properly, I started to see a few additional gaps. There were several plants with multiple entries under different, but similar, names. I deduped and merged the symptom data and also updated the severity groupings to make more sense.</p>
<p>I also quickly realised that merging <code>seizure</code> into <code>seizures</code> would have silently promoted over a hundred plants to &ldquo;Critical&rdquo;. The severity groups treated those two spellings as <em>different levels</em>. The little cleaner script I threw together caught it during a dry run. The script grew a rule about never merging across severity levels as a result. The plants that genuinely deserved promotion got one. For instance <a href="https://plantsm.art/plant/ageratina-altissima/">white snakeroot</a>, the plant that killed Lincoln&rsquo;s mother, was somehow rated &ldquo;Severe&rdquo;. The script properly re-rated it to &ldquo;Critical&rdquo;.</p>
<p>The enrichment didn&rsquo;t stop there. I sourced proper taxonomy for every record via GBIF, per-plant toxicity principles with a glossary and little world maps showing their native origins.</p>
<h2 id="there-was-also-quite-a-bit-of-fat-to-trim">
  <a class="heading-link" href="#there-was-also-quite-a-bit-of-fat-to-trim">There was also quite a bit of fat to trim.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>Somewhere in all this I noticed every page weighed over <code>200kB</code>. This included pages that were basically just copy. The culprits were painfully self-inflicted. There was an <code>85kB</code> inline script shipping all ten animated logo SVGs to every single page. The same animal icon inlined seventy times on the front page. Oh, and let&rsquo;s not forget my personal favourite, the attributions page carrying <code>149kB</code> of pure <em>indentation</em> that a template loop had quietly emitted. I was shipping whitespace at scale.</p>
<p>The fixes were old-school and very satisfying. A single fingerprinted and cached JS bundle, SVG sprites so each drawing only ships once and one well-placed whitespace trim yielded the following results:</p>
<table>
	<thead>
			<tr>
					<th>page</th>
					<th>before</th>
					<th>after</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>home</td>
					<td>247 KB</td>
					<td>56 KB</td>
			</tr>
			<tr>
					<td>attributions</td>
					<td>238 KB</td>
					<td>24 KB</td>
			</tr>
			<tr>
					<td>safe plants</td>
					<td>270 KB</td>
					<td>33 KB</td>
			</tr>
			<tr>
					<td>plant pages</td>
					<td>114 KB</td>
					<td>36 KB</td>
			</tr>
	</tbody>
</table>
<p>No framework was harmed, or indeed present, in the making of this facelift.</p>
<h2 id="we-ship-from-the-homelab-now">
  <a class="heading-link" href="#we-ship-from-the-homelab-now">We ship from the homelab now.<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>The last box to tick from the original post was the bittersweet one. In 2022 I wanted the project &ldquo;open-source and community-driven&rdquo; on GitHub. In practice, the community contribution was me, at midnight, fixing my own typos. So, the repository followed this blog into my homelab using the exact same moving parts as outlined in <a href="https://wilhelm.codes/blog/my-blog-now-ships-from-my-homelab/">My Blog Now Ships From My Homelab!</a>. It just made sense after this site&rsquo;s migration. The <em>data</em> remains as open as ever through the API, which was always the part worth opening. That will never change.</p>
<p>While migrating I had a small panic about the 315MB of plant photos sitting in my working tree, imagining every CI build hauling them across the network. Turns out my 2023 self had already gitignored them and the entire repository clones at 7.5MB. Every once in a blue moon past me does something right. I&rsquo;ve decided to let sleeping dogs lie and not investigate what else he buried in there.</p>
<h2 id="was-the-juice-worth-the-squeeze">
  <a class="heading-link" href="#was-the-juice-worth-the-squeeze">Was the juice worth the squeeze?<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>Very much so. The site is faster, cuter and finally says the most important thing it knows on every card: <em>how</em> dangerous is this plant, not just <em>whether</em>. It builds from nothing with a single binary and deploys itself when I push. The data is cleaner and more robust than it has ever been and enriched well past what 2022 me had the patience for.</p>
<p>But the honest win is the same one as the blog demolition. The whole thing is now boring to operate and boring is what lets a hobby project survive its maintainer&rsquo;s attention span.</p>
<p>If you have a plant-curious pet, <a href="https://plantsm.art">Plant Smart</a> is free, the <a href="https://plantsm.art/api/">API</a> is free and the <a href="https://plantsm.art/safe/">safe list</a> might even let you buy something nice for yourself. And if four years from now there&rsquo;s a third post in this series, may it be shorter than this one.</p>
<figure class="pull-quote">
  <span class="pull-quote-mark" aria-hidden="true"><span class="icon "><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><g fill="currentColor"><path d="M108 72v72H40a8 8 0 0 1-8-8V72a8 8 0 0 1 8-8h60a8 8 0 0 1 8 8m108-8h-60a8 8 0 0 0-8 8v64a8 8 0 0 0 8 8h68V72a8 8 0 0 0-8-8" opacity=".2"/><path d="M100 56H40a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h60v8a32 32 0 0 1-32 32a8 8 0 0 0 0 16a48.05 48.05 0 0 0 48-48V72a16 16 0 0 0-16-16m0 80H40V72h60Zm116-80h-60a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h60v8a32 32 0 0 1-32 32a8 8 0 0 0 0 16a48.05 48.05 0 0 0 48-48V72a16 16 0 0 0-16-16m0 80h-60V72h60Z"/></g></svg></span></span>
  <blockquote>
    <p>The data enrichments will continue until "Morella" improves.</p>
  </blockquote>
  <figcaption>
    <cite>C'mon, this was a GREAT pun!</cite>
  </figcaption>
</figure>

<p>Anyways, adios&hellip;</p>]]></content:encoded>
    </item>
    <item>
      <title>Why I Built Plant Smart</title>
      <link>https://wilhelm.codes/blog/why-i-built-plant-smart/</link>
      <pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
      <author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author>
      <guid>https://wilhelm.codes/blog/why-i-built-plant-smart/</guid>
      <category>svelte</category>
      <category>plantsm.art</category>
      <description>Simply put, I love plants and I love animals. I can&amp;rsquo;t count how many times I&amp;rsquo;ve been to a plant nursery and had to stop and do a Google search to see if something was safe enough to bring home and keep around our little Pandora, or 🐼 for short.&#xA;</description>
      <content:encoded><![CDATA[<p>Simply put, I love plants and I love animals. I can&rsquo;t count how many times I&rsquo;ve been to a plant nursery and had to stop and do a Google search to see if something was safe enough to bring home and keep around our little Pandora, or 🐼 for short.</p>
<h2 id="its-as-simple-as-that">
  <a class="heading-link" href="#its-as-simple-as-that">It&rsquo;s as simple as that?<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>That was the idea, at least. I just wanted a single place that had all the information I needed so I could make informed purchasing decisions. I also figured I couldn&rsquo;t possibly be the only person who has this problem. So, I set off to make this project during the holiday break of 2022.</p>
<p>However, I didn&rsquo;t want to make it <em>too</em> easy for myself&hellip;</p>
<h2 id="a-challenge">
  <a class="heading-link" href="#a-challenge">A challenge!<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>I work as a weird combination of <a href="https://en.wikipedia.org/wiki/Site_reliability_engineering">SRE</a> and <a href="https://en.wikipedia.org/wiki/DevOps">DevOps engineer</a>. I have plenty of smarts when it comes to the technical side of hosting and running things, but it&rsquo;s been years since I&rsquo;ve done any front-end work. Career-wise, I need to be able to speak the same language as the teams I have to support. So, understanding how far behind that portion of my skillset had become, I thought this would be the perfect opportunity to brush up.</p>
<h3 id="the-requirements">
  <a class="heading-link" href="#the-requirements">The Requirements:<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<ul>
<li>Must keep operational costs as close to zero as possible. The only money I&rsquo;ve put down on this so far is the $20 AUD to purchase the domain name.</li>
<li>Must be hosted on <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>. I could&rsquo;ve chosen <a href="https://pages.github.com/">Github Pages</a> to keep everything in one place, but automated Cloudflare builds &amp; deployments work out of the box with minimal configuration. Besides, I&rsquo;ve already worked with the latter and I wanted the challenge of trying something new.</li>
<li>Must be completely static. There should be no server-side rendering, processing or other explicit backend dependencies to manage. For this, I use the pre-rendering functionality that comes packaged with <a href="https://kit.svelte.dev/">SvelteKit</a>. I&rsquo;ve been working with this for only a few weeks now and I&rsquo;m a full convert.</li>
<li>All data must be served statically as well. The entirety of the data set is contained within a single JSON file, which you can view at <a href="https://plantsm.art/plants.json">/plants.json</a>. This is the source of truth for all derivative data sets and lookup tables used on this site. It&rsquo;s effectively what I call a &ldquo;dumb API&rdquo;. Check out the <a href="http://localhost:5173/api">API documentation</a> if you&rsquo;d like to know more about it.</li>
<li>Must use <a href="https://kit.svelte.dev/">SvelteKit</a>, <a href="https://www.typescriptlang.org/">TypeScript</a>, <a href="https://tailwindcss.com/">TailwindCSS</a> and <a href="https://vitejs.dev/">Vite</a>. I had zero working knowledge of any of these and my frontend peers can&rsquo;t seem to shut up about them. So&hellip; why not?</li>
<li>Must be <em>fast</em>. Everything is static, compressed, cached and sitting behind a world-class CDN. I&rsquo;ve worked in a network performance and load testing SaaS for close to 5 years now. I wouldn&rsquo;t be able to look myself in the mirror if I couldn&rsquo;t easily do this one. 😅</li>
<li>Must be open-source and community-driven. At one point, I would like to take the hands off the wheel and see if other interested parties would like to get involved and help out with managing datasets and fixing bugs. GitHub allows for pretty much all of this. Check how to <a href="http://plantsm.art/contribute">contribute</a> or see the <a href="http://plantsm.art/updates">latest contributions</a>.</li>
</ul>
<p>So far, it&rsquo;s going quite well. I haven&rsquo;t had any issues with meeting any of these self-imposed development constraints.</p>
<h3 id="any-caveats">
  <a class="heading-link" href="#any-caveats">Any Caveats?<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<p>Definitely. The most obvious one would be image storage which has a direct effect on not only repository size — which currently clocks in at over 1.5GB — but, also build and deployment speeds. I could shell out $5 - $10 for object storage and image processing, but that would go against the first constraint. For now, image data will live in the GitHub repository as a perfectly reasonable compromise.</p>
<h2 id="where-did-you-source-all-this-data">
  <a class="heading-link" href="#where-did-you-source-all-this-data">Where did you source all this data?<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>There are quite a few sources I&rsquo;ve collated from, but these are the main ones.</p>
<ol>
<li><a href="https://www.inaturalist.org/">iNaturalist</a> is the best source of high-quality, community-driven creative commons license photography. All images have been sourced from this site along with licensing and attribution data.</li>
<li><a href="https://www.aspca.org/">ASPCA</a> was used to initially prime the first dataset. This is also where I sourced most of the common name and symptom data.</li>
<li><a href="https://en.wikipedia.org/wiki/Plant">Wikipedia</a> is the best source of scientific classification data out there.</li>
</ol>
<p>All of this disparate data was collated and munged together by several processing scripts written in <a href="https://go.dev/">Go</a> as <a href="https://magefile.org/">Magefiles</a>. It got me about 95% there, but it still needs quite a bit of handraulic finessing.</p>
<h2 id="where-to-go-from-here">
  <a class="heading-link" href="#where-to-go-from-here">Where to go from here?<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>I think I&rsquo;ve met most, if not all, of my requirements. The datasets for the project still need a lot of love and I plan on supporting listings for a variety of other pet species. I already have the data; just need to go through it with a fine-toothed comb. Not to mention responsiveness for smaller screens needs a solid amount of work.</p>
<p>I&rsquo;m having loads of fun at the moment learning new things. I hope I can keep doing this for a while longer. However, I do have other things planned for the future and will be using what I&rsquo;ve learned here as a kind of launching pad.</p>
<p>I sincerely hope you find <a href="https://plantsm.art">Plant Smart</a> as useful as I had fun making it.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
