Software engineer working where business systems meet the factory floor.
Backend, integrations and reporting in Java, Python and Lua, across feed production, poultry, bulk weighing, recycling and warehouse logistics — including the serial and I/O layers most stacks never reach.
Based in Hermosillo, Mexico
Relocating to the Netherlands
In production13installations running on customer sites
Built and shipped6software products, across 5 industries
Dosing accuracy±50gper ingredient, recipe-driven
Bagging throughput500–700bags per hour, sustained
How it works
The operating cycle, one step at a time.
Feed production · 2 sites · On-premise
Recipe-driven batching
An ingredient maps to one or more motors, not one-to-one: one site runs three ingredients across five motors, another three across three. Same software, no branch.
Batching portalIllustrative sample — no customer data
Batch Run Report
Multi-ingredient batching · Torete · 833.00 kg batches
http://plant-local/batching
Batches14
Net weight11,662.5kg
Mean deviation+0.04kg
Out of tolerance0
Detail by batch
Batches recorded during one shift
Ticket
Time
Target
Actual
Deviation
Status
B-260909-014
10:21
833.00
833.50
+0.50 kg
In spec
B-260909-013
10:04
833.00
833.00
0.00 kg
In spec
B-260909-012
09:47
833.00
833.00
0.00 kg
In spec
B-260909-011
09:30
833.00
832.50
−0.50 kg
In spec
B-260909-010
09:13
833.00
833.00
0.00 kg
In spec
01/ 06
Recipe selected
The operator picks the recipe on the indicator. That one choice sets a target weight for each ingredient and decides which motors feed each of them.
Calcium
First ingredient. One motor, one auger, until the hopper reads its target. A recipe with no calcium skips this step outright — the motor never starts and the cycle moves on.
Soy
Second ingredient, on top of the first. The hopper is never emptied between ingredients, so each dose is measured as a difference — which is why an error on one ingredient does not cancel another.
Maize — three motors
One ingredient, three stores, three motors running together. This is the whole reason the recipe is modelled against ingredients and not against motors: the same build runs this five-motor site and the three-motor one, with configuration deciding which motors serve which ingredient.
Batch complete
The hopper discharges and the batch becomes a record: target against actual for every ingredient, scored against the scale’s own division of 0.5 kg. A tolerance finer than the division would mean nothing.
The run, as a record
The shift as the supervisor sees it: every batch against its target, in the scale’s own half-kilo steps. The last row is the batch the drawings built, and the ingredient table under it names the motors that served each one — the recipe itself never does.
Feed production · 2 sites · On-premise
Bagging line control
Product and bag size select the recipe and the line stops itself on completion. Reports total ingredient consumption, bags produced and kilos bagged per run.
Local reporting portalIllustrative sample — no customer data
Bagging Run Report
Bagging line · Layer feed · 25 kg bags
http://plant-local/reports
Bags produced618
Net weight15,450.4kg
Mean deviation−7g
Out of tolerance0
Detail by bag
Sample of bags recorded during one run
Ticket
Time
Target
Actual
Deviation
Status
B-260831-001
08:14:47
25.000
24.994
−6 g
In spec
B-260831-002
08:15:34
25.000
24.994
−6 g
In spec
B-260831-003
08:16:21
25.000
25.011
+11 g
In spec
B-260831-004
08:17:08
25.000
24.997
−3 g
In spec
B-260831-005
08:17:55
25.000
25.008
+8 g
In spec
01/ 06
Product and target
The operator picks the product and the bag size on the indicator. That choice is the recipe: it sets the target weight, the tolerance band and the preact value.
Bag placed, auto-tare
The empty bag goes on the spout and the pedal starts the cycle. The clamps hold it and the system tares itself, so the bag’s own weight never reaches the record.
Coarse fill
The main gate opens at full flow while the scale reads continuously. This stage puts in about ninety per cent of the target and is the part that decides throughput.
Fine fill and preact cut-off
Flow drops to a trickle and the gate shuts before the target. The material already in flight finishes the weight — that in-flight compensation is what holds ±50 g, not the gate speed.
Released and logged
The clamps release the bag onto the conveyor. Ticket, actual weight and deviation go to the web platform, so every bag stays traceable by run, product and date.
The run, as a record
Where the cycle ends: not on the floor, but in the report the supervisor opens afterwards. Every bag, its target, its actual weight and its deviation — consumption and throughput fall out of that, they are not counted by hand.
Bulk weighing and transport · 6 sites · Local and web
Weighbridge platform
The most-deployed product of the six — the same core running on six sites, which is where the per-model configuration profiles came from.
Every weighing on this account, in and out.
· customer since 2023
ExcelPDF
Receipts312all time
Dispatches148all time
Most common productAggregateof 4 products
Most used truckT-114tare 15,340 kg
Type
Folio
Order
Product
Truck
Driver
Origin
Destination
Gross
Tare
Net
State
Date / time
IN
E-4821
OC-2291
Aggregate
T-114
D-18
Pit 2
Plant
42,680
—
—
Pending
10/09 16:18
OUT
S-1188
OC-2290
Gravel
T-114
D-18
Plant
Depot 7
38,120
15,340
22,780
Completed
10/09 12:40
IN
E-4819
OC-2284
Sand
T-114
D-18
Pit 2
Plant
39,940
15,340
24,600
Completed
10/09 13:47
OUT
S-1187
OC-2286
Sand
T-114
D-18
Plant
Depot 7
40,560
15,340
25,220
Completed
09/09 16:05
Reception dashboardIllustrative sample — no customer data
Weighbridge platform
Receipts · dispatches · stock
GATE 1 · ONLINE SYNCED 17:30
Reception dashboard
04 – 10 Sep 2026 ·
now 17:30
This weekTodayThis month
3 pending receipts— trucks on site with no second weighing yet
Folio
Order
Customer
Truck
Driver
Product
Gross
In
Waiting
E-4821
OC-2291
Customer 12
T-114
D-18
Aggregate
42,680
16:18
1 h 12 m
E-4822
OC-2293
Customer 09
T-071
D-22
Gravel
44,910
17:04
26 m
E-4823
OC-2295
Customer 17
T-142
D-31
Sand
38,470
17:22
8 m
Entries106this week
Completed103this week
Pending3this week
Net received2,663,900kg
Customers9this week
Dispatch dashboardIllustrative sample — no customer data
Weighbridge platform
Receipts · dispatches · stock
GATE 1 · ONLINE SYNCED 17:30
Dispatch dashboard
04 – 10 Sep 2026 ·
now 17:30
This weekTodayThis month
2 pending dispatches— tare taken, still loading, no second weighing yet
Folio
Order
Customer
Truck
Driver
Product
Destination
Tare
In
Waiting
S-3318
OC-2292
Customer 04
T-208
D-04
Gravel
Depot 7
15,480
16:41
49 m
S-3319
OC-2296
Customer 21
T-330
D-09
Sand
Depot 3
15,720
17:11
19 m
Dispatches86this week
Completed83this week
Pending2this week
Cancelled1this week
Net dispatched1,961,100kg
Completion rate97%completed / total
ReportsIllustrative sample — no customer data
Weighbridge platform
Receipts · dispatches · stock
GATE 1 · ONLINE SYNCED 17:30
Reports and statistics
Last 30 days, to 10 Sep 2026
ExcelPDF
Received11,344,400kg
Dispatched8,311,500kg
Net difference3,032,900received minus dispatched
Customers9of 12 active
Received against dispatched, 30 days
ReceivedDispatched
01/ 07
Inventory receipt
A truck scale does not weigh a load — it weighs a truck, twice. Loaded on arrival: 42,680. The record opens on that reading and stays open, because the load is a difference and the other half of it has not happened yet.
Inventory dispatch
The same yard, the same chain, the same screen — the truck simply arrives empty and the two weighings land in the opposite order. The code does not branch on it: the heavier of the two is the gross, whichever came first, which is why one model serves both.
The history
Every weighing lands here, finished or not. The card that matters is Pending — the count of trucks still in the yard with a record half written. The first row is the receipt the drawings just opened.
The customer
The same folios as the history, with the same figures — a customer page that disagreed with the catalogue behind it would be the first thing anyone noticed. What it adds is direction: receipts and dispatches in one list, because to a customer they are two halves of the same account.
Reception dashboard
Four steps have said the record waits. Here the wait has a clock on it: how long each truck has been on site, red past the hour. And the pending count is not a figure anyone maintains — entries and completed run together every day but today, and the gap is the trucks still in the yard.
Dispatch dashboard
The mirror of 05, with one column swapped: an outgoing truck arrives empty, so the reading it already has is the tare and the one it waits for is the gross. What only this side carries is stock — a receipt is limited by the yard, a dispatch by what is left to load.
The report
The only screen of the seven a manager opens. It is the same month the gate lived one truck at a time, and every figure on it is derived from the daily series the dashboards draw — so the report and the screen it reports on cannot drift apart.
Poultry · 1 site · Local and web
Poultry farm management
Crate weighing, label printing and barcode stock movements, with production curves per warehouse.
A crate of 360 eggs on a counter scale, read over serial. Pressing F8 is not printing: in one transaction the station takes the stable weight, resolves the collector into a house, a location and its flock, pulls the day’s lot, writes the record with a barcode that exists nowhere else, and posts the stock movement — then asks the printer. If the printer jams the crate is still counted.
Crate weighing
The operator chooses a collector — and the house and location come with him, greyed out. One key does the rest. The count on sync crates is what the station still owes the server, and it is allowed to sit above zero all day.
The house's day
Kilos, crates, eggs, grams per hen and feed conversion — then the same day split per collector across clean, dirty and cracked, and then every crate that made it. Nothing on this screen was typed.
Egg stock
Where a crate stops being a weighing and becomes stock: in when weighed, transferred to the central store, out when sold. Voiding writes the opposite movement instead of deleting the first, which is why the week still adds up.
The flock
A flock is a purchase of hens assigned to a house, and it is what a crate is finally attributed to. Weeks in cycle, hens at start, hens now — that last figure is hens at start minus every death recorded, and it is the denominator of everything that follows.
Egg production
Each house is a flock at its own age, so each line runs only to where that flock is today — against the breed’s standard curve and an 85% target. A house is judged against what its hens should be doing at that age, which is the only comparison that means anything.
Recycling · 1 site · Local and web
Recycling plant system
Buys and sells recyclable material across four scales on one PC — three floor scales at the counter and a truck scale in the yard — so one purchase can be several materials, each weighed where it fits.
Counter · purchaseIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Counter PURCHASE
B1 · Floor scale 1COM3
612.40 kg
ReadUse →
B2 · Floor scale 2COM4
87.15 kg
ReadUse →
B3 · Floor scale 3COM5
148.20 kg
ReadUse →
Purchase order C-1187
Supplier 07 · tariff Retail
Scale
Material
Gross
Tare
Net
$/kg
Subtotal
B1
Cardboard
612.40
—
612.40
2.80
$1,714.72
B2
PET
87.15
2 × 0.40
86.35
6.50
$561.28
B3
Aluminium
148.20
—
148.20
24.00 ✎
$3,556.80
TOTAL TO PAY$5,832.80
Truck scale · purchaseIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Truck scale PURCHASE
Two weighings frame the purchase; each material is worked out as it comes off the truck.
TrucksComplete (exit)
The truck, reading by reading
Scrap ironCardboardPETTruck
OperationsIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Collection centre · operations
Purchases and sales in one list, each with the materials it carried.
ExcelPDF
Operations10today
Purchases$22,292.466 · 5,358.60 kg
Sales$16,360.002 · 2,230.00 kg
To pay$6,575.102 orders
Folio
Date / time
Type
Materials
Supplier / customer
Net kg
Total
State
Payment
C-1187
10/09 13:18
Purchase
CardboardPETAluminium
Supplier 07
846.95
$5,832.80
Complete
Pending
C-1188
10/09 12:48
Purchase
Scrap ironCardboardPET
Supplier 15
9,810.00
$35,107.00
On site
Pending
C-1185
10/09 12:37
Purchase
PET
Supplier 11
114.20
$742.30
Complete
Pending
C-1183
10/09 12:02
Purchase
CardboardAluminium
Supplier 08
527.00
$1,947.56
Complete
Paid
TillIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Till OPEN
Shift opened 07:58 · Cashier 01
Manual movementClose the till
Opening float$5,000.00opened 07:58
Cash in+$16,360.00sales paid in cash
Cash out−$6,305.36purchases and withdrawals
Cash in the till$15,054.64what the drawer should hold
Transfers$10,912.00this shift · not in the drawer
2 purchases to pay— $6,575.10
Folio
Materials
Supplier
Total
Pay
C-1187
CardboardPETAluminium
Supplier 07
$5,832.80
CashTransfer
C-1185
PET
Supplier 11
$742.30
CashTransfer
Recycling dashboardIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Recycling dashboard
Today, 10 Sep 2026 · now 13:40
Purchases today$22,292.466 · 5,358.60 kg
Sales today$16,360.002 · 2,230.00 kg
Baled today2,460.00 kg3 records
Cash in the till$15,054.64transfers today $10,912.00
Purchases against sales, last 7 days
PurchasesSales
SettlementsIllustrative sample — no customer data
Recycling plant system
Purchases · sales · cash
COUNTER 1 · ONLINE SYNCED 13:40
Settling remote sales
Our scale at the origin, the customer's at the destination, and the weight the sale is finally paid on.
Settle V-0342 · Customer 21
merma = origin − destination
Material
Origin
Destination
Agreed
$/kg agreed
Merma
%
Subtotal
Cardboard
18,420
18,160
18,200
3.40
260
1.41%
$61,880.00
Mixed paper
4,860
4,880
4,860
2.10
−20
-0.41%
$10,206.00
SETTLED TOTAL · estimated $72,834.00, −$748.00$72,086.00
01/ 07
The counter
Four scales, one PC: three low-profile floor scales at the counter and a truck scale in the yard, each on its own serial port. A supplier brings several materials at once, so a purchase is a basket — each line weighed on whichever scale it fits, all of them on one ticket.
Buying at the counter
Every floor scale is a column on the screen, because a supplier brings several materials at once. This is the order the drawing added up — the same three weights, the PET’s tare taken by the sack, and one price raised above the catalogue that would not save without a name against it.
Weighing down
The weighbridge weighs a truck twice and gets one number. This truck is weighed twice and gets a basket: it drops one material, is weighed again, and each drop is that material’s weight. The empty truck’s reading is the tare, so gross minus tare has to equal the lines.
Every operation
Purchases and sales in one list, because to a recycler they are two ends of the same kilo. The counter order is the top row, still to be paid; the truck is on site; a load sold to a mill is on the road. Only operations with a second weighing count towards the day.
The till
A recycler pays across the counter, so purchases leave as cash. What the drawer should hold is arithmetic — float, plus cash in, minus cash out — and closing the shift is a person counting it. The software adds; the person counts; the difference gets a name.
The dashboard
The owner’s screen. Two banners before any chart — what the yard owes suppliers and what customers owe the yard — and both are sums of rows other screens already hold. The cash tile is the till’s own figure, not a copy of it.
Settling at a distance
A load sold to a mill is weighed here and again at the mill, and the two never agree. It is settled per material on a weight both sides accept, and the gap is written down: merma, origin minus destination. The red row is their scale reading heavier than ours.
Consumer services · 1 site · Web
Appointment scheduling
Booking and scheduling for a personal-care business — the one delivery with no scale attached to it, and the one that had to survive contact with non-technical users all day.
Next appointmentThu 08/10 · 16:00Colour · Stylist 2
Last visittoday0 days ago
Spent$4,650since her first visit
Salon · loyalty passPK-••••3F2A
VISITS8 / 10
✓✓✓✓✓✓✓✓
2 more visits to her reward
PayrollIllustrative sample — no customer data
Appointment scheduling
Agenda · till · payroll
RECEPTION · ONLINE SYNCED 17:30
Payroll · pay day Sat 12/09
Sat 05/09 – Fri 11/09 · running to today
Total $9,373.50Work out payroll
1Stylist 1
Base$1,500
Commissions Sat–Sun$316.00
Commissions Mon–Fri$1,354.00
of which today$512.00
To pay$3,170.00
2Stylist 2
Base$1,500
Commissions Sat–Sun$470.00
Commissions Mon–Fri$1,310.00
of which today$840.00
To pay$3,280.00
3Stylist 3
Base$1,200
Commissions Sat–Sun$287.00
Commissions Mon–Fri$1,436.50
of which today$523.00
To pay$2,923.50
FinanceIllustrative sample — no customer data
Appointment scheduling
Agenda · till · payroll
RECEPTION · ONLINE SYNCED 17:30
Finance · September 2026
From the daily closes, the 1st to today
ExcelPDF
Income this month$72,72010 closes
Commissions$28,059frozen at each charge
Net after commissions$44,661before rent and stock
Payroll due$9,374Sat 12/09
Daily closes
today
01/ 07
The system
The one product of the six with no scale in it. Reception books into a web app; the moment an appointment exists, a scheduler queues its two reminders — a day before and an hour before — and they arrive on a wallet pass on the client’s phone. She installs nothing, and the same pass carries her stamps.
The agenda
One column per stylist, each appointment a block as long as its services take. A dashed block has no deposit yet; a solid one is confirmed. The ringed one is the appointment the drawing follows, and the cancelled one stays on the grid — the hour it freed is information too.
Booking, and the hour that says no
Capacity belongs to the category, not to the stylist. The salon has two nail stations, so a third nail appointment overlapping two others is refused even with a stylist free. Saving the booking also queues its two reminders.
The till of the day
Appointments and walk-ins in one list. Charging is where three things happen at once: the deposit comes off the total, the stylist’s commission is frozen, and a stamp lands on the pass. Cash, transfer, card and gift card plus the deposits make the day’s close.
The client's record
One stamp per charged visit, so the stamps and the visit count are the same number by construction. Today’s visit is the top of her history and the eighth stamp on the pass the reminders arrive on.
Payroll
Paid on Saturday for the seven days before it: a base plus the week’s commissions. Every commission is copied onto its line when the service is charged, rate included, so changing a rate never rewrites what was already earned. A receptionist never sees this screen.
Finance
The month seen from its closes. Today’s bar is the till of the day, not a copy of it; the payroll tile is Saturday’s payroll; the commissions are the ones frozen at each charge. Every figure on it is a sum of rows another screen already holds.
13installations in production, built and commissioned end to end — proposal, development, commissioning, training and support.
What I work with
Plain lists. No proficiency bars.
Delivery
Docker
Commissioning on site
Operator training
Device layer
Weight indicators
RS232 serial
Relay / digital I/O
Industrial scales
Languages
Java
Python
Lua
Web and data
Django
Hibernate
PostgreSQL
I write software for places where being wrong has a physical cost — a batch out of spec, a truck weighed twice, a line that stops.