Get your dead code valued, without uploading it.
Run one small open-source tool on your machine. It reads your repository locally, writes a one-file summary (counts and hashes, never your code) and you choose whether to send it.
Run this in your terminal:
curl -fsSL https://galenadata.com/fingerprint.sh | shWhy a command and not a download? macOS blocks unsigned apps downloaded from a browser. This route avoids that, and it verifies checksums.
Run this in your terminal:
curl -fsSL https://galenadata.com/fingerprint.sh | shPrefer a terminal?curl -fsSL https://galenadata.com/fingerprint.sh | shnpx galena-fingerprintbrew install galenadata/tap/fingerprintCode only on GitHub? →
Zero network calls.
No HTTP client exists in the binary. Verify with strace -f -e trace=network.
Your code never leaves your machine.
The manifest contains counts, hashes, and statistics; never source.
Secrets are counted, never read.
Credential detection reports counts per rule class; matched values are never recorded anywhere.
You review before anything is sent.
The tool writes a local file and stops. Uploading is your separate, manual act.
Open source, ~4,600 lines, no dependencies.
Read every line on GitHub. View the source →
What happens when you run it
Double-click the app.
Your browser opens with a list of your repositories, found automatically.
Your repositories
Found 3 repositories on this machine
acme-app · main · 214 commitsFingerprint this repobilling-service · main · 892 commitslegacy-site · master · 3,401 commitsPick one.
It fingerprints the repository locally; big histories take about a minute.
── 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)Real output from our demo repository, which has fake credentials planted on purpose. "head:0 hist:1" means a credential was committed and later deleted: it still lives in git history, and the tool catches that without ever reading the value.
Review, then upload.
The summary is a JSON file on your disk. Look inside if you like, then upload it at the valuation page. Upload it for a valuation →
My code is only on GitHub
- In your repository on github.com: Add file, then Create new file.
- Name it .github/workflows/galena-fingerprint.yml.
- Paste the workflow below and commit.
- Go to the Actions tab, open "Galena Fingerprint", and press Run workflow.
- When it finishes, download the galena-manifest artifact and upload it at the valuation page.
# 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]"
The workflow checks out with fetch-depth: 0 on purpose: a shallow checkout would make history metrics incomplete, and the manifest flags itself if that happens. Everything runs inside your GitHub account; your code never touches our servers.
What's in the manifest
- Repo shape
- Branches, size, and file counts at HEAD
- Commit history
- Activity over time and authors, with emails hashed
- Languages & tests
- Language mix by bytes and the test-to-code ratio
- Real source lines
- Lines you actually wrote, with vendored code, lockfiles, bundles and generated files counted separately
- Dependencies
- Direct dependencies, version pinning, lockfile presence
- Licenses
- Detected licenses, including copyleft flags
- Secrets
- Credential hit counts per rule class; values never recorded
- Risky files
- .env files, SQL dumps, databases, and key material, by count
- File hashes
- Content hashes usable to check public exposure (SWHIDs)
- Commit quality
- Line churn per commit, rework ratio, commit-message discipline
- Tickets
- Issue references mined from commit messages, and what they claim to close
- Provenance
- How much was written before 2023, per-year activity, date-tampering signals
- AI assistance
- Commits signed by a coding assistant, per year; a floor, since those trailers are optional
See a sample manifest →See a large one: 1.2M raw lines, 269k real source, snapshot mode (1.6 MB) →
The large example is a public open-source repository (BBC simorgh, Apache-2.0, no affiliation), fingerprinted from a ZIP download: that is why it runs in snapshot mode with no commit history.
File paths feel sensitive too? Run with --redact-paths and paths are hashed as well.
Questions
Is this safe to run?+
Yes. It is open source (~4,600 lines of Go, no dependencies), it makes zero network calls, and you can verify that yourself with strace -f -e trace=network. The binary cannot upload anything: it has no HTTP client.
What if my repo has secrets in it?+
The tool counts potential credential hits per rule class; the matched values are never read into the manifest. Those counts are exactly what a valuation needs to know, and the values never leave your machine.
Do I need git installed?+
The tool uses git to read history. macOS offers to install its developer tools the first time you run it. On Windows, install git with the one-liner below. Or use the GitHub path with nothing installed at all.
Windows one-liner:winget install Git.Git
Can I see what gets sent?+
Yes. The result is one JSON file on your disk; open it in any editor. Nothing is sent until you upload it yourself at the valuation page.
My code is old, or was never in git. Does it still count?+
Yes. If the code lived in SVN, CVS, Mercurial or TFS, convert it to git first (git svn clone, cvs2git, hg-fast-export, git-tfs): the full history comes across, and a decade of real history is worth more, not less. If it was never in version control, or all you have is a ZIP download, run the tool with -snapshot: it fingerprints the files as they are, and the manifest is labelled snapshot_mode so nobody mistakes it for a full history. Your folder is never modified.
What happens after I upload?+
We review the manifest and come back with an indicative range, and everything else runs through the same NDA-gated process as any other listing. Upload it for a valuation →