EUNICE M. Get in Touch
Back to Projects

Full Stack · Marketplace

Craft Cove

A marketplace for handmade goods, built in Django. Catalogue with categories and reviews, wishlists, a cart that survives login, and an order pipeline careful enough to give reserved stock back when a payment falls through.

Django Python SQLite GitHub Actions Server-rendered Vercel
craft-cove-topaz.vercel.app Open

Live embed of the deployed app. If it doesn't load in your browser, open it in a new tab.

What's inside

A conventional commerce stack, with the attention spent on the states most builds get wrong.

4 Core domains Users, products, orders, payments
Live Deployment Running on Vercel
CI Automation GitHub Actions workflow
Seeded Demo data One management command
Cart Sync Guest cart survives login
Stock Safety Allocations released on failure

The Problem

Independent makers selling handmade work need a storefront that handles the boring parts correctly — stock that reflects reality, a cart that doesn't vanish when someone logs in, and orders that don't quietly hold inventory hostage after a payment fails.

Those are the details that turn a demo into something a maker could actually run, and they're the ones this build focuses on.

My Role

Sole developer. I built the data model, the storefront and checkout flow, the payment and order services, and the seeding command that makes a fresh clone immediately demonstrable.

  • Catalogue & review models
  • Cart and checkout flow
  • Order & payment services
  • Demo seeding command
  • Deployment

App structure

Four Django apps and a services layer holding the logic that doesn't belong in a view.

User

Accounts, forms and the seller/buyer relationship.

products

Category, Product, ProductReview and WishlistItem.

orders

Order lifecycle, plus cart_sync and a services layer.

payments

Payment records and the flow that confirms or releases an order.

seed_marketplace

Management command that populates a browsable demo catalogue.

.github/workflows

CI running on push so a broken commit is visible immediately.

Engineering decisions

Release stock when payment fails

release_order_allocations returns reserved stock and capacity for a cancelled payment order. Without it, every abandoned checkout permanently removes inventory that was never sold — a slow leak that's hard to trace later.

Business logic in services

Order and payment logic lives in services.py rather than in views. Views stay thin, and the same operation can be triggered from a view, a command or a test without duplication.

Carts that survive login

cart_sync merges a guest cart into the user's cart at sign-in. Losing a basket at the login step is a self-inflicted abandoned checkout.

Seeded demo data

A single management command fills the marketplace with realistic products. Nobody evaluates an empty storefront kindly, and the seed doubles as fixtures for testing.

Reviews and wishlists as models

Both are first-class records rather than bolt-ons, so they can be queried, moderated and counted — wishlist volume is a real demand signal for a maker.

CI from the beginning

A GitHub Actions workflow runs on push. Cheap to add at the start, and it catches the commit that breaks the build before it's three commits back.

Want a walkthrough of the code?

I'm happy to talk through the architecture or the decisions above — and I build systems like this for other people too.