Valora tu código muerto, sin subirlo.
Ejecuta una pequeña herramienta de código abierto en tu máquina. Lee tu repositorio localmente, escribe un resumen de un solo archivo (conteos y hashes, nunca tu código) y tú decides si enviarlo.
Ejecuta esto en tu terminal:
curl -fsSL https://galenadata.com/fingerprint.sh | sh¿Por qué un comando y no una descarga? macOS bloquea las apps sin firmar descargadas desde el navegador. Esta ruta lo evita, y además verifica los checksums.
Ejecuta esto en tu terminal:
curl -fsSL https://galenadata.com/fingerprint.sh | sh¿Prefieres la terminal?curl -fsSL https://galenadata.com/fingerprint.sh | shnpx galena-fingerprintbrew install galenadata/tap/fingerprint¿Tu código solo está en GitHub? →
Cero llamadas de red.
No existe ningún cliente HTTP en el binario. Verifícalo con strace -f -e trace=network.
Tu código nunca sale de tu máquina.
El manifiesto contiene conteos, hashes y estadísticas; nunca código fuente.
Los secretos se cuentan, nunca se leen.
La detección de credenciales reporta conteos por clase de regla; los valores encontrados no se registran en ninguna parte.
Revisas antes de que se envíe nada.
La herramienta escribe un archivo local y se detiene. Subirlo es tu acto separado y manual.
Código abierto, ~4.600 líneas, sin dependencias.
Lee cada línea en GitHub. Ver el código fuente →
Qué pasa cuando lo ejecutas
Haz doble clic en la aplicación.
Tu navegador se abre con la lista de tus repositorios, encontrados automáticamente.
Tus repositorios
Se encontraron 3 repositorios en esta máquina
acme-app · main · 214 commitsHacer fingerprint de este repobilling-service · main · 892 commitslegacy-site · master · 3.401 commitsElige uno.
Hace el fingerprint del repositorio localmente; los historiales grandes toman alrededor de un minuto.
── galena-fingerprint v0.4.0 ───────────────────────────────── repo main @ c53aa0cce23a commits 12 over 1877 days · 2 authors · 1 merges (1 PR merges) head 21 files · 11.9 KB · 125 LOC raw · test ratio 0.10 source 94 LOC in 7 files (75% of raw) · 31 LOC excluded: data 8, snapshot 5, vendored 4, asset 3, … languages JavaScript (6.1 KB), Text/Other (4.8 KB), Binary/Other (528 B), JSON (152 B) deps npm: 3 direct · 33% pinned · lockfile ✓ deps pip: 3 direct · 33% pinned · NO LOCKFILE licenses GPL-3.0×1, MIT×1 ⚠ copyleft license inside a vendored tree secrets ⚠ 3 potential credential hits across 3 rule classes (counts only — values not recorded) aws_access_key_id head:0 hist:1 connection_string_with_creds head:0 hist:1 stripe_key head:0 hist:1 risk paths ⚠ env:1 sql-dumps:1 sqlite:1 keys:0 cred-files:0 vendored node_modules files:1 vendor files:2 committed at HEAD churn +128/-3 lines · median commit 3 · p90 13 · 0% huge · 1.0x rework messages 0% conventional · 0% one-word · 0 reverts · mean 23 chars tickets forge-issues · 1 distinct refs · 8% of commits reference one · 0% claim a fix provenance 75% of commits and 98% of added lines predate 2023-01-01 signatures not checked (-verify-signatures) · 2 timezones · dates are self-reported (verify via SWHIDs) ai assist 2 commits (17%) carry an AI co-author trailer: Claude 1, GitHub Copilot 1 first 2024-03-04 · +2 lines on those commits · a floor, not a share: trailers are optional, so untagged commits may also be assisted blobs 21 at HEAD (3 historical-only) — hashes usable as SWHIDs minhash 2 file sketches + repo sketch output galena-manifest.json (106 ms)Salida real de nuestro repositorio de demostración, que tiene credenciales falsas plantadas a propósito. "head:0 hist:1" significa que una credencial fue confirmada y luego borrada: sigue viviendo en el historial de git, y la herramienta lo detecta sin leer jamás el valor.
Revisa y luego sube.
El resumen es un archivo JSON en tu disco. Míralo por dentro si quieres, y luego súbelo en la página de valoración. Súbelo para una valoración →
Mi código solo está en GitHub
- En tu repositorio en github.com: Add file y luego Create new file.
- Nómbralo .github/workflows/galena-fingerprint.yml.
- Pega el workflow de abajo y confirma el commit.
- Ve a la pestaña Actions, abre "Galena Fingerprint" y pulsa Run workflow.
- Cuando termine, descarga el artefacto galena-manifest y súbelo en la página de valoración.
# Galena Fingerprint — run entirely inside YOUR GitHub account.
# Your code never leaves GitHub's runners; only the summary manifest
# is produced, and it lands as a downloadable artifact on this run.
#
# To use (no local install needed):
# 1. In your repo on github.com: Add file → Create new file
# 2. Name it: .github/workflows/galena-fingerprint.yml
# 3. Paste this file's contents, commit.
# 4. Actions tab → "Galena Fingerprint" → Run workflow.
# 5. When it finishes, download the "galena-manifest" artifact and
# upload it at https://galenadata.com/valuation
name: Galena Fingerprint
on:
workflow_dispatch:
permissions:
contents: read
jobs:
fingerprint:
runs-on: ubuntu-latest
steps:
- name: Check out full history
uses: actions/checkout@v4
with:
# CRITICAL: the default shallow clone would gut every history
# metric (commits, authors, deleted-secret detection).
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.22'
- name: Build fingerprint tool from public source
run: |
git clone --depth 1 https://github.com/galenadata/fingerprint /tmp/fp
cd /tmp/fp && go build -o /tmp/galena-fingerprint .
- name: Run fingerprint (zero network calls; counts only, never values)
run: /tmp/galena-fingerprint -o galena-manifest.json .
- name: Upload manifest as artifact
uses: actions/upload-artifact@v4
with:
name: galena-manifest
path: galena-manifest.json
# Optional: submit automatically instead of downloading the artifact.
# Create a repository secret GALENA_SUBMIT_TOKEN (from your valuation
# page) and uncomment:
#
# - name: Submit manifest to Galena
# run: |
# curl -fsS -X POST https://galenadata.com/api/valuation \
# -H "Authorization: Bearer ${{ secrets.GALENA_SUBMIT_TOKEN }}" \
# -F "[email protected]"
El workflow hace checkout con fetch-depth: 0 a propósito: un checkout superficial dejaría incompletas las métricas de historial, y el manifiesto se marca a sí mismo si eso ocurre. Todo corre dentro de tu cuenta de GitHub; tu código nunca toca nuestros servidores.
Qué contiene el manifiesto
- Forma del repo
- Ramas, tamaño y conteo de archivos en HEAD
- Historial de commits
- Actividad en el tiempo y autores, con correos hasheados
- Lenguajes y tests
- Mezcla de lenguajes por bytes y proporción de tests
- Líneas de código reales
- Las líneas que escribiste de verdad, contando aparte código de terceros, lockfiles, bundles y archivos generados
- Dependencias
- Dependencias directas, fijado de versiones, presencia de lockfile
- Licencias
- Licencias detectadas, incluidas alertas de copyleft
- Secretos
- Conteos de credenciales por clase de regla; los valores nunca se registran
- Archivos de riesgo
- Archivos .env, volcados SQL, bases de datos y llaves, por conteo
- Hashes de archivos
- Hashes de contenido para verificar exposición pública (SWHIDs)
- Calidad de commits
- Líneas por commit, proporción de retrabajo, disciplina en los mensajes
- Tickets
- Referencias a incidencias extraídas de los mensajes de commit y qué dicen cerrar
- Procedencia
- Cuánto se escribió antes de 2023, actividad por año, señales de manipulación de fechas
- Asistencia de IA
- Commits firmados por un asistente de código, por año; es un mínimo, porque esas firmas son opcionales
Ver un manifiesto de ejemplo →Ver uno grande: 1,2 M de líneas en bruto, 269k de código real, modo snapshot (1,6 MB) →
El ejemplo grande es un repositorio público de código abierto (BBC simorgh, Apache-2.0, sin afiliación), analizado desde un ZIP descargado: por eso corre en modo snapshot y no tiene historial de commits.
¿Hasta las rutas de archivos te parecen sensibles? Ejecuta con --redact-paths y las rutas también se hashean.
Preguntas
¿Es seguro ejecutarlo?+
Sí. Es código abierto (~4.600 líneas de Go, sin dependencias), hace cero llamadas de red y puedes verificarlo tú mismo con strace -f -e trace=network. El binario no puede subir nada: no tiene cliente HTTP.
¿Y si mi repo tiene secretos?+
La herramienta cuenta posibles credenciales por clase de regla; los valores encontrados nunca se leen hacia el manifiesto. Esos conteos son exactamente lo que una valoración necesita saber, y los valores nunca salen de tu máquina.
¿Necesito tener git instalado?+
La herramienta usa git para leer el historial. macOS ofrece instalar sus herramientas de desarrollo la primera vez. En Windows, instala git con la línea de abajo. O usa la vía de GitHub sin instalar nada.
Línea única para Windows:winget install Git.Git
¿Puedo ver qué se envía?+
Sí. El resultado es un archivo JSON en tu disco; ábrelo en cualquier editor. No se envía nada hasta que tú mismo lo subes en la página de valoración.
Mi código es antiguo, o nunca estuvo en git. ¿Sirve igual?+
Sí. Si el código vivía en SVN, CVS, Mercurial o TFS, conviértelo a git primero (git svn clone, cvs2git, hg-fast-export, git-tfs): el historial completo se conserva, y una década de historial real vale más, no menos. Si nunca estuvo en control de versiones, o solo tienes un ZIP descargado, ejecuta la herramienta con -snapshot: hace el fingerprint de los archivos tal como están, y el manifiesto queda marcado como snapshot_mode para que nadie lo confunda con un historial completo. Tu carpeta nunca se modifica.
¿Qué pasa después de subirlo?+
Revisamos el manifiesto, volvemos con un rango indicativo, y todo lo demás sigue el mismo proceso con NDA que cualquier otra publicación. Súbelo para una valoración →