A self-hosted, fully offline tool for comparing PGP, SSH, or any hex fingerprints — character by character.
Lyra normalises and compares two fingerprint strings entirely in your browser. Nothing is ever sent to a server, logged, or stored. Paste your expected fingerprint and the one you received, hit compare, and instantly see whether they match — with every differing character clearly highlighted.
Built with the same visual language as Andromeda: a black-and-white liquid glass interface, an animated star field, and the DM Serif Display + Outfit type pairing.
| 🔒 100% local | All comparison logic runs in plain JavaScript in your browser. No network requests, no telemetry, no backend processing of your data. |
| ⚡ Smart normalisation | Optionally ignores case, whitespace/colons/hyphens, and common prefixes (0x, SHA256:, fingerprint:) before comparing. |
| 🔍 Character-level diff | Uses an LCS (longest common subsequence) algorithm — the same technique behind diff — to show exactly which characters match, mismatch, or are missing from either string. |
| ✨ Clear visual feedback | A green pulse with a particle burst on match; a red shake animation with a full character breakdown on mismatch. |
| 🐳 Self-hosted | Single Docker container, no database, no external dependencies. |
docker run -d -p 3458:3000 --name lyra ghcr.io/matejselko/lyra:latestThen open http://localhost:3458
docker compose up -dcd backend
npm install
npm startThen open http://localhost:3000
- Normalisation — each string is processed according to the toggles you select:
- Ignore case — lowercases both strings
- Ignore spaces/formatting — strips whitespace, colons, and hyphens
- Strip prefixes — removes
0x,SHA256:,SHA1:,MD5:, andfingerprint:prefixes
- Diff — the normalised strings are compared character-by-character using a dynamic-programming LCS algorithm.
- Match — if the strings are identical after normalisation, a green success animation plays.
- Mismatch — if they differ, every character is colour-coded:
- Grey — matches
- Red — present in Fingerprint A, different or missing in B
- Blue — present in Fingerprint B, different or missing in A
Note: This project is vibe-coded.