Skip to content

Commit f7dec8a

Browse files
morpheusadamclaude
andcommitted
Add screenshots, animated README graphics, and fix a hidden-attribute CSS bug
- assets/hero.svg (animated wordmark + rising stars + crawling snake) and assets/entropy-chart.svg (animated brute-force-time-by-entropy chart); both degrade to a correct static frame if a renderer ignores SMIL. - assets/screenshots/{builder,snake,unlock,output}.png captured from the real built app via headless Chrome. - README: hero, badges incl. GitHub stars, screenshot gallery, the entropy chart, and a star-history section. - Fix: `[hidden]{display:none!important}` — component display rules (.actions, .grid) were overriding the hidden attribute, which showed Copy/Hide before decryption in the viewer. Caught by the screenshots. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent d2ddedf commit f7dec8a

10 files changed

Lines changed: 146 additions & 8 deletions

File tree

README.md

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
1-
# ColdPhrase — Offline, Single-File Cold Storage for Crypto Seed Phrases
1+
<div align="center">
2+
3+
<img src="assets/hero.svg" alt="ColdPhrase — offline single-file seed-phrase vault" width="880">
4+
5+
# ColdPhrase
6+
7+
**Offline, single-file cold storage for crypto seed phrases.**
8+
Argon2id + AES-256-GCM in one self-contained HTML file — with a duress decoy and an optional Snake-game disguise.
9+
10+
<p>
11+
<img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-black">
12+
<img alt="runtime deps: 0" src="https://img.shields.io/badge/runtime%20deps-0-black">
13+
<img alt="offline: 100%" src="https://img.shields.io/badge/offline-100%25-black">
14+
<img alt="KDF: Argon2id 256MiB" src="https://img.shields.io/badge/KDF-Argon2id%20256MiB-black">
15+
<img alt="cipher: AES-256-GCM" src="https://img.shields.io/badge/cipher-AES--256--GCM-black">
16+
<a href="https://github.com/morpheusadam/coldphrase/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/morpheusadam/coldphrase?style=social"></a>
17+
</p>
18+
19+
</div>
220

321
> Encrypt a wallet recovery phrase into **one self-contained HTML file** that decrypts
422
> **fully offline** — no server, no install, no dependencies at runtime. Hardened with
523
> **Argon2id + AES-256-GCM**, a **duress decoy**, tamper detection, and a network-blocking CSP.
624
7-
![license: MIT](https://img.shields.io/badge/license-MIT-black)
8-
![runtime deps: 0](https://img.shields.io/badge/runtime%20deps-0-black)
9-
![offline: 100%](https://img.shields.io/badge/offline-100%25-black)
10-
![KDF: Argon2id 256MiB](https://img.shields.io/badge/KDF-Argon2id%20256MiB-black)
11-
![cipher: AES-256-GCM](https://img.shields.io/badge/cipher-AES--256--GCM-black)
12-
1325
ColdPhrase turns a Trust Wallet / MetaMask–style **BIP39 seed phrase** (or any secret text)
1426
into a portable `wallet-secret.html`. Double-click that file in any browser, type your
1527
password, and the phrase appears — decrypted in memory only, on a machine that can be
@@ -61,6 +73,31 @@ attacker who steals it into a memory-hard offline brute-force against a strong p
6173
See **[docs/CRYPTOGRAPHY.md](docs/CRYPTOGRAPHY.md)** for the full scheme and
6274
**[docs/BENCHMARKS.md](docs/BENCHMARKS.md)** for cracking-cost math.
6375

76+
### How hard is it to break?
77+
78+
The cipher is never the target — only your password is. Behind Argon2id's memory-hard wall,
79+
entropy is everything:
80+
81+
<div align="center"><img src="assets/entropy-chart.svg" alt="Brute-force time by password entropy — from ~4 hours for a weak password to ~480 billion years for the generated one" width="880"></div>
82+
83+
---
84+
85+
## Screenshots
86+
87+
<table>
88+
<tr>
89+
<td width="50%"><b>Builder — encrypt a phrase</b><br><img src="assets/screenshots/builder.png" alt="ColdPhrase builder"></td>
90+
<td width="50%"><b>Snake-game cover</b><br><img src="assets/screenshots/snake.png" alt="Snake game cover"></td>
91+
</tr>
92+
<tr>
93+
<td width="50%"><b>Recover — unlock screen</b><br><img src="assets/screenshots/unlock.png" alt="Unlock screen"></td>
94+
<td width="50%"><b>Decrypted output</b><br><img src="assets/screenshots/output.png" alt="Decrypted phrase grid"></td>
95+
</tr>
96+
</table>
97+
98+
The wallet file opens as the Snake game on the left; typing your secret word reveals the
99+
unlock screen. All screens are theme-aware (dark shown).
100+
64101
---
65102

66103
## Quick start
@@ -162,6 +199,14 @@ BIP39 mnemonic encryption · Argon2id · AES-256-GCM · WebCrypto · Trust Walle
162199
MetaMask recovery phrase · hardware-free cold wallet · plausible deniability · duress password ·
163200
self-custody · air-gapped encryption · single-file HTML encryptor · zero-dependency.
164201

202+
## Star history
203+
204+
If ColdPhrase is useful to you, a ⭐ helps other self-custodians find it.
205+
206+
<a href="https://star-history.com/#morpheusadam/coldphrase&Date">
207+
<img src="https://api.star-history.com/svg?repos=morpheusadam/coldphrase&type=Date" alt="ColdPhrase star history" width="600">
208+
</a>
209+
165210
## License
166211

167212
MIT — see [LICENSE](LICENSE). Bundled third-party components retain their own licenses.

assets/entropy-chart.svg

Lines changed: 39 additions & 0 deletions
Loading

assets/hero.svg

Lines changed: 42 additions & 0 deletions
Loading

assets/screenshots/builder.png

200 KB
Loading

assets/screenshots/output.png

61.1 KB
Loading

assets/screenshots/snake.png

20.1 KB
Loading

assets/screenshots/unlock.png

31.3 KB
Loading

dist/SHA256SUMS.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
97b508c513a2ac5b7c74b5fae3e1a7d3299583870b5dca9b13759d44723e7378 coldphrase.html
1+
ded2af61efa08c376d362b479c51e706ca91e2d30d66ed95e53c9d5697c9b6eb coldphrase.html

dist/coldphrase.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373

7474
* { box-sizing: border-box; margin: 0; }
7575

76+
/* The `hidden` attribute must win over component display rules
77+
(.grid/.actions set display, which would otherwise override it). */
78+
[hidden] { display: none !important; }
79+
7680
body {
7781
min-height: 100vh;
7882
display: flex;
@@ -10607,6 +10611,10 @@ <h1>Encrypt a recovery phrase</h1>
1060710611
1060810612
* { box-sizing: border-box; margin: 0; }
1060910613
10614+
/* The \`hidden\` attribute must win over component display rules
10615+
(.grid/.actions set display, which would otherwise override it). */
10616+
[hidden] { display: none !important; }
10617+
1061010618
body {
1061110619
min-height: 100vh;
1061210620
display: flex;

src/styles/app.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
* { box-sizing: border-box; margin: 0; }
77

8+
/* The `hidden` attribute must win over component display rules
9+
(.grid/.actions set display, which would otherwise override it). */
10+
[hidden] { display: none !important; }
11+
812
body {
913
min-height: 100vh;
1014
display: flex;

0 commit comments

Comments
 (0)