All projects
Overview
Satr Easy Store lets a merchant sign up, create a store, connect a custom domain, design the storefront and sell products, all on shared infrastructure. It is made of three parts that I built together: the backend services, the merchant dashboard and the storefront engine.
Shoppers get store-scoped accounts separate from merchant accounts, so a customer token from one store is rejected by every other store. Stock is reserved atomically at checkout, and every order follows a fixed lifecycle that restores inventory on cancellation or refund.
Components
Backend (ecommerce-platform)
A Cargo workspace of Rust/Axum services (gateway, auth, store, catalog, orders, notifications) on PostgreSQL, Meilisearch and pict-rs, with a rate-limited TLS gateway as the only public entry point.
Merchant dashboard (ecommerce-platform-frontend)
React 19, Vite, shadcn/ui and TanStack Query with feature-based architecture: stores, domains, products and variants, orders, themes, navigation and a layout studio.
Storefront engine (storefront-astro)
A server-rendered Astro storefront that renders each store from a versioned JSON config language, with generated Open Graph, JSON-LD, sitemap and robots files per store.
What I built
- Built Satr Easy Store end to end: Rust/Axum microservices, a React merchant dashboard and an Astro storefront.
- Designed a catalog with variants, inventory tracking, Meilisearch search and async CSV bulk import and export.
- Built an order engine with server-side pricing, atomic stock reservation and a validated status state machine.
- Built a config-driven storefront and layout studio with themes, saved layouts and per-store SEO.
Design and architecture
- Route namespaces: /api/v1 for public JSON, /in/v1 for service-to-service calls that are never published, and /store for rendered storefront HTML.
- Response standard: every JSON endpoint returns the same status / data / meta / error envelope, documented per service.
- Orders: price and stock are always looked up server-side from the catalog, items are reserved atomically, and a failed reservation rolls the whole order back.
- Order lifecycle: pending, confirmed, processing, shipped, delivered, with cancelled and refunded as terminal states that restore inventory idempotently.
- Catalog: variant generation from option sets, per-variant stock with low-stock thresholds, store-scoped tags and attributes, and CSV import as an asynchronous job with status polling.
- Storefront config: a JSON Schema validates versioned page configs made of ordered sections with content and style kept apart, plus theme tokens for colors, typography and spacing.
- Custom domains: DNS ownership verified with real CNAME and TXT lookups.