Home

Projects

Real code, real problems, no filler.

Scroll

ChambaFlow

Applying on OCC and Computrabajo is repetitive by design: search, open, read, click, go back. ChambaFlow eliminates that cycle with a bot that attaches to your active browser session, without storing or intercepting credentials, because the right approach was to never need them. The technical bet was remote debugging: instead of managing authentication (brittle, hard to maintain), the bot inherits your already-open session and operates from there. The entire configuration, keywords, platforms, filters, lives in a single YAML file.

PythonGitGitHubSelenium

Pásalo

Pásalo is a community-driven platform designed to redistribute items locally without friction. Unlike traditional classifieds, there is no buying, selling, or negotiation, the focus is on directly connecting people who have useful items with those who actually need them. The system prioritizes immediacy and user experience: posting takes seconds, browsing adapts to your location, and interactions are designed to be clear and frictionless. More than a listings app, Pásalo aims to promote a culture of reuse, reducing waste while strengthening local communities through thoughtful technology.

Next.jsReactTypeScriptPostgreSQLSupabase+10

DescífraMX

Most Mexicans use their CURP without knowing what each character encodes. DescífraMX dismantles it visually in real time: date of birth, state, sex, check digit, and flagged words, field by field, with context. With over 1,000 recorded queries and a public REST API documented with OpenAPI, the most important decision was privacy-by-design: no data leaves the browser. No backend, no logs, no database.

Next.jsTypeScriptReactTailwind CSSShadcn UI+6

MiInbox

An email client is one of the most demanding state problems in frontend: read/unread messages, threads, real-time search, composition, everything must stay synchronized without visible lag or cascading re-renders. MiInbox solves this with Zustand as the central state layer: a store that keeps inboxes consistent without triggering unnecessary renders. The result is an interface that responds instantly regardless of how many messages are active in parallel.

ReactReact RouterTypeScriptv0Vitest+3

GitQuick

Most Git tutorials teach commands. GitQuick teaches you to reason about history: what happens when you merge two branches with conflicts, when a rebase can destroy shared history, and how to undo a mistake without panicking. Organized into logical blocks, basics, branches, remotes, conflicts, it works as a quick reference while you work, not just a reading guide. Every command includes a real example, not just its signature.

HTML5CSS3JavaScriptNetlifyVue+4

Pokédex

Over 1,000 Pokémon with types, base stats, abilities and sprites, all served from PokéAPI v2. The challenge wasn't consuming the API, it was doing it without degrading the experience: local cache to avoid duplicate requests, pagination that doesn't block render, and real-time search over the full dataset. The result is an interface that feels fluid even when filtering across lists of this size.

ReactTypeScriptTailwind CSSViteGit+1

Tetris

Tetris seems simple until you try to implement it: collision detection is a matrix problem, piece rotation must respect board boundaries, and speed must scale without losing responsiveness. Built with vanilla JavaScript and Canvas API, no framework, because the point was to solve the problem, not delegate it. The result is a complete game with a scoring system, level progression, and smooth keyboard controls.

JavaScriptHTML5CSS3GitGitHub

Aparecen.mx

Aparecen.mx is a free civic tool designed to help families, collectives, and citizens in Mexico quickly generate search alerts for missing persons. The platform automates design using emergency communication principles: high contrast, strong visual hierarchy, and optimization for both social media and physical printing. The key design decision was privacy: all data is processed entirely in the user's browser (client-side), with no databases, no storage, and no external data transmission.

Next.jsReactTypeScriptTailwind CSSShadcn UI+8
ChambaFlow
OCC / ComputrabajoPlatforms
One YAML fileConfiguration
CLI / Interactive menuUsage
Applying on OCC and Computrabajo is repetitive by design: search, open, read, click, go back. ChambaFlow eliminates that cycle with a bot that attaches to your active browser session, without storing or intercepting credentials, because the right approach was to never need them. The technical bet was remote debugging: instead of managing authentication (brittle, hard to maintain), the bot inherits your already-open session and operates from there. The entire configuration, keywords, platforms, filters, lives in a single YAML file.
Problem / Context

Searching for jobs on OCC and Computrabajo involves a very repetitive flow by design.

Technical approach

Remote debugging: the bot attaches to your already-logged-in browser session to automate the clicks.

Results

Console or CLI-operable tool that automatically applies while respecting your active session.

  • Remote debugging is more resilient than handling authentication directly.
  • A YAML config file can replace an entire UI.
Pásalo
Functional MVPProduct
Post in secondsInteraction
No transactionsModel
Pásalo is a community-driven platform designed to redistribute items locally without friction. Unlike traditional classifieds, there is no buying, selling, or negotiation, the focus is on directly connecting people who have useful items with those who actually need them. The system prioritizes immediacy and user experience: posting takes seconds, browsing adapts to your location, and interactions are designed to be clear and frictionless. More than a listings app, Pásalo aims to promote a culture of reuse, reducing waste while strengthening local communities through thoughtful technology.
Problem definition

Traditional classifieds introduce unnecessary friction (pricing, negotiation, trust issues). The problem is reframed as direct redistribution.

Experience design

Built around speed and clarity: fast posting, location-based exploration, and fewer decisions.

System development

Full implementation including item management, user profiles, persistent favorites, and client-side image optimization.

Polish & interaction

Micro-interactions and animations enhance usability and perceived quality.

  • Reducing choices (like removing pricing) can improve adoption.
  • Perceived speed is as important as actual performance.
  • Hyperlocal focus significantly changes user behavior.
  • Visual design and micro-interactions directly impact trust.
DescífraMX
1K+Queries
Next.js FullstackStack
100% client-sidePrivacy
Most Mexicans use their CURP without knowing what each character encodes. DescífraMX dismantles it visually in real time: date of birth, state, sex, check digit, and flagged words, field by field, with context. With over 1,000 recorded queries and a public REST API documented with OpenAPI, the most important decision was privacy-by-design: no data leaves the browser. No backend, no logs, no database.
Problem / Context

Most online CURP/RFC tools send data to external servers, a serious concern for government identity information.

Solution design

Inspector-style experience that visually dismantles each character of the CURP/RFC, processing everything locally in the browser.

Implementation

Pure parsing logic in Next.js + TypeScript: no backend required. Public REST API documented with OpenAPI, installable as a PWA.

Results

Over 1,000 queries with zero privacy incidents, because no data ever left the user's browser.

  • Privacy-by-design can be a key differentiator.
  • Good visual design helps clarify ambiguous legal concepts.
MiInbox
50+Simulated messages
SPA + ZustandArchitecture
An email client is one of the most demanding state problems in frontend: read/unread messages, threads, real-time search, composition, everything must stay synchronized without visible lag or cascading re-renders. MiInbox solves this with Zustand as the central state layer: a store that keeps inboxes consistent without triggering unnecessary renders. The result is an interface that responds instantly regardless of how many messages are active in parallel.
Problem / Context

Email clients with fragmented state trigger cascading re-renders: updating one inbox breaks another. The challenge was maintaining global consistency without performance overhead.

State architecture

Central Zustand store that keeps inboxes, read state, and composition in sync, only re-rendering components that actually depend on the changed slice.

Interface & navigation

Three-column layout (inboxes, message list, detail view) with React Router, real-time search, and floating compose window, all without page reloads.

Testing

Vitest test suite covering the Zustand store, ensuring read, archive, and search flows behave predictably under concurrent conditions.

  • Prioritize clarity of hierarchies in the inbox view.
  • Zustand radically simplifies props in overwhelming interfaces.
GitQuick
20+Commands
Interactive guideFormat
Most Git tutorials teach commands. GitQuick teaches you to reason about history: what happens when you merge two branches with conflicts, when a rebase can destroy shared history, and how to undo a mistake without panicking. Organized into logical blocks, basics, branches, remotes, conflicts, it works as a quick reference while you work, not just a reading guide. Every command includes a real example, not just its signature.
Problem / Context

Git tutorials teach syntax. GitQuick was built to teach reasoning about history: what a rebase destroys, when force-push is dangerous, how to undo mistakes without panic.

Content design

Logical blocks (basics, branches, remotes, conflicts) with real examples for each command, not just the signature, but the context of when and why to use it.

Implementation

Built with Vue 3 and Vite for instant load. Vitest to validate code examples are correct before publishing.

  • Examples in Git are more powerful than technical theory.
  • Documentation must be designed with its own mental CMS.
Pokédex
1000+Available Pokémon
PokéAPI v2Data source
Real-timeSearch
Over 1,000 Pokémon with types, base stats, abilities and sprites, all served from PokéAPI v2. The challenge wasn't consuming the API, it was doing it without degrading the experience: local cache to avoid duplicate requests, pagination that doesn't block render, and real-time search over the full dataset. The result is an interface that feels fluid even when filtering across lists of this size.
Problem / Context

Over 1,000 entries from a public API: the challenge wasn't fetching the data, it was doing so without degrading the experience through blocking renders or duplicate requests.

Design & integration

In-memory cache strategy: PokéAPI responses are stored on-the-fly to avoid re-fetching already-visited Pokémon. Intersection-based scroll pagination, non-blocking.

Implementation

Combined type filters and real-time search across the full dataset. Detail view with base stats, abilities, and sprites, built with React + TypeScript and Vite.

  • Local cache drastically reduces requests to public APIs.
  • Designing UI for large lists requires virtualization or pagination from the start.
Tetris
Vanilla JSFramework
Canvas APIRendering
Dynamic speedLevels
Tetris seems simple until you try to implement it: collision detection is a matrix problem, piece rotation must respect board boundaries, and speed must scale without losing responsiveness. Built with vanilla JavaScript and Canvas API, no framework, because the point was to solve the problem, not delegate it. The result is a complete game with a scoring system, level progression, and smooth keyboard controls.
Motivation

Tetris looks simple until you try to implement it. Deliberately chosen to solve a classic problem from scratch, no game engine, no framework to delegate the logic to.

Game logic

Matrix-based collision detection: each piece is a sub-matrix on the board. Rotation with boundary validation. Line clearing and board descent in O(n).

Rendering & progression

Canvas API rendering: full control over every frame. Scoring system with multiplier for simultaneous lines, progressive speed levels, and game-over management.

  • Canvas API gives full rendering control at the cost of greater complexity.
  • Collision logic in grids requires clear matrix thinking.
Aparecen.mx
FreeCost
100% client-sidePrivacy
PNG + PDFOutput
Aparecen.mx is a free civic tool designed to help families, collectives, and citizens in Mexico quickly generate search alerts for missing persons. The platform automates design using emergency communication principles: high contrast, strong visual hierarchy, and optimization for both social media and physical printing. The key design decision was privacy: all data is processed entirely in the user's browser (client-side), with no databases, no storage, and no external data transmission.
Problem research

Identified friction points in search alert creation: design delays, reliance on third parties, and lack of standardization.

Emergency-first design

Visual system focused on immediate impact: readability, contrast, and social feed optimization.

Private architecture

100% client-side implementation to avoid storing sensitive data and ensure anonymity.

Generation & export

Dual export system: PNG for digital platforms and print-ready PDF.

  • Privacy-by-design is critical in high-risk products.
  • Visual design directly impacts information reach and effectiveness.
  • Reducing friction in critical moments can have real-world impact.
  • Client-side architectures are powerful for sensitive tools without backend complexity.