Case study
zlitego.pl
A solid-wood furniture shop: Stripe payments, InPost shipping, an admin panel, a CAD module. The first thing I ever built with AI.
Context
I build solid-wood furniture and needed somewhere to show it — and I wanted to learn how to build a shop from the ground up. This was my first project built with AI: it came from my own need, not a client brief.
That doesn't make the problems invented. Solid-wood furniture pieces are one-offs, not catalog products — every table or workbench exists exactly once. The shop had to reflect that: reserve stock in the cart so two people can't buy the same piece, and handle shipping differently for furniture whose transport can't be priced up front.
What I built
- A home page with five paths: sales, a gallery of past work, buying back old furniture, contact, and the sketchpad.
- A project gallery with a description of each piece and workshop photos.
- A cart rule that disables delivery options for products that need an individual shipping quote.
- Cart reservations that expire and return the item to sale.
- Online payments via Stripe and shipping via InPost ShipX.
- An admin panel with IP-based login lockout.
- A CAD sketchpad — Szkicownik (“Sketchpad”) — where a customer draws a piece with dimensions in millimeters and sends the design for a quote.
Crux
Technical decisions
Why does the shop take delivery choice away from the customer?
An oak workbench for 3,300 zł isn't going in a parcel locker. The shop knows that: for products needing an individual shipping quote, it disables the shipping options and leaves only in-person pickup, instead of letting someone order a courier and sorting it out afterward. The rule lives in the cart, not in the terms and conditions — the customer can't select something that isn't possible anyway.
Why do stock reservations expire?
Solid-wood furniture pieces are one-offs — there's no “second one in the warehouse.” Adding to cart reserves the piece so two people don't buy the same table, but the reservation expires and returns it to sale. Without expiry, an abandoned cart would freeze the item forever.
Why does the admin login lockout live in a file, not in the session?
Because a lockout in the session isn't a lockout. An attacker who doesn't send the cookie back gets a fresh session on every request — the attempt counter resets to zero and the limit disappears. A counter kept in a file, keyed by IP address, can't be beaten by dropping a cookie. Five failed attempts locks the address out for 15 minutes.
Where did the idea for Szkicownik come from?
The customer knows what they want but can't describe it — and I can't price a description. Szkicownik flips the order: the customer draws the piece with real dimensions in millimeters, sends the design, and I build it. Instead of an email back-and-forth of “something like that, but lower,” I get a technical drawing.
What it looks like
Stack
- PHP 8
- React
- Stripe
- InPost ShipX
- MySQL
- Apache / OVH
- PL/EN
The shop runs live on its own domain — see it in action.