Fue una conversación de Telegram con un amigo desarrollador: me contó que había encontrado su propio código en un repositorio público de GitHub, casi sin modificaciones. El autor había cambiado los nombres de variables y el README pero la lógica era idéntica, incluyendo un bug muy específico que él mismo había introducido y corregido meses antes.
La semana siguiente construí Sentinel.
La idea
Sentinel es un watchdog que corre automáticamente cada lunes y busca fragmentos de mis proyectos en el código público de GitHub. Si encuentra algo nuevo que no había visto antes, me avisa por Telegram. No es una solución perfecta, pero es mucho mejor que enterarse por casualidad.
Cómo busca
La estrategia no es comparar archivos completos —demasiado caro para la API gratuita— sino buscar fragmentos de código suficientemente específicos para no generar falsos positivos. Strings únicos de mi código: nombres de variables en español dentro de JavaScript (como setStation newNombre newLogo), combinaciones de constantes que no tienen equivalente genérico, comentarios propios dentro de código técnico.
La GitHub Code Search API tiene un límite de 30 requests por minuto. Para no gastar la quota, los fragmentos tienen que producir menos de 10 resultados. Si un fragmento produce 0 resultados, perfecto. Si produce más de 20, es probablemente demasiado genérico y lo saco de la lista.
Lo que encontré (y lo que no)
En las primeras semanas, Sentinel encontró tres coincidencias:
Una era efectivamente código mío: un snippet de PHP para parsear tokens que había publicado en un comentario de Stack Overflow y que alguien había incluido en su proyecto sin atribución. No me molestó mucho —lo había publicado en público— pero ilustra que el sistema funciona.
Las otras dos eran falsos positivos: coincidencias con código que se parece al mío porque ambos seguimos las mismas convenciones de PHP. Parte esperable del ajuste fino.
El límite honesto
Sentinel sólo busca en código público de GitHub. Repositorios privados, GitLab, Bitbucket —invisible para él. Si alguien copia el código y lo mantiene privado, no lo vas a encontrar así. Y si el código fue refactorizado significativamente o traducido a otro lenguaje, las búsquedas de texto tampoco van a matchear.
Para eso necesitarías análisis de similitud semántica. Es un problema mucho más difícil. Por ahora, con detectar los casos obvios me alcanza.
El repo es privado —precisamente porque publicar los fingerprints que uso sería darle a alguien la guía de cómo evitar que lo detecte. El README describe el enfoque general sin revelar las queries específicas.
Comentarios
Todavía no hay comentarios. Sé el primero.
Dejá tu comentario
Los comentarios son moderados antes de publicarse.