Interface
Representative interface stills.
- Role
- Solo
- Organisation
- Personal project
- Period
- 2023
- Stack
- Next.js
- TypeScript
- Tailwind
- Express
Short explanation
Laminastore is a game top-up storefront — buy credit for a game, pay, done. I built the storefront, the API behind it and the admin surface for running it, because I wanted to know what a complete product felt like rather than what a complete frontend felt like.
- Storefront in Next.js, TypeScript and Tailwind.
- A backing API written in Express rather than a hosted backend.
- A separate admin dashboard for catalogue and orders.
- Open source — two public repositories.
Why it exists
Buying game credit in Indonesia meant slow, cluttered, ad-heavy sites. I wanted to see whether the whole flow — browse, checkout, fulfil — could be made fast and quiet instead.
The honest second reason: I'd built a lot of interfaces for other people's backends and wanted to find out which of my API frustrations were the backend's fault and which were mine.
Three surfaces, one product
Storefront
The customer-facing half — catalogue and checkout.
Laminastore storefront and checkout flow
Express API
Written rather than rented.
Reaching for a hosted backend would have shipped faster. Writing it meant making the decisions myself: what the resources are, what the endpoints return, where validation belongs.
Admin dashboard
A separate surface for the person running the shop.
The part that's easy to skip on a personal project, and the part that turns it from a demo into something operable.
Admin dashboard for catalogue and order management
What it taught me
That the interesting decisions are at the seams. Designing an API for a screen I was also building made it obvious how often I'd been handed endpoints that were shaped for the database instead of the view — and how easy that is to do when you never see the interface.

