← Back to all projects

Client project4 min read

VavaStone - Inventory, Sales & Delivery for Natural Stones Industry

VavaStone - Inventory, Sales & Delivery for Natural Stones Industry

Tech stack

GolangReactTypeScriptPostgreSQLDockerKubernetesMicroservicesProjectFullstackAWS

Services

  • →Fullstack development (Go + React + TypeScript)
  • →OpenAPI contract definitions and typed client generation
  • →Local Kubernetes dev environment standardisation
  • →Inventory and order management module development
  • →Engineering hiring, structured onboarding, and mentorship

Deliverables

  • ✓Type-safe API contracts between microservices, integration bugs caught at compile time
  • ✓Makefile-based local dev setup, new engineers productive on day one
  • ✓Inventory and order management feature improvements
  • ✓Hiring pipeline and onboarding process for distributed engineering team

Challenge

VavaStone is an international platform for natural stone inventory, sales, and delivery, a domain with complex logistics: multi-warehouse stock, weight-based shipping, multi-currency pricing, and multinational customer workflows. The engineering team was distributed across several countries. By the time I joined, the Go + React microservice architecture was functional but had accumulated friction: service boundaries were implicit, local development required significant setup, and onboarding new engineers took too long.

Hiring took a single day. We had a WhatsApp call, talked it through, and that same evening the contract was signed and the work began.

VavaStone, WhatsApp chat for the front-end position: the call rescheduled to the same day, contact details hidden
Arranging the call that led to the contract

In the team Slack I was listed simply as DEV, but in practice I was a full-stack developer: I worked on both the frontend and the Go backend.

Slack profile named Artem DEV
Listed as DEV, working full-stack

Discovery

A few weeks of codebase exploration and team conversations identified three root causes. First: services communicated via untyped JSON with no shared schema, making integration bugs subtle and hard to catch before production. Second: the local Kubernetes environment required manual steps that weren't documented, so each engineer had a slightly different setup. Third: the hiring and onboarding process was informal, knowledge lived in people's heads, not in docs.

Options Considered

  1. Introduce a service mesh and auto-generated clients, too heavy for the team size; would have taken months to migrate existing services.
  2. Add OpenAPI specs and generate typed clients per service: chosen as the pragmatic middle ground. Explicit contracts, generated types, no new infrastructure.
  3. Migrate to a monorepo with shared type packages, deferred; viable long-term but too disruptive short-term.

Decision

Introduce typed API contracts incrementally as services are touched, rather than a big-bang migration. Simultaneously: document the local dev environment into a repeatable setup script, and formalise the onboarding process with a written checklist and a designated buddy for new hires.

Implementation

Added OpenAPI definitions to the services I worked on and generated TypeScript client types used by the React frontend. This caught a class of bugs at compile time that previously only surfaced in staging. Refactored the local Kubernetes setup into a documented Makefile-based workflow, `make dev-up` instead of six manual commands. New engineers could run the full stack locally on day one.

On the product side, delivered inventory and order management module improvements: stock level display across warehouses, order status tracking, and delivery cost calculation flows. Participated actively in hiring: wrote job descriptions, conducted technical interviews, and ran the first structured onboarding for two new engineers.

Outcome

Integration bugs between services dropped measurably as typed contracts caught mismatches at build time. New engineer ramp-up time shortened from weeks to days with the documented dev environment. The team shipped features at a noticeably higher velocity in the quarters following the tooling improvements.

Demo

Tightening the types between backend and frontend came down to one practical option: generating an annotation for every single API call. Doing that by hand across the whole surface is a long grind, so I tested the AI tooling available at the time, still raw then, and picked it to carry that work. This is the R&D recording of that approach.

Second half of the same story: an OpenAPI utility reads those call annotations and generates the frontend types from them. From there a type mismatch surfaces as a compile-time error on its own, which removes an entire category of runtime integration bugs.

The approach did not stay mine: I recorded a walkthrough and presented it to the rest of the team. It got the teamlead's sign-off and was adopted as the standard for further development, so new and reworked endpoints went through the same annotate-and-generate flow.

VavaStone, team feedback on the type-generation approach
Team feedback in the project channel

Early alpha of the reporting system prototype, order and inventory analytics built on top of the type-safe data layer.

Presenting one of the implemented screens to the client on a video call, with the code behind it on the shared screen: report generation runs under the debugger in VS Code, paused on a breakpoint in the step that loads the selected entities from the database. The client's camera is blurred.

VavaStone, presenting an implemented screen to the client over Google Meet: reporting code paused on a breakpoint in VS Code, client camera blurred
Client demo over a video call

Client feedback on the finished module in the reporting channel. We agreed to show a report on the site first and move export to XLS or PDF into a button, and the verdict was "Good progress!!". The client's photo and a personal remark are hidden.

VavaStone, client feedback in the reporting Slack channel: report shown on the site first with an export button, then Good progress, client avatar and a personal remark hidden
Client feedback on the reporting module
🔒 How it ended

This part is closed. Enter the code to read it.

Projects

Chelyabinsk State University, SharePoint Portal Development and Administration

Chelyabinsk State University, SharePoint Portal Development and Administration

Before: the university SharePoint portal lacked what the platform does not ship with: an events calendar, admission rankings fed from FoxPro exports, a mobile layout and spam-safe email addresses. After: custom web parts added a Google-synced calendar, SSRS ranking lists that update from an upload and hidden emails, and the site got a responsive mobile version.

Open for contract collaboration

I am available for contract-based collaboration. If you have an interesting project idea, schedule a call via Calendly.

Schedule a 30-min call