Skip to content
Ramdan Firdaus
←All work

02Side project

Bee Media Book Inventory

Warehouse stock control with a storefront style public catalog.

For
Freelance, for a book publisher
Role
Full stack, built with one collaborator
Period
2026
Bee MediaKatalogKoleksiPENERBIT BEE MEDIATemukan buku favoritmudi katalog kamiCari judul, penulis, ISBN, atau kode...CariKoleksi cerita anak →Rp 85.000Stok 24Rp 62.500Stok 8Rp 120.000HabisRp 48.000Stok 51Rp 99.000Stok 3

Illustration redrawn for this portfolio. Not a screenshot, no client data.

1
entry point for every stock change
57
automated tests, run in CI
6
report types with CSV export
2
roles: owner and warehouse admin

Context

An inventory system for a publisher's book warehouse: every stock movement audited, bulk imports from spreadsheets, and a public catalog customers can browse to check availability.

The publisher's book data lived in spreadsheets. They needed stock control a warehouse admin could run from a phone, reports the owner could trust, and a public catalog where customers can check availability themselves.

It is a deliberately boring stack: server rendered Laravel and Blade with Tailwind, no SPA. The interesting parts are the rules: one guarded path for every stock change, and imports that survive messy real world spreadsheets.

Stack

  • Laravel 13
  • PHP 8.3
  • Blade
  • Tailwind CSS 4
  • Vite
  • MySQL
  • ZXing
  • PhpSpreadsheet
  • Docker
  • GitHub Actions

Interactive

Try to oversell

A simplified model of the stock service. The direction comes from the movement type, every change leaves an audit row, and stock can never drop below zero.

Current stock

12

copies of "Cerita Anak Nusantara"

Audit trail

No movements yet. Record one, then try to sell more than you have.

Movement type

Quantity

What I built

  1. 01

    One way to move stock

    Every movement goes through a single service that runs in a transaction, locks the book row, derives the direction from the movement type and refuses anything that would push stock below zero. Each change leaves an audit row with the previous and new stock.

  2. 02

    Public catalog

    Storefront style pages with search, filters, curated collections, an admin managed highlight carousel, galleries and synopses, each showing live stock availability.

  3. 03

    Imports that survive real spreadsheets

    CSV and Excel imports map Indonesian headers to columns, detect the header row, skip section rows and upsert by ISBN with a hashed fallback key. Each run writes a log with per row errors.

  4. 04

    Cover images from Drive links

    A queued job downloads covers from public Google Drive links, then compresses them for display while keeping the originals intact.

  5. 05

    ISBN scanning in the browser

    The stock movement form opens the phone camera and reads the ISBN barcode with ZXing, so the admin never types a 13 digit number.

  6. 06

    Reports and exports

    Current stock, low stock, movements, inventory value and more, previewed in the browser and streamed as CSV so large exports do not exhaust memory.

  7. 07

    Tests, CI and deploy

    57 feature and unit tests run on every push with GitHub Actions. The app ships as Docker containers behind Nginx on a small VPS, with a written deployment guide.

Next case study

Kick Avenue Marketplace Revamp→

Rebuilding a live marketplace, from the buy button to the back office.

KASearch sneakers, apparel, collectiblesSellWalletBRAND NEWSNEAKERS / RUNNINGRunner 1 Retro"Signal Orange"✓ Legit checkedSELECT SIZEUS 7US 7.5US 8US 8.5US 9US 9.5US 10US 10.5LOWEST ASKIDR 3.450.000Buy nowMake offer