# Not Carlos Serrano > Desarrollador full stack (Python + Vue). Si algo le molesta dos veces, le escribe un programa. ## Perfil - Trabajo actual: sistema de gestión de almacenes (WMS). Backend, frontend, despliegues con Docker y Azure y trato directo con el cliente. - Núcleo: Python, FastAPI · Vue, Vuetify, TypeScript · PostgreSQL, Supabase, Redis · Docker, Azure, Vercel. - Idiomas: español, catalán, inglés. ## Registro de molestias (proyectos propios) ### Twitch VOD Spoiler Free (M-001) > Un reproductor de VODs que esconde la línea de tiempo. URL: https://notcarlosserrano.com/m/twitch - TIPO: Web app - STACK: Vue 3 · Vuetify 3 · TypeScript - FUNCIONA CON: VODs públicos de Twitch - DESPLIEGUE: Vercel #### La molestia Ver un VOD de Twitch y saber cuánto queda me destripa el final. #### La idea: Si no ves la barra, no hay spoiler. Saber que quedan diez minutos de partida ya es un spoiler. La barra de progreso, la duración y el tiempo transcurrido cuentan el final antes de tiempo. Este reproductor carga el VOD y cambia los controles de Twitch por otros relativos: avanzas o retrocedes sin saber nunca en qué punto estás. #### Cómo funciona 1. EL ENLACE: twitch.tv/videos/… (pegas la URL o el ID) 2. EL REPRODUCTOR: Embed de Twitch (con la línea de tiempo tapada) 3. TUS CONTROLES: −15 −5 −1 · +1 +5 +15 (y atajos de teclado) Basta con el número del VOD en la dirección para abrirlo directamente, y los últimos que has visto quedan a mano para volver a ellos. #### Los detalles: Todo el control, ninguna pista. - Saltos de 1, 5 y 15 minutos, hacia delante y hacia atrás. - Atajos de teclado: espacio, M, F y flechas; con Shift, de cinco en cinco. - Recuerda los últimos VODs que has visto. - Selector de calidad y pantalla completa sin salir del modo sin spoilers. - Sin backend: un despliegue en Vercel y listo. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Saltos relativos de 1, 5 y 15 minutos y atajos de teclado: ves el VOD entero sin saber nunca cuánto queda. ### lightsout (M-002) > Un interruptor de hombre muerto para dos Raspberry Pi: si dejan de dar señales, me llega un aviso. URL: https://notcarlosserrano.com/m/lightsout - TIPO: Raspberry Pi · servicio - STACK: Bash · curl · systemd - AVISA POR: Telegram - LICENCIA: MIT #### La molestia Se va la luz en casa y me entero al abrir el congelador. #### La idea: El vigilante no puede vivir en casa. Todo lo que corre en casa muere en el mismo apagón que debería avisar. Un script en la Pi no puede escribirte para contar su propia muerte. Así que las Pis solo demuestran que siguen vivas, cada 5 minutos. Lo que dispara la alarma es el silencio, y lo detecta un servidor en internet que no depende de mi enchufe. #### Cómo funciona 1. EN CASA: pi-hole · pi-docker (latido cada 5 min) 2. EN INTERNET: healthchecks.io (un check por Pi · 10 min de gracia) 3. EN TU MÓVIL: Telegram (aviso cuando hay silencio) Si las dos Pis callan a la vez, algo ha pasado en casa. Si calla solo una, el problema es esa Pi. Al volver, cada una cuenta cuánto tiempo estuvo caída y si fue un apagón o un reinicio. #### Los detalles: Pensado para no fallar cuando importa. - Sin batería ni SAI: el aviso nace del silencio, no de un último mensaje que nunca saldría. - Un check por Pi: si cae solo una, sabes al momento que la casa está bien. - Diez minutos de gracia: un ping perdido no te despierta a las tres de la mañana. - El instalador se puede repetir: recuerda tu configuración y no te pide el token dos veces. - Todos los scripts pasan shellcheck, y los tests cortan la luz de verdad con docker kill. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Distingue un apagón de un reinicio y te dice cuánto tiempo estuvo la casa a oscuras. ### YouTube Improvements (M-003) > Catorce ajustes para YouTube, cada uno con su interruptor. URL: https://notcarlosserrano.com/m/youtube - TIPO: Extensión Chrome · MV3 - STACK: JavaScript sin dependencias - PERMISOS: Solo storage - IDIOMAS: 8 #### La molestia YouTube decide por mí: doblaje automático, Shorts, autoplay, calidad baja. #### La idea: Instalarla no cambia nada. Tú eliges qué encender. YouTube decide demasiado: dobla los vídeos al idioma de tu cuenta, mete Shorts por todas partes, encadena el siguiente vídeo y baja la calidad cuando quiere. Cada mejora es un módulo independiente que se enciende desde el popup y se aplica al momento en todas las pestañas, sin recargar. #### Cómo funciona 1. REPRODUCCIÓN: Audio original · calidad · velocidad (y volumen hasta el 300 %) 2. DISEÑO: Vídeos por fila · Shorts (de 2 a 8 columnas, o sin Shorts) 3. DISTRACCIONES: Modo concentración (sin autoplay ni pantallas finales) Añadir una mejora nueva es crear una carpeta y registrarla en el manifest. Nada más del núcleo cambia. #### Los detalles: Respeta tu YouTube y tu privacidad. - Las 14 mejoras vienen apagadas: instalarla no cambia nada. - Ningún dato sale del navegador: sin red, sin analíticas y un solo permiso. - Si una mejora falla, las demás siguen funcionando. - Tus ajustes se exportan e importan en un archivo. - En 8 idiomas, con selector propio aunque Chrome no lo ofrezca. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: 14 mejoras, todas apagadas por defecto, en 8 idiomas y sin una sola petición de red. ### Tornos (M-004) > Abrir el torno de la oficina con un solo toque. URL: https://notcarlosserrano.com/m/tornos - TIPO: PWA - STACK: Vue - MODOS: Texto o iconos - TEMA: Claro y oscuro #### La molestia Abrir el torno de la oficina con su app tarda más que cruzarlo. #### La idea: Del bolsillo al torno, sin esperar a la cámara. La app oficial obligaba a abrirla, esperar a que cargase la cámara y apuntar. Cada mañana, en la puerta. Tornos se instala como una app más y muestra un botón por torno. Lo tocas y se abre. #### Cómo funciona 1. TU MÓVIL: Icono en la pantalla de inicio (instalada como PWA) 2. UN TOQUE: El torno que quieres (por nombre o por posición) 3. LA PUERTA: Acceso abierto (con tu sesión, renovada sola) Se conecta al sistema de accesos con tres direcciones: inicio de sesión, renovación de la sesión y apertura. #### Los detalles: Cero fricción en la puerta. - Instalable en Android, iPhone y escritorio. - Modo texto o modo iconos con la posición de cada torno. - La sesión se renueva sola: no vuelves a meter la contraseña. - Modo claro y modo oscuro. - Ni cámara ni QR: un toque. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Se instala como app: un toque desde la pantalla de inicio y el torno se abre. ### catia-kit (M-005) > De CATIA V5 a la BOM en Excel sin copiar nada a mano. URL: https://notcarlosserrano.com/m/catia - TIPO: Escritorio + web - STACK: Python · FastAPI · Nuitka - GENERA: Excel · PowerPoint - DATOS: No se guardan #### La molestia Pasar a mano la lista de piezas de CATIA a Excel y a PowerPoint. #### La idea: Un clic en el PC con CATIA. El resto, en la web. En una oficina técnica de moldes, las listas de piezas y las presentaciones de cambios se hacían copiando datos de CATIA a mano. Lento y fácil de equivocar. Un .exe de un clic recorre el árbol del producto y lo empaqueta en un .zip. La web lo procesa y devuelve los documentos de siempre. #### Cómo funciona 1. PC CON CATIA: catia-kit-volcado.exe (un clic · solo lectura) 2. LA WEB: Subir el .zip (resumen y avisos) 3. DOCUMENTOS: BOM · PowerPoint de cambios (listos para enviar) La web procesa el volcado sin guardarlo: los datos del cliente no se quedan en ningún servidor. #### Los detalles: Hecho para gente que no quiere tocar código. - Nunca guarda ni modifica el modelo de CATIA. - BOM en cuatro hojas: estructurada, plana, avisos y resumen. - Compara dos revisiones pieza a pieza y genera una diapositiva por cambio. - Avisa de piezas sin material, masas a cero o referencias repetidas. - El .exe se compila y se publica solo con GitHub Actions. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Un clic, solo lectura: nunca toca el modelo. Compara revisiones y genera el PowerPoint de cambios. ### VideoStutterAnalyzer (M-006) > Mide los tirones de un vídeo, frame a frame. URL: https://notcarlosserrano.com/m/stutter - TIPO: CLI + librería - STACK: Python · PyAV · OpenCV - GENERA: JSON · CSV · gráficas - LICENCIA: MIT #### La molestia Un vídeo da tirones y nadie sabe decir dónde ni cuántos. #### La idea: «Va a tirones» no es una métrica. Un vídeo que no va fluido puede tener frames perdidos, duplicados o un ritmo irregular. A simple vista, todo parece lo mismo. VideoStutterAnalyzer lee la marca de tiempo exacta de cada frame y convierte esa sensación en números, eventos y gráficas. #### Cómo funciona 1. EL VÍDEO: video.mp4 (timestamps exactos con PyAV) 2. EL ANÁLISIS: Detectores (perdidos · duplicados · jitter · pausas) 3. EL INFORME: report.json + gráficas (en consola y en disco) Un comando, videostutter analyze video.mp4, y en la carpeta de informes aparecen el JSON, el CSV y cuatro gráficas. #### Los detalles: Precisión de laboratorio en una terminal. - Distingue entre frame rate constante y variable. - Tiempo entre frames: media, mediana, p95 y p99. - Cada evento llega con su momento exacto y su gravedad. - Se usa desde la terminal o como librería de Python. - Módulos de una sola responsabilidad, listos para añadir la reparación automática. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Encuentra frames perdidos, duplicados y jitter, con informes y gráficas. La arquitectura ya deja sitio para repararlos. ### Bulk Empty Files (M-007) > Crea muchos archivos vacíos de una sola vez. URL: https://notcarlosserrano.com/m/bulk - TIPO: Extensión VS Code - STACK: TypeScript · VS Code API - DÓNDE: Marketplace - CÓDIGO: Abierto #### La molestia Crear treinta archivos vacíos en VS Code, uno a uno. #### La idea: Treinta archivos, un solo paso. Empezar un módulo nuevo a veces significa crear decenas de archivos vacíos, uno detrás de otro, con el mismo clic derecho. Bulk Empty Files los crea todos de golpe a partir de sus nombres y extensiones. #### Cómo funciona 1. TÚ ESCRIBES: Nombres y extensiones (en una sola entrada) 2. LA EXTENSIÓN: Comprueba (qué existe ya) 3. EL RESULTADO: Archivos creados (sin tocar los existentes) Disponible en el Marketplace de Visual Studio Code. #### Los detalles: Pequeña, segura y publicada. - Nombres y extensiones flexibles en una sola pasada. - Nunca sobrescribe un archivo que ya existe. - Pensada para proyectos grandes. - Se instala en un clic desde VS Code. - Código abierto en GitHub. #### Enlaces - [Ver en el Marketplace](https://marketplace.visualstudio.com/items?itemName=CarlosSerrano.bulk-empty-files) - [Código en GitHub](https://github.com/NotCarlosSerrano/vscode-bulk-empty-files) Detalle: Publicada en el Marketplace. Nunca pisa un archivo que ya existe. ### Remove Empty Folders (M-008) > Encuentra y borra las carpetas vacías de tu proyecto. URL: https://notcarlosserrano.com/m/folders - TIPO: Extensión VS Code - STACK: TypeScript - ALCANCE: Workspace o carpeta - CÓDIGO: Abierto #### La molestia Carpetas vacías olvidadas por todo el proyecto. #### La idea: Limpiar sin miedo a borrar de más. Refactor tras refactor, un proyecto acumula carpetas vacías que nadie se atreve a borrar a mano. La extensión las busca de forma recursiva y te enseña qué borraría antes de hacerlo. #### Cómo funciona 1. BUSCA: Todo el workspace (o desde una carpeta del explorador) 2. PREVISUALIZA: Modo de prueba (la lista, sin borrar nada) 3. LIMPIA: Carpetas borradas (con resumen al terminar) Clic derecho en una carpeta del explorador → Clean From Folder. #### Los detalles: Control total antes de borrar. - Búsqueda recursiva en todo el proyecto o desde una carpeta. - Modo de prueba para ver qué se borraría. - Patrones para ignorar carpetas y opción para incluir las ocultas. - Confirmación opcional antes de borrar. - Registro completo en el panel de salida de VS Code. #### Enlaces - [Código en GitHub](https://github.com/NotCarlosSerrano/vscode-remove-empty-folders) Detalle: Con modo de prueba: ves qué borraría antes de borrar nada. ### Code Redeem Reader (M-009) > De la captura de pantalla al código, listo para canjear. URL: https://notcarlosserrano.com/m/redeem - TIPO: App de escritorio - STACK: Python · Tkinter · OpenCV - RESULTADO: Portapapeles - CÓDIGO: Abierto #### La molestia Teclear códigos de canje leyéndolos de una captura. #### La idea: Copiar lo que no se puede copiar. Los códigos de canje llegan dentro de imágenes. Copiarlos a mano es lento, y un 0 se confunde con una O. La app captura la pantalla, lee el texto y lo deja en el portapapeles listo para pegar. #### Cómo funciona 1. CAPTURA: La pantalla (desde la propia app) 2. LEE: OCR (extrae el texto de la imagen) 3. COPIA: Portapapeles (limpio de caracteres raros) Un único flujo: capturar, leer, limpiar y copiar. #### Los detalles: De la imagen al canje en segundos. - Interfaz gráfica sencilla, sin terminal. - Limpia los caracteres especiales antes de copiar. - El texto va directo al portapapeles. - Código abierto en GitHub. #### Enlaces - [Código en GitHub](https://github.com/NotCarlosSerrano/python-code-redeem-reader) Detalle: Captura, lee y limpia los caracteres raros: el código llega al portapapeles listo para pegar. ### VirusTotal Checker (M-010) > Pasa una carpeta entera por VirusTotal con un comando. URL: https://notcarlosserrano.com/m/virustotal - TIPO: Script - STACK: Python · vt-py - GENERA: vt_results.json - EXTRA: Inspector de MKV #### La molestia Comprobar una carpeta de descargas en VirusTotal archivo a archivo. #### La idea: Una carpeta, un comando. Revisar una carpeta de descargas en VirusTotal significa subir archivos uno a uno y esperar a cada análisis. El script calcula el SHA-256 de cada archivo, consulta VirusTotal y guarda todos los resultados en un JSON. #### Cómo funciona 1. HASH: SHA-256 (de cada archivo de la carpeta) 2. CONSULTA: VirusTotal (estadísticas de análisis) 3. INFORME: vt_results.json (un objeto por archivo) Si VirusTotal no conoce un archivo, el script lo sube, pide el análisis y vuelve a consultar por ti. #### Los detalles: Sin pestañas, sin esperas. - Usa el cliente oficial de VirusTotal. - Configuración por .env o por argumentos. - Sube y analiza solo lo que VirusTotal aún no conoce. - Incluye un inspector de pistas de audio y subtítulos para archivos MKV. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Calcula el hash, consulta y, si el archivo es nuevo, lo sube y espera el análisis por ti. ### Slideshow (M-011) > Presentaciones de fotos y vídeos, con su mapa. URL: https://notcarlosserrano.com/m/slideshow - TIPO: Web - STACK: React · Supabase · Leaflet - COMPARTIR: Enlace privado - MODO DEMO: Sin configurar nada #### La molestia Enseñar las fotos de un viaje sin perder dónde se hizo cada una. #### La idea: Cada foto sabe dónde se hizo. Las fotos de un viaje llevan dentro la fecha y el lugar, pero casi ninguna herramienta para enseñarlas lo aprovecha. Slideshow las reproduce como una presentación y coloca cada una en un mapa, leyendo el GPS de sus propios metadatos. #### Cómo funciona 1. SUBES: Fotos y vídeos (arrastrando, HEIC incluido) 2. LEE: EXIF y QuickTime (fecha y coordenadas) 3. PRESENTA: Pantalla completa + mapa (o con un enlace para compartir) Compartir genera un enlace con un token de 128 bits: solo entra quien lo tiene, y se puede revocar en cualquier momento. #### Los detalles: Bonita por fuera, seria por dentro. - Convierte las fotos HEIC del iPhone a JPEG en el propio navegador. - Lee la ubicación también de los vídeos MOV y MP4. - Mapa con una miniatura por foto en su punto exacto. - Cada usuario ve solo lo suyo gracias a Row Level Security. - Modo demo que funciona sin ninguna configuración. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Saca el GPS hasta de las fotos HEIC y los vídeos MOV del iPhone, y coloca cada una en su mapa. ### Chat con un blog (M-012) > Pregúntale a un blog entero y recibe la respuesta con sus fuentes. URL: https://notcarlosserrano.com/m/blogchat - TIPO: RAG local - STACK: FastAPI · LanceDB · Next.js - MODELOS: Ollama - NUBE: Ninguna #### La molestia Encontrar algo en un blog enorme sin leerlo entero. #### La idea: Respuestas con fuente, sin salir de tu máquina. Un blog con cientos de artículos guarda muchas respuestas, pero encontrarlas obliga a buscar y leer. Este chat indexa todo el contenido y responde citando los artículos de los que sale cada respuesta. #### Cómo funciona 1. INGESTA: Sitemap → texto → fragmentos (una vez, o periódica) 2. ÍNDICE: LanceDB (embeddings en local) 3. CHAT: Respuesta + fuentes (con un modelo en Ollama) Ningún dato sale del ordenador: los embeddings y el modelo corren en local. #### Los detalles: Privado por diseño. - 100 % local: sin claves ni servicios externos. - Cada respuesta enlaza sus fuentes. - Va bien en español con qwen2.5. - Base vectorial embebida, sin servidor que mantener. - El modelo de embeddings se cambia sin tocar el resto. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: 100 % local: sin claves ni nube, y cada respuesta cita sus fuentes. ### QR Studio (M-013) > Códigos QR bonitos que saben cuánta gente los escanea. URL: https://notcarlosserrano.com/m/qr - TIPO: Web - STACK: React · Express · Supabase - EXPORTA: PNG · SVG · JPEG · WebP - CUENTA: Opcional #### La molestia Imprimir un QR sin saber si alguien lo escanea. #### La idea: Un QR impreso no debería ser una caja negra. Una vez impreso, un QR normal no te dice nada: ni si alguien lo escanea ni cuándo. QR Studio genera QR personalizados en el navegador y, si quieres, los convierte en dinámicos: apuntan a un enlace corto que cuenta la visita y redirige. #### Cómo funciona 1. DISEÑAS: Colores, formas y logo (en el navegador) 2. IMPRIMES: Un enlace corto (imposible de adivinar) 3. MIDES: Mis códigos (visitas y última visita) La generación nunca sale de tu dispositivo, y las visitas se guardan en tu propio Supabase. #### Los detalles: Para imprimir con datos. - Texto, enlaces, email, teléfono, SMS, Wi-Fi y tarjetas de contacto. - Paletas, degradados, fondo transparente y logo. - Exporta en PNG, SVG, JPEG y WebP. - La IP se guarda anonimizada con hash, nunca en claro. - Modo claro y modo oscuro. #### Enlaces - [Pídeme una demo](mailto:contact@notcarlosserrano.com) Detalle: Enlaces cortos imposibles de adivinar y visitas contadas sin guardar una sola IP. ### local-media-downloader (M-014) > Descargas de audio y vídeo en tu propia máquina, sin anuncios ni webs de terceros. URL: https://notcarlosserrano.com/m/media - TIPO: Web local - STACK: Python · yt-dlp · ffmpeg - ESCUCHA EN: 127.0.0.1 - LICENCIA: MIT #### La molestia Bajar el audio de un vídeo propio y acabar en una web llena de anuncios y descargas trampa. #### La idea: El conversor, en tu ordenador. Las webs de conversión viven de los anuncios: pop-ups, botones de descarga falsos y esperas. Y además ves pasar por ellas lo que descargas. local-media-downloader es una web que corre en tu propio ordenador. yt-dlp descarga las pistas y ffmpeg convierte, une y recorta, con progreso real en cada paso. #### Cómo funciona 1. PEGAS: El enlace (vista previa antes de descargar) 2. ELIGES: Audio o vídeo (MP3, M4A, Opus o MP4 hasta 1080p) 3. DESCARGAS: Tu archivo (o un ZIP si es una lista) El servidor solo escucha en 127.0.0.1: nada queda expuesto a tu red, y los temporales se borran al terminar. #### Los detalles: Robusto aunque nadie lo vea. - Progreso con porcentaje, velocidad y tiempo restante, tanto en la descarga como en la conversión. - Un vigilante corta ffmpeg si deja de avanzar, con un error claro en lugar de quedarse colgado. - Recorta solo un tramo, por ejemplo de 1:20 a 3:45. - Listas de hasta 50 vídeos, empaquetadas en un ZIP. - En Windows basta con un doble clic: instala lo necesario y abre el navegador. #### Enlaces - [Ver el código en GitHub](https://github.com/NotCarlosSerrano/local-media-downloader) Detalle: Todo en tu máquina, con progreso real de la conversión y un vigilante que corta ffmpeg si se atasca. ## Encargos - Supersónicos Anónimos (podcast aeroespacial): La web del podcast de divulgación de Sergio Hidalgo y Josep Calatayud: episodios, rutas automáticas y redes. Vue · Vuetify. https://supersonicosanonimos.com/ - Taller de encargos (taller de serigrafía): App instalable en el móvil para llevar encargos, clientes y pagos, con un formulario público para pedir un encargo. Next.js · Supabase · Playwright. - catia-kit (oficina técnica de moldes): Un .exe de un clic que lee el árbol de CATIA V5 y una web que devuelve la BOM en Excel y el PowerPoint de cambios entre revisiones. Python · FastAPI · Nuitka. - La Matriu (arts gràfiques i feminismes): Web multipágina en catalán para un proyecto de serigrafía, ilustración e inclusión. Preparada para más idiomas. Astro · Tailwind. https://www.lamatriu.art/ ## Open source - [sqlacodegen](https://github.com/NotCarlosSerrano/sqlacodegen) (fork · python): Rama fix/mssql-sysname-reflection: reflejar bien los tipos sysname de SQL Server. - [SQLAlchemy](https://github.com/NotCarlosSerrano/sqlalchemy) (fork · python): El ORM con el que trabajo a diario. Fork para seguir de cerca lo que toco. - [Vuetify](https://github.com/NotCarlosSerrano/vuetify) (fork · vue): La librería de componentes de casi todos mis frontends. - [markdown-cv](https://github.com/NotCarlosSerrano/markdown-cv) (fork): Un CV escrito en Markdown y publicado con GitHub Pages. - [Bulk Empty Files](https://marketplace.visualstudio.com/items?itemName=CarlosSerrano.bulk-empty-files) (publicado): En el Marketplace de VS Code. - [Remove Empty Folders](https://github.com/NotCarlosSerrano/vscode-remove-empty-folders) (público): Extensión de VS Code con modo de prueba y patrones a ignorar. ## Cómo trabajo - Una alarma sin probar no es una alarma. lightsout se prueba matando el contenedor, no confiando en que funcione. - Si nada decide, mejor no tocar nada que elegir mal. El «audio original» de YouTube no adivina: si duda, deja el vídeo como está. - Instalarlo no debería cambiar nada. Las 14 mejoras de mi extensión vienen apagadas. Tú decides qué encender. - Los detalles que nadie ve también cuentan. Tests, CSP, RLS y límites de peticiones, aunque sea un proyecto de fin de semana. ## Contacto - contact@notcarlosserrano.com - GitHub: https://github.com/NotCarlosSerrano - LinkedIn: https://linkedin.com/in/carlos-serrano-vicente-11985b20b