Ingeniería de Backend
Servicios pensados para concurrencia y corrección bajo carga: manejo atómico de dinero, identidad por tokens y persistencia fuera del camino de la petición.
-
Real-Time Betting Validation API
DestacadoValidación de apuestas de alta concurrencia en Rust
Acepta tickets de apuestas en vivo y valida cuotas, verifica saldo y lo debita dentro de un único script Lua de Redis, luego responde al cliente antes de que la escritura llegue a PostgreSQL. La persistencia corre fuera del camino de la petición mediante un consumer group de Redis Streams que reprocesa su lista pendiente al arrancar, así un worker que muere a mitad de lote reprocesa en vez de perder datos. El dinero son centavos i64 de punta a punta — la capa de dominio no tiene aritmética de punto flotante.
- 1,000 req/s con p99 de 300 ms bajo pruebas de carga con k6
- Arquitectura hexagonal: el dominio declara puertos como traits y no importa infraestructura
- Contadores de Prometheus sin labels, así el número de series no puede crecer sin límite
- Rust
- Actix-Web
- Redis Streams
- PostgreSQL
- Docker
- k6
- Prometheus
-
Secure Banking Auth Service
DestacadoIdentidad por tokens con detección de robo de refresh tokens
Los refresh tokens son opacos, se guardan solo como digests SHA-256 y se agrupan en familias donde cada token es canjeable exactamente una vez. Esa regla de un solo uso convierte el robo en un evento detectable: si un token llega a canjearse dos veces, el servicio revoca la familia entera en vez de adivinar cuál de las dos partes es el atacante. Los access tokens llevan claims jti y ver, así que un JWT vivo puede retirarse antes de que expire.
- La carrera de rotación se cierra en SQL (UPDATE ... WHERE used_at IS NULL), no en código de aplicación
- Lista de denegación en Redis por jti, con TTL igual a la vida restante del token
- RBAC por permisos y endpoint; un incremento de versión retira una cantidad ilimitada de tokens vivos
- Rust
- Axum
- PostgreSQL
- Redis
- JWT
- SHA-256
-
Backend en Rust/Axum para un catálogo de generación de leads
Una plataforma de catálogo para empresas que no venden en línea sino que generan leads mediante cotizaciones. El lado público navega productos con búsqueda, filtros y fichas técnicas en PDF y envía solicitudes de cotización; detrás hay un panel de administración con CRUD completo sobre productos y categorías, carga de archivos y gestión de solicitudes. Los RUC peruanos se validan con el algoritmo de Módulo 11 y no por longitud, así que un RUC inválido se rechaza en el formulario y no aguas abajo.
- Rust y Axum sobre PostgreSQL, con almacenamiento de archivos compatible con S3
- Autenticación JWT con hashing de contraseñas mediante Argon2id
- Frontend en Astro y TypeScript con Nano Stores para el estado compartido
- Rust
- Axum
- PostgreSQL
- JWT
- Argon2id
- Astro
- TypeScript
- S3
Ciencia de Datos
Pipelines sobre datos públicos reales y sucios, evaluados contra un baseline explícito — y marcados como no evaluados donde no existe ground truth etiquetado.
-
GoalData League
DestacadoRecuperación y ranking de fútbol sobre 1.75M de acciones de evento
Ingesta partidos, plantillas y streams de eventos en un esquema relacional, comprime temporadas-jugador en embeddings PCA y sirve búsqueda de similitud item-item: dada una temporada-jugador, rankea los comparables más cercanos dentro de un pool filtrado por posición. El mismo embedding alimenta una capa de clustering, un grafo de similitud k-NN y un optimizador ILP de once inicial.
- 94,525 partidos · 1,751,751 acciones de evento · 52,387 temporadas-jugador
- Recall@10 0.1435 vs 0.0614 del baseline; MRR 0.1788 vs 0.0773; NDCG@10 0.1146 vs 0.0430
- Leave-one-out sobre 3,670 temporadas-jugador, 1,662 consultas, pool de evaluación idéntico para ambos sistemas
- Python
- Polars
- pandas
- scikit-learn
- PCA
- Parquet
- Streamlit
-
Hospital Bed Prediction
DestacadoDescenso de gradiente distribuido en Go sobre 200,000 registros
Tres modelos lineales generalizados — uno logístico, dos lineales — entrenados por descenso de gradiente en Go para predecir riesgo de mortalidad, días de supervivencia y costo de tratamiento. El entrenamiento paraleliza de dos formas sobre el mismo código map-reduce: fan-out de goroutines dentro de un nodo y un clúster parameter-server sobre net/rpc entre nodos. Las capas REST, JWT y WebSocket son librería estándar; go.mod declara dos dependencias directas.
- AUC de mortalidad 0.770 contra una referencia aleatoria de 0.500; accuracy 0.832
- R² de supervivencia 0.906 (RMSE 199 días) · R² de costo 0.983 (RMSE $1,494)
- Speedup de 2.95× que satura en 4 workers en una máquina de 4 núcleos, medido en 3 repeticiones
- Go
- MongoDB
- Redis
- net/rpc
- Docker
-
Resolución de entidades que vincula candidatos con registros públicos de sanciones
Un pipeline medallion en Polars que consolida candidatos presidenciales y congresales peruanos desde el JNE, el Congreso y portales de transparencia, vincula cada uno con empresas sancionadas por OSCE y calcula un índice de riesgo reproducible servido por una capa de lectura FastAPI sobre Parquet. Los matches determinísticos DNI→RUC y los difusos por nombre se etiquetan por separado en cada fila, así una conjetura no verificable nunca parece un vínculo documentado.
- Cinco capas: raw → staging → normalized → matched → curated
- Riesgo financiero sobre mediana + MAD × 1.4826 en vez de media y desviación estándar, porque los bienes declarados están muy sesgados
- El matcher no tiene ground truth etiquetado — precisión y recall no están medidos, y el repositorio lo declara
- Python
- Polars
- FastAPI
- Parquet
- FAISS
- Docker
Inteligencia Artificial
Recuperación por embeddings, visión por computadora y pipelines de NLP — con la brecha de evaluación declarada sin rodeos donde el trabajo de precisión aún no está hecho.
-
Matching estudiante/oferta por embeddings en cuatro servicios
Los perfiles de estudiantes y las ofertas de empresas se convierten en texto ponderado por campo, se embeben con un sentence-transformer multilingüe, se indexan en Qdrant y se rankean por k-NN coseno. Una capa de swipe de dos lados registra la intención y solo promueve un par a match cuando ambos deslizan a la derecha. La importancia de cada campo se expresa repitiendo términos en el texto de entrada — skills requeridos ×10, área ×8 — porque el encoder no acepta ponderación por campo.
- Cuatro servicios; 20 tablas relacionales sobre SQLAlchemy async, organizadas como puertos y adaptadores
- El texto en español se lematiza y se le quitan stop-words con spaCy antes de codificar
- El recomendador no está evaluado: aún no hay split held-out ni etiquetas de relevancia, y el repositorio lo declara
- Python
- FastAPI
- PostgreSQL
- Qdrant
- sentence-transformers
- spaCy
-
Detección de placas, del detector a las apps de campo
Un detector YOLOv8 entrenado con 2,620 fotos anotadas de placas peruanas, envuelto en un servicio Flask que recorta la placa y le corre OCR. Una app de escritorio en Electron es la estación de inspección y una app móvil en Expo es el cliente de campo; ambas hablan con la misma API HTTP sobre un solo esquema de Supabase.
- 4,144 cajas sobre 2,433 imágenes de entrenamiento — 1.70 placas por imagen, o sea multi-objeto, no un solo objeto
- Caja mediana de 504 px², 0.12% del frame: por debajo del umbral de objeto pequeño de COCO, que es lo que determina imgsz
- El detector no tiene evaluación commiteada — no se afirma ningún mAP, y el repositorio explica por qué
Repositorio colaborativo — alojado en la cuenta de un compañero de equipo.
- Python
- YOLOv8
- PaddleOCR
- Flask
- Supabase
- Electron
- React Native
-
Asistente de comunicación con pictogramas
Una aplicación web de comunicación aumentativa que convierte texto en español a pictogramas en tiempo real. Un backend en FastAPI sirve chat por REST y WebSocket, lematiza el texto entrante con spaCy antes de buscar los términos contra el conjunto de pictogramas ARASAAC, y alimenta un constructor de oraciones y un asistente tutor en un cliente React.
- FastAPI sobre REST y WebSockets; cliente en React y Vite
- spaCy es_core_news_lg lematiza el español antes de buscar el pictograma, así las formas flexionadas resuelven a un mismo símbolo
- La clasificación de foto a pictograma figura como condicional en el repositorio — esa parte está incompleta
- Python
- FastAPI
- WebSockets
- spaCy
- TensorFlow/Keras
- React
- Vite
- Tailwind CSS
Hub Central
Sistemas que cruzan más de una capa y más de un lenguaje: un pipeline con el cliente que lo consume, un backend con el modelo y la interfaz encima.
-
Semantic Search — Court Records
DestacadoPipeline concurrente de anonimización de expedientes judiciales
Un pipeline de worker pool en Go que normaliza y anonimiza el texto de expedientes del Tribunal Constitucional peruano, alimentado por un scraper y una capa de EDA en Python que construyen el corpus. La pregunta que el repositorio responde con mediciones es cómo escala un pool de goroutines alimentado por canales de 15 a 150 workers.
- 149,387 expedientes de origen; el pipeline escala a un corpus combinado de aproximadamente 1.4M de filas
- 10.26× de throughput al pasar de 15 a 150 workers, medido en 1,100 corridas cronometradas commiteadas al repo
- La eficiencia por encima del 100% es un artefacto de un costo por registro simulado, no trabajo real de CPU — declarado como limitación
- Go
- Python
- pandas
- semantic search
-
Ingesta de CVs, entrevista simulada con IA y ranking automatizado
Una plataforma para reclutadores que almacena CVs, extrae información estructurada de los PDFs, corre una entrevista simulada con un asistente conversacional y produce un ranking automatizado de candidatos por oferta laboral. Backend en FastAPI con cliente en React y TypeScript.
- En etapa de prototipo: la persistencia es una caché en memoria, no una base de datos
- El scoring combina desempeño en la entrevista con ajuste a la oferta
- Python
- FastAPI
- React
- TypeScript
- Tailwind CSS
- PDF extraction
-
Plataforma de tutorías académicas en Java + Spring Boot
Un marketplace de tutorías que cubre registro, disponibilidad de tutores, reserva de sesiones, pagos simulados, enlaces de sesión y reseñas. Backend REST en Java/Spring Boot contra un esquema relacional, con cliente en React y TypeScript; el repositorio incluye el modelo UML, el diagrama de base de datos y el backlog completo entregado.
- 16 historias de usuario entregadas de punta a punta
- Alrededor del 90% de los endpoints de la API los construí yo
- Esquema relacional y diagramas UML commiteados junto al código
Desarrollador en un equipo universitario de cinco personas; construí alrededor del 90% de los endpoints de la API.
- Java
- Spring Boot
- React
- TypeScript
- SQL
Experiencia
Donde el trabajo fue pagado, llegó a usuarios reales, o ambas.
-
Zoluxiones
Practicante de Ingeniería de Software · consultora de TI · rol actual
Practicante de ingeniería de software en una consultora de TI, trabajando en plataforma interna y automatización. Los entregables de cliente y los productos internos son confidenciales y deliberadamente no se describen aquí.
- Rol actual
- Trabajo de backend y automatización bajo confidencialidad
- Python
- TypeScript
- PostgreSQL
- Docker
- CI/CD
-
Cofundador · marketplace de matching de CVs con usuarios reales
Cofundé una plataforma que conecta estudiantes universitarios con retos reales publicados por empresas, y la llevamos a usuarios reales. El backend es dueño del dominio relacional — estudiantes, empresas, ofertas, skills, matches y acuerdos — sobre SQLAlchemy async y PostgreSQL, y delega el ranking de candidatos a un servicio de IA aparte por HTTP.
- 15 entidades de dominio y 8 casos de uso detrás de interfaces de puerto explícitas
- 8 endpoints HTTP; FastAPI confinado al adaptador de entrada
- Sin tests automatizados y sin etapa de test en CI — declarado en el repositorio
- Python
- FastAPI
- SQLAlchemy
- PostgreSQL
- JWT
- gunicorn
- Azure
-
Kreante
Practicante de Desarrollo No-Code · entrega de MVPs en Bubble
Construí MVPs funcionales en Bubble para que las ideas de los clientes pudieran validarse con usuarios antes de comprometer presupuesto de ingeniería.
- Entrega no-code en Bubble
- Bubble
- No-code