Engineering Stories

The decisions behind the builds.

Most portfolios list what was built. These show how I think: real technical decisions on real production systems.

01

Upgrading Legacy Laravel Without Downtime

Background. A production Laravel app, running for years with many third-party packages and live data, needed to move from Laravel 7 to Laravel 12. The goal: minimize risk while ensuring compatibility.

Challenge. A direct 7 to 12 jump risked deprecated APIs, package incompatibility, auth and middleware changes, migration issues, and hidden regressions, all hard to diagnose at once.

Approach. I ran an incremental upgrade, treating each major version as its own migration: 7, 8, 9, 10, 11, 12. At every step: dependency review, Composer updates, refactoring deprecated methods, migration verification, and API, functional and regression testing in a dedicated dev environment. Nothing shipped until it passed.

Testing. Each version was validated across auth flow, permissions, CRUD, background jobs, email, payments, API endpoints, scheduled tasks, and queue workers before starting the next.

Deployment. After full validation, I deployed Laravel 12 in a scheduled maintenance window: full DB backup, rollback plan, Composer optimization, config caching, queue restart, and post-deployment verification.

Lesson. Breaking a large migration into milestones dramatically reduces complexity. Incremental upgrades plus thorough testing beat a single big jump every time.

02

Migrating MySQL to PostgreSQL

Background. A production app needed to move from MySQL to PostgreSQL for scalability and infrastructure alignment. This meant both database conversion and application-level compatibility.

Challenge. SQL syntax, auto-increment behavior, JSON functions, boolean handling, timestamps, and indexes all differ. Existing Laravel queries had to remain functionally identical.

Strategy. I used a conversion tool to accelerate schema migration, then manually reviewed every object: schema conversion, data migration, constraint verification, index recreation, and foreign-key validation.

Application refactoring. Raw SQL and Query Builder adjustments, PostgreSQL-specific syntax, and migration and seeder verification.

Production migration (minimal-downtime cutover). Rather than a long shutdown: full backup of the production MySQL database, build and validate the PostgreSQL environment, restore and verify migrated data in staging, synchronize final incremental changes just before cutover, schedule a short maintenance window for the switch only, point application config to PostgreSQL, smoke-test critical business functions, and monitor logs, query performance and health post-deploy. The app is unavailable only during the brief cutover, not the whole migration.

Lesson. Migration is not just moving data; application compatibility is often the bigger challenge. Planning, validation, and rollback readiness matter as much as the migration itself.

03

Building ERP Systems From Scratch

Background. I have built multiple ERPs from the ground up, for property management and creative studios. ERP work is less about features and more about translating complex business processes into scalable software.

Discovery. Every ERP starts with understanding the business, not writing code: stakeholder interviews, business process mapping, requirement gathering, identifying pain points, and scoping.

System design. Software architecture, database schema, ERD, PRD, module decomposition, roles and permissions, and API architecture, reducing technical debt before implementation.

Development. Incremental: database, backend APIs, auth, admin dashboard, business modules, reporting, frontend integration. Each module validated before the next.

Testing. Functional, UAT, data validation, business-flow verification, and regression testing before production.

Lesson. Successful ERP projects depend more on understanding business processes than on picking the right technology. Tech is the tool; translating workflows into software is the real work.

04

Automating Large Product Catalog Imports

Background. A client needed to migrate thousands of products from a legacy e-commerce site into a new Medusa commerce system. Manual re-entry was impractical and error-prone.

Solution. I designed an automated pipeline with n8n and Medusa.js: scrape product data from the legacy website, parse and normalize the extracted data, clean inconsistent attributes and formatting, map legacy fields to the new product structure, process imports through queue-based jobs, and log failures for retry without interrupting the run.

Queued processing handled large batches reliably without overloading the app or external APIs.

Result. Sharply reduced manual effort, improved data consistency, and a repeatable process reusable for future catalog updates.

05

Infrastructure Cost Optimization

Background. A client ran their app on Amazon EC2 despite a workload that did not need that flexibility, paying for capacity they were not using.

Analysis. I reviewed CPU, memory, storage, network traffic, architecture, and future scaling needs. The workload suited a simpler virtual server.

Solution. Migrated from EC2 to Amazon Lightsail while keeping deployment architecture and behavior consistent: environment replication, data migration, SSL config, DNS updates, deployment, and production validation.

Result. Stable performance maintained, monthly costs reduced, and server management simplified.

06

Security-First Software Engineering

Background. My Cyber Security Engineering background shapes how I design and build. Security is a fundamental design principle from the start, not a final phase.

Secure architecture. Authentication mechanisms, authorization models (RBAC and permission-based), principle of least privilege, API exposure, service boundaries, sensitive-data flow, secrets management, and backup and DR considerations.

Secure development. Input validation and output encoding, SQL-injection prevention via parameterized queries and Eloquent ORM, XSS mitigation, CSRF protection, strong password hashing, secure session management, safe error handling, and file-upload and MIME validation.

Database security. Normalized schema, foreign-key constraints, encryption for sensitive data when required, least-privilege DB accounts, regular backups, and controlled production access.

Infrastructure security. HTTPS and TLS, Nginx reverse-proxy hardening, firewall and network access control, environment variable protection, secure deployment pipelines, dependency and vulnerability monitoring, and log visibility.

Mindset. Security is a quality attribute embedded throughout the lifecycle. A well-engineered application is functional, performant, resilient against common threats, maintainable, and protective of both business operations and user data.

These decisions apply to your stack too.

Get in touch