Built for the hand. Designed at the
contract.

Mobile application developer. I ship the surface people hold, then design the API so a payment can clear certification, a tax document can be accepted, and a receipt can still print when the network is the unreliable part.

Illustrated

The hand, then the contract.

A live trip on the phone. A charge the location resolves. These drawings are not the production screens. The Tricycall landing page is the surface I shipped.

01 — Contracts

A good API can be understood without the documentation. I settle the patterns before the first endpoint, then the samples below are how those patterns show up in systems I have shipped. None of them is a production endpoint.

  1. 01

    Resources, not actions

    The URL names the thing. The method names what you do with it.

    POST /createOrder POST /v1/orders

  2. 02

    Predictable URLs

    Collection, then id, then what belongs to it. One casing, used everywhere.

    /v1/orders/{id}/items

  3. 03

    Methods mean what they say

    GET reads. POST creates. PUT replaces. PATCH changes part. DELETE removes. Repeating PUT, PATCH, or DELETE does nothing further.

  4. 04

    Status carries the result

    The client should not get 200 and then hunt the body for a failure. 201 created. 202 accepted. 400 invalid. 404 missing.

  5. 05

    One error shape

    A person reads the message. Software reads the code. Validation names the field that failed.

  6. 06

    Path identifies, query refines

    Filtering, paging, and sorting stay in the query. An action never hides there.

    GET /users?action=delete GET /v1/orders?status=shipped

  7. 07

    Version the break

    Adding a field is safe. Removing one, or changing the shape, needs a new version. /v1 keeps working while clients move.

  8. 08

    One format, then familiarity

    camelCase in JSON. kebab-case in paths. ISO-8601 for dates. Learn one endpoint and the next one should feel expected.

The error, every time

Same three fields on every failure. If a value is wrong, the message says which field and why.

{
  "code": "LOCATION_NOT_FOUND",
  "message": "No location with id loc_14",
  "status": 404
}

Before the first endpoint

A sketch, not a shipped endpoint

Describe the system.

One sentence. The rules above decide the path, the status, and the error. Nothing is sent off this page.

Tricycall · Firebase

One trip, four apps

trips/{tripId}
{
  "state": "searching",
  "vehicle": "tricycle",
  "pickup": { "lat": 14.5995, "lng": 120.9842 },
  "dropoff": { "lat": 14.6091, "lng": 120.9918 },
  "riderId": "r_1842",
  "driverId": null
}

Decision The trip is a resource, trips/{id}, not an action. I built the rider, driver, admin, and landing page alone, and all four read that one document. Four private copies would drift the moment the driver moved.

02 — Systems

Selected systems

Work I led, built solo, or maintained. The hard part was never a screen. It was keeping the screen honest with everything behind it.

Intercard · backend and frontend

WalletPass

One wallet product, many locations, and a different payment processor behind each location. I maintained both sides of it through certification with Elavon, Cybersource, Portaldom, Orkespay, and others.

The app stays stable while a processor changes. A location resolves to an adapter. Charges are idempotent. Async results come back as a status the client can trust.

Role
Backend and frontend
Constraint
Certification is per processor and location
Contract
Client sends a location, never a processor name

Thesis · Built solo

Tricycall

A GPS hailing app for tricycles. I built it alone in Flutter and Firebase as four products: the rider app, the driver app, an admin panel, and the landing page.

Matching, live location, and trip state had to stay coherent across all four. The map is the interface. The shared trip is the product.

Role
Solo builder, thesis
Stack
Flutter, Firebase, GPS
Surfaces
Rider, driver, admin, landing

Landing page

Dominican Republic · Regulatory APIs

Tax and e-invoicing

I created the APIs for tax and e-invoicing compliance. A fiscal document is not a form you save. It is a sequence the regulator will accept or reject.

The contract exposes state and the next legal action. Clients cannot skip signing, and a rejection has to be readable by the person who has to fix the document. Press the next action. A bad tax id comes back naming the field.

Role
API design and build
Domain
e-CF and tax compliance
Rule
State machine, not generic CRUD
  1. Draft
  2. Signed
  3. Submitted
  4. Accepted
  5. Rejected · reason

Next action · sign

Devices · Kotlin

Terminals and the receipt

I contributed to mobile payment terminals, including the Castles Technology S1E4 PRO and Pax devices. On the printer path I integrated Epson over Bluetooth Low Energy with the Epson SDK, in Kotlin.

A terminal and a printer fail differently. The payment can be approved and the receipt can still be the part that breaks. That path gets its own contract.

Devices
Castles S1E4 PRO, Pax, Epson
Link
Bluetooth Low Energy
Stack
Kotlin, Epson SDK

S1E4 PRO · Pax

Also on the record

Third-party API

Varsity

I did not build the consumer app. I provided the third-party API behind it, including Apple Wallet and Google Wallet passes whose themes are data.

Apple · Google

Intercard · Debug, maintain, integrate, publish

iWallet, iService, and iInventory

The Edge mobile apps: a guest wallet, remote game service, and redemption inventory. I debug, maintain, integrate, and publish them.

Edge collection

School · Backend lead

Library system

Laravel API for the school library. The first contract other people had to build against.

Sample contract

Migration

Legacy services to .NET 6

Moved legacy ASP.NET web services onto .NET 6 so the integrations could keep running on a stack we could still change.

Legacy to .NET 6

Gordon College · Next.js

GradVerify

A web app for checking graduation status. The page is the product.

Demo site

Subic Bay Yacht Club

A marketing demo: marina berths, rooms, dining, events, and membership.

Freelance · Next.js

GES admin

A Next.js project-management app with time tracking. The real screen is private. This is the admin: projects, tasks, and status.

Private app

03 — Stack

What the work used

Listed because a system on this page depended on it. No scores, no filler.

Drag the top card, or click it.

04 — Path

Four commits, one branch

The projects are already in the record. McDonald's is six months beside Gordon College, not the next stop after it. The line splits, then comes back to main.

git log --graph

main, with one branch while studying

Gordon McDonald's 6 months Marine SBCOMP
  1. HEAD · main · mobile developer · since Aug 2025

    SBCOMP, with Intercard

    git commit -m The development cycle as a company actually runs it. Azure tickets, a release process, and the work of making, integrating, fixing, and shipping apps that have to stay reliable. The role is mobile. The larger gain is software engineering: communication, corporate practice, and AI used in the work.

  2. commit · main · two years offshore

    Marine satellite IT

    git commit -m Installed and kept up what a ship runs on. VSAT, ECDIS, networks, PCs, internet, and Cisco. The link has to hold when the next port is the only help coming.

  3. branch · 6 months · while studying

    McDonald's

    git commit -m Six months on the floor, in parallel with Gordon College. A station can be clear enough that someone new, even a child, can run the whole thing. I still use that test. A good flowchart, and a clear architecture, is what lets other people run the system.

  4. root · main · BSIT

    Gordon College

    git commit -m The root commit. Basics, fundamentals, and a guided path into software engineering. The McDonald's branch leaves from here and comes back before the next commit on main.

05 — Contact

Let's talk
business.

Certification, a flaky radio, a regulator, a driver on a map. Write the system you need built. It opens a note addressed to me.

Ralph Angelo Jaminal · Mobile application developer

What is it