IoT platform that monitors and automates hydroponic crops, split into 11 repositories and built by a team of five in which I'm the lead developer.
MicroPython firmware for the ESP32 that publishes sensor readings over MQTT with TLS, plus a simulator that feeds the demo with real weather and no hardware.
Spring Boot 4 API on Java 21 with MongoDB, Redis, JWT and OpenAPI, 130+ JUnit tests, which checks who owns each crop and each device.
FastAPI and scikit-learn assistant that diagnoses each crop with an expert system, fuzzy logic and models that forecast when a reading will leave its range.
React 19 and TypeScript PWA, built with Vite 8 and Tailwind 4, that shows each reading against its ideal range and lets the assistant act.
This site is a bilingual React and TypeScript portfolio with prerendered pages, a view per role, a page for every project and an assistant that answers in the browser.
Static prerendering of every view and every project, with per-route SEO, structured data, a sitemap and Open Graph images.
Each section loads its code and its copy separately, under budgets that CI checks for the startup JavaScript, the weight of each chunk and what the first paint needs.
Six role views that rewrite the copy, reorder the sections and bring forward what each profile looks for.
The GitHub figures come, on every CI build, from the stats my profile repository generates every day.
20+ FastAPI services that keep Zoho CRM in sync with the academic systems of 15+ institutions in Latin America and Spain.
One service per institution on a shared standard, with logic-free routers, controllers that normalize the data and a single access layer for each external system.
Connects PeopleSoft Campus Solutions over SOAP with WS-Security, SQL Server databases behind a VPN, CSV files over FTP, REST APIs and webhooks.
Long syncs answer 202 Accepted, run in the background and leave a record of every run in the CRM with its outcome and duration.
The newest services use idempotency keys, staggered retries when Zoho answers 429, jobs persisted in PostgreSQL and secrets encrypted with AES-256-GCM.
The stack that watches the integration services and the servers they run on, with metrics, logs, traces, probes and alerts in one place.
Prometheus scrapes 26 jobs across the instrumented FastAPI services, the containers through cAdvisor, the machines through Node Exporter and Nginx through its exporter.
18 Blackbox Exporter probes check from outside that every service and every domain answers, and that their TLS certificates are not about to expire.
Promtail ships the container logs to Loki through a read-only proxy of the Docker socket, and Tempo receives the services' OpenTelemetry traces.
Grafana holds 4 dashboards (Docker, FastAPI, machine and Nginx) and 12 alert rules, among them 500 errors in the integrations, containers restarting in a loop, disk and CPU, which reach Telegram.
Five widgets that live inside Zoho CRM to build quotes, enroll, capture leads, book appointments and change programs without leaving the record.
A quote builder that simulates the payment plan in the browser, applies discounts within their cap, generates the investment plan PDF and only writes to the CRM on confirmation.
A React enrollment assistant that runs, in order, the five Deluge functions that talk to PeopleSoft Campus Solutions, validates the data before each step and translates the academic system's errors.
Lead capture from a campaign, one by one or as a bulk import with a template, column mapping and a review before importing.
Appointment management on the CRM's events to create, reschedule, cancel and record the outcome, with business permissions that block the action when they cannot confirm a role.
Forms that institutions publish on their websites so an applicant can register, complete the application and upload documents, connected to the CRM through the integration services.
A multi-page flow that goes from lead registration to the full application that updates the opportunity, document upload and a thank-you page.
Cascading selects that load each institution's offering (unit, level, modality, schedule, term and program) from the academic hierarchy API.
A shared script for the CRM's web forms that keeps the UTM parameters in hidden fields and preselects the program from the URL.
Versions for undergraduate, graduate and continuing education, plus scholarship and family-relationship forms for the processes that need them.
A signature generator for the group's five brands that looks the same in Outlook, Gmail and Apple Mail.
A FastAPI and Jinja2 service with a form, a catalog per brand and theme, an .htm download for Outlook and a batch mode that turns a CSV into a ZIP with one signature per person.
Every logo ships twice, as a hosted image for modern clients and as the brand name in text for desktop Outlook, which renders with Word.
The fallback name is measured with an Arial Bold width table and shrinks one pixel at a time until it fits its column.
An audit renders every combination of brand, theme and badge and fails on anything an email client would break.
More than 90 admissions landing pages for five higher-education institutions that send every lead to Zoho CRM with the campaign that brought it.
React, TypeScript and Vite landing pages that capture UTM parameters, block double submissions, post to Zoho Forms and send the conversion event to Google Tag Manager.
WhatsApp, Meta Ads and Google Ads connected to the CRM through webhooks and REST, with Deluge functions and Zoho Creator apps for the sales teams.
Lead contact with AI agents in Dapta.
On postgraduate pages, the form asks for the applicant's level of studies and the answer reaches the CRM with the lead.
The infrastructure that publishes, watches and maintains 100+ landing pages for several clients on one VPS, without restarting anything on each deployment.
Each landing page calls a reusable GitHub Actions workflow that installs, builds, checks the base path, gzips the files, generates WebP images and uploads the result with rsync in two phases.
The deployment logs in as a user without a shell, confined with rrsync and with a pinned host key, and each client's Nginx mounts its landing pages read-only.
A single Nginx block serves any registered landing page, with assets immutable for a year, uncached HTML, WebP by negotiation and the Google Tag Manager tags injected on the server.
Scripts that apply one change to all 106 repositories (deploy workflow, Dependabot policy, environment files) and generate each client's Nginx configuration.
Nightly results for two lottery brands plus welcome and birthday emails, each one carrying the name and segment of the person who receives it.
A Python script queries the results API, fills a Jinja2 template that holds only variables and writes the HTML ready for the Amazon SES template.
Emails that a subscriber event triggers, such as the welcome and the birthday greeting.
Recipients come from a Zoho Analytics view through its bulk export API; each email carries the person's name and segment, and a column of the file can assign another template.
When a draw is not published yet, the script exits with its own code and the pipeline retries every 10 minutes, up to 9 times, before sending what was published.
A real estate agency's lead capture site, which shows the properties the company already keeps in Wasi, synced every day before dawn, and takes requests for advice, contact and visits.
Every day before dawn, a GitHub Actions workflow downloads the inventory from the Wasi API, publishes only the available properties and, when something changed, commits and starts the deployment.
The listing and its filters read a columnar index of 25 fields per property; each property's full record lives in its own file, fetched when its page opens.
When a property leaves Wasi, the next sync deletes its detail file.
Requests for advice, contact and visits reach a Supabase Edge Function that validates them and stores them in PostgreSQL.
The whole degree in one GitHub organization, with a repository per course, from the first pseudocode to distributed systems, networks on Cisco hardware, artificial intelligence and computer vision.
In distributed and parallel programming, a multiplayer bingo over TCP sockets with threads, a school system in Spring Boot with a GraphQL layer in FastAPI and React, and a Sudoku solved over RMI.
In artificial intelligence and data, a CLIPS expert system, fuzzy logic, genetic algorithms, music, wine and image classifiers, and lettuce disease detection with computer vision.
In networks and systems, real Cisco routers with OSPF, EIGRP and IPv6, SNMP monitoring, memory and scheduling algorithms on Linux, and ARM assembly.
In software engineering, test-driven development in six languages (111 tests), design patterns, SQL and NoSQL databases, and a full-stack store with Spring Boot, React and MongoDB in Docker Compose.
Three lab reports from the diploma, from reconnaissance with Nmap to privilege escalation, and the analysis of a cyberattack with its response plan.
Lab 1: reconnaissance of a vulnerable machine on an isolated Docker network, with Nmap scans from less to more detail until vsftpd 2.3.4 shows up, and research into its backdoor.
Lab 2: the analysis of a phishing attack that ends in double-extortion ransomware, its threats and vulnerabilities, the confidentiality, integrity and availability principles, a role-based access control matrix and a secure cloud architecture.
Lab 3: a complete CTF, from reconnaissance and an information leak to authorized brute force with Hydra and privilege escalation, plus a controlled availability test on WordPress with ApacheBench and wrk.
Controls aligned with ISO/IEC 27001, the NIST CSF and the SP 800-61 and SP 800-34 guides, and with Colombia's data protection law.
An image classifier built on MobileNetV2 that tells healthy lettuce, weeds and six diseases apart, meant for SmartPot, with an evaluation that shows where it fails.
MobileNetV2 with transfer learning on Kaggle's Lettuce Diseases dataset, with eight classes.
97.9% accuracy on 2,337 test images, with the confusion matrix and the per-class report kept in the repository.
Average recall per class is 65.7%, because the six diseases have between 6 and 30 test images each and the model gets between a third and two thirds of them right.
A Python package with training, evaluation and prediction scripts, set up with uv and tested on its configuration and dataset.
Ten radar images of a coastal area, filtered, clustered with K-Means and turned into a dataset, plus two restoration models that could not improve on the input.
Ten monthly Sentinel-1 images in VV polarization, from May 2025 to February 2026, rescaled and filtered with a 7 × 7 Lee filter.
K-Means with k = 3 and k = 4 on the filtered and unfiltered images, and a water versus land mask built from the clusters.
The ten dates, aligned and averaged, make a noise-free reference; 512 × 512 patches are cut from each pair for training.
In scene classification, ResNet50 with transfer learning reached 99.58% accuracy, while a sequential CNN trained from scratch overfit and collapsed to a single class.
The same CRUD written test by test in C#, Python, React, PHP, Rust and Go, plus the JUnit 5 exercises, in eight suites and 137 test cases that run in Docker.
A playlist CRUD built with TDD in six languages, which are C# with xUnit, Python with pytest, React with Vitest, PHP with PHPUnit, and Rust and Go with their own test tools.
All six share the model, with a validated entity, an in-memory repository, ids assigned by the repository and two kinds of error, and tests named the same way everywhere.
The JUnit 5 guide exercises in Java and Kotlin, and unit versus integration tests with Mockito.
A docker-compose file with one service per language that runs the eight suites without installing any SDK.
The course's four modules, with an expert system and a fuzzy one for candlestick charts, genetic algorithms, models for SmartPot and a reactive agent with its dashboard.
An expert system in CLIPS, called from Python with clipspy and with a Tkinter interface, that recognizes bullish and bearish engulfing patterns in two candlesticks.
A fuzzy logic system with scikit-fuzzy that uses the candle sizes and the engulfing difference to recommend investing a little, a normal amount or a lot.
Genetic algorithms that rebuild an image's color from its grayscale version, and that optimize a skydiver's jump to land on a given point.
For SmartPot, a logistic regression that controls the fans and a neural network that doses pH, with desktop and Streamlit versions.
The site of a fictional company that offers entrepreneurs a free digital payroll, in Spanish and English, with sign-up and a payroll form in PHP and MySQL.
A site in PHP, HTML, CSS and JavaScript with Spanish and English versions.
User sign-up and sign-in on MySQL with PDO.
A payroll form with base salary, days worked, health, pension, and overtime, night and holiday shifts, saved in the payroll table.
Lab reports of the cybersecurity diploma, with the vulnerability analysis of an FTP service, a CTF up to privilege escalation and the response to a cyberattack case.
Testing and configuration management, with CRUDs written test first in six languages, 111 tests on top of the JUnit exercises and a script that runs all eight suites in Docker.
Computer vision in five guides, on convolutions and color, a vision model behind an API, Sentinel-1 radar clustering, deep learning and lettuce disease detection.
In distributed and parallel programming, a multiplayer bingo over TCP sockets with threads, a school system in Spring Boot with a GraphQL layer in FastAPI and React, and a Sudoku solved over RMI.
Java, Spring Boot, Python, FastAPI, GraphQL, React
Artificial intelligence in four modules, with a CLIPS expert system, fuzzy logic, genetic algorithms that colorize images and classification models for SmartPot.
NoSQL databases, with MongoDB aggregations and a full-stack store with a Spring Boot API and JWT, a React frontend and all three services in Docker Compose.