Skip to content

Commit 8a4f818

Browse files
Update README formatting and content
1 parent 175ff42 commit 8a4f818

1 file changed

Lines changed: 45 additions & 29 deletions

File tree

README.md

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1-
# 🔐 BurnAfterRead
1+
# BurnAfterRead
22

33
**Privacy-first, end-to-end encrypted, self-destructing data sharing.**
44

55
Share sensitive text or files via links that expire after being read. No accounts. No tracking. The server never sees your decryption key.
66

77
https://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
```
3233
plaintext → 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

7071
1. `GET /api/drops/:id` hits the Worker
7172
2. 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

8687
1. Sender calls `DELETE /api/drops/:id` with `{ delete_token }`
8788
2. 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
99100
npm install
@@ -106,11 +107,15 @@ npm run build
106107
npx 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

178194
Send 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
202218
Options:
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

238254
MIT

0 commit comments

Comments
 (0)