Fadhil Official Logo
Fadhil NuruzzamanSoftware Engineer
E-CatalogPersonal2026

Harvest Sun: White-Label E-Catalog Platform

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.

Preview

Walk Through the Site

A scrollable look at the finished site, exactly as a visitor would browse it.

Harvest Sun: White-Label E-Catalog Platform desktop preview

Desktop

Harvest Sun: White-Label E-Catalog Platform mobile preview

Mobile

Tech Stack

Technologies Powering the Build

The tools and technologies that came together to bring this project to life.

HTML logo
CSS logo
JavaScript logo
PHP logo
Wordpress logo
Blocksy logo
WooCommerce logo
Alpine.js logo
Tailwind CSS logo
VSCode logo

Roles

A Skill-by-Skill Breakdown

Each project draws on a mix of disciplines: here's how they came together on this one.

Web Development

  • Built the theme as a child theme on Blocksy plus a companion settings plugin, splitting reusable logic like Customizer controls and custom post types into the plugin so it survives independent of theme updates.
  • Structured all six static pages as thin PHP orchestrators that assemble self-contained section partials, each rendering its own ACF fields and markup, so a new page can be composed from existing sections instead of duplicating code.
  • Turned WooCommerce into a catalog without checkout by disabling purchasability while deliberately leaving its add-to-cart hook registered, after tracing an internal Blocksy behavior where removing that hook silently deleted unrelated custom buttons sharing its priority range.
  • Fixed a category filter bug where the archive page's own category wasn't yet present in the query at the point custom filters run, which silently returned zero products whenever a shopper picked a second category while already on a category page.
  • Traced and fixed a query bug where flattening a filter array with array_values() corrupted its relation key, silently breaking the AND/OR logic between filter clauses with no PHP error.
  • Wrapped every content field call across all six pages behind a compatibility shim, so a disabled or failing content plugin degrades gracefully instead of taking the whole site down with a fatal error, verified by disabling it live and confirming every page stayed up.
  • Built branding as CSS custom properties driven entirely from the WordPress Customizer, including an automatic hex-to-RGB generator so Tailwind's opacity modifiers work against colors an admin can change at any time.
  • Registered custom post types with the safety flags needed to avoid WordPress's canonical-redirect quirks on post types with no public single page.
  • Ran a systematic audit of every point the custom code touches WordPress, Blocksy, WooCommerce, and ACF internals, documenting what's safe against future updates, what's already safeguarded, and what still needs a manual recheck, with a checklist to run after every update.

UI/UX Design

  • Designed navigation around how each breakpoint is actually used, hover-driven dropdowns on desktop and tablet, tap-driven on mobile, with mobile submenus always expanded instead of collapsed behind a toggle.
  • Redesigned the sticky header to keep only the top utility row anchored while the nav row scrolls with the page, after an earlier collapsing-header animation caused scroll-jump loops on load.
  • Designed off-canvas drawers for mobile, a category browser sliding in from the left and the main menu from the right, each mirroring the side of the button that opened it.
  • Designed the responsive grid rhythm for repeating card sections to step down column counts gracefully across breakpoints instead of ever collapsing straight to one column.
  • Designed the Customizer's branding controls so a non-technical admin can reskin the whole site's color and typography system from a handful of fields, without touching code.

Graphic Design

  • Designed the Harvest Sun brand identity and logo from scratch as the demo brand for this boilerplate.
  • Standardized every icon sitewide to a single outline style sourced from an icon library, including social brand marks that are usually filled by convention, replacing a mix of hand-drawn and filled icons found during a design audit.
  • Created the site's favicon.
  • Compressed every image to WebP and mostly under 200KB before upload, without a visible drop in quality.

Digital Marketing

  • Designed the catalog experience around WhatsApp as the actual point of contact, letting a business start taking orders without needing a payment gateway or courier integration first.
  • Added search, category filters, and sorting so shoppers can find what they want in a large catalog without scrolling through everything, keeping them from bouncing before they ever reach a product.
  • Built a related-products section on every product page, a straightforward cross-sell that puts more of the catalog in front of a shopper who's already interested.
  • Gave every product its own detail page instead of one long scrolling list, so individual products can be found and indexed through search instead of only the homepage.
  • Combined the blog and company profile into the same site as the catalog, so content written to attract organic traffic and the trust-building company story sit right next to the products they're meant to sell.
  • Kept category and product data in WooCommerce's native taxonomy structure instead of custom fields, so search engines and future SEO tooling can read it the way they already expect.

Highlights

Behind the Scenes

A closer look at what the finished product offers, the obstacles along the way, and what came out of it.

Key Features

  • Fully responsive across mobile, tablet, and desktop.
  • Combines a company profile, a blog, and a full product catalog into one website.
  • Six purpose-built pages, Home, About, Customers, How to Order, Contact, and Gallery, each with its own dedicated content.
  • A stats highlight strip on the homepage.
  • A "why choose us" section highlighting the platform's strengths.
  • A product categories showcase on the homepage.
  • A trusted-by section featuring client and partner logos.
  • A recent-deliveries section showing proof of past shipments to build buyer trust.
  • A dedicated Customers page presenting featured testimonials.
  • A dedicated How to Order page walking a first-time visitor through the WhatsApp ordering flow step by step.
  • Product search, plus sorting by newest, oldest, and price low to high or high to low.
  • Filter products by price range or category.
  • Every product page includes an image carousel, a full description, and a "Buy on WhatsApp" button that skips checkout entirely.
  • Share any product by copying its link or sharing straight to Facebook or WhatsApp.
  • Download a product's photo directly, so a customer or the support team can ask about a specific item just from the image, no link required.
  • Every product's data can be added or edited from the dashboard, with a built-in guide for whoever manages it.
  • Every image compressed to WebP before upload.
  • Multi-brand ready, the whole color palette and typography can be reskinned from the WordPress admin.

Challenges Faced

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.

Lessons Learned

  • Debugging a WordPress hook by watching what it actually contains at runtime, not just trusting what its name implies, is what surfaced both the category filter bug and the query relation bug, and neither was visible from reading the code alone.
  • A build tool that reads files as text has no idea a helper function exists once that file moves, a config's file paths need to be treated as part of a refactor's checklist, not a one-time setup step.
  • Wrapping a fragile integration point in a compatibility layer only proves its worth once it's tested against actual failure, not just against the happy path, disabling the plugin live was what actually confirmed the shim worked.
  • Centralizing brand colors into Customizer-driven tokens instead of hardcoding them cost more upfront than a single-brand build, but turned reskinning into a configuration change instead of a rewrite.

Impacts

Problems Solved After Launch

How this project changed things for the business and its users after launch.

Filtering always returns the right products

Zero single point of failure across all 6 pages

Images under 200KB

Full rebrand without touching CSS

One shared source for section spacing sitewide

Critical Fix

A Category Filter That Silently Returned Nothing

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.

Critical Fix

A Single Point of Failure Across Every Page

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.

Performance

Slow-Loading Pages From Unoptimized Images

Before

Uncompressed images would have made every page, especially the image-heavy product catalog, slow to load.

After

Every image is compressed to WebP and mostly under 200KB before upload.

Improvement

Rebuilding From Scratch for Every New Brand

Before

Standing up a new catalog site for a different brand would mean rewriting hardcoded colors and styles throughout the CSS.

After

Brand colors, hover states, and spacing are centralized in the WordPress Customizer, so a new brand is a configuration change, not a rebuild.

Improvement

Section Spacing With No Single Source of Truth

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.