Strata/strata-daemon/README.md
edu4rdshl 350d647953 Initial commit
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 03:02:34 -05:00

101 lines
3.2 KiB
Markdown

# strata-daemon
The Rust backend for [Strata](../README.md). Speaks D-Bus, stores history in
SQLite, generates image thumbnails, and indexes text for full-text search.
It is **not GNOME-specific**. Any D-Bus client can use it.
## Build
```sh
cargo build --release
# binary at target/release/strata-daemon
```
The GNOME extension spawns this binary automatically; you only need to run it
manually if you're using a non-GNOME front-end.
## Storage
| Path | Contents |
|---|---|
| `~/.local/share/strata/clipboard.db` | History DB (WAL mode, FTS5 index) |
| `~/.cache/strata/thumbnails/<id>.png` | Per-item image thumbnails |
## D-Bus interface
- **Bus name:** `org.gnome.Strata`
- **Object path:** `/org/gnome/Strata`
- **Interface:** `org.gnome.Strata.Manager`
| Member | Signature | Notes |
|---|---|---|
| `SubmitItem` (method) | `(s ay) → ()` | Ingest a clipboard payload (mime, raw bytes) |
| `GetHistory` (method) | `(u u) → s` | `(offset, limit)` → JSON array |
| `SearchHistory` (method) | `(s u) → s` | FTS5 query → JSON array |
| `GetThumbnail` (method) | `s → ay` | PNG bytes for item id |
| `GetItemContent` (method) | `s → (ss)` | `(mime, base64)` for paste-back |
| `SetClipboard` (method) | `s → ()` | Re-copy a stored item |
| `DeleteItem` (method) | `s → ()` | |
| `ClearHistory` (method) | `() → ()` | |
| `Shutdown` (method) | `() → ()` | Graceful exit |
| `SetConfig` (method) | `(uuu) → ()` | `(max_history, max_text_bytes, max_image_bytes)`; 0 means leave unchanged |
| `ItemAdded` (signal) | `(sss)` | `(id, mime, preview)` |
| `ItemDeleted` (signal) | `s` | |
| `HistoryCleared` (signal) | `()` | |
### Example: drive it from the shell
```sh
# Start the daemon (foreground)
./target/release/strata-daemon
# In another terminal:
busctl --user call org.gnome.Strata /org/gnome/Strata \
org.gnome.Strata.Manager GetHistory uu 0 10
# Submit text:
busctl --user call org.gnome.Strata /org/gnome/Strata \
org.gnome.Strata.Manager SubmitItem say "text/plain;charset=utf-8" 5 104 101 108 108 111
# Listen for new items:
busctl --user monitor org.gnome.Strata
```
## Supported clipboard payloads
Strict mime allowlist. Per-type size caps default to 1 MB for text and
5 MB for images; both are runtime-configurable via the `SetConfig`
D-Bus method (the GNOME extension wires this to its GSettings).
- Text: `text/plain*`, `UTF8_STRING`, `STRING`, `TEXT`, `text/rtf`,
`text/markdown`, `text/html`, `text/uri-list`, `x-special/nautilus-clipboard`,
`application/x-kde-cutselection`, `application/rtf`
- Images: `image/png`, `image/jpeg`, `image/jpg`, `image/gif`, `image/webp`,
`image/bmp`, `image/tiff`, `image/avif`, `image/x-icon`, `image/svg+xml`
Items carrying `x-kde-passwordManagerHint` are silently dropped
(KeePassXC / Bitwarden convention).
## Module map
```
src/
├── main.rs Entry point, clipboard ingest, mime allowlist
├── config.rs Config loading + size caps
├── db.rs SQLite schema, FTS5, parameterised queries
├── dbus_service.rs zbus interface implementation
└── clipboard/
├── monitor.rs Optional wl-clipboard-rs monitor (unused on GNOME)
└── writer.rs Paste-back helpers
```
## Tests
```sh
cargo test --release
```
## License
GPL-3.0-or-later.