Inventory at the company I work for used to live in spreadsheets scattered
across warehouses. Nobody could see another site's stock, shortages got
caught too late, and goods sent out to events came back unreconciled. So I
built a replacement — end to end, from the database to the server it runs on.
The constraint that shaped everything
This wasn't a greenfield side project with unlimited time. It had to ship,
work for non-technical warehouse staff, and run on infrastructure I could
maintain alone. That constraint killed a lot of "clean" ideas in favor of
boring, reliable ones.
One client, two targets
Instead of a separate mobile app and web app, I built a single React Native +
Expo client that compiles to both an Android APK and a static web export,
with no duplicated code:
bash
# same codebase, two artifacts
eas build --platform android
expo export --platform web
Distribution skips app stores entirely — direct APK install, plus JS-only
OTA updates through EAS Update, so warehouse staff get fixes without
reinstalling anything.
Multi-branch by design, not by accident
Each warehouse ("casa") manages its own inventory independently, with
equivalences between boxes and loose units handled at the domain layer, not
bolted on with if statements scattered across the codebase. A dedicated
events module handles temporary dispatch — checklist out, automatic
reconciliation on return.
An AI layer that can fail without taking the app down
I added a layer on the Claude API for three things: an admin chatbot, invoice
reading through vision, and product-rotation analysis. The important design
decision wasn't the AI part — it was isolating it so that a missing API key,
a timeout, or a rate limit degrades that one feature gracefully instead of
crashing the request pipeline. If the AI layer is unavailable, the core
inventory system doesn't even notice.
The migration nobody asks about until it's too late
The system started on Vercel + Render + Supabase — fast to prototype, but
three separate billing relationships and three separate points of failure
for one internal tool. I migrated everything to a single self-hosted VPS
managed with Coolify: containerized Postgres, own domain, Let's Encrypt SSL,
zero downtime during the cutover.
That's the unglamorous part of "full stack" that portfolios rarely show —
not just writing the API, but being the one who gets paged if the server
falls over.
Where it landed
- In daily use as the company's actual inventory system, not a demo.
- Three services (web, API, database) collapsed into one Docker deployment.
- Users get improvements over the air, without reinstalling.
Full case study, architecture diagram and stack breakdown:
https://www.gmarinelly.com/proyectos/inventario
I'm a Full Stack developer and Computer Engineering student in Venezuela,
open to remote roles. More projects (including a truck-weighing system with
real hardware integration) at https://www.gmarinelly.com.
Top comments (0)