Selected work

Projects

A selection of projects from my time at dive.ai and as an independent consultant, plus research from school — production ML systems, policy tools, and research infrastructure.

Production Systems & Consulting

  • Startup · Founder · 2026

    Konfirmo

    A guest management platform for wedding planners and event organizers. An AI assistant sends WhatsApp invitations, reads guests' replies, and keeps the RSVP list up to date on its own.

    Role
    Founder and technical lead.
    Stack
    TypeScript (backend), Vue (frontend), Python messaging service, Strands Agents, Gemini, Redis (queuing), WhatsApp

    Chasing RSVPs is one of the most tedious parts of planning an event: hundreds of messages, guests who answer in their own words, and a spreadsheet that’s always out of date. Konfirmo hands that work to an AI. Planners launch a WhatsApp campaign to their guest list, the assistant understands each reply, and confirmations land in one place automatically.

  • Production · dive.ai · 2024–2025

    LLM Insurance Chatbot

    A WhatsApp assistant that tells policyholders what their insurance actually covers, built for an insurtech startup and serving 200K+ insurance clients.

    Role
    Technical lead and client lead. The startup brought the problem; I designed the original architecture, built the baseline and shipped the first version. From there I led a team of five (three engineers, a PM and me), owned the technical decisions and the client relationship, and set priorities with the client. Hands-on in the LangGraph agent code.
    Stack
    LangGraph, Gemini Flash (Vertex AI), Gemini embeddings, Postgres + pgvector, Redis (conversation memory), Twilio WhatsApp API, Google Cloud Platform
    Outcome
    Still in production and still improving. Brokers answer coverage questions faster and better, and the company serves a broader population with fewer people.

    The problem was information asymmetry. People didn’t know what their insurance covered, and agents couldn’t answer them fast enough. Questions like “does my policy cover this?” or “which hospitals can I go to?” waited in a queue for a human.

    The assistant lives in WhatsApp. A user can ask about coverage, find in-network hospitals, or ask for a copy of their policy and get the PDF back in the chat.

    Under the hood, a LangGraph agent routes each question. It decides whether the question is about the general conditions, which apply to everyone, or about the user’s specific policy. The general conditions were chunked, embedded with Gemini and indexed in Postgres with pgvector. Individual policies were processed and passed in as context. Both were cross-referenced with a structured database of hospitals and providers.

    The system runs as several services. A Twilio client receives and sends messages. A backend runs the agent and the LLM calls. A database sits alongside, and side containers handle asynchronous work such as summarizing a conversation once it ends and fetching policy PDFs. Conversation memory lives in Redis; we built our own memory layer before frameworks offered one. Part of the job was designing the GCP architecture itself so the whole thing would hold up in production.

  • Production · dive.ai · 2025

    Transfer Fraud Detection

    A fraud-scoring model for a new Mexican bank's account-to-account transfers, cutting false positives by 60% against a rules baseline while keeping detection accuracy.

    Role
    Sold the project and served as tech lead. Hands-on with the modeling: built the model and set the criteria for trading off false positives against false negatives.
    Stack
    XGBoost, Feature engineering, Databricks (batch jobs + model serving)
    Outcome
    60% fewer false positives than the bank's rule-based baseline, at the same detection accuracy, so the fraud team stopped reviewing nearly every transfer by hand.

    The bank’s fraud team was drowning. The existing rule set was so conservative that almost every account-to-account transfer got flagged, and analysts were checking them one by one.

    We replaced the blanket rules with a learned score. An XGBoost model scores each transfer using the account’s transaction history, the characteristics of the transfer itself, and a set of engineered features. Choosing where to draw the line between false positives and false negatives was as much a business decision as a modeling one, and setting those criteria with the bank was a core part of the work.

    It runs inside the bank’s own stack. The main pipeline is a batch job on the bank’s Databricks workspace that ingests transfers and writes scores back, so only the risky ones reach a human. We also deployed the same model as a Databricks serving endpoint, so it can score transfers in real time as they happen.

  • Consulting · IMCO (independent) · 2023–2024

    IMCO Competitiveness Index

    Redesigned the weighting behind IMCO's State Competitiveness Index (ICE), replacing hand-assigned weights with PCA. The index ranks Mexico's 32 states and is used by state governments as a policy tool.

    Role
    Statistician on the index, hired directly by an IMCO director. Co-wrote the new methodology with their team, wrote all the code, and came back for later editions to help collect data, run the index and adjust the method.
    Stack
    Principal Component Analysis, Composite index design
    Outcome
    A reproducible, data-driven methodology, first used in ICE 2023 and carried into ICE 2024, which states use to see where they stand and what to improve.

    The old index was weighted by vote. IMCO’s team would get in a room and assign weights to each variable by consensus. The result wasn’t very scientific, and with so many indicators the subindexes ended up looking alike.

    The new method separates judgment from arithmetic. Experts still decide which variables belong in each subindex, a question of meaning. Then PCA derives the weights from the data itself, so each subindex reflects how its indicators actually vary across states. The 2024 edition combines 50 indicators into six subindexes, from innovation and economy to law and government.

    It became a recurring engagement. The methodology and code carried over from year to year; for each edition I helped with data collection, ran the pipeline, and adjusted the method as indicators changed. ICE 2024 is the edition below.

Research & Academic

  • Research · Research assistant to Mauricio Romero (ITAM) · 2023–2024

    Aircraft Noise Impact Study

    Research on whether aircraft noise affects academic performance, using changes in Mexico City flight routes as a natural experiment. Built the AWS pipeline that turned 17M+ flight data points into noise exposure for each school.

    Role
    Research assistant. Owned the flight-data pipeline: downloading, storing, cleaning and aggregating the raw tracks into exposure measures the regressions could use.
    Stack
    AWS (sharded, distributed processing), Geospatial gridding, Regression analysis

    The question: does aircraft noise hurt how kids do in school? Mexico City’s flight routes changed, so some neighborhoods that used to be quiet started getting planes overhead, and others stopped. That shift is a natural experiment: compare schools’ standardized test scores before and after, depending on how their exposure changed.

    The hard part was the data. The raw source was an enormous database of flight tracks, with a position (x, y, altitude) for every second of every flight: more than 17 million data points. Too big for one machine, it was downloaded into a sharded, distributed setup on AWS, where it was cleaned and transformed before any of it was usable.

    From points to exposure. We laid a grid over the city and aggregated the track points into how many planes per hour crossed each cell, then matched cells to schools so exposure could enter the regressions alongside test scores.

  • Research · Research assistant to Mauricio Romero (ITAM) · 2023

    Bogotá School Air Quality Reports

    Reproducible reports and interactive dashboards on air quality in Bogotá schools, built for the schools and the city government as part of a study on air filters and student learning.

    Role
    Built the reporting pipeline and dashboards end to end, designed so the research team could rerun them as new readings came in.
    Stack
    R, R Markdown, Shiny

    The Air Filters and Student Learning project installed air quality monitors in 150 schools across Bogotá. Raw sensor readings don’t mean much to a principal or a city official, so I built reports and dashboards that summarize pollution by school and by locality.

    The point was reproducibility: the team could regenerate every report and visualization with one run as new data arrived, instead of rebuilding them by hand. The reports went to the schools and to Bogotá’s city government, and the locality reports are public.

  • Research · Research assistant to Mauricio Romero (ITAM) · 2024

    Air Quality CV Pipeline

    A YOLOv8 segmentation pipeline that measures how dirty a school's air filter is from a photo, as a proxy for how much the filter was used. Part of a study on air filters and student learning in Bogotá.

    Role
    Built it end to end: hand-labeled the training images, fine-tuned the model, wrote the color-comparison step, and fed the results into a small platform where researchers pull reports.
    Stack
    YOLOv8 (instance segmentation), Python, Streamlit, Hand-labeled training data
    Outcome
    Analysis that used to mean a researcher checking photos one by one became immediate, an estimated 80% cut in manual inspection time.

    The study needed to know whether schools actually ran their air filters. The cheapest evidence is the filter itself: the more it’s used, the dirtier it gets. Field teams photographed each filter next to a white reference card.

    The model finds two things in every photo. A YOLOv8 model, fine-tuned on images I labeled by hand, segments the reference card and the filter. Every photo used the same white card, so comparing the filter’s pixels to the card’s cancels out differences in lighting and camera, and the gap between them is the usage proxy.

    Results go straight to the researchers. Scores land in a small Streamlit platform where the team can pull a report for any school, instead of eyeballing photos one at a time.

  • Internship · Mexico City Ministry of Labor, with Tec de Monterrey · 2022

    Employment Matching System

    A nightly batch system that matched job seekers to openings on the Mexico City Ministry of Labor's job portal, across 7M+ profiles.

    Role
    Data science intern under Liliana Millán, then at Tec de Monterrey. In charge of the pipeline and experiments: maintaining the pipelines, designing and testing new features, and joining meetings with the ministry's team to report results.
    Stack
    Python, Bag-of-words text models, Feature engineering, Data versioning, Nightly batch pipeline

    Matching people to jobs on a public portal. Mexico City’s Ministry of Labor (Secretaría del Trabajo) runs a job portal where residents post profiles and employers post openings. The goal was to suggest better matches between the two.

    Before transformers, text meant bag-of-words. Profiles and job postings were represented with bag-of-words models plus engineered features, the standard toolkit at the time.

    Built like production software, not a notebook. The system ran as a nightly batch: pull the latest data, rebuild features, and score matches. Data versioning and tracked experiments meant every model could be traced back to the data and settings that produced it.

  • Research · ITAM Center for Data, Algorithms and Society · 2022

    Project Buscadoras

    The data side of No Están Solas, a platform about the madres buscadoras: interactive maps of search collectives across Mexico and 50+ visualizations crossing them with public crime and survey data.

    Role
    Did all of the data work as part of the center's first cohort: cleaning INEGI's public data, joining it with private records on the collectives, and building the interactive maps and visualizations.
    Stack
    R, Shiny, Leaflet, INEGI public data

    Who the buscadoras are. Across Mexico, mothers and families of the disappeared have organized into collectives that search for their missing relatives themselves. No Están Solas (“You Are Not Alone”) documents that work, with interviews, a directory of contacts, and a data section.

    The data section was ours. The project was led by Magic Grant recipients from the Brown Institute at Columbia, working with researchers at ITAM. I handled the data: cleaning INEGI’s public surveys, crossing them with private databases on the collectives, and turning the result into something people could explore.

    Maps first. The centerpiece is an interactive Leaflet map of where collectives operate; click one to learn more. Other visualizations cross the collectives with crime data.

More code on GitHub.