Skip to content

Exsport

Exsport is an e-commerce platform for the bag brand Exsport (exsportbags.com). Customers browse a catalogue, add items to a cart, pick a courier, pay, and track delivery. Staff manage products, stock, orders, members, promotions and content from an admin panel. The platform talks to three outside services: Biteship for delivery, DOKU for payment, and PowerBiz (WMS) for warehouse stock.

Binari builds and maintains it. Everything is one Jira project, DEF07.

How it is shaped

Exsport is one product split across several repositories, one per service. This is the opposite of INACT, which is one codebase forked per client. Here there is one live system, and the split is by role, not by client.

        Storefront (Next.js)          Admin (Next.js)
              │                              │
              └──────────────┬───────────────┘

                   Backend (NestJS, GraphQL + REST)

        ┌────────────────────┼────────────────────┐
        ▼                    ▼                     ▼
     Biteship             DOKU              PowerBiz (WMS)
   (delivery)           (payment)             (stock)
        │                    │                     │
        └───────── webhook receiver → SNS ─────────┘

The repositories

All under binari-digital on GitHub. Local checkouts sit under /Volumes/xpro/erisristemena/ in a folder named for the stack (nestjs/, nextjs/, …), not under www/ like the INACT repos.

RepoRoleStackBranches on origin
def-exsport-backendGraphQL + REST API, all business logicNestJS 10, Apollo, TypeORM, Postgresmain, staging, development
def-exsport-frontend-storefrontCustomer shopNext.js 15, React 19, Apollo, NextAuthmain, staging, development
def-exsport-frontend-adminAdmin / CMSNext.js 15, React 19, Apollo, NextAuthmain, staging, development
def-exsport-webhookReceives third-party callbacks, fans out to SNSExpress 5, plain JSmain only
def-exsport-3rdparty-simulatorProxy in front of Biteship/DOKU/WMS, with error simulationExpress 5, http-proxymain only
def-exsport-data-migrationOne-off product and member import from Google SheetsDeno, TypeScriptmain only
def-exsport-stresstestLoad test that drives real browsersGo 1.24, playwright-gomain only
def-exsport-pulumiAWS infrastructure as codePulumi, TypeScriptmain only

Versions are read fresh in the repo comparison. The branch model is read from origin, never from memory — it decides the whole git workflow. See Working on a ticket.

Stack facts that matter

APIBackend serves code-first GraphQL (autoSchemaFile: true, no committed schema.gql) at /{APP_PREFIX}/graphql, plus REST for file uploads and inbound webhooks
DatabasePostgres only — one engine, so none of INACT's cross-driver rules apply
SchemaTypeORM with synchronize: true — the schema is defined only by the *.model.ts entity files. No migrations folder, no seed scripts
AuthTwo separate JWT realms: admin/CMS and storefront member. Guards are per-resolver, no global guard
FrontendsBoth Next.js 15 App Router, Apollo Client, NextAuth. Storefront on Tailwind v4, admin on Tailwind v3
Third partiesBiteship, DOKU, PowerBiz WMS — reached only from the backend. In dev they point at the simulator
DeployPush to a branch auto-deploys that env via GitHub Actions on the self-hosted rumah runner

Where to go next

New here: Local setup, then the codebase tour, then working on a ticket. Tracing a feature: the feature map and the page for that feature. Working in one repo: its repo page. Adding or fixing a page: the contributing guide.