Galena Fingerprint

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.

¿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

  1. Haz doble clic en la aplicación.

    Tu navegador se abre con la lista de tus repositorios, encontrados automáticamente.

  2. Elige 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.

  3. 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

  1. En tu repositorio en github.com: Add file y luego Create new file.
  2. Nómbralo .github/workflows/galena-fingerprint.yml.
  3. Pega el workflow de abajo y confirma el commit.
  4. Ve a la pestaña Actions, abre "Galena Fingerprint" y pulsa Run workflow.
  5. 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

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 →