Plant Market

A marketplace for buying local plants and having them delivered to your location.


Project Purpose and Goal

The purpose of the website is to serve as a marketplace for buying plants. Shop owners should be able to use it to give their shop an online presence.

My goal was to create a web app that's a pleasant, feature-rich experience for shoppers, and satisfies what sellers want from an online marketplace (such as displaying their information concisely and effectively). On a technical level, I wanted to create this web app from the ground-up, not using any traditional services for creating online marketplaces.

Tech Stack

The frontend is built with Next.js, using the new App Router. The new Server Component paradigm was initially difficult to wrap my head around at first, but it clicked once I got used to how and where to place client boundaries. I enjoy how powerful it is for shipping complex features while not burdening the client.

I used TypeScript for type-checking. It's similar to using JavaScript with JSDoc type definitions, but it's more strict and integrated into the programming experience. Developing a large application with pure JavaScript isn't impossible, but using Typescript results in less headache.

The backend is powered with Firebase, using Cloud Firestore for the database and the Authentication feature for user sign-ins. I had to familiarize myself with both APIs make proper use of the database.

I hosted the website on Vercel, since its tight integration with Next.js made deployment straightforward to manage.

Problems and Thought Process

I wanted users to be able to use the website without having to log in (albeit with restricted features), then be able to upgrade to a full account if they wanted. I used Firebase's anonymous authentication feature to help achieve this, but I still had to be conscious of things like not letting the user checkout without formally signing up.

Lessons Learned

It's impossible to plan exactly you'll implement the features of an application before doing it, but I could've given it more thought towards the beginning. Doing so would've saved me some refactoring later in the project, and gave me a more holisitic view of what to prioritize.

That said, I still learned a lot, and I'm still satisified with the final result.