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.
| Repo | Role | Stack | Branches on origin |
|---|---|---|---|
def-exsport-backend | GraphQL + REST API, all business logic | NestJS 10, Apollo, TypeORM, Postgres | main, staging, development |
def-exsport-frontend-storefront | Customer shop | Next.js 15, React 19, Apollo, NextAuth | main, staging, development |
def-exsport-frontend-admin | Admin / CMS | Next.js 15, React 19, Apollo, NextAuth | main, staging, development |
def-exsport-webhook | Receives third-party callbacks, fans out to SNS | Express 5, plain JS | main only |
def-exsport-3rdparty-simulator | Proxy in front of Biteship/DOKU/WMS, with error simulation | Express 5, http-proxy | main only |
def-exsport-data-migration | One-off product and member import from Google Sheets | Deno, TypeScript | main only |
def-exsport-stresstest | Load test that drives real browsers | Go 1.24, playwright-go | main only |
def-exsport-pulumi | AWS infrastructure as code | Pulumi, TypeScript | main 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
| API | Backend serves code-first GraphQL (autoSchemaFile: true, no committed schema.gql) at /{APP_PREFIX}/graphql, plus REST for file uploads and inbound webhooks |
| Database | Postgres only — one engine, so none of INACT's cross-driver rules apply |
| Schema | TypeORM with synchronize: true — the schema is defined only by the *.model.ts entity files. No migrations folder, no seed scripts |
| Auth | Two separate JWT realms: admin/CMS and storefront member. Guards are per-resolver, no global guard |
| Frontends | Both Next.js 15 App Router, Apollo Client, NextAuth. Storefront on Tailwind v4, admin on Tailwind v3 |
| Third parties | Biteship, DOKU, PowerBiz WMS — reached only from the backend. In dev they point at the simulator |
| Deploy | Push 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.