Skip to content
Back to work
Own product · RetailIn production2025

Tendero

Inventory, sales and barcode scanning for a corner store. All from a phone.

A web app that replaces the shop's paper notebook: stock comes in, a sale goes out, and inventory reconciles at the end of the day without anyone counting shelves.

EscanearCámara activa

Arroz Diana 500 g

7702001120987

$3.200

18 en stock

Movimientos

  • Venta-2
  • Entrada+24
  • Venta-1
  • Ajuste-3
SUM(delta)= 18 ✓

The problem

The shop tracked inventory in a notebook and prices in the owner's head. There was no way to know what was selling, or what had run out, until a shelf was empty. Whatever replaced it had to run on the cheap Android phones the staff already carried — nothing to install, nothing to learn.

Engineering decisions

  1. Scanner in the browser, not a native app

    Barcode decoding via WebAssembly against the phone's camera. Nothing to download from an app store, and it behaves the same on a low-end handset as on a new one.

  2. Inventory can't silently drift

    Every stock movement is a row in an append-only ledger. A product's quantity is a projection of that ledger, and a reconcile job verifies that SUM(delta) still equals the stored quantity across the whole catalog.

  3. Notebook importer

    The catalog that already existed on paper loads into the database in one pass, instead of asking the owner to type in a thousand products before the system is any use.

  4. No API tier

    Server Components read Postgres directly and Server Actions write. One less service to deploy, monitor and keep in sync — which matters when the maintenance team is one person.

Stack

Next.js 16React 19TypeScriptPostgreSQLPrismaTailwind CSSWebAssemblyS3DockerRailwayVitest

Next project

PideBot

A WhatsApp bot that takes the order and collects payment for the restaurant, 24/7.