StepUp — online shoe store with payments and delivery
A full online shoe store with a catalog of 14,000 products, card payments and delivery across Kazakhstan.
For shoppers
Catalog filters by size, colour, season, brand and price, with a live product count
Quick view right from the product grid and search with instant suggestions
Product pages with a photo gallery, colour versions and a size picker
Cart for guests and signed-in users (merged at login), wishlist, reviews, order history and saved addresses
Order status updates on the page without reloading
Under the hood
Card payments via Freedom Pay: the server recalculates the total, signs the request and treats the signed server-to-server callback as the only proof of payment
Stock is written off only after a successful payment, inside a database transaction, so abandoned orders never lock up sizes
Kazpost delivery rates and parcel tracking, synced in the background with Celery
14,077 products, 85,473 size variants and 69,531 photos imported from a catalog export; full-text search in PostgreSQL
Security first: payment and delivery keys stay on the server, the refresh token lives in an httpOnly cookie, other customers' orders simply don't exist for you
262 automated tests and CI on GitHub Actions
Stack: Django 5 + DRF, PostgreSQL, Redis, Celery on the backend; React 18, TypeScript, Tailwind CSS and TanStack Query on the storefront; Docker, deployed on Vercel.
StepUp — online shoe store with payments and delivery
A full online shoe store with a catalog of 14,000 products, card payments and delivery across Kazakhstan.
For shoppers
Catalog filters by size, colour, season, brand and price, with a live product count
Quick view right from the product grid and search with instant suggestions
Product pages with a photo gallery, colour versions and a size picker
Cart for guests and signed-in users (merged at login), wishlist, reviews, order history and saved addresses
Order status updates on the page without reloading
Under the hood
Card payments via Freedom Pay: the server recalculates the total, signs the request and treats the signed server-to-server callback as the only proof of payment
Stock is written off only after a successful payment, inside a database transaction, so abandoned orders never lock up sizes
Kazpost delivery rates and parcel tracking, synced in the background with Celery
14,077 products, 85,473 size variants and 69,531 photos imported from a catalog export; full-text search in PostgreSQL
Security first: payment and delivery keys stay on the server, the refresh token lives in an httpOnly cookie, other customers' orders simply don't exist for you
262 automated tests and CI on GitHub Actions
Stack: Django 5 + DRF, PostgreSQL, Redis, Celery on the backend; React 18, TypeScript, Tailwind CSS and TanStack Query on the storefront; Docker, deployed on Vercel.
We built a freight forwarder that doesn't exist. Then we made its website actually work.
Halyard is a concept project — no client, no brief. We wanted to see what happens when a corporate site stops describing its product and just runs it.
So on the site you can:
→ Hover a live route map — 16 real ports, containers moving along their trade lanes, each port showing its local time and weekly sailings.
→ Track a container — type a number and it's checked against the real ISO 6346 check digit. Mistype one and it suggests the correction. You get the vessel, voyage, arrival date and every milestone from booking to delivery.
→ Price a lane — Shanghai to Rotterdam, 40ft reefer, pick a weight. Out comes transit time, sea distance, an indicative rate range and that container's CO₂e.
Five pages, built in Framer. The route map, tracker, estimator, counters and clocks are custom React code components. Open roles on the Careers page come from the CMS.
The part we keep coming back to: most corporate sites make you book a call to see the product. This one hands it to you on the homepage.