1- # 🔐 BurnAfterRead
1+ # BurnAfterRead
22
33** Privacy-first, end-to-end encrypted, self-destructing data sharing.**
44
55Share sensitive text or files via links that expire after being read. No accounts. No tracking. The server never sees your decryption key.
66
77https://burnafterread.casablanque.com
88
9- Check crypto - https://burnafterread.casablanque.com/security
9+ Security details:
10+ https://burnafterread.casablanque.com/security
1011
1112---
1213
13- ## ✨ Features
14+ ## Features
1415
15- - 🔐 ** End-to-end encryption (AES-GCM 256)** — encrypted in your browser before upload
16- - 🔑 ** Zero-knowledge architecture** — server never sees the decryption key
17- - 💣 ** Burn after read** — data is destroyed after access
18- - 📁 ** File support** — up to 5 MB
19- - ⏳ ** TTL expiration** — 1 hour, 24 hours, or 7 days
20- - 🔁 ** Limited views** — 1, 3, or 10 reads
21- - 🗑️ ** Revoke anytime** — delete a drop before it's read using the delete token
22- - 🕶️ ** Paranoid mode** — always deletes on first access, returns ` not_found ` instead of ` expired ` /` burned `
23- - 🧠 ** Atomic reads** — Durable Objects prevent double-reads under concurrent requests
24- - 🚦 ** Rate limiting** — 20 requests per IP per 60 seconds on all API routes
25- - ♻️ ** Automatic cleanup** — expired drops purged from D1 and R2 every hour
16+ - ** End-to-end encryption (AES-GCM 256)** — encrypted in your browser before upload
17+ - ** Zero-knowledge architecture** — server never sees the decryption key
18+ - ** Burn after read** — data is destroyed after access
19+ - ** File support** — up to 5 MB
20+ - ** TTL expiration** — 1 hour, 24 hours, or 7 days
21+ - ** Limited views** — 1, 3, or 10 reads
22+ - ** Revoke anytime** — delete a drop before it's read using the delete token
23+ - ** Paranoid mode** — always deletes on first access, returns ` not_found ` instead of ` expired ` /` burned `
24+ - ** Atomic reads** — Durable Objects prevent double-reads under concurrent requests
25+ - ** Rate limiting** — 20 requests per IP per 60 seconds on all API routes
26+ - ** Automatic cleanup** — expired drops purged from D1 and R2 every hour
2627
2728---
2829
29- ## 🧠 How it works
30+ ## How it works
3031
3132```
3233plaintext → AES-GCM encrypt (browser) → ciphertext → Cloudflare R2
@@ -51,10 +52,10 @@ https://burnafterread.casablanque.com/d/<id>#k=<base64url-key>
5152
5253---
5354
54- ## 🏗️ Architecture
55+ ## Architecture
5556
5657| Layer | Technology |
57- | ---| ---|
58+ | --- | --- |
5859| Frontend | React, Web Crypto API |
5960| Backend | Cloudflare Workers |
6061| Metadata | Cloudflare D1 (SQLite) |
@@ -65,7 +66,7 @@ https://burnafterread.casablanque.com/d/<id>#k=<base64url-key>
6566
6667---
6768
68- ## 🔁 Read lifecycle
69+ ## Read lifecycle
6970
70711 . ` GET /api/drops/:id ` hits the Worker
71722 . Worker checks rate limit (DO-based, per IP)
@@ -81,7 +82,7 @@ https://burnafterread.casablanque.com/d/<id>#k=<base64url-key>
8182
8283---
8384
84- ## 🗑️ Revoke lifecycle
85+ ## Revoke lifecycle
8586
86871 . Sender calls ` DELETE /api/drops/:id ` with ` { delete_token } `
87882 . Worker delegates to ` DropAccessCoordinator ` DO
@@ -93,7 +94,7 @@ https://burnafterread.casablanque.com/d/<id>#k=<base64url-key>
9394
9495---
9596
96- ## 🚀 Local development
97+ ## Local development
9798
9899``` bash
99100npm install
@@ -106,11 +107,15 @@ npm run build
106107npx wrangler dev
107108```
108109
109- Open ` http://localhost:8787 `
110+ Open:
111+
112+ ```
113+ http://localhost:8787
114+ ```
110115
111116---
112117
113- ## 🧪 API
118+ ## API
114119
115120### Create drop
116121
@@ -154,7 +159,14 @@ Response:
154159}
155160```
156161
157- Errors: ` 404 not_found ` , ` 410 expired ` , ` 410 burned ` , ` 429 too many requests `
162+ Errors:
163+
164+ ```
165+ 404 not_found
166+ 410 expired
167+ 410 burned
168+ 429 too many requests
169+ ```
158170
159171---
160172
@@ -169,11 +181,15 @@ Content-Type: application/json
169181}
170182```
171183
172- Response: ` { "ok": true } `
184+ Response:
185+
186+ ``` json
187+ { "ok" : true }
188+ ```
173189
174190---
175191
176- ## 🧰 CLI
192+ ## CLI
177193
178194Send and receive drops directly from your terminal. Same zero-knowledge guarantees as the web app.
179195
@@ -202,7 +218,7 @@ burnafter send archive.zip --paranoid
202218Options:
203219
204220| Flag | Description | Default |
205- | ---| ---| ---|
221+ | --- | --- | --- |
206222| ` --text <text> ` | Send text instead of file | — |
207223| ` --ttl <seconds> ` | Time to live | ` 86400 ` |
208224| ` --views <n> ` | Allowed reads | ` 1 ` |
@@ -222,17 +238,17 @@ The URL must be passed as a quoted string to prevent the shell from stripping th
222238
223239---
224240
225- ## ⚠️ Security notes
241+ ## Security notes
226242
227243- Encryption is ** client-side only** — the server stores ciphertext, never plaintext
228244- The decryption key is in the ** URL fragment** — it is never sent to the server by the browser
229245- ** No authentication** — the link itself is the only access control; guard it accordingly
230246- ** Losing the link means losing the data** — there is no recovery mechanism
231- - ` ttl_seconds ` is bounded to 60s –7 days; ` views ` to 1–10
247+ - ` ttl_seconds ` is bounded to 60 seconds –7 days; ` views ` to 1–10
232248- All API responses include ` Content-Security-Policy ` , ` X-Frame-Options: DENY ` , and ` Referrer-Policy: no-referrer `
233249
234250---
235251
236- ## 📜 License
252+ ## License
237253
238254MIT
0 commit comments