# pbring
macOS向けのセキュアなクリップボード履歴デーモン。暗号化、ヘッドレス、パイプ志向。
Linux Waylandの [cliphist](https://github.com/sentriz/cliphist) に相当するmacOS版。
*pasteboard + ring -- Emacsのkill-ringのように、コピー履歴をリングバッファとして暗号化保管する。*
## 特徴
- AES-256-GCMによるエントリ単位の暗号化、キーはmacOS Keychainに保管
- NSPasteboardマーカーによるパスワード自動フィルタリング(1Password、Keychain等)
- `org.nspasteboard.source` によるループ防止
- TTLベースの自動期限切れ(デフォルト: 24時間)
- `zeroize` によるメモリ安全性 -- 平文はdrop時にワイプ
- UIなし -- 純粋なCLI、パイプで任意のピッカーと連携
## インストール
```bash
cargo install --path .
```
## クイックスタート
```bash
# デーモン起動(フォアグラウンド)
pbringd
# launchdに登録して自動起動
cp resources/com.pbring.daemon.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.pbring.daemon.plist
# 履歴から選択してクリップボードに復元
## コマンド
### `pbringd`
デーモンバイナリ。`NSPasteboard.general.changeCount` を500ms間隔でポーリングし、クリップボード内容を暗号化してSQLiteに保存する。
- PIDファイル: `~/.local/state/pbring/pbringd.pid`
- `SIGTERM` / `SIGINT` で安全にシャットダウン
### `pbring list`
```
<id>\t<timestamp>\t<type>\t<preview>
```
| `--limit N` | 表示する最大エントリ数(デフォルト: 100) |
| `--type text\|image\|file` | メディアタイプでフィルタ |
### `pbring get`
stdinから1行(`<id>\t...`)を読み取り、エントリを取得・復号してstdoutに生バイト出力する。他のツールへのパイプに使用。
```bash
### `pbring copy`
stdinから1行(`<id>\t...`)を読み取り、エントリを取得・復号して正しいUTIでペーストボードに直接セットする。テキスト、画像、ファイルに対応。
```bash
### `pbring delete`
stdinから1行を読み取り、該当エントリを削除する。
```bash
### `pbring clear`
全エントリを削除する。DBファイル自体は残る。
### `pbring wipe`
全エントリを削除し、DBファイルをゼロ埋めしてから削除する。完全な痕跡消去用。
## セキュリティ
### ペーストボードマーカーによるフィルタリング
デーモンは `NSPasteboard.general.types` を検査し、以下のマーカーがある場合は記録をスキップする。
| `org.nspasteboard.ConcealedType` | パスワード(1Password、LastPass、Keychain) |
| `org.nspasteboard.TransientType` | 一時的なコンテンツ(TextExpander) |
| `org.nspasteboard.AutoGeneratedType` | 自動生成コンテンツ(Keyboard Maestro) |
| `com.agilebits.onepassword` | 1Password固有マーカー |
| `PasswordPboardType` | レガシーパスワードマーカー |
### 暗号化
- アルゴリズム: AES-256-GCM、エントリごとにランダム96bitノンス
- キー: 256bit、初回起動時に生成、macOS Keychainに保存(`com.pbring.encryption-key`)
- Keychainアクセスは `security` CLIコマンド経由
### メモリ安全性
- 復号データは `Zeroizing<Vec<u8>>` で保持 -- drop時にワイプ
- 暗号化キーは `Zeroizing<[u8; 32]>` で保持
## 設定
`~/.config/pbring/config.toml`
```toml
poll_interval_ms = 500 # ポーリング間隔(ミリ秒)
max_entries = 1000 # 最大保持エントリ数
ttl_seconds = 86400 # エントリのTTL(0で無期限)
max_entry_bytes = 10_485_760 # 最大エントリサイズ(10MB)
record_types = ["text", "image", "file"]
extra_ignored_types = [] # 追加の除外NSPasteboardType文字列
ignored_apps = [] # 除外するバンドルID
preview_max_chars = 100 # プレビューの最大文字数
```
全フィールドは省略可能。上記はデフォルト値。
## ファイル配置
| データベース | `~/.local/share/pbring/history.db` |
| 設定ファイル | `~/.config/pbring/config.toml` |
| PIDファイル | `~/.local/state/pbring/pbringd.pid` |
| launchd plist | `~/Library/LaunchAgents/com.pbring.daemon.plist` |
## 動作要件
- macOS 14 (Sonoma) 以降
- Rust 1.75+
## ライセンス
MIT