La versión gratuita de Screaming Frog está limitada a 500 URLs. Para auditar cualquier web mediana se queda corta, y dejamos de pagar la subscripción este año porque casi ya no la usábamos… Y en cualquier caso, usábamos muy pocas de sus amplísimas funcionalidades. Sobre esto vuelvo luego, que me parece interesante.
Así que en un momento de esos en que uno tiene más ganas que sensatez :), decidí montarme el mío propio.
El resultado es Crafty Fox: una sencilla app de escritorio en Python que rastrea un sitio web, extrae los metadatos SEO de cada URL y los muestra en una tabla en tiempo real, filtrable y exportable. No es Screaming Frog, claro, pero hace lo que necesito y lo tengo bajo control porque lo he construido yo.

El stack lo eligió Claude, yo le definí lo que quería
No toco el código. No sé Python más allá de haber leído algún tutorial, y no tengo ni idea de qué es un QTimer ni por qué existe PySide6. Lo que sí tenía claro era lo que quería construir: una app de escritorio que rastreara una web o trabajara sobre un listado de URLs, mostrara los metadatos de cada página en una tabla y los exportara. Sin límite de URLs. Sin pagar suscripción.
Claude eligió Python, armó una primera versión con algo llamado Tkinter y funcionaba, pero era visualmente horrible. Aspecto de aplicación de los 90, sin posibilidad real de mejorarlo. Le pedí algunas modificaciones estéticas: tema oscuro, acento naranja, que tuviera aspecto de app moderna. Me dijo que con Tkinter era un poco «esto es lo que hay» y propuso migrar todo a PySide6. Le dije que adelante. Eso fue todo lo que tuve que decidir en ese frente. 😉
Dos modos, exportación y un .exe que no necesita instalación
Yo quería que hubiera dos formas de lanzar un rastreo, modo crawl y modo directo.
El crawl normal parte de una URL semilla, descubre enlaces automáticamente respetando robots.txt y los procesa según unos parámetros que le defines (profundidad y límite de URLs a procesar).

El modo direct acepta una lista fija de URLs sin descubrir nuevos enlaces: puedes pegarlas a mano, importarlas desde el portapapeles, desde un CSV, desde un Excel o desde un sitemap XML.
La exportación va a XLSX o CSV. El CSV usa ; como separador en lugar de coma, que es lo correcto si luego lo vas a abrir con Excel en configuración europea. Con coma como delimitador, cualquier meta description que tenga una coma en el texto se partía en columnas al importar. Detalles que vas puliendo…
La app se distribuye como ejecutable Windows de un solo fichero. Pesa unos 23 MB, no necesita instalación y no abre consola. Para el día a día funciona bien.
Los campos que quería ver
No hizo ni falta explicarle cómo funciona la herramienta en términos de auditoría SEO: él ya sabía que para el modo rastreo (o crawl) empieza por una URL, va encontrando todas las páginas enlazadas y por cada una extrae lo que me interesa. Sí acordé con él los campos: título, meta description, H1, canonical, si está indexada, tiempo de carga, código de respuesta, si es un redirect y a dónde apunta. Claude tradujo eso en una estructura interna:
@dataclass
class PageRecord:
url: str
status_code: Optional[int]
title: Optional[str]
meta_description: Optional[str]
h1: Optional[str]
canonical: Optional[str]
robots_meta: Optional[str]
response_time_ms: Optional[int]
size_bytes: Optional[int]
redirect_url: Optional[str]
depth: int
indexable: Optional[bool]
Yo no escribí esa clase. Pero la lista de campos la fui decidiendo yo a medida que pensaba en qué información necesito para una revisión/check.
Unas pocas horas ajustando el aspecto
Quería que pareciera una app de verdad, no una ventana genérica de sistema. Pusimos una barra de título personalizada: arrastrar para mover la ventana, botones de minimizar y cerrar, esquinas redondeadas, icono del zorro. En la versión de Tkinter daba bugs continuos: la ventana a veces no aparecía en la barra de tareas, maximizar fallaba a medias y cada arreglo abría otro problema. Claude fue directo: esto con Tkinter no tiene buena solución.
Con la migración a PySide6 la barra de título custom volvió y funcionó desde el principio. El resto fue ir pidiendo ajustes/detalles según los iba viendo al usar la herramienta: que el botón de exportar se pusiera verde cuando hubiera datos en la tabla, que las filas con errores 4xx salieran con fondo rojo claro, que las columnas se ordenaran al clicar la cabecera. Ese tipo de cosas las fui describiendo en lenguaje normal y Claude las resolvía.
Muchas veces con IA lo que consigues es un rápido y muy buen «primer 80%». Luego viene la parte de ajustar y pulir, y acabas invirtiendo mucho más tiempo ahí que en arrancar algo. Pero yo es la parte que más disfruto: me permite dejar el proyecto completamente a mi gusto.
Construirlo con Claude Code sin saber programar
Todo el desarrollo lo hice con Claude Code, el CLI de Anthropic que corre directamente en el terminal. El flujo de trabajo fue siempre el mismo: yo describía una funcionalidad en lenguaje normal, Claude la construía, yo la probaba y le decía qué cambiar. Sin revisar el código, sin entender la arquitectura interna. Si algo no me gustaba visualmente, lo describía — «ese botón es demasiado pequeño», «quiero que las filas rojas sean más suaves», «que la tabla no tenga ese borde ahí» — y lo ajustaba.
En algunos momentos lancé varios agentes en paralelo sobre el mismo repositorio, uno trabajando en el motor de rastreo y otro en la interfaz. Para que no se pisaran los ficheros, tengo montado un protocolo de semáforo sobre un fichero de texto plano en la raíz del repo: antes de tocar cualquier archivo, el agente tiene que declarar un lock y verificar que no hay otro con ese path abierto.
No es la solución más sofisticada del mundo, pero tiene una ventaja sobre otras herramientas de terceros que descargas: hace solo lo que necesitas que haga.
Creo que este es uno de los temas interesantes de todo este rollo del vibe coding… ¿por qué pelearme con una herramienta compleja con mil funcionalidades para acabar usando uno o dos, si puedo crearme algo completamente a mi medida?
Crafty Fox no tiene JavaScript rendering, ni análisis de enlaces internos, ni la mitad de las columnas que tiene Screaming Frog. Pero para una auditoría rápida de metadatos hace lo que tiene que hacer. Y no pago suscripción.



