§ Overview
The online home of Dolphin Model Hobby, a Tamiya hobby shop in Indonesia. One platform brings together a shop with cart and checkout, a community board where members post, react and reply, race announcements and results, and Tamiya news, all run from an admin dashboard. I built it full stack on my own, from the API and database to the storefront, the admin side and the production deployment.
§ Key features
- 01A REST API on Bun and Elysia, documented with OpenAPI and covering products, cart, checkout, orders, reviews, wishlist, community, events, articles and site settings
- 02An admin dashboard for products, orders, banners, news, events and users, with an activity log of admin actions
- 03A product catalogue and market with category filters, search and sorting
- 04Cart with instant updates that roll back if the server rejects them
- 05Checkout with saved addresses, live shipping rates per courier through RajaOngkir, and payment through iPaymu
- 06Order history with payment status, and product reviews with star ratings that open as soon as an order is paid
- 07A Reddit-style community: posts by category, likes and dislikes, and threaded comment replies
- 08Accounts with email verification and password reset, with protected pages guarded on the server
- 09Maintenance mode that can take down a single page, such as the market, while the rest of the site stays up
- 10Images stored on AWS S3, with the app shipped in Docker behind Cloudflare
§ Challenges & solutions
Owning both ends meant the API could be shaped around what each screen actually needs, instead of the storefront stitching responses together. The shop has no live delivery tracking, so waiting for "delivered" before allowing a review meant most buyers would never be asked. Reviews now open the moment an order is paid, and each order shows which of its items still need one. Shipping cost depends on the courier the buyer picks, so rates come live from RajaOngkir per address instead of from a flat table. Maintenance also had to be finer than all-or-nothing: the maintenance settings live in the API, and the site checks the requested path on the server before rendering, so one section can be closed for work without taking the community and events down with it.