MIKHAIL NERI

01 · Thesis Mikhail Neri Senior full stack web developer Cagayan de Oro, Philippines · UTC+8 Local time


Software, ecommerce and products, built from architecture to production.

Available for new projects · replies within 24 hours on weekdays

02 · Proof Four facts, each with its source

P.01

3 card gateways

Stripe, Mollie and Viva Wallet on one webhook driven order flow, plus a pay by bank rail built from scratch. Every price is resolved again on the server.

Headless commerce platform
P.03

Cost price never leaves the owner

StoqShelf cashiers sell by QR scan and see only price and stock, enforced by the server rather than the screen.

StoqShelf
P.04

15 of 18

Processor requirements passing for a store in a regulated, high risk vertical, up from a failing audit. The other three wait on the client's merchant credentials, legal review and go live.

Payments readiness

15+ years 80+ projects delivered 4 continents 90+ custom plugins

BOM · Bill of materials

  1. PHP
  2. Laravel
  3. CodeIgniter 4
  4. React 19
  5. TypeScript
  6. WordPress
  7. WooCommerce
  8. Shopify
  9. Webflow
  10. Stripe
  11. Mollie
  12. Viva Wallet
  13. MySQL
  14. NGINX
  15. React Native

03 · Selected systems Three features, two notes Fig. 02 and Fig. 03 run live

Selected systems

Headless commerce platform Three applications over one shared database. Card gateways post signed webhooks to the API, the API is the only door into the data, and the storefront is one client of it. Parts: Stripe; Mollie; Viva Wallet; Pay by bank (per deployment); CI4 admin platform (catalog, orders, logic); REST API service (private and public endpoints); React 19 storefront (tanstack start); Shopify / WooCommerce (cart handoff); One shared database (mariadb · 34 migrations). Stripe connects to REST API service. Mollie connects to REST API service (signed webhooks). Viva Wallet connects to REST API service. Pay by bank connects to REST API service. CI4 admin platform connects to REST API service. REST API service connects to React 19 storefront (bearer, cors). React 19 storefront connects to Shopify / WooCommerce (optional). CI4 admin platform connects to One shared database. REST API service connects to One shared database. Signed webhooks Bearer CORS Optional Stripe Mollie Viva Wallet Pay by bank Per deployment CI4 admin platform Catalog, orders, logic REST API service Private and public endpoints React 19 storefront TanStack Start Shopify / WooCommerce Cart handoff One shared database MariaDB · 34 migrations
  • Payments Stripe, Mollie and Viva Wallet on one webhook driven order flow, plus a pay by bank rail built from scratch. Every price is resolved again on the server.
  • Admin and API The admin owns the data and logic, and the API exposes it. The API is the only door into the data.
  • Storefronts The storefront consumes the API, so a new storefront is a new client of the API rather than a migration.
  • Data One shared database behind all three applications, built up over 34 migrations.
FIG. 01 The API is the only door into the data, so a new storefront is a new client of the API rather than a migration.

Private · Client under NDA

Headless commerce platform

A three application suite I built solo: a CodeIgniter 4 admin across 28 feature phases, a hardened REST API service and a React 19 storefront.

PHP 8.2 · CodeIgniter 4 · MariaDB · React 19 · TanStack Start

Read the architecture
Relaunching

StoqShelf

Cloud inventory for owner operators. QR scan to sell from any phone, cashier delegation that never exposes cost price, and per item profit.

PHP · CodeIgniter · MySQL · PayPal

Read the case study
  1. CAMERA Phone browser reads the item QR
  2. CLIENT Cashier enters quantity 2
  3. AUTH Server checks the delegate role
  4. DB Stock decremented in one transaction
  5. LEDGER Sale and margin logged for the owner
  6. ALERT Low stock threshold crossed
  7. VIEW Cashier sees price and stock, never cost

Every stageSample data

01/07 · CAMERA · PHONE

scan → SKU-0142
item: "USB-C Hub 7-Port"

02/07 · CLIENT · PHONE

POST /sales
{ sku: "SKU-0142", qty: 2 }

03/07 · AUTH · SERVER

role: cashier
can(sell) ✓   can(edit) ✗
can(view_cost) ✗

04/07 · DB · SERVER

BEGIN
  SELECT … FOR UPDATE
  qty 12 → 10
COMMIT

05/07 · LEDGER · SERVER

sale · 2 × $24.00
margin → owner ledger only

06/07 · ALERT · SERVER

qty 10 ≤ reorder_at 12
queue: email owner

07/07 · VIEW · PHONE

200 OK
{ price: 24.00, stock: 10 }
// cost never left the server
Stock
10 · low
Revenue
+$48
FIG. 02 A cashier sale, traced. The role check runs on the server, so the cost price never reaches the cashier's phone. Sample item and price; the cashier rules are the real ones.
  1. ROUTE Laravel matches the case study route
  2. CONTENT The project loads from typed PHP content, no database
  3. BLADE Blade renders the whole page, figure included
  4. HTML Readable, crawlable HTML reaches the browser
  5. VITE One small entry loads; React waits for the figure
  6. REACT React 19 mounts one figure, nothing else
  7. INPUT The reader focuses a layer of the schematic

Every stageReal code

01/07 · ROUTE · SERVER

Route::get('/work/{slug}', [WorkController::class, 'show'])
    ->name('work.show');

02/07 · CONTENT · SERVER

$project = $this->projects->findOfKind($slug, ProjectKind::Work);
abort_if($project === null, 404);

03/07 · BLADE · SERVER

return view('v3.pages.case-study', [
    'project' => $project,

04/07 · HTML · WIRE

200 OK · text/html
works with JavaScript off

05/07 · VITE · BROWSER

@vite(['resources/css/v3.css', 'resources/js/v3.ts'])

06/07 · REACT · BROWSER

createRoot(el).render(
    <StrictMode>
        <Component {...props(el)} />
    </StrictMode>,
);

07/07 · INPUT · BROWSER

onFocus={() => setActive(layer.id)}
// state stays inside the island
JS shipped
65.4 KB
Interactive
figure
FIG. 03 One page request, traced. Laravel sends finished HTML; React loads only for the figure that has to move.

Live · You are reading it

mikneri.dev

Laravel renders every page on the server. React 19 mounts as islands only where a figure moves, like the two traces on this page.

Laravel · Blade · React 19 · TypeScript · Vite

Read decision DR.01

04 · Decisions Three records

How I decide.

Context
A portfolio that has to rank, load fast on a phone and still carry interactive figures.
Tempting answer
One React app over Inertia for every page.
What I did
Blade renders each page on the server. React mounts as islands only where a figure has to move.
Why
Inertia renders on the server only with a Node process, and the shared host has none. Blade pages stay crawlable with JavaScript off, and React loads only where a figure moves.
DR.02

PrepBenchmark data model split

Read more about PrepBenchmark data model split
Context
Certifications, exam levels, providers and provider course levels were modelled as one idea.
Tempting answer
Keep the shortcut and patch the filters around it.
What I did
Split the exam relationship from the provider course relationship on every article and review, with globally unique level slugs.
Why
The fix is cheap while content is thin and expensive once live filters depend on it.
DR.03

Verify before costing

Read more about Verify before costing
Context
Asked to scope tables, blockquotes and inline code in the article editor.
Tempting answer
Estimate from the editor feature list.
What I did
Built a throwaway article and inspected what the editor actually produced.
Why
Three of the four features already worked. The real gap was template styling, so the estimate covered only that.

05 · Products Designed and built

Software I designed and built.

All products

06 · AI Position statement

AI writes code. Someone still has to be responsible for it.

I use AI tools the way I use an IDE or a linter. I read and test every line, I own the architecture, and nothing reaches production that I could not explain line by line.

How I work with AI

07 · Capabilities The schematic, expanded

What I can take on.

  1. 01 Interface
    • React 19
    • TypeScript
    • Tailwind CSS 4
    • Vite
    • React Native
    • Expo

    Storefronts, dashboards and mobile apps in React 19 and TypeScript.

  2. 02 Application
    • PHP 8
    • Laravel
    • CodeIgniter 4
    • REST APIs

    Domain logic, admin platforms and APIs that other clients can depend on.

  3. 03 Commerce and payments
    • WooCommerce
    • Shopify
    • Stripe
    • Mollie
    • Viva Wallet

    Checkout, webhook driven orders and payment processor readiness.

  4. 04 Platforms
    • WordPress
    • Shopify Liquid
    • Webflow
    • Custom plugins

    Content and commerce platforms, with 90+ custom plugins built.

  5. 05 Data and integrations
    • MySQL
    • MariaDB
    • SQLite
    • Webhooks
    • AI chat

    Data models, imports and the integrations between systems.

  6. 06 Infrastructure and security
    • VPS
    • NGINX
    • Apache
    • LiteSpeed
    • SSL
    • Backups

    Servers I provision, deploy and harden, with zero downtime deploys.

FIG. 07 Six layers, one owner. Each layer is a place a project can start, and the drawing shows what it touches on the way to production.

08 · Process Four steps, three models

How a project runs.

  1. 01 · Discover

    We talk through the problem, the goal and the constraints. I scope it and send a quote and timeline, usually the same week.

  2. 02 · Architect

    I plan the build before writing code: the data model, the moving parts and where it can break. You sign off before I start.

  3. 03 · Ship

    I build in clear milestones, test as I go and deploy with zero downtime. You see progress, not silence.

  4. 04 · Iterate

    After launch I watch the logs, fix what needs fixing and keep improving.

Pricing happens in the conversation, once I understand the work.

Flexible

Hourly

Small fixes, audits and ad hoc work where the scope is open.

Most common

Project

A defined build with fixed scope, milestones and a clear finish line.

Ongoing

Retainer

Set hours each month for maintenance, updates and support.

09 · Human Drawn by M. Neri

Mikhail Neri in a cap and a T shirt with a wave logo, in front of screens of code, drawn in graphite and teal.
FIG. 09 · Duotone, graphite and teal

I am Mikhail. For fifteen years I have built for the web from Cagayan de Oro, for clients on four continents.

You work with me directly. The person who scopes the system is the person who designs it, writes it, deploys it and answers for it after launch.

More about me

10 · Contact Step 1 of 3

Tell me what needs to exist.

Available for new projects · replies within 24 hours on weekdays