ThriftIt — Project Story

Inspiration

The fashion industry discards billions of garments every year — not because they're worn out, but because the systems around reuse are too slow, too sketchy, and too inconvenient. ThriftIt started from a straightforward observation: the clothes exist, the demand exists, and what's missing is a marketplace that treats second-hand shopping as a first-class experience.

I wanted to close that gap. Not by preaching sustainability, but by removing the friction that makes people default to buying new. The core hypothesis is simple:

$$ \text{Sustainable Impact} \propto \text{Ease of Reuse} \times \text{User Trust} $$

If you make reuse fast and trustworthy, people choose it. That's the product bet ThriftIt is built on.


How I Built It

ThriftIt is a full-stack web app supporting both a buyer and a seller experience — two distinct user journeys sharing one coherent platform.

  • Frontend: React, React Router, Redux Toolkit, Tailwind-based UI, Framer Motion
  • Backend: Node.js + Express APIs
  • Database: SQLite for product and user data
  • State + UX: Cart, wishlist, auth/session flows, guarded seller routes
  • Platform features: Product listings, product details, orders, profile/settings, seller dashboard

Beyond core features, I invested in production readiness — because a sustainable marketplace only works if people can actually find and use it:

  • Route-based code splitting (React.lazy + Suspense) to keep initial bundle size lean
  • Lazy-loaded product media to reduce above-the-fold load weight
  • Open Graph, Twitter cards, and structured data for SEO and link shareability
  • Route-aware title and description logic to make every page indexable in a SPA context

What I Learned

The biggest shift in my thinking was realising that product quality is not a single axis. Features get you to functional. Performance, discoverability, and clarity are what get you to good.

  • Architecture pays forward. Clear route boundaries and reusable components early on meant I could move fast later without untangling a mess. The discipline upfront was worth it.
  • SEO is a product decision, not an afterthought. In a SPA, if you don't explicitly manage metadata per route, your pages are effectively invisible. Treating it as a feature changed how I approached every new route.
  • Performance is additive. There is no single fix — it is a series of small decisions that compound. Load time breaks down as:

$$ T_{\text{load}} = T_{\text{network}} + T_{\text{parse}} + T_{\text{render}} $$

Shaving time from each term separately is what produces a noticeably faster experience.

  • Visibility drives behaviour. Sustainability features only change habits if users can see the impact. Embedding that into the product flow — rather than burying it in an "About" page — is what makes it real.

Challenges I Faced

  1. Balancing visual richness with speed — Motion and video-heavy sections elevated the brand feel, but came with real load cost. The solution wasn't to strip the design back, but to be surgical: lazy-load what's below the fold, compress aggressively above it, and let Framer Motion handle animation weight rather than raw video where possible.

  2. Managing multi-role flows cleanly — Buyer and seller journeys share an app but need strict separation: guarded routes, distinct session intents, and navigation states that don't bleed into each other. Getting this right required treating roles as a first-class architectural concern, not a conditional flag bolted on later.

  3. Keeping shared state predictable — Cart, wishlist, products, and auth running in parallel is where Redux can get messy fast. Structuring slices with deliberate boundaries — each owning its own shape and actions — was what kept things from unravelling as features grew.

  4. SEO in a single-page app — SPAs don't get metadata for free. Every route needs its own title, description, and structured data to be discoverable. Building route-aware metadata logic from the ground up was the right call, and it's now a pattern I'll carry into every future project.


Final Reflection

ThriftIt grew from a sustainability idea into a full product engineering problem — one where UX, architecture, performance, SEO, and business logic all had to work together, not in isolation. The version I built here is a foundation: the multi-role marketplace, the optimised delivery layer, and the discoverability infrastructure are all in place. What comes next is scale — more sellers, richer search, and impact metrics surfaced directly in the product so users can see the environmental difference their purchases make. The core conviction hasn't changed: make reuse easier than buying new, and people will choose it.

Built With

Share this project:

Updates