whale

Stock you can trust.
Never oversold.

On-hand, movements, transfers, purchase orders, counts — every unit through one door, so the number on screen is the number on the shelf.

acme / inventorypositions live
location · main

Inventory

receive stock
on hand12,481
low stock8
inbound426
Blue Dream · 3.5gon hand 128 · reserved 6122 avail
Daily Formula · 30cton hand 84 · reserved 282 avail
Night Oil · 30mlon hand 12 · reserved 48 low
Relief Balm · 2ozon hand 42 · reserved 042 avail

Every unit moves by a movement.

Stock changes only through recorded movements — received, sold, transferred, adjusted. No silent edits, so no mystery shrinkage in the books.

Purchasing is a declared workflow.

Purchase orders and suppliers are declared in your rulebook. Receive against a PO and the position updates itself — one step, one record.

Counts settle arguments.

A count is a recorded fact. A discrepancy becomes an adjustment on the record — who counted, when, and by how much — not a guess.

See it at the door.

Receiving stock and advancing a purchase order are typed commands — the position updates itself, and every step is on the record.

$ whale cmd inventory.receive --json '{"sku":"beans-1kg","qty":24,"location":"back-room"}'
  # received 24 · on-hand 61 · movement recorded
$ whale cmd lifecycle.advance --json '{"type":"purchase.order","id":"po_18","to":"received"}'
  # po_18 → received · stock posted · supplier on the record

Stock can't go below zero.

Oversell is refused in the engine, not in an app. No screen, import, or AI can promise a unit that isn’t there — the door refuses the sale and names the reason.

more capabilities: selling & pos · workflows & reports · devices & hardware