The problem
A customs brokerage firm was running its entire operation on a legacy system built in Visual FoxPro 7. One daily task consumed hours across the whole office: notifying each client every time their shipment was cleared by customs.
The process was completely manual. An operator would look up the customs record, copy the relevant details, write an email, and send it. Multiple operators doing this dozens of times a day meant slow turnaround, high risk of typing errors on critical data, and no traceability of who sent what.
Replacing the whole legacy system wasn't an option — the historical database and daily workflows were mature and working. The solution had to modernize without breaking anything.
The solution
I designed and built a standalone web application that connects directly to the legacy database in read-only mode and automates the notification workflow. The new app runs alongside the old system without requiring a single change to it.
How it works:
- The operator enters the customs record number.
- The system pulls all relevant data from the legacy database (client, invoice, shipment details, containers, etc.) and shows it on an editable dashboard.
- With one click, the operator sends a professional email to the client's recipients.
- Recipients are saved per client for next time.
- Every send is logged for auditability.
- Every day at 10pm, a background job automatically sends each broker a consolidated summary of the day's notifications.
Multi-tenant from day one
The system was designed to host multiple brokers on the same instance, with strict data isolation:
- Broker (owner): manages their team, sees full history, configures who gets the daily summary.
- Team operators: send notifications on behalf of the broker, with limited access.
- Each broker only sees their own data, ever.
This means the same infrastructure can serve additional brokers in the future without any code changes.
Production-grade deployment
This isn't a demo. The system runs on a proper VPS with the full stack of what production means:
- Ubuntu server with Nginx as reverse proxy.
- HTTPS with Let's Encrypt and automatic renewal.
- Isolated DEV and PROD environments.
- systemd for service management and automatic restarts.
- Structured logging for troubleshooting.
The same server already hosts a second microservice for the same client, part of an ongoing effort to modernize the legacy system piece by piece — without ever taking it offline.
Impact
- Time per notification: from minutes to seconds.
- Typing errors on critical data: eliminated.
- Traceability: every notification logged and auditable.
- Privacy: operators can send notifications without accessing the broker's personal email.
- Adoption: brokers and operators started using the tool without formal training — the UX was designed for non-technical users from the ground up.
What makes this project different
Integration with legacy without invading it. Not a single line of legacy code was touched. The old system kept operating exactly as before, unaware of the new one.
Real production deployment. Real VPS, real domain, real HTTPS, real environments, real monitoring. This runs 24/7 and clients depend on it every day.
Extensible foundation. The infrastructure was designed to grow. Every next modernization step can plug into the same base without starting over.