Portfolio · Abu Saleh, Senior Full-Stack Software Engineer

Real business problems, and how I solved them.

12 projects from 16+ years of building payments, point of sale, bookings, marketplaces and SaaS platforms. Each one starts with what the business needed and ends with what changed.

Work

The challenge, how I solved it, and the result

Client names are left out on purpose, apart from my current work at Gourmeal. Filter by the kind of problem you care about.

Showing 12 of 12 projects

Current · Flagship
When
May 2026 – present
Where
United States
Role
Lead engineer, team of 4–5
Problems
  • Payments & money
  • Retail & point of sale
  • Security & reliability

Gourmeal: food ordering from your seat at events and food trucks

The challenge

Fans order from their seats and vendors print tickets in the truck. Prices were partly decided by the phone app, where they could be tampered with, and the order services had never had a security review.

How I solved it

Moved all pricing and payment onto the server. Wrote the first security review of the order services and fixed what it found.

The result

8 security findings identified. The critical, high and medium ones were fixed within three days. The platform is in its pilot stage.

Inside the problem

  • The app decided pricesSolved by: Every order priced from the vendor's menu, with a full breakdown before paying
  • Rates differ by event and vendorSolved by: Commission, tax and service charge settable per event, vendor or platform, with the most specific rate winning
  • Print jobs must not be lost or printed twiceSolved by: A print queue that printers poll, with stale locks recovered
  • Password guessing on the vendor consoleSolved by: Sign-in locked for 5 minutes after 5 failed attempts
LaravelGoStripeAWS
Flagship
When
Mar 2015 – Apr 2020
Where
Australia
Role
Senior backend developer, one of the two largest contributors
Problems
  • Bookings & travel
  • Payments & money
  • Modernizing legacy systems

Car-rental comparison and booking across 10+ suppliers

The challenge

Travellers compare and book cars across many rental companies, each with its own system and rules. Airline and airport partners wanted their own branded sites on the same engine.

How I solved it

Put every supplier behind one booking flow for search, book, change and cancel, so the site and its partner sites never deal with supplier differences. Helped replace the old booking engine while existing bookings kept working.

The result

4M+ rentals across 5 countries, with sub-second responses (reported).

Inside the problem

  • Every rental company has its own rules for extras, mileage, driver age and error codesSolved by: Vehicle data normalized into one shape, and supplier errors turned into clear messages
  • A booking touches the supplier, the payment and the confirmation, and prices can change between search and bookingSolved by: Bookings created in stages, with the customer protected from price rises
  • The old engine couldn't be switched off in one goSolved by: Historical bookings imported, and a few features routed to the old engine until their replacements were ready
  • Staff needed to hear about problems quicklySolved by: Alerts for price changes, incomplete bookings and automatic cancellations
LaravelAngularJSStripe
Flagship
When
Aug 2021 – Apr 2023
Where
United States
Role
Lead engineer, team of 2–3
Problems
  • Retail & point of sale
  • Security & reliability

Point of sale, delivery and inventory for licensed retailers

The challenge

Regulated retailers had to run in-store sales, delivery and online orders while reporting every regulated sale to the state's track-and-trace system.

How I solved it

One order engine for the till, delivery, pickup and the online store, with state compliance reporting built into the moment a sale completes. Built the public product website and self-service onboarding from the first commit.

The result

A wholesale product was spun off from the platform, and it kept pace as the company expanded into more US states. Top backend contributor, also involved in hiring.

Inside the problem

  • Every regulated sale must be reported exactly once, only for tracked itemsSolved by: Each completed sale reported automatically, with untracked items skipped
  • Sales aren't allowed outside business and restricted hoursSolved by: Sales blocked outside those hours, with an exception for untracked goods
  • Orders come from four channels with different discounts, taxes and feesSolved by: One order engine that applies the right rules per channel
  • New retailers needed to get started without calling salesSolved by: Demo booking, sign-up and onboarding that follows each state's rules
Flagship
When
Oct 2023 – Sep 2025
Where
United States
Role
Proposed and designed the architecture; #1 contributor to the API
Problems
  • Bookings & travel
  • Modernizing legacy systems
  • Security & reliability

One catalogue for seven tour operators

The challenge

Seven tour operators publish tours, departures and prices in their own formats and on their own schedules. Customers need one consistent page, and the old admin site put the public site at risk with every change.

How I solved it

One tour format fed by a separate reader for each operator, refreshed automatically every day. Admin work moved to a new API, and a new public website was started on top of it.

The result

Tour and search pages became several times faster (reported), and adding an operator now means adding one reader.

Inside the problem

  • Daily updates could leave the site half-updatedSolved by: Data backed up, loaded into temporary tables, then swapped in at once
  • Rebuilding search would show customers empty resultsSolved by: The new index built in a copy and renamed into place
  • Failed background jobs went unnoticed until content went staleSolved by: Alerts on every failure, and when nothing has completed for four hours
  • Bots and password guessing hit the siteSolved by: IPs blocked after 3 failed logins in 5 minutes, with search-engine crawlers still allowed
LaravelNext.jsRedis

More projects

Open “Inside the problem” on any project for the details

Jan 2026 – Apr 2026United StatesSenior full-stack engineer, top contributor in the period

A financial-newsletter publisher's own email platform

Challenge
Editors built research reports by hand in several formats. Management had no single view of performance, and the platform was old standalone scripts with security holes and manual deploys.
Solved by
Built a report generator and a performance dashboard, and moved legacy screens into a structured layer one module at a time.
Result
Each report is produced as a web page, a PDF and an interactive flipbook from one saved setup. Critical security holes were fixed, and staging now deploys on every push.
Inside the problem
  • Reports were made by hand for each campaignSolved by: All three formats generated at once, including on a schedule
  • No single view of email and ad performanceSolved by: A nine-tab dashboard covering earnings per subscriber, per click and per offer
  • Old scripts were risky to changeSolved by: Screens moved into the new structure one module at a time
  • Modernizing legacy systems
  • Security & reliability
  • Workflow & automation

Aug 2023 – Oct 2023United StatesSenior full-stack engineer

A marketplace connecting gyms, trainers and clients

Challenge
Gyms, trainers and clients each needed their own view, bookings needed approval, and the team deployed by hand.
Solved by
Dashboards for each role, booking approval and an automatic order flow, plus sign-up flows for web and mobile.
Result
Tests and deploys now run automatically, with a team message after each deploy and automatically numbered mobile builds.
Inside the problem
  • Each role signs up differently on web and mobileSolved by: Separate flows for trainers, gyms and clients
  • Earnings were hard to seeSolved by: Total and last-30-day earnings on each dashboard
  • Manual deploysSolved by: An automated test-and-deploy pipeline
  • Marketplaces
  • Payments & money
  • Workflow & automation

Sep 2023 – Oct 2023AustraliaLed the restructuring

A marketplace for education consultants

Challenge
A codebase inherited from another team mixed admin and public code, used inconsistent names and had no data layer.
Solved by
Split admin and public modules, added a proper data layer, renamed core concepts to match the business, and migrated the existing data.
Result
A cleaner codebase the business could keep building on, with new home and job-posting pages.
Inside the problem
  • Names didn't match the businessSolved by: “Freelancer” became “Expert” and “Seminar” became “Training” across code and data
  • Data didn't fit the new structureSolved by: Migrations and seeders, with skills merged into one table
  • Marketplaces
  • Modernizing legacy systems

Jun 2020 – Jul 2021SingaporeMain contributor

An e-wallet for consumers and merchants, plus a marketplace

Challenge
Customers send money, pay merchants by QR code and withdraw to banks across several currencies. A transfer must never be applied twice.
Solved by
Built money movement, top-ups, withdrawals and identity checks, and most of the marketplace seller portal, where sellers are paid through the wallet.
Result
Fixed a double-spend race found by a penetration test and closed the wallet's authorization gaps.
Inside the problem
  • Simultaneous requests could change a balance twiceSolved by: Each transfer made all-or-nothing and rejected early if checks fail
  • Fees, commission and rewards must be rightSolved by: All of them calculated before any money moves
  • Reports slowed down paymentsSolved by: Reads moved to separate read-only database connections
  • Payments & money
  • Security & reliability
  • Marketplaces
CakePHPMySQLRedisAWS

Apr 2014 – Apr 2015Saudi ArabiaSenior software engineer (on-site, Dhaka)

Online hotel booking and front desk for the Saudi market

Challenge
Hotels and motels were booked by phone and email. Owners wanted every property listed in one place with fully online booking.
Solved by
Learned a new framework for the project, then built property listings with online booking, the mobile booking API, notifications and the front-desk screens.
Result
Guests book online in Arabic or English, and front-desk staff check in, move rooms and take payments in one system.
Inside the problem
  • Guests needed updates without callingSolved by: SMS and bilingual email for cancellations and date changes
  • Front-desk staff juggle check-ins, room moves and paymentsSolved by: One check-in form, a room-transfer flow with charge adjustment, and reports by role
  • Bookings & travel

Jul 2013 – Feb 2015AustraliaSoftware developer (part-time, remote)

A multi-product online travel store

Challenge
The store was built for desktop while phone and tablet traffic grew, and cruises couldn't be sold alongside flights and hotels.
Solved by
Rebuilt every product module's pages with responsive layouts, and made cruises a bookable itinerary item.
Result
Every product's pages were rebuilt for phones and tablets, and cruises appeared in itineraries, emails and PDFs.
Inside the problem
  • Sign-up friction hurt registrationsSolved by: Sign-in with three social providers
  • Staff needed to manage destination videosSolved by: A video library with admin screens
  • Bookings & travel
  • Modernizing legacy systems

Jan 2012 – Apr 2014BangladeshSenior software engineer (on-site, Dhaka)

Project management that runs from email

Challenge
Teams ran projects through email, so decisions and action items lived in inboxes and nobody could see a project's true state.
Solved by
Mapped the workflow with the teams, then built the parsing that turns relevant emails into tracked tasks, and the reply loop.
Result
Teams could run a project from email alone or from the tool, with nothing lost in between (reported).
Inside the problem
  • Work fell between email and the project toolSolved by: Every relevant email becomes a task automatically
  • People live in their inboxSolved by: Specially formatted emails and replies update tasks without opening the tool
  • Workflow & automation

Approach

How I think about a problem

Six habits that show up in almost every project, each with the place it came from.

Don't let the app set the price

The server decides what a customer pays. The phone app only displays it.

Example: Gourmeal: every order priced from the vendor's menu.

See the project →

Never show customers half-finished data

Load new data to the side and swap it in at once.

Example: Daily updates from seven tour operators.

See the project →

Money moves all-or-nothing

A transfer either completes fully or not at all.

Example: The e-wallet double-spend fix.

See the project →

Hide the mess behind one clean door

Many suppliers, one simple way to book.

Example: 10+ rental companies behind one booking flow.

See the project →

Replace old systems without stopping the business

Move one piece at a time and keep the old path working until the new one is ready.

Example: The newsletter platform's module-by-module move.

See the project →

Hear about problems before customers do

Alert on failures, and on silence.

Example: Alerts when no background job has finished for four hours.

See the project →

Let's talk

Got a problem worth solving?

Tell me what you're building or what's in the way, and we'll take it from there.

Let's talk