LOG // PROJECTS
Projects
Real problems. Real solutions. Click any card to see the full story.
LOG // PROJECTS
Real problems. Real solutions. Click any card to see the full story.
Multi-Tenant SaaS · Practice Management
Harbour is practice management for Mexican service businesses — barbershops, dental offices, clinics, salons. The dashboard opens on the numbers that decide the day: revenue collected, tickets still unpaid, stock about to run out, who is coming in at 2:30. Booking feeds that picture, but the product is everything that happens after the appointment is made — the cash register, the inventory, the client history, the staff kiosk. Every business is its own tenant behind its own slug, with its own branding, timezone, catalog, team, and payment account.
In a multi-tenant system, one leaky endpoint exposes every customer at once. Every authenticated query is scoped to the requesting user before it touches the database, so a tenant who guesses a competitor's slug gets a 403 — never their data. What makes that hold over time is a sweep in the test suite that walks every route mounted under a tenant slug and fails the build if a new one appears without being declared either scoped or deliberately public. Adding an endpoint and forgetting to secure it is not a code-review catch here; it is a red pipeline, and a red pipeline means no deploy.
Deposits are collected at booking through Stripe Connect, into an account that belongs to the business — not to a platform wallet. Harbour charges a monthly subscription and takes zero commission per transaction, so growth costs the client nothing extra and the incentives never drift apart. Card fees are absorbed by the business rather than passed to the customer, which is not just a courtesy: surcharging card payments has been illegal in Mexico since the 2024 consumer-protection reforms. Money moves as Decimal with half-up rounding, and deposits land on whole pesos so nothing at the counter ends in cents.
Messaging is the only cost that grows with every single appointment, which makes it the one line item that can invert a flat subscription. Priced against the real AWS tariffs, an SMS segment to Mexico runs $0.10 USD against $0.0115 for the same message over WhatsApp — 8.7x, and Mexico is 8.4x more expensive for SMS than the US, so every playbook written for that market misleads here. At the top plans, SMS would cost more than the plan charges: the better the client does, the more money the platform loses. So WhatsApp is the primary channel and SMS is the fallback, and skipping re-verification for a phone the business has already confirmed cuts the per-appointment message count nearly in half. That is architecture answering to a spreadsheet, not to taste.
Django 6 and DRF run under Gunicorn and Nginx on EC2, with managed RDS MySQL on its own host and S3 for tenant media; the Next.js 16 App Router frontend ships to Vercel's edge. The API and the app live on separate subdomains, which makes strict CORS the first wall rather than an afterthought. Auth is JWT with short access tokens and a module-level refresh queue — when five calls hit a 401 at once, one refresh fires and the rest park and retry, instead of five racing requests invalidating each other and logging the user out mid-task. Rate limits are enforced twice, at the DRF scope and again at the Nginx zone, and a 429 comes back as a countdown the user can read. Every push to main runs pytest, tsc, lint and vitest before anything reaches production.

Innovatec Winner · AI-Powered Smart Wardrobe
ClossApp took first place at the local stage of Innovatec, the innovation competition held at Instituto Tecnológico de Saltillo. The judging weighed the business case as heavily as the build — market, differentiation, unit economics and margin, not just a working demo. Winning it meant defending both: a product that actually runs, and the numbers that say why it deserves to exist.
"I have clothes and nothing to wear." This universal frustration has a real cost: time lost every morning, money wasted on forgotten purchases, and luxury pieces sitting idle that could be generating income. Existing apps make it worse — they require users to manually tag, categorize, and describe every single garment. Nobody does that.
ClossApp eliminates the barrier entirely. Take a photo — Claude AI analyzes it and returns a structured JSON with name, category, color, and style. No forms. No manual labels. The wardrobe builds itself. From there, a personalized outfit engine suggests combinations based on weather and occasion, pulling from the user's actual inventory.
The platform doubles as a peer-to-peer marketplace. Users can list garments for sale or rent directly from their digital wardrobe. Evening dresses and luxury accessories that collect dust can generate real income. The business model is a SaaS hybrid: freemium subscriptions (Plus at $59 MXN/mo, Elite at $89 MXN/mo) plus 8–15% commissions on marketplace transactions.
Built serverless on Next.js 15 with Supabase (PostgreSQL + Storage) and the Anthropic API. A client-side Canvas compression pipeline reduces image size by 90% before upload — keeping infrastructure costs near zero. A RBAC Guest Guard blocks unauthenticated users from hitting AI endpoints entirely, protecting API spend. Projected Year 1 gross margin: ~95%.
AI-Powered Exoplanet Discovery
For the 2025 NASA Space Apps Challenge, we chose the advanced "A World Away: Hunting for Exoplanets with AI" challenge. The problem was clear: while missions like Kepler, K2, and TESS have enabled the discovery of thousands of exoplanets, most were identified through time-consuming manual analysis. Our task was to create a machine learning model, trained on NASA's open datasets, that could automatically and accurately identify new exoplanets from raw astronomical data.
My team and I decided to go a step further. Instead of only developing a model, we built a full-stack interactive web platform to empower both researchers and citizen scientists. The platform allows users to upload their own astronomical data for evaluation by our models, train new models, and visualize the relationship between a celestial body and its host star.
As a core developer, I architected the full-stack application, leading the frontend development with Next.js and building the Python/Flask backend API to serve our machine learning models. I was responsible for the seamless integration between the complex data science backend and the intuitive user interface.

A Shared Finance PWA, Built for Two
My girlfriend Daya and I are moving in together, and for months our entire shared budget lived in a single Excel file: rent, groceries, savings goals, who-paid-what — all tracked by hand. It worked until it didn't. Formulas broke, updates lagged behind real life, and the person who actually needed to check it fastest — standing in a supermarket parking lot — had to open a spreadsheet on her phone to do it.
So I built us an app instead of a template. The one hard requirement: logging an expense takes under 10 seconds — big category buttons, a numeric keypad, a "who paid" toggle, done. The entire UI is in warm, jargon-free Spanish, because Daya is the one using it daily and she is not a systems engineer. It's a real PWA, installable on Android, and offline-first: if there's no signal, the expense saves to IndexedDB and syncs the moment connectivity returns — capturing a purchase should never depend on having bars.
Underneath the friendly UI is the same logic that ran our Excel, ported into a pure, fully tested module. Expenses split proportionally by income — not 50/50 — so if I earn more, I cover more, automatically. It tracks burn rate, runway, savings-goal progress, and real-vs-planned spend per category with ✓/⚠ indicators, plus three "cajitas" that mirror our actual Nu savings boxes: moving cushion, emergency fund, and furniture — each with its own target and the weekly pace needed to hit it before moving day.
The backend is AWS Lambda (Python) behind API Gateway, a single-table DynamoDB design, and Cognito auth with public registration disabled — there are exactly two accounts, hers and mine. Everything ships through CDK and deploys via GitHub Actions using OIDC, no stored AWS keys. Running cost for two people: about $0.30 a month. What started as an MVP for expense tracking has since grown into a services payment calendar and a live "shopping mode" grocery list — the app is now the actual command center for our move, not the spreadsheet.

IoT Water Level Monitoring
In many homes and buildings, water tanks run dry without warning — causing disruptions, wasted time, and unnecessary stress. Manual checks are unreliable and inefficient. WaterChecker was built to eliminate that uncertainty entirely, delivering real-time awareness directly to your phone.
This is not just a script — it's a complete IoT pipeline. An ESP32 microcontroller with an ultrasonic sensor takes 7 readings per cycle, applies a median filter to discard noise, then transmits a single, reliable data point to the cloud via HTTPS. The entire backend runs serverless on AWS: Lambda functions handle ingestion, querying, and alerting, while DynamoDB stores every reading. EventBridge triggers proactive alerts on a schedule.
The system integrates with the Twilio API to deliver a conversational WhatsApp bot. Ask it "¿Cuánta agua hay?" and it responds instantly with the current level in both percentage and liters. If the tank drops below 25%, the cloud supervisor fires an automatic alert — no action required from the user.
The ESP32 runs in Deep Sleep mode between readings, dramatically extending battery life for off-grid deployments. All credentials (WiFi, API keys, AWS ARNs) are managed through environment variables and .gitignore — never hardcoded. The entire cloud stack fits within the AWS Free Tier, making this a production-grade solution at near-zero cost.