sara. PT

Full-stack software engineer

Multi-tenant SaaS platforms for domains where mistakes are expensive.

I build products end to end — architecture, backend, frontend, mobile and AI agents — in sectors where business rules are dense and the margin for error is thin. Five products today on the same technical foundation, at different stages: one already in production with a client, two in client staging and two in internal testing.

Available for contract work

By the numbers

multi-tenant products on the same technical foundation
5
regulated domains served
5
commits authored in 9 months
~4,250
MCP servers consolidated into one
3 → 1

How I work

01

End-to-end SaaS

Architecture, backend, frontend, mobile and deployment. I do not outsource what matters — I deliver the full stack, from schema to component.

02

Multi-tenant in production

Schema-level isolation in PostgreSQL, decoupled Laravel modules, no data leaking between clients. The same pattern replicated across five products.

03

AI on real data

AI agents operate on the products' real data through MCP, under each tenant's permission scope — tooling for the technical and support team, not a chatbot exposed to the end customer.

04

Foundation before features

Design system, shared template and CI with a real gate. A new product starts with multi-tenancy, RBAC and authentication already in place — not from scratch.

Selected work

Clients cannot be named publicly. I can go into detail under NDA — just ask.

CASE / 01

Public procurement

B2G SaaS platform

Multi-tenant platform for public-sector agencies to plan and run their own procurement processes: an Annual Procurement Plan (PCA) with a Demand Formalization Document (DFD) per item, incremental consolidation and fiscal-year controls with deadline alerts. A compliance checklist per process variant, with an AI-generated opinion, a product catalogue and a general registry of suppliers and responsible parties.

In a recent consolidation I merged three modules into one and took the product from four business modules down to two — proving parity across 345 routes, with no migration re-run on any of the five schemas. In client staging.

  • · Modular Laravel
  • · Multi-tenant PostgreSQL
  • · Vue 3 + Inertia
  • · AI-generated opinion

Architecture · Backend · Frontend · AI

CASE / 02

Public sector

Municipal government ERP

The largest product in the portfolio: a modular platform for city halls and public agencies, isolated per municipality at the schema level. Modules for budgeting, fleet, assets, scheduling and HR with payroll and timekeeping — each client enables only what they use.

I shipped the budgeting and fleet modules end to end, rewrote the authorization layer (RBAC) after finding a serious cross-tenant access flaw, and made the database audit trail immutable. In internal testing.

  • · Modular Laravel
  • · Multi-tenant PostgreSQL
  • · Vue 3 + Inertia
  • · MCP Server

Architecture · Backend · Frontend · AI

CASE / 03

Tax

Municipal tax auditing

Cross-referencing service invoices, receipts with no matching invoice and federal tax authority statements into a revenue cube with propagated measures. A domain where a badly implemented rule does not produce a bug: it produces an unjustified tax assessment.

I rebuilt the federal tax authority activity catalogue for the current layout, fixing a bug that inflated or masked reported revenue, and wrote the module first screen-level test suite. In client staging.

  • · Modular Laravel
  • · Multi-tenant PostgreSQL
  • · Vue 3 + Inertia
  • · Revenue cube

Backend · Frontend · Tax rules

CASE / 04

Citizen services

Municipal app shipped on iOS and Android

Mobile app for public services with a single codebase running on iOS, Android and web. Public venue booking, municipal taxi service with offline support, payslips with income tax and social security statements, city financial indicators and a water and sewage portal.

Published on both stores and in use by citizens — not a prototype.

  • · Vue 3 + Capacitor
  • · TypeScript
  • · Pinia
  • · Offline-first

Mobile · Frontend · Integrations

CASE / 05

Support and internal knowledge

AI-powered support and knowledge hub

A platform that centralizes the company knowledge and support, today split across the other products: a ticket queue with classification and SLAs, an internal wiki with full-text search, and a hybrid search engine (RAG) over manuals, articles and technical docs. That knowledge is exposed through MCP to a local LLM, used as a support chat agent and for code completion during development.

I shipped the first two milestones of the ticketing module and the foundation of the hybrid search. In internal testing — another developer on the team has already shipped a feature end to end on the same foundation.

  • · Modular Laravel
  • · Multi-tenant PostgreSQL
  • · Vue 3 + Inertia
  • · Hybrid search (RAG) + local LLM

Architecture · Backend · Frontend · AI

Platform work

Much of what I deliver is not a product feature: it is the foundation the other products — and the other developers — rely on.

Design system as a package

A Vue 3 component library shipped as a private npm package and versioned with semver. A single canonical source shared by three products: fixing one component fixes all three at once.

Versioned base template

The starting point for a new product, already carrying schema-based multi-tenancy, global and local RBAC, authentication, PDF generation and the core modules. Time from decision to a working screen drops from weeks to days.

Consolidating the MCP agents

There was one MCP server per product, each a copy of the same scaffold with the same dozens of duplicated tools — which produced the same bug in three places at once. I designed the unified server that resolves the connection per product at runtime and replaces all three, proving coverage case by case before retiring each one.

Quality you can audit

  • Static analysis and formatting as a CI gate, with a measured baseline
  • E2E suite covering navigation, CRUD, permissions and listing regressions
  • Architecture decisions recorded as ADRs, superseded explicitly
  • Onboarding documentation written for people arriving without context

Stack

Backend

  • Laravel · PHP 8.2+
  • Multi-tenant PostgreSQL
  • Sanctum · Queues · Jobs

Frontend

  • Vue 3 · Strict TypeScript
  • Inertia.js
  • Tailwind · In-house design system

Mobile

  • Capacitor · iOS and Android
  • Pinia · Vue Router
  • Offline-first

Infra and quality

  • Docker · CI/CD
  • Schema-per-tenant
  • Playwright · Static analysis

AI

  • MCP Servers
  • RAG + local LLM (support and code completion)
  • Tool use scoped to the tenant

About

Software engineer focused on SaaS platforms in complex domains. I work with Laravel, Vue 3 and multi-tenant PostgreSQL on products serving public procurement, municipal government, tax, payroll and citizen services — from the app already in production to the ones in client staging and internal testing.

I got here by a crooked path. I was a personal trainer, lived abroad between 2014 and 2018 working in hostels in Chile and Norway, and led a CrossFit coaching team for three years. I joined the company I am at today in 2021, in an administrative role; I moved into development in 2024 and now I lead its innovation team.

Coaching people teaches something that carries straight into software: you answer for someone else's outcome, and a lapse in judgement has physical consequences. That is where my discomfort comes from with a system that passes its tests but that nobody has ever opened on screen.

I consolidated products that started out separate into one coherent technical platform: the same modular architecture, the same tenant isolation model, the same design system, the same quality gates. That is what lets me ship a new feature in any of them without relearning the terrain.

I work with AI agents that operate on the products' real data through MCP, under each tenant's permission scope — internal tooling for the technical and support team, not a chat layer for the end customer. I also supervise an intern and write the onboarding documentation: part of my job is making sure someone else can get into the code without having to ask me.

Everywhere I have been, I made a difference. And every time I left, I left behind people who carried the work forward — or improved on what I built.

Let us talk

Open to opportunities and contract work. For details under NDA, drop me an email.