Projects
2026

Maxton

A full-stack e-commerce platform - async FastAPI backend, PostgreSQL, and a server-rendered storefront plus admin dashboard, with Stripe checkout and inventory that cannot quietly leak. A personal build, not a launched store.

Year
2026
Focus
Backend
Screens
4

Overview

Most e-commerce practice projects stop at a product list and a cart. Maxton is my attempt at the whole shape of a shop instead: a storefront a customer actually moves through - catalog, cart, checkout, orders, wishlist, reviews, saved addresses - and, on the same codebase and database, an admin dashboard the owner runs the business from.

The backend is layered the way I build everything: routers handle HTTP and nothing else, services hold the business rules, repositories own the queries, and models own the schema. Requests and responses are typed with Pydantic, the database is async SQLAlchemy 2 on asyncpg, and every request carries an ID through structured JSON logs so a failure can actually be traced.

The part that needed real thought was the gap between 'add to cart' and 'paid'. An order that is waiting on payment has to hold its stock, or two people buy the last item; but it cannot hold it forever, or an abandoned cart quietly takes the product off sale. So reserving is tied to order state, and a background job expires unpaid orders and releases exactly what they were holding.

Payments go through Stripe Checkout, called directly over httpx rather than through the SDK, with a webhook endpoint for confirmation. Auth is session-based: bcrypt password hashes, httpOnly cookies, and password-reset tokens stored as SHA-256 hashes, so the database never holds a token that is usable on its own.

It runs locally or in Docker, with pytest against a real PostgreSQL instance. To be clear about status: it is a personal build I use to push on architecture, not a live store with customers.

Highlights

Storefront and admin

Catalog, cart, Stripe checkout, wishlist, reviews and addresses for customers; analytics and management UI for the owner.

Layered by default

Router to service to repository to model, typed end to end with Pydantic and async SQLAlchemy 2.

Stock that cannot leak

Reservations are tied to order state, and a background job expires unpaid orders and releases what they held.

Payments without the SDK

Stripe Checkout driven directly over httpx, with a webhook endpoint for payment confirmation.

Tokens stored safely

bcrypt password hashes, httpOnly session cookies, and reset tokens kept only as SHA-256 digests.

Traceable in production

Structured JSON logging with a request ID attached to every request.

Stack

FastAPIPostgreSQLSQLAlchemyStripeDocker