# Angel Baez > Personal website of Angel Baez, an entrepreneur and AI engineer based in Cancun, Mexico. Senior software engineer with 12+ years building production web applications, now focused on AI agents, agentic workflows, and full-stack TypeScript/Node.js systems. Key facts: - Role: Entrepreneur & AI Engineer (Senior Software Engineer) - Location: Cancun, Quintana Roo, Mexico - Expertise: AI agents, agentic workflows, TypeScript, Python, Node.js, React, Astro, Next.js, AWS, Cloudflare - Founder work: Prepa IN (https://prepain.mx), an online high school in Mexico serving students with disabilities - The site is bilingual: English (default) and Spanish under /es/ ## About - [About](https://angel-baez.com/about): Bio, expertise areas (frontend, backend, DevOps), and professional background - [Resume](https://angel-baez.com/resume): Full work history, skills, and education - [Resume (JSON)](https://angel-baez.com/resume.json): Machine-readable JSON Resume — preferred source for structured career data (roles, dates, skills) - [Contact](https://angel-baez.com/contact): Contact form for reaching Angel ## News Announcements and milestones from Angel's ventures. - [Recupera Accepted into the AWS Activate Program](https://angel-baez.com/news/recupera-aws-activate/): Recupera, a bootstrapped startup helping employees in Mexico recover their tax refunds, has been accepted into AWS Activate, Amazon Web Services' program for growing startups. (2026-08-10) ## News (Spanish) - [Recupera fue aceptada en el programa AWS Activate](https://angel-baez.com/es/news/recupera-aceptada-aws-activate/): Recupera, una startup bootstrapped que ayuda a empleados en México a recuperar su dinero de impuestos, fue aceptada en AWS Activate, el programa de Amazon Web Services para startups en crecimiento. (2026-08-10) ## Blog - [Running EmDash CMS in Production One Day After It Launched](https://angel-baez.com/blog/emdash-cms-in-production-one-day-after-launch/): Cloudflare shipped EmDash, its open-source AI-first CMS, as a developer preview the press said wasn't ready for production. We had it live the next day, hit its first real scaling bug at 124 posts, and got the fix merged into core nine days later. The architecture, the contribution, and the risk calculus. (2026-08-18) - [Migrating Prepa IN off WordPress in a Weekend with Claude Code](https://angel-baez.com/blog/wordpress-to-astro-migration-in-a-weekend/): A WordPress site with six years of history moved to Astro on Cloudflare in two days of work. Six months later organic search hit an all-time high and Google was showing the site 21 times more often. What we decided, and what it returned. (2026-08-17) - [How a Fleet of Claude Managed Agents Grew Prepa IN's SEO and AI Visibility 20x](https://angel-baez.com/blog/claude-managed-agents-prepa-in-blog/): The architecture behind the autonomous Claude managed-agent fleet that researches, writes, reviews, and publishes Prepa IN's blog, and the 20x SEO and AI visibility it produced. (2026-08-15) - [Removing ACF as a Runtime Dependency from WordPress](https://angel-baez.com/blog/removing-acf-as-a-runtime-dependency-from-a-wordpress-multisite/): How I removed Advanced Custom Fields from Prepa IN — a WordPress LMS with 6,000+ PDF lessons — using native blocks, a PDF.js viewer, and a careful migration that also fixed PDFs on mobile. (2026-06-23) - [How I Achieved Perfect Lighthouse Scores (100 Across the Board)](https://angel-baez.com/blog/achieving-perfect-lighthouse-scores/): A deep dive into the tech stack and architecture decisions behind angel-baez.com — built with Astro, deployed on Cloudflare Pages, scoring 100/100/100/100 on Lighthouse. (2026-03-25) - [From YouTube Videos to Recipes with AI](https://angel-baez.com/blog/youtube-to-recipe-with-ai/): How I built a TypeScript CLI that turns cooking-video audio into structured recipes with Deepgram and the OpenAI API. (2026-07-17) - [First Year in Cancun](https://angel-baez.com/blog/first-year-in-cancun/): About new beginnings (2025-03-19) - [WordPress Security Best Practices for Developers](https://angel-baez.com/blog/wordpress-development-best-security-practices/): A layered WordPress security checklist covering updates, data handling, authorization, database access, authentication, HTTPS, and recovery. (2026-07-17) - [Implementing a Queue in TypeScript](https://angel-baez.com/blog/implementing-a-queue-in-typescript/): Implementing a queue in TypeScript (2024-07-14) - [A Tool for Dealing with Life Changes](https://angel-baez.com/blog/a-personal-tool-i-use-to-deal-with-changes-in-life/): A practical reflection exercise for comparing the cost of change with the cost of staying where you were. (2026-07-17) - [Visual Regression Testing with Playwright](https://angel-baez.com/blog/visual-regression-testing-with-playwright/): Visual testing with Playwright (2024-07-11) - [Using Levenshtein Distance and Python to Find Similar Names](https://angel-baez.com/blog/using-levenshtein-distance-and-python/): A Python script to find similar names using the Levenshtein distance algorithm. (2024-07-09) - [Implementing Confetti Animation with Vanilla JavaScript](https://angel-baez.com/blog/implementing-confeti-animation-with-vanilla-javascript/): Creating a confetti animation effect using vanilla JavaScript. (2024-07-08) - [Middle of the Linked List: Two-Pointer Technique](https://angel-baez.com/blog/middle-of-a-linked-list/): Solving the middle of the linked list problem on Leetcode (2024-07-07) - [Number of Steps to Reduce a Number to Zero](https://angel-baez.com/blog/number-of-steps-to-reduce-a-number-to-zero/): Solving the Number of Steps to Reduce a Number to Zero problem on Leetcode. (2024-07-06) - [FizzBuzz: Classic Coding Interview Problem](https://angel-baez.com/blog/fizzbuzz/): How I solved the FizzBuzz problem on Leetcode. (2024-07-05) - [Array Problems: Running Sum and Maximum Wealth](https://angel-baez.com/blog/sum-of-1d-array/): Solving Sum of 1d Array and Richest Customer Wealth problems on Leetcode. (2024-07-04) - [How to Set Up Dynamic Imports in Laravel Mix and TypeScript](https://angel-baez.com/blog/setup-dynamic-imports-laravel-mix-typescript/): Configure code splitting with dynamic imports in an existing Laravel Mix 6, webpack, and TypeScript project. (2026-07-17) ## Blog (Spanish) - [19 jóvenes con discapacidad se graduaron en el Senado de la República](https://angel-baez.com/es/blog/graduacion-prepa-in-senado-de-la-republica/): La historia de cómo 19 jóvenes con discapacidad concluyeron su bachillerato a través de Prepa IN, con una ceremonia de graduación en el Senado de la República. (2026-02-10) ## Optional - [Spanish home](https://angel-baez.com/es/): Spanish version of the site - [RSS feed](https://angel-baez.com/rss.xml): English blog feed - [RSS feed (Spanish)](https://angel-baez.com/es/rss.xml): Spanish blog feed - [Sitemap](https://angel-baez.com/sitemap-index.xml): Full page index - [GitHub](https://github.com/baezor/): Open-source projects and code - [LinkedIn](https://www.linkedin.com/in/angelromerobaez): Professional profile - [X](https://x.com/baezor/): Posts and updates