
Harvest Sun combines a company profile, a blog, and a full product catalog into a single website, browsable the way an online store would be, with search, category filters, sorting, and a related-products section, minus the checkout. Ordering happens directly over WhatsApp instead. It’s built flexible enough to fit almost any retail business, from groceries and clothing to food, electronics, furniture, and home goods, so a new business can launch on the same proven foundation instead of starting from scratch. The products shown on the demo are placeholders, but every feature and flow behind them is already complete, so swapping in real products is all it takes to go live.
Work like this is usually split between a developer, a UI/UX designer, a graphic designer, and a marketer. On this project, one person holds all four of those skill sets, so every decision came from someone who understood the whole project, not just their own part of it.
16
standards met, from code to marketing.
Business impact here is measured across 5 areas: Presence, Quality, Trust, Conversion and Growth. Together they cover how the business is found, perceived, and acted on.
Information that stays findable, not buried
Before
Most businesses today rely only on social media, Instagram, Facebook, TikTok, to share information, but a feed is built to bury old posts under new ones, so anything specific gets harder to find the moment something newer gets posted.
After
A website organizes every piece of information by page and section instead of by post date, so specific details always stay exactly where a customer expects to find them.
Each project draws on a mix of disciplines: here’s how they came together on this one.
The tools and technologies that came together to bring this project to life.










The problems that came up while building this project, and what came out of solving them.
A Filter Selection That Silently Returned Nothing
WooCommerce’s category archive page doesn’t add its own category to the query’s filter conditions at the point custom code can hook in, so a custom category filter ended up stacking a second, unrelated condition on top instead of replacing it. Picking any category from the sidebar while already on a category page returned an empty grid with no error to explain why, fixed by explicitly clearing the archive’s own condition before the custom filter runs.
A Refactor That Silently Deleted a Section’s Spacing
A shared PHP helper that wraps every section with consistent vertical spacing was moved into a new folder during a cleanup, but the build tool that scans for Tailwind classes wasn’t told to look there, since it reads files as text rather than running PHP. Its classes dropped out of the compiled CSS with no error anywhere, and the spacing between every section on every page quietly collapsed until it was caught.
A Single Plugin Away From Taking the Whole Site Down
All six pages read their content through one plugin’s field function, called directly across dozens of places with no fallback. If that plugin were ever deactivated or failed to load, every page would fail with a fatal error at once instead of degrading, closed by wrapping every call behind a compatibility layer and verifying the site stayed up with the plugin disabled live.
The technical problems fixed while building this project.
Filtering always returns the right products
Zero single point of failure across all 6 pages
Images under 200KB
Automatic compression on every future upload
One shared source for section spacing sitewide
Before
Picking a second category from the sidebar filter while already viewing a category archive returned zero products, with no error to explain why.
After
The archive’s own category condition is explicitly cleared before the custom filter runs, so filtering always reflects what the shopper actually picked.
Before
All six pages read their content through one plugin’s field function with no fallback, so a disabled or failing plugin would fatal-error the entire site at once.
After
A compatibility shim wraps every call and returns safely when the plugin is unavailable, verified by disabling it live with the site staying fully up.
Before
Uncompressed images on an image-heavy catalog would have made every page slow to load, especially on a customer’s mobile connection.
After
Every image is compressed to WebP before upload, keeping pages fast everywhere they’re viewed.
Before
Compression only happened as a one-time manual pass, so any photo the client uploads later would arrive at full, uncompressed size.
After
A custom pipeline now compresses and converts every future upload automatically, so pages stay fast without relying on anyone remembering to optimize an image by hand.
Before
Vertical rhythm between sections could silently drift if the build tool ever lost track of the helper function defining it, as it briefly did during a refactor.
After
The gotcha is documented and guarded against, and every page’s section spacing stays consistent by construction from one shared helper.