Twelve years of PHP.
Six apps you can open right now.

I am Millicent Convento, a senior Symfony and Laravel developer in Makati. I design the schema, write the backend, build the front end, and then put the thing on a server and keep it running. Everything below is deployed — same box, same afternoon, real certificates.

Based in
Makati, Metro Manila
Working since
2013
Setup
Dedicated room, fibre, backup line
Portrait of Millicent Convento
6 services live on one server

The work

Six applications, each one running at the address shown in its window. Open any of them. The screenshots are captures of those instances, not mockups.

  1. brgy.mjmconvento.com
    Barangay Profiling System running at brgy.mjmconvento.com Open it

    Barangay Profiling System

    Constituent records for a Philippine barangay: 3,200 residents, tax billing across twelve periods, criminal records, and the captains who sign for them. The dashboard answers the question an official actually asks — who owes what, and where.

    Queue worker and scheduler run as separate containers off the same image.

    • Laravel 13
    • PHP 8.4
    • PostgreSQL
    • Redis
    • Chart.js
  2. furry.mjmconvento.com
    Save a Furry Friend running at furry.mjmconvento.com Open it

    Save a Furry Friend

    A rescue-story feed split by how the story lands — happy, neutral, heartbreaking — so the hard ones arrive behind a warning instead of ambushing you. Posts are documents, users are rows, and media never touches the app server.

    Two databases on purpose: relational identity, document content.

    • Laravel 12
    • React 19
    • PostgreSQL
    • MongoDB
    • S3 / MinIO
  3. calendar.mjmconvento.com
    Booking Calendar running at calendar.mjmconvento.com Open it

    Booking Calendar

    Month grid, day view, customer records. Click a free day to book it, click a busy one to read it in full. The interesting part is not the calendar widget — it is the booking rules underneath that stop two people holding the same slot.

    Registration is gated; the calendar never faces the open internet unauthenticated.

    • Symfony 8.1
    • Doctrine ORM 3
    • FullCalendar
    • PostgreSQL
  4. snake.mjmconvento.com
    Snake running at snake.mjmconvento.com Open it

    Snake

    Apples, growth, and the golden one that rots if you take too long. Scores stream to every open tab over server-sent events, so the leaderboard moves while you are still playing.

    Live leaderboard over SSE — no polling, no socket server.

    • Symfony 8.1
    • Mercure SSE
    • React
    • PostgreSQL
  5. tetris.mjmconvento.com
    Tetris running at tetris.mjmconvento.com Open it

    Tetris

    Seven-bag randomiser, wall kicks, lock delay — the rules that separate a Tetris clone from Tetris. Same backend shape as Snake, which is the point: one deployment pattern, reused.

    Deployed from the same compose template as Snake and Battle City.

    • Symfony 8.1
    • Mercure SSE
    • React
    • PostgreSQL
  6. battle.mjmconvento.com
    Battle City running at battle.mjmconvento.com Open it

    Battle City

    Tank combat on a destructible grid. Collision, projectile timing and brick-by-brick terrain damage, running at frame rate in the browser with the score pipeline shared with the other two.

    Third project on the pattern; the deploy took twenty minutes.

    • Symfony 8.1
    • Mercure SSE
    • React
    • PostgreSQL

One server, not six

Every project above answers on its own hostname, but there is a single machine underneath. Caddy terminates TLS and routes by host; the databases are shared, one engine per kind, not one per project. That decision is what makes the whole set cost about eleven dollars a month.

Edge

Caddy, automatic certificates, HTTP/3, one container holding ports 80 and 443.

Applications

Six Compose projects on a private network. PHP-FPM behind nginx, queue workers and schedulers where the app needs them.

Data

One PostgreSQL with a database per app, plus MariaDB, MongoDB, Redis and S3-compatible object storage.

Twelve years, mostly PHP

B.S. Computer Engineering, Adamson University, 2013. That first year was spent near the hardware on support and machine maintenance; development started in 2014 and has not stopped since.

The work began with a scheduling system that grew into a full ERP and CRM — which is where I met Symfony, by way of a manufacturing module, a lot of Twig admin panels, and the inventory, purchasing and sales screens nobody writes conference talks about. After that came software for a multinational bank: service-worker push notifications, bulk actions across every page, automated director loan computations. Then several years at offshore and outsourcing shops, which is a fast way to see a lot of other people’s codebases.

PHP has been the constant, with MySQL beside it in very nearly every job. Symfony is where I am most comfortable and Laravel is a pleasure when a project suits it. On the front end I went jQuery, then Vue, then React, in that order. I also handle the AWS side and the parts of DevOps a backend developer ends up owning whether or not the job title says so.

Backend

  • PHP 8.x
  • Symfony
  • Laravel
  • Doctrine
  • Eloquent
  • Python

Data

  • PostgreSQL
  • MySQL / MariaDB
  • MongoDB
  • Redis
  • Query plans
  • Migrations

Front end

  • React
  • Vue
  • TypeScript
  • Vite
  • Twig / Blade
  • jQuery

Delivery

  • Docker
  • Compose
  • Caddy / nginx
  • GitHub Actions
  • AWS
  • Hetzner

Domains

  • ERP and CRM
  • Manufacturing
  • Banking
  • Scheduling
  • Government records
  • Offshore product teams

Hiring, or just curious?

I read everything that arrives by email. Makati-based, set up for remote work with a dedicated room, fibre, and a backup connection for when it rains sideways.

Writing about the day job lives in the blog — upgrade notes, query plans, and the occasional post about why a thing that should have worked did not.