Skip to content
All projects
06 · PURCHASE SERVICE · DELIVERY FROM CHINA AND HONG KONGLive site

Taobao.at: 600+ orders a month by handover

Home page of the Taobao.at website
  • E-commerce
  • Full-Stack

Stack:

  • Nuxt 4
  • Vue 3
  • TypeScript
  • Pinia
  • Nuxt i18n
  • Nuxt Icon
  • VueUse
  • Tailwind CSS
  • daisyUI
  • Vitest
  • Envoy
  • Laravel
  • Go
  • PostgreSQL
  • Redis
  • RabbitMQ
  • S3 / MinIO
  • ClickHouse
  • Elasticsearch
  • Docker
  • Traefik
  • Kubernetes
  • Argo CD
  • GitLab CI
  • ELK
  • Grafana
  • Prometheus

used by me

Role
Fullstack Developer
Team
2 fullstack developers and a junior frontend developer
Timeline
January 2026 – March 2026
Status
Completed, the site is live

What I did

  • Design and UI kitThe site design is entirely mine. The UI kit is built on Tailwind and daisyUI with a custom theme, so the look changes by switching the theme. For the business, this means a new style for a promotion or a rebranding can be shown and rolled out in a day, without redoing the layout.
  • Storefront in NuxtI proposed making the storefront a separate Nuxt application with server-side rendering: pages open faster and are indexed better by search engines, and search is a direct source of customers for the store. I built its client side myself: Pinia, Russian and English interface, the layer of API requests.
  • Admin panelThe client side of the operator workspace and its requests to the backend. The faster an operator processes an order, the sooner the customer gets the product, so the speed of the whole service depends directly on how convenient the admin panel is.
  • Storefront APILaravel endpoints that feed the storefront. The cart and favorites work without signing up, so the customer gets to the order without an extra step, and the business loses fewer customers along the way.

Context

Business

The client purchases and delivers products from China and Hong Kong. Its customers live in Russia, and for many of them the service is a way to buy what has become unavailable or noticeably more expensive in Russian stores. China and Hong Kong are major trade hubs: they sell products of global brands, including European and American ones, often cheaper than in Russia. So customers order not only Chinese products through the service, but also IKEA furniture, Apple devices for the Hong Kong market, clothing and shoes from Farfetch, and computer components.

If an item is not in the catalog, it can be ordered with a purchase request.

Process, architecture and decisions

The order flow

The catalog price is in rubles right away and already includes duties, the service fee and delivery. After that an order goes through four steps.

  1. 01OrderFrom the catalog or with a purchase request. The cart and favorites work without signing up
  2. 02PaymentBy a MIR card or via SBP
  3. 03CheckThe order is checked for completeness before shipping
  4. 04Delivery17–28 days to Russia, the status is visible in the personal account. Pickup point or courier

Architecture

The storefront lives separately from the backend. It is easier to develop, and mobile apps can be built from the same code by adding Capacitor.

  • STOREFRONTStorefront

    Nuxt 4 with server-side rendering, Pinia and Nuxt i18n, a UI kit on Tailwind and daisyUI. The server sends the browser a ready page instead of building it on the customer's device. So the catalog opens faster even on a low-end phone, and search engines see every product and bring customers from search.

  • ADMINAdmin panel

    An internal site for the service staff that customers never see. In it, operators receive and process orders and purchase requests, check that orders are complete before shipping and update the delivery statuses the customer sees in their account.

  • APIPublic API

    Cart, favorites and product blocks for the home page. The guest session relies on a signed cookie, so the customer does not have to sign up in advance.

    • /api/public/v1
    • catalog/block-products
  • BACKENDServices and data

    Laravel and Go, queues on RabbitMQ. Data in PostgreSQL, Redis, Elasticsearch, ClickHouse and S3 / MinIO.

  • INFRAInfrastructure

    Docker and Kubernetes, rollout via GitLab CI and Argo CD, traffic through Traefik and Envoy. Monitoring on Grafana, Prometheus and ELK.

Pages are built from the API

The structure and content of a page can change without a storefront release. The backend returns a JSON array shaped like an abstract syntax tree, and the storefront builds the page from it.

The home page is built this way, and its product blocks come from catalog/block-products. Any other page can be built the same way.

Data security

For customs clearance the service stores customers' personal data. Sensitive fields are encrypted in the database with Laravel's built-in tools, and the key is stored separately from both the code and the database. Permissions are split between customers, operators and administrators.

Quality and releases

I was responsible for three kinds of tests: component tests on Vitest, visual regression tests that compare blocks against reference screenshots, and E2E tests on Playwright for critical scenarios. The junior frontend developer's code went through my review.

A task from its own branch goes into develop, passes the automated tests and code quality checks and is deployed to the test environment. On the planned release date the finished tasks are gathered into preprod, where final testing and acceptance run in an environment identical to production. Then the release is merged into master and updates production without downtime. If something breaks in production, it is possible to quickly return to the previous stable version.

  1. develop test environment
  2. preprod acceptance
  3. master production without downtime

Sprints lasted two weeks. At the end of each one the client saw what was done, what was not and why, and what was planned for the next two weeks.

Challenges

Accessibility in the UI kit

Problem
The storefront is used by very different customers: on a phone on the go, with a keyboard only, with a screen reader or with low vision. Ready-made daisyUI components do not guarantee accessibility on their own. If it is not built into the UI kit from the start, the issues spread to every page, and some customers cannot place an order.
Solution
Accessibility is built into the UI kit itself: semantic page regions, a visible focus and a logical keyboard order, alt text on images, accessible names on buttons and links. Zooming is allowed, and the screen notch on phones is taken into account.
Result
An axe-core check against WCAG 2.2 AA and a manual keyboard pass on the home page, a category and a product page, on desktop and on a phone, found one violation. The brand red gives a contrast of 4.1:1 against the required 4.5:1, which is fixed by darkening the red a couple of shades in the daisyUI theme.

A new look in a day

Problem
The client came with requests for a new storefront style, and it had to be shown and rolled out quickly.
Solution
I chose Tailwind and daisyUI: the UI kit components take their look from a theme, the custom taobao_v2 or the standard light and dark. The prototype of a new theme was generated with GPT-4.
Result
By my estimate, without measurements: a prototype page in the new style is ready in under an hour after the request, and rebuilding the site takes no more than a day.

Metrics and results

  • 600+orders a month at handover
  • 2M+products in the catalog at handover

Need a cross-border delivery service or a storefront that can be restyled in a day?

I will design an accessible UI kit, build the storefront in Nuxt and the API behind it.