Frontend y experiencia de producto
Construí interfaces de edición con React y Next.js: timeline, manipulación de clips, reproducción y controles de exportación.

Durante dieciséis meses trabajé a través de las distintas capas de Xnapper: interfaces de edición, lógica y estado de aplicación, procesamiento multimedia, persistencia y servicios backend para un producto comercial con aproximadamente 20.000 usuarios.
Visitar XnapperXnapper es una herramienta comercial de capturas de pantalla que se expandió hacia la edición de imagen y video. Como Desarrollador de Software del equipo, fui responsable de features en la interfaz, el estado de la aplicación, el procesamiento, la persistencia y las integraciones con servicios — no de una sola capa del stack.
La dificultad técnica surgió al pasar de la edición estática de capturas a flujos de video cuadro a cuadro que debían mantenerse confiables y mantenibles en distintos entornos de ejecución, sin sacrificar performance.
Construí interfaces de edición con React y Next.js: timeline, manipulación de clips, reproducción y controles de exportación.
Modelé el estado del editor, el historial de undo/redo y la persistencia de sesiones y presets, conectando la interfaz con los distintos flujos del producto.
Implementé el procesamiento de video con Node.js, FFmpeg y WebAssembly, coordinando archivos, reproducción, progreso y generación de resultados.
Diseñé y publiqué un servicio serverless de licenciamiento que aplicaba reglas comerciales por dispositivo y persistía el estado de las activaciones en Redis.
El producto necesitaba dejar atrás la edición estática de capturas y soportar flujos de video confiables sin sacrificar performance, mantenibilidad ni consistencia entre entornos.
La aplicación creada con Electron utiliza la aplicación web de Xnapper
Construí esta capacidad de punta a punta: desde las interacciones de timeline y el modelado del estado hasta la extracción de frames, el procesamiento y la exportación final.
Diseñé y publiqué un backend serverless para validar licencias comerciales y controlar la cantidad de dispositivos asociados a cada usuario.
La búsqueda nativa de video no era confiable en material con frame rate variable — podía terminar en el cuadro incorrecto, rompiendo la edición cuadro a cuadro.
Extraje los cuadros a través de un demuxer en lugar de depender de la búsqueda nativa, dándole al editor una fuente consistente y precisa sin importar la codificación original del clip.
Soportar múltiples destinos de exportación estaba esparciendo lógica condicional por todo el código, haciendo cada vez más riesgoso agregar una nueva opción de exportación.
Introduje una interfaz compartida de export strategy para que cada destino implemente el mismo contrato, concentrando la lógica de ramificación en un solo lugar en vez de condicionales dispersos.
El cliente podía validar la misma licencia repetidamente, y un dispositivo ya activo no debía duplicar su registro ni ocupar más de un lugar disponible.
Diseñé la activación como una operación idempotente: si el dispositivo ya estaba activo, el servicio devolvía éxito sin duplicar el registro. Las bajas se modelaron con soft-delete para conservar el historial sin consumir un lugar disponible.