Skip to content

Piura, Peru · full stack + data · 2022—

I build the software companies run on.

Full stack developer and data engineer in Piura, Peru. Seven products in production — ERPs, payroll, e-commerce, electronic invoicing — three of them mine and sold by subscription, four built for clients who paid for them. Everything below has a live URL or a public repository.

Daniel Morán Vílchez
500,000+
records migrated without closing for a day
7
products in production with a live URL
50+
daily users on systems I maintain
20+
business modules built and in service
02

Engineering notes

Four problems
FeaturedLiving systems
Language
Python, no dependencies
Service
FastAPI · jobs by date
Integration
bidirectional, both systems live
Result
500,000+ records, 0 days closed
py-foxpro-engine ↗Read the case study →

Writing to FoxPro tables that are still open

FoxPro still runs real operations, and the application sits open on every desk from eight in the morning. Moving that history anywhere normally means closing the business for a weekend.

Instead I wrote a DBF engine in Python with no dependencies that speaks FoxPro’s own locking protocol: it takes the exact byte range of the row it is touching, never the file, and writes each record in a single pass so no concurrent reader ever sees half a row. The legacy application keeps working and never notices. On top of it runs a FastAPI service that does two different things: it migrates by date range as a followable job, and it answers live queries without migrating anything — which is how reception resolves a patient while every cash desk is writing to that same file.

Before

The data never left the building. It lived on the local network, tied to the application that wrote it, and the only way out was an Excel report.

Now

The same data is multiplatform: dashboards that refresh themselves, a patient resolved from a tablet at the desk, devices that talk to each other, and analysis nobody could even propose before.

A restaurant backend without an ORM

Mozaico is the repository with the most commits I have written. The SQL is written by hand and sits next to the query it serves, with PL/pgSQL functions in PostgreSQL for the operations that must not be split. Order state travels to the floor and kitchen screens over gorilla/websocket, so a dish marked ready appears where it is needed without a reload or a poll. The client is React 19 and TypeScript on Vite.

Two AI designs, deliberately opposite

AlmaZen answers on stock, sales, margins and customer debt through 29 read-only tools, and every tool is gated by its own permission: a user who cannot see margins does not get the margin tool, so the question has nowhere to resolve. Master Color runs a public sales chatbot with no tools at all — it sees the catalog and nothing else, because anyone on the internet can talk to it. Same technology, opposite threat models.

Regulated domainssunat-comprobantes ↗

The part that is only hard if you are here

Peruvian electronic invoicing end to end on Greenter: submission to SUNAT, handling the CDR that comes back, voids and summary documents. Alongside it, SIAGIE and MINEDU rules in education, SUSALUD in healthcare, RENIEC lookups and the ubigeo tables. None of it is intellectually glamorous and all of it decides whether the software is usable at all.

03

In production

Seven systems

Own product · subscription

Multi-tenant ERP: inventory, purchasing, sales, POS, SUNAT e-invoicing, AI agentLaravel · Livewire · PostgreSQL · Gemini
Restaurant management with floor and kitchen synced over WebSocketsGo · Gin · sqlx · React 19 · PostgreSQL
Staff, attendance, scheduling and payroll runsTypeScript · NestJS

Client work · commissioned

E-commerce, order management and a Flutter field-support appLaravel · Vue 3 · Flutter · AWS S3
Cash desk, receipts and student registry with role-based access and audit trailVue 3 · Firebase
Catalog with a quote cart and an admin panel, orphaned images cleaned by triggersFirebase · Cloud Functions · Cloudflare Pages
Corporate site with continuous deployment from the repositoryFirebase Hosting · GitHub Actions
04

Track record

Healthcare · 3+ years

2022 —

Backend developer & systems analyst (full stack)

Clínica Santa Rosa · Sullana, Piura

More than half of my week is clinical software. Since November 2022 I have built and maintained the systems a private clinic runs on: the intranet its staff uses every day, medical insurance management, and the data layer that pulls history out of a 1990s system. The code belongs to the clinic and is not published — what follows is the engineering.

2022 — 2024

IT support

Hardware and software support, and the insurance collections and refunds desk. I learned the system from the business side rather than from a requirements document, which is where every improvement I later proposed came from. First applications on my own initiative: a ticketing app and a medical appointments app.

2024 —

The job changes

I proposed the medical insurance system and it was approved. Built decoupled from the legacy system, with a rudimentary migrator — a DBF viewer and Python on Windows — good enough for one-off loads but not for daily operation.

2025 —

The data layer

A Linux server of my own next to the Windows Server the 1990s systems run on, with a shared folder across operating systems on the same LAN and two network uplinks from different providers for redundancy. On top of it, the DBF engine, the service that exposes it, and the endpoints another developer on the team now consumes.

Flagship systems

A motor of my own that reads and writes the 1990s FoxPro tables at byte level with byte-range locking, and a FastAPI service that fires migrations by date range, follows them by id and serves the aggregates. Over 500,000 historical records reached PostgreSQL without closing the operation for a single day. It is not a one-off migration: it is the data layer the area runs on. Another developer on the team consumes its endpoints from the legacy system to build his own dashboards, the integration runs both ways — an admission recorded in the old system shows up in the intranet, and the other way round — and the digital clinical record being built now will be fed from here.Python · FastAPI · PostgreSQL · FoxPro · DBF · Alembicpy-foxpro-engine ↗
A central API that orchestrates admissions, records, human resources and IT support in one place, with real-time events over WebSockets so admission screens stay in sync. It stamps data and signatures onto existing PDF templates instead of rebuilding them. The client is a single-page app with a shift calendar, barcode reading straight from the browser camera, and PDF and Excel export done on the client so the server never carries it.Laravel 12 · Vue 3 · Reverb · JWT · MySQL
The full insurance cycle: admission, clinical record, billing, medical audit and settlement, with role-based access separating auditors, billers and administration so each one sees only their own stage. Live notifications over WebSockets, and bulk Excel import and export, which is what this kind of work actually runs on.Laravel 11 · Vue 3 · RBAC · Reverb · Docker
In development: a conversational assistant to take the repeated calls off the clinic’s phone lines. Python on the server, a Vue client, packaged in Docker. It is the third AI I put inside a product rather than beside it — and the first one whose callers are patients.Python · Vue 3 · Docker
05

Open source

Published in full

The products stay private because they are sold. These are the pieces that carry the engineering and none of the business rules, published in full.

Reads and writes FoxPro (.dbf) tables natively, speaking FoxPro’s own byte-range locking protocol: it appends and edits while the 1990s application is open on every desk. No dependencies, no ODBC, no Windows binaries. Its README states its limits up front.

Packagist · MITsunat-comprobantes ↗

Peruvian electronic invoicing (SUNAT) utilities, published on Packagist as djasoft/sunat-comprobantes.

Python · MITnomenclador ↗

Bulk-renames PDF invoices — reading native text, falling back to OCR when the PDF is a scan, and applying each insurer’s required naming scheme.

06

How I work

Six steps

Not Scrum or Kanban — everyone writes that. This is what the work actually looks like when the systems you touch cannot be switched off.

01

Open what is already there

Before proposing any architecture I open the system that holds the business up today: its files, its binaries, the spreadsheets people actually work from. More than once the thing that decided the project was not in the documentation but inside a .dbf nobody had looked at. Listing files is not auditing them — they have to be opened.

02

Write the constraints before the features

Anyone can hand over a feature list. What decides the design are the constraints: the operation cannot stop, the data is a sensitive category, the kitchen screen is a modest tablet on shared Wi-Fi. Written down first, the architecture almost follows on its own — and the constraints nobody mentioned show up in the first week instead of the last.

03

One change at a time, verified afterwards

On systems people use every day, a large batch does not get debugged — it gets rolled back whole. So: the concrete plan before executing, and the result checked after. It is slower to describe and considerably faster when something goes wrong.

04

Back up before touching the irreversible

Before anything that cannot be undone, a backup — and the backup verified against the original, because an unverified backup is a belief, not a backup. Containment comes before tidying up, too: if something is exposed, it gets closed first and documented second. Covering a problem is not fixing it.

05

Do not break what someone else depends on

Part of what I write is consumed by a colleague’s system. An endpoint already in production is a contract: you extend it, you do not reshape it — and when it has to change, you say so before and you check after. It costs an extra conversation on day one and it saves the phone call on day two.

06

Take the reusable half out

When a piece carries technical value and no business rules, I pull it out, strip it and publish it. The client keeps their product; I keep code already proven in production. The packages above came out that way — and extracting one of them surfaced two correctness bugs that had been hiding for years.

And the decisions get written down, the ones that turned out wrong included: this site keeps its own record ↗

07

Stack

What I ship with
Backend
Go · Gin · sqlx · PHP · Laravel · TypeScript · NestJS · Python · FastAPI
Frontend
React 19 · Vue 3 · Livewire · Astro · Tailwind
Data
PostgreSQL · PL/pgSQL · Firestore · FoxPro · DBF · ETL
Mobile
Flutter
Infrastructure
Firebase · Cloudflare Pages · AWS S3 · GitHub Actions · WebSockets
08

Contact

Open to work

Open to engineering roles and to consulting on legacy integration, Peruvian tax and regulatory domains, or putting an LLM inside a product without handing it the keys.