cd /news/ai-products/from-spreadsheets-to-a-self-hosted-m… · home topics ai-products article
[ARTICLE · art-130614] src=dev.to ↗ pub= topic=ai-products verified=true sentiment=↑ positive

From Spreadsheets to a Self-Hosted Mini-ERP: Building an Inventory System with an AI Layer

A full-stack developer in Venezuela built a self-hosted mini-ERP inventory system for a multi-warehouse company, replacing scattered spreadsheets with a single React Native + Expo client that compiles to Android and web. The system runs on a single self-hosted VPS managed with Coolify and includes an isolated Claude API layer for an admin chatbot, invoice vision reading, and product-rotation analysis that degrades gracefully if unavailable. It is now in daily use as the company's actual inventory system.

by read2 min views1 publishedSep 15, 2026

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.

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.

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
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.
── more in #ai-products 4 stories · sorted by recency
── more on @claude api 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/from-spreadsheets-to…] indexed:0 read:2min 2026-09-15 ·