···112112- `TUMBLE_EMBED_ASSETS=true` (Options: `true`, `false`. Default: `true`)
113113- `TUMBLE_LOGGING_LEVEL=debug`
114114- `TUMBLE_REQUEST_TIMEOUT=2s` (Default: `2s`)
115115+- `TUMBLE_CLICK_SIGNING_KEY=your-secret` (Optional, enables signed click tracking)
115116116117### Environment Modes (`TUMBLE_MODE`)
117118···273274274275#### Link Submission with Duplicate Detection
275276276276-When submitting links via `/irclink/`, the API automatically detects if a URL has been previously posted and provides contextual information:
277277+When submitting links via `/link/`, the API automatically detects if a URL has been previously posted and provides contextual information:
277278278279- **Behavior**: Links are always added to the database, even if duplicates exist
279280- **JSON API** (`Accept: application/json` or `source=api`):
···303304304305For complete API documentation, visit `/docs` on your running instance or see `internal/assets/openapi.json`.
305306307307+> **Note:** The legacy `/irclink/` endpoint is still supported for backwards compatibility but `/link/` is preferred.
308308+306309#### Link Deletion
307310308308-Links can be deleted via the API using the `DELETE` method on `/irclink/{id}`. This requires authentication using an admin secret.
311311+Links can be deleted via the API using the `DELETE` method on `/link/123` (where `123` is the link ID). This requires authentication using an admin secret.
309312310313**Configuration:**
311314···321324322325```bash
323326# Using X-Admin-Secret header (recommended)
324324-curl -X DELETE -H "X-Admin-Secret: your-secret" https://your-server/irclink/123
327327+curl -X DELETE -H "X-Admin-Secret: your-secret" https://your-server/link/123
325328326329# Using query parameter
327327-curl -X DELETE "https://your-server/irclink/123?secret=your-secret"
330330+curl -X DELETE "https://your-server/link/123?secret=your-secret"
328331```
329332330333**Responses:**
···335338- **404 Not Found**: Link does not exist
336339337340If no `admin_secret` is configured, deletion falls back to localhost-only access for backwards compatibility.
341341+342342+#### Click Signature Tracking
343343+344344+Tumble supports signed URLs for verified click tracking. When enabled, links include an HMAC signature that validates clicks came from the rendered page rather than bots or direct URL access.
345345+346346+**Configuration:**
347347+348348+Add a `click_signing_key` to your `config.yaml`:
349349+350350+```yaml
351351+click_signing_key: "your-random-secret-string"
352352+```
353353+354354+Or set via environment variable: `TUMBLE_CLICK_SIGNING_KEY=your-secret`
355355+356356+**How it works:**
357357+358358+- When configured, links render as `/link/123?sig=abc123...` instead of `/link/123`
359359+- The signature is an HMAC-SHA256 hash of the link ID using your secret key
360360+- On redirect, the server validates the signature to distinguish verified clicks from unverified access
361361+- This helps track genuine user engagement vs. crawler/bot traffic
362362+363363+**Note:** If no `click_signing_key` is configured, links work normally without signatures. This feature is optional and doesn't affect basic functionality.
338364339365#### Caching
340366