下部ストリップ
⇧⌘Vメイン。下から立ち上がるカルーセル。フォルダ=倉庫として、定型文・画像・URL を分類して貯めておけます。⌘1〜9 で一発貼付、X キーで複数選択、⌘Enter で一括貼付。
macOS のための、超軽量でローカルファーストなクリップボードマネージャ。下から出るカルーセルがメイン、ノッチが副メイン、Raycast 拡張がサード。v0.10.0-beta の最新アップデートはリリースノートをご覧ください。
下部ストリップが主役。ノッチからは同じカルーセルが上から降りてきます。Raycast 拡張はサード。表示位置と起動方法が違うだけで、履歴・フォルダ・定型文はすべて同じデータベースを共有します。
メイン。下から立ち上がるカルーセル。フォルダ=倉庫として、定型文・画像・URL を分類して貯めておけます。⌘1〜9 で一発貼付、X キーで複数選択、⌘Enter で一括貼付。
サブ。ノッチにマウスを乗せると、同じカルーセルが上から降りてきます (ノッチがない Mac は画面上端中央 20% が代わり)。表示位置だけが違い、中身も操作も下部ストリップと同じ。
サード。Raycast 内で履歴検索・複数選択・連続貼付ができる拡張。Pasty 本体と同じ履歴・フォルダ・定型文を共有します。
Paste のレビュー、Reddit、Hacker News に書かれた不満をひとつずつ読み、それぞれに答える形で Pasty を作りました。
常時 60 MB 未満。コールドスタート 0.2 秒以下。慎重なポーリング、必要十分なメモリ。4.0 MB の dmg がそれを物語っています。
あなたの Mac から外には何も出ません。クラウドアカウントなし、テレメトリなし、解析なし。データは SQLite ファイル 1 つに入っているので、いつでも自分で覗けます。
ノッチをインタラクティブにした世界初のクリップボードマネージャ。乗せて呼び出し、ドラッグして貼り付ける。キーボードに触れる必要はありません。
7 言語の構文ハイライト。{{date}} {{cursor}} {{uuid}} といったスニペットは貼付の瞬間に展開。差分ビュー内蔵。
SQLite FTS5 による全文検索の上に、本物の DSL。type:link source:Safari /TODO/ >7d のように grep のように組み合わせ、Spotlight のように速く。
MIT ライセンス、コードはぜんぶ GitHub。サブスクなし、卒業するプランなし、後出しの値上げなし。フォークして、配って、好きにしてください。
5 つの値を 5 つのフォーム欄に順に貼りたいこともあれば、ひとつのテキストにまとめて貼りたい時もある。Pasty はそのどちらにも、Finder で慣れた操作のまま対応します。
1 枚目を選んで、⇧ を押しながら次のカードをクリック。間にあるカードがすべて選択されます。Finder、メール、エディタと同じ流儀。個別に足したい/外したいときは ⌘ を押しながらクリック。
␣ で現在のカードを選択/解除。⇧↑/↓ で範囲を広げる。⌘A で全件選択。マウスとキーボードは同じ「選択状態」を共有するので、好きな方法を行き来できます。
選択中に ↩ を押すと、各カードに対して ⌘V を少し間隔を空けて送ります。複数欄のフォームをまとめて埋めたいとき向け。
選択したカードを改行で連結して、1 回のペーストとして送信。Slack のあちこちから集めたメモを 1 つの議事録にまとめる時に最適です。
Paste の「ピンボード」を、もう少し深く。色付きフォルダを好きなだけ作って、定型文・画像・URL・JSON・コードを分類して貯めていけます。⌘C で流れてきた一瞬を、ずっと使える資産に。
「営業の定型文」「請求書テンプレ」「画像倉庫」「ToDo の決まり文句」…。下部ストリップの「+ 新しいフォルダ」から、用途に応じて好きなだけ作れます。色も自分で選べます。
「定型文」ボタン または ⌘N から、新しいテキストをその場で作成。クリップボードを経由しなくても、開いたフォルダに直接保存されます。{{date}} {{user}} {{uuid}} といったスニペット変数は貼付時に展開されます。
テキストだけでなく、画像 (PNG/TIFF を自動正規化)・ファイルパス・URL・コード・JSON も同じフォルダに混ぜて保存可能。サムネイル付きで、内容を見ながら選べます。
フォルダタブを右クリック → 「中身を順次貼付」or「中身を結合して貼付」。複数欄のフォームに一気にデータを流し込んだり、定型文セットをまとめて 1 通のメールにしたり。
タブを右クリックで「名前を変更」「削除」。フォルダを消してもクリップ本体は履歴に残るので、安心して整理し直せます。
下部ストリップで作ったフォルダは、ノッチホバーでもそのまま現れます。同じデータベース、同じカルーセル、同じ選択状態。場所だけ違う。
v0.4 は、Pasty を「貯める道具」から「使い倒す道具」へ引き上げる更新です。全画面プレビュー、テンプレ差し込み、Apple Intelligence による書き直し・翻訳・要約、自動カテゴリ分類、スマートフォルダ — すべてオンデバイスで完結します。
Space で Quick Look 全画面、⌘P で Explorer 分割ペイン (リスト + 大きなプレビュー)。カードに乗せるだけの Hover Pill で、中身を見ながら選べます。
定型文に [[name]] [[topic]] といったプレースホルダを埋め込んでおくと、貼付の瞬間にダイアログが立ち上がって値を入力 → 完成したテキストが送られます。メール、伝票、議事録ですぐ効きます。
⌘I で AI メニュー、⌃⇧R/T/S/J/E で直接 (書き直し / 翻訳 / 要約 / 変換 / メール整形)。macOS 26+ では Foundation Models (Apple Intelligence) と統合、それ未満では heuristic にフォールバック。ネットワークは介しません。
今日 / 今週 / 画像 / リンク / コード / 定型文 / 大容量 — Pasty が自動で 7 つのスマートフォルダを生成。条件にマッチするクリップが流れ込み、消しても自動で再構成されます。手で作った倉庫と並んで使えます。
コピーした直後に NLLanguageRecognizer + heuristic が走り、コード / URL / JSON / 日本語 / 英語 を判定。指定したフォルダに自動 pin。「気付いたら倉庫が育っている」体験。
選択中のクリップ件数を、画面右下に常時表示。ストリップを閉じても「今いくつ抱えているか」がひと目で分かるので、Shift クリックで集めて、別アプリへ運んで、まとめて貼る、が自然に。
初回起動に 3 ステップのウォークスルー。コピー → 呼び出し → 貼付 を実機で体験できます。あとはいつでも ⌘? で全キー早見表をオーバーレイ表示。
⇧⌘V / ⌥⇧V / ⌃⇧P / ⌃⇧Z / ⌃⇧R-E まで、全部リバインド可能。既存のショートカットと衝突しない組み合わせに、自分の指で合わせ込めます。
SwiftUI Charts による統計ビュー。何種類のクリップを抱え、どのフォルダがよく使われ、どんな時間帯にコピーしているか — クリップボードの使い方を可視化します。設定 → インサイト から。
全クリップ + フォルダ構造を 1 つの JSON にバックアップ。別の Mac に移行する時、リカバリ時、共有時に。プレーンテキストなので diff も取れますし、自分でスクリプトを書いて加工も自在。
貼り付いた瞬間、画面右下にミニ通知。「いま 3 つ目を貼った」「テンプレの値が埋まった」が一目で分かるので、連続貼付や複数選択の流れが止まりません。控えめに、でも頼もしく。
⌃⇧Z で直前の貼付を取り消し。間違った欄に流し込んだ瞬間、ひとつ前のクリップボード状態に戻すので、「やってしまった」を恐れずに連続貼付できます。
いつでも ⌘? で全ショートカット一覧をその場に重ねて表示。覚えなくていい。忘れていい。必要な時に、必要なだけ、ヒントが現れます。
サンプルを押すか、自分で入力してみてください。入力に合わせて結果がリアルタイムに更新されます。このデモはブラウザ上で、Pasty 本体と同じ DSL ロジックを動かしています。
Pasty は、Application Support フォルダ配下にある SQLite ファイル 1 つにすべてを保存します。一時停止して、削除して、ターミナルで覗いてみてください。それ以外には何もありません。
クリップボードマネージャがネットワーク上でできる最高の振る舞いは、何もしないことです。Pasty のバイナリには HTTP クライアントが組み込まれていません。 ペーストボードの sensitive フラグは尊重します。パスワードマネージャがフロントにいる時は記録しません。バンドルID単位でアプリを除外することもできます。
⌃⇧P でキャプチャを 60 秒間一時停止。設定 → プライバシータブから、ワンクリックで全履歴を消せます。
Pasty は「倉庫の中で完結する」ことを大事にしています。コピーしたあとに気付いた typo は ⌘E でその場で書き換え、テキストでコピーした URL は自動で link カードに昇格、動画ファイルは先頭フレームをサムネ表示。Stack の連続ペースト問題も修正しました。
⌘E でテキスト・URL・コードの中身をその場で書き換え。「コピーしたあとに気付いた typo」を、新しく開き直さずに直せます。倉庫の中で内容が完結するという、Pasty の本領が一段深くなりました。
テキストとしてコピーされた URL も、自動で link カードに昇格。プレビュー、ドメイン表示、ブラウザでの直接オープンが、いつものテキストコピーでも効くようになりました。Slack の文中 URL もそのまま倉庫資源に。
.mp4 / .mov ファイルの先頭フレームをカードにサムネ表示。フィルタにも「動画」を追加。倉庫を眺めただけで「あのクリップだ」と見つけられる粒度に揃いました。
連続ペーストが途中で止まる問題を修正、オンボーディングに Stack の使い方ステップを追加。複数選択 → 順番にペーストという Pasty 独自のワークフローが、初日から伝わるようになりました。
履歴保持期間に 7d / 30d / 90d / 365d / 無期限 プリセットボタンを追加。「いつまで残すか」を、数値入力なしで決められます。倉庫の容量設計が、3 クリックで終わるようになりました。
外部アプリへの D&D で marker prefix が混ざってしまう不具合を修正、画像ペースト時に余計な文字列が貼られてしまう問題も解消。「コピーしたものが、そのまま貼られる」という当たり前を、もう一度。
v0.4.13 は、Raycast 派と Slack / Discord 派のための更新です。連続貼付モードで Raycast の状態が残り、Enter 送信モードで改行が末尾に入る。複数選択は Space ひとつに統一、フォルダの使い方は 3 段でガイドされます。
⌥Enter で貼付したとき、Raycast の検索状態を保持。次回 ⌘Space を押せば、続きから複数のクリップを連続で貼り出せます。長文の差し込みや、フォーム入力に最適です。
⇧Enter で貼付したクリップの末尾に改行を自動付与。Slack / Discord / iMessage で「貼って、Enter で送信」が 1 アクションに。タイムラインに連続投稿するときの摩擦がゼロになります。
Space キー 1 つで選択をトグル。Pasty 本体・Raycast の両方で同じ操作感に統一しました (旧 X キーは撤廃)。Raycast ライクな UX で、覚えるショートカットが 1 つ減ります。
ドラッグで定型文化 → 右クリックで整理 → 複数選択で一括移動。フォルダの使い方を 3 段に分けてガイド。「倉庫」という Pasty の本領が、初日に伝わるようになりました。
v0.4.12 は、Pasty を「初めて触る人にも、毎日使う人にも」気持ちのいい道具にするための更新です。オンボーディング、ガラス感のあるシャドウ、設定タブ、複数選択フロー、そして Raycast 拡張による連続貼付。
初回起動時、コピー → 呼び出し → フォルダ → 複数選択 → 貼付 を 7 ステップで体験。手を動かしながら覚えられるので、説明書を読む時間が要りません。
ストリップ・ノッチドロップダウン・ダイアログのすべてに、Liquid Glass 風の 3 層シャドウを再設計。背景となじみつつ、浮いて見える物理感が戻ってきました。
一般 / ホットキー / フォルダ / AI / プライバシー / インサイト / 詳細 / Raycast の 8 タブに整理。初心者向けの説明文と、上級者向けの細かいトグルが両立しました。
複数選択した状態で ⌘Enter。すべてのクリップを順番に、または 1 ブロックにまとめて貼付。フォーム入力もメール本文も、これ 1 つで埋まります。
カードにフォーカスして X を押すと、その場で選択にトグル。Shift クリックも併用可。キーボードだけで「集める→まとめて貼る」が完結します。
Pasty 本体と同じ履歴を Raycast 内で検索 → タブで複数選択 → ⌘↩ で連続貼付。Raycast 派の人もそのまま Pasty の倉庫を使えます。
macOS アプリ本体と、Raycast 拡張。両方ともローカルファースト、両方とも無料、同じ履歴を共有します。
dmg をダウンロード。/Applications にドラッグ。⇧⌘V。インストールは、それで全部です。
$ git clone https://github.com/IvyGain/Pasty.git $ cd Pasty $ swift build -c release $ open .build/release/Pasty.app
Raycast 内で履歴検索 → タブで複数選択 → ⌘↩ で連続貼付。Pasty 本体と同じ履歴・フォルダ・定型文を共有します。
Raycast Store 公開準備中。当面は下のワンライナーで簡単にセットアップできます。
curl -fsSL https://raw.githubusercontent.com/IvyGain/Pasty/main/pasty-raycast/scripts/install.sh | bash
$ git clone --depth 1 https://github.com/IvyGain/Pasty.git $ cd Pasty/pasty-raycast $ npm install $ npx ray develop # Raycast を起動して「Pasty」と入力すると 4 つのコマンドが見つかります
npx ray develop を実行している間だけ Raycast に拡張が登録されます。ターミナルを開いたままにしてください。Raycast Store 公開後は通常のワンクリックインストールに切り替わります。
Pasty は、すでにある体の動きの中に溶け込むように設計されています。チュートリアルもアカウント作成もありません。順番にどうぞ。
dmg をダウンロード、Pasty.app を /Applications にドラッグ。初回だけ右クリック → 開く で Gatekeeper をくぐります。メニューバーの右上にアイコンが出ます。
Pasty は 1 度だけ聞きます。これは、直前のアプリに ⌘V を送るために使います。それ以外には使いません。
⌘C、ドラッグコピー、共有メニュー、なんでも構いません。Pasty がバックグラウンドで拾い、内容ハッシュで重複排除します。
⇧⌘V を押す下から Pasty のストリップがせり上がります。←/→ でカードを送る、⌘1〜9 で番号指定貼付、⇧↩ で書式を捨ててプレーンテキストとして貼付。Return で確定。
Raycast を起動して Pasty と入力 → Pasty の履歴がそのまま検索可能。⇥ で複数選択、⌘↩ で連続貼付。Raycast 派の人もそのまま Pasty の倉庫を使えます。
カーソルを MacBook のノッチに近づけると、Liquid Glass のストリップが滑り降りてきます。カードをそのまま下のエディタへドラッグ。マウスだけで貼付完了。(ノッチがない Mac は、画面上端の中央 20% が代わりに反応します)
ストリップ上部の「+ 新しいフォルダ」で好きな名前・色のフォルダを作成。クリップを右クリック → 「フォルダに振り分け」で分類。「定型文」ボタン or ⌘N で文章を直接書いて保存することも。設定 → 自動カテゴリ分類 をオンにすれば、コピーした瞬間に種別を判定して指定フォルダへ自動 pin されます。
フォルダタブを右クリック → 「中身を順次貼付」or「中身を結合して貼付」。複数欄のフォーム入力や、定型文セットをまとめてメールにする時に便利。
⌃⇧P でキャプチャを 60 秒間停止。パスワードマネージャを触る瞬間に使えます。一時停止中はメニューバーアイコンが色付きになります。
⌃⇧R/T/Sクリップを選んで ⌘I で AI メニュー。または ⌃⇧R 書き直し、⌃⇧T 翻訳、⌃⇧S 要約、⌃⇧J 変換、⌃⇧E メール整形を直接実行。macOS 26+ は Apple Intelligence (Foundation Models)、それ未満は heuristic にフォールバック。すべてオンデバイスです。
過去のリリースは、すべてここから辿れます。各バージョンの専用ページは検索エンジンからも直接開けるよう、固有 URL を発行しています。
@MainActor/Sendable を明示化。Localizable.strings (ja.lproj + en.lproj) に 70 キー追加 (en/ja パリティ済み)。L10n(key) / L10nText(key) / L10nFormat.string(key, args...) を導入。RetentionSweeper を追加。起動時に BlobGC と並んで起動。~/Library/Caches/io.pasty.app/{video-thumbs,pdf-thumbs}/ 永続化 (40 MB + 20 MB / 90 日エビクション)。swift test 51/51 グリーン。7 軸の全方位監査 (critical path / hot path / re-render / leak / DB / concurrency / industry benchmark) を経て、表面ではなく構造レベルで仕立て直したリリースです。Raycast / Linear / Apple Store の "売れる仕組み" を Pasty に翻訳しました。
synchronous = NORMAL + 16MB cache + 32MB mmap を全 DB 起動に適用。検索とインサートの両方が体感で速くなります。ClipStore.recent を実差分があるときだけ publish するよう変更。アイドル状態での SwiftUI 再評価を抑制しました。createdAt DESC)。"今コピーしたあの URL" が最上位に来ます。⌘? ヘルプ表にも追記。DispatchWorkItem 由来の旧式タイマーを構造化並行 (Task + Task.sleep) に置き換え。キャンセル挙動が予測可能に。searchPage(query:afterID:limit:): 履歴ビュー / アーカイブ拡張に向けたカーソルベースのページネーション API を追加。ユーザー向けの直接効果は次リリース以降。DispatchQueue.main.asyncAfter を 4 箇所削除し、Task { @MainActor in try? await Task.sleep(...) } に置換 (PastyApp Stage 2、PasteToast auto-dismiss、TemplateFieldDialog focus latch ほか)。PerfLog.log(_:) 追加: 自由文の perf 計測ポイントを少ないコストで埋められるよう拡張。ANALYZE、月 1 回 PRAGMA incremental_vacuum(5000) をバックグラウンドで実行。PerfLog.enabled のときだけ tombstone 比率を出力。GC 遅延の早期検知に使えます。DesignTokens.swift の snappy (response 0.35 / damping 0.85) を引き続き活用。次リリースでキャプチャ瞬間の "祝祭" アニメーションへ拡張予定です。リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.9.9-beta
このリリースの専用ページを開く →「ノイズを消し、上限を自動で守り、見た目を一段引き上げる。」v0.9.7-beta の P1 一掃に続き、Wave 1–2 で UX とビジュアルを総ざらいします。
PastyDesign) を全画面に適用リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.9.8-beta
このリリースの専用ページを開く →v0.9.6-beta の P0 安定化に続き、v0.9.5-beta Stability Audit で洗い出された 30 件の P1 と、Wave-2 audit で追加検出された 4 件の follow-up をまとめて落とします。「ホットパスを軽く、失敗を黙らせず、削除済みは本当に消す。」
クリップボード変化検出のたびに SHA256 を計算していましたが、lastTextString キャッシュを追加し、直前と同一文字列なら既存ハッシュをそのまま再利用します。長文を立て続けにコピーする場面で CPU 使用率が目に見えて下がります。
複数の画像を同時にコピーすると Vision OCR が無制限に並走して AIEngine が CPU/メモリを吸い上げる挙動がありました。actor OCRQueue (max=2) で 同時 2 件まで に抑え、3 件目以降はキュー待ちにします。
SyntaxHighlighter がプレビュー描画ごとに try! NSRegularExpression(...) を実行していたものを、言語ごとの 静的プロパティに巻き上げ て型ロード時に一度だけコンパイルする方式に変更。コードプレビューが滑らかになります。
AttributedString(markdown:) のパース結果を clipID + contentHash をキーに NSCache (容量 256) で記憶します。同じクリップを繰り返し開いてもパースが走らず、長文 Markdown のプレビュー再表示が即座に。
検索結果が大量ヒットした場合に StripPanel が無制限にロードしていた箇所に LIMIT 1000 を明示適用し、上限到達時は「結果が1000件を超えています。検索条件を絞り込んでください」とトーストでガイドします。
これまで Sparkle のダウンロード/インストール失敗はサイレントでした。failedToDownloadUpdate / didFinishUpdateCycleFor / didAbortWithError の 3 デリゲートを実装し、エラーを network / edsa / sandbox / other に分類してそれぞれ専用トーストを出します。インストール成功時も「Pasty を更新しました(バージョン X)」と通知。
launchPad で初回ペーストする前に Sparkle がバックグラウンドチェックに走り、ペースト操作と HTTP リクエストが競合する微細なラグがあった問題を解消。初回ペースト完了 か 起動から 30 秒経過 のいずれか早いほうまで初回チェックを遅延します。
セッション中にユーザーがアクセシビリティ権限を OFF にすると、これまではトーストのみで埋もれがちでした。NSAlert(5 分クールダウン付き)で 「システム設定を開く」 ボタン付きの永続アラートを出し、x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility に 1 クリックで遷移できるようにしました。
PasteAutomator.emitCommandV がこれまで「先にクリップボードへ書き込んでから AX チェック」していたため、権限が剥がれた状態で ユーザーのクリップボードを意図せず上書き していました。チェックを 書き込み前 に移動し、未許可なら一切クリップボードを汚さず処理を中断します。
~/Library/Application Support/io.pasty.app/blobs/ と画像ステージング dir を毎起動 POSIX 0700 に再適用。他ユーザー / 他プロセスからの覗き見を防ぎます。
Integration Hubs (Linear / Notion / GitHub 等の連携) の 取り消し操作 が CGEvent.post を AX チェック無しで叩いていた点を修正。AXIsProcessTrusted() で事前ガードし、未許可なら pastyPasteFailed 通知を出して失敗を可視化します。
v0.9.6-beta で読み出しパスに WHERE deleted_at IS NULL を入れましたが、Wave-2 audit で 3 つの抜け穴 が見つかりました。
空クエリ (recent) と FTS5 MATCH の 両方 に deleted_at IS NULL を適用。検索で deleted clip が一瞬出るケースを根絶。
ピンボードに登録済みのクリップが ClipStore で soft-delete された場合、Pinboard 側では残骸として表示され続けていた問題を、JOIN に AND clips.deleted_at IS NULL を追加して解消。
今日 / 週次 / 日次 / カインド別 / アプリ別 / 長期保存などの 全集計クエリ に deleted_at IS NULL を入れました。削除済みクリップが統計のグラフを歪めることはなくなります。
最大の漏れは、deleted_at が NULL→値 に変わっても FTS5 インデックスからは削除されない ことでした。v10 マイグレーションで AFTER UPDATE OF deleted_at トリガーを追加し、soft-delete 時に FTS から除去 / 復元時に再投入する 完全同期 を実現。これで「アプリ再起動するまで MATCH に残骸が出る」が消えます。
複数のホバープレビューを高速に行き来すると、古いアニメーション完了ハンドラが新しいパネル状態を破壊するレースがありました。animatingPanelID: UUID のトークン照合で 古い完了ハンドラを無視 するようにし、状態の整合性を確保。
ドラッグ中に Esc を押すと panel は閉じるのに macOS 側のドラッグ状態が残ったまま で、次のクリックが drop と誤認される問題を解消。Esc 受信時にドラッグが進行中なら leftMouseUp CGEvent を合成してから clearAll() するようにしました。
ディスプレイの抜き差し / 解像度変更時に notch hot-zone と strip panel の座標がずれる問題を、NSApplication.didChangeScreenParametersNotification 購読で 再登録 + 再配置 することで解消。
StackPill が NotificationCenter にぶら下げた screenObserver token を deinit で確実に解除。長時間稼働でも漏れません。
起動時に登録される Stage-1 observer 群を stage1Observers: [NSObjectProtocol] に保管し、applicationWillTerminate で一括解除。
DropDelegate は AppKit / SwiftUI 仕様で main thread 呼び出しが保証されているのに、DispatchQueue.main.async で再ラップしていた箇所を解消。微小ですがレスポンスが軽くなります。
AIError を .modelNotAvailable / .osUnsupported / .aiDisabledBySettings / .other に分類し、4 種のローカライズ済みトースト を出すように。Apple Intelligence 未登録 / OS バージョン不足 / 設定 OFF / その他の区別がユーザー側で明確に。
複数アイテムのドロップで一部が失敗していた場合に、これまでは成功したものだけ静かに登録されていました。「N 件中 M 件のみ追加されました」 トーストで具体的な数を伝えます。
過去の中断起動などで entity_uuid が NULL のまま残っていた行を救うため、UserDefaults フラグに依存せず毎起動 SELECT COUNT で残存を検査してバックフィルする方式に変更。
全 41 テスト pass — v0.9.6-beta の 36 件に加え、SoftDeleteFilterTests を 5 件追加:
testSearchEngineExcludesDeleted_emptyQuerytestSearchEngineExcludesDeleted_FTSMatchtestPinboardItemsExcludesDeletedtestInsightsExcludesDeletedtestV10TriggerRemovesFTSRowリリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.9.7-beta
このリリースの専用ページを開く →「データを失わない、操作を取りこぼさない、機密を漏らさない。」v0.9.5-beta の Stability Audit で洗い出された 14 件の P0 をまとめて落とします。
クリップを削除した瞬間に DB から物理消去するのをやめ、deleted_at タイムスタンプで 論理削除に統一 しました。これまでは UI 上の削除と内部読み出しのタイミングで「削除したはずのクリップが一瞬戻る」「FTS5 の結果に残骸が混じる」といった不整合が稀に発生していました。UI / Recent / Search / byId / FTS5 JOIN の全 SELECT パスに WHERE deleted_at IS NULL を強制し、削除されたクリップは表示・検索の双方から確実に消えます。
全文検索インデックス (FTS5) の再構築は本来 v8 で完了しているはずですが、過去のアップグレード経路では稀に未完で終わるケースが報告されていました。v9 で pasty_meta テーブルを新設し、v8.fts5_backfilled = true マーカーが無い場合は起動時に冪等で再投入します。一度完了すれば二度走らないので起動が遅くなることもありません。
これまで ClipStore の初期化に失敗するとアプリは fatalError でクラッシュし、ユーザーは手動でファイルを退避する必要がありました。これからは clips.db を clips.db.corrupt-<timestamp> に退避し、新規 DB で起動を続行、NSAlert で「DB を再構築しました。バックアップは clips.db.corrupt-... に保存されています。」と通知します。データロスはバックアップで救済可能、起動だけは止まりません。
画像 / 動画 / PDF / ファイルクリップの実データは ~/Library/Application Support/io.pasty.app/blobs/ 配下に保存されます。これまでは tombstone 化したクリップの blob が永遠に残り続けていました。起動から ~1 秒後に BlobGC.sweep がバックグラウンドで走り、deleted_at から 30 日経過したクリップの blob と、どのクリップからも参照されない孤児 blob を削除します。30 日のグレース期間で、誤削除した直後でも元データは残っているので Undo 可能なまま掃除が進みます。
これまで Pasty のアクセシビリティ権限が無効化されている状態でクリップを貼ろうとすると、CGEvent.post が空打ちになって 「貼ったつもりが貼れていない」 という最悪のサイレント失敗を起こすことがありました。AXIsProcessTrusted() で全 CGEvent.post サイトをガードし、未許可ならば pastyPasteFailed 通知を発火、Toast でユーザーに「アクセシビリティ権限を許可」と促せるようにしました。Blob 読み込み失敗も同様に通知化、無音で失敗することは無くなります。
画像クリップから抽出した OCR テキストには稀にクレジットカード番号 / SSN / マイナンバー / API トークン / IBAN / 電話番号が含まれます。デフォルト ON で 正規表現 + Luhn 検証 で検出し、[CARD] / [SSN] / [MYNUMBER] / [TOKEN] / [IBAN] / [PHONE] に置換してから DB / FTS5 / AI に渡します。設定 → OCR の「機密データ自動マスク (CC / 身分証 / API トークン)」で無効化も可能。メールアドレスは検索性のため保持します。
StripPanel が NotificationCenter にぶら下げた observer が .onDisappear で外れず、長時間稼働で memory pressure が増えていた問題を修正。observer token を捕捉して disappear 時に確実に剥がします。
複数選択で連続ペースト中に ClipStore の更新が走ると、選択中のクリップ ID 配列が縮んでペースト対象がブレるケースがありました。ペースト開始時に ID をスナップショットして ID キー解決で 1 件ずつ処理、tombstone 化したクリップはスキップして次に進みます。
通知バー (NotchHover) の dismiss アニメーション中に再度トリガーすると、アルファ値が中途半端な状態で固まったり、Z オーダーが沈んだまま再表示される問題を修正。isDismissing フラグで状態遷移を捉えて、show 時に進行中アニメーションをキャンセルして見える状態を復元してから表示し直します。
動画 / PDF のサムネイル生成で、同じクリップに対する 2 つの concurrent リクエストが「片方が走っていればもう片方は待つ」をすり抜けて重複生成していた問題を NSLock で atomize。重複したファイル I/O が消えます。
FileManager.urls(...).first! を guard 化 (URLLinkPreview / DragDropSupport)URL(string: "about:blank")! を nil-coalescing でフォールバック (DragDropSupport)pastyPasteFailed 通知導入 (将来の Toast UI の土台)全 36 テスト pass — 既存 16 + 新規 20 (ClipStore soft-delete × 8、SensitiveDataFilter × 12)。
リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.9.6-beta
このリリースの専用ページを開く →「クリップを賢く、フォルダを安定に。」
これまで画像クリップをドラッグ&ドロップで貼ろうとすると、TextEdit / Notes / Slack 等のアプリでカーソル位置に画像が埋め込まれませんでした。今回、ClipDragItem の Transferable 経路に PNG/JPEG/TIFF/GIF の binary representation と FileRepresentation を追加。Enter キー貼付と同等の体感で D&D も画像をカーソル位置に貼り付けます。
URL クリップの hover プレビューが favicon を取得して表示するようになりました。LPLinkMetadata の iconProvider を NSImage に解決し、メモリ + ディスクキャッシュ。「サイトの顔」が見えて識別しやすく。設定 → サーフェス → URL プレビューで OFF にもできます。
フォルダタブをドラッグして gap の外でキャンセルすると、ソースタブが薄いままになるバグを修正。StripView に NSEvent .leftMouseUp local monitor を仕掛けて、ドラッグ終了時に確実に opacity 1.0 へ復帰します。
「特定のアプリからのコピーは別の期間で保持する」設定を追加。例: Chrome は 7 日、メールは 90 日、Notion は無期限。グローバル保持期間とのオーバーライド方式。設定 → キャプチャ → 「アプリ別保持期間」から bundle ID + 日数を登録できます。
PDF クリップは 1 ページ目のサムネ、動画クリップは 0:00 のサムネ + ▶ icon を hover で表示。PDFKit + AVFoundation の thumbnail を NSCache + ディスクキャッシュで効率化。設定 → サーフェス → ホバープレビューで個別に OFF にできます。
画像クリップを取り込んだ直後に Vision の VNRecognizeTextRequest が background でテキストを抽出し、FTS5 にも index されるので 画像内の文字列で検索ヒット します。ja-JP / en-US デフォルト、設定 → キャプチャから言語追加可能。OCR が走ってもパネル操作のレスポンスは犠牲にしません。
{{counter:invoice}} — 名前付き永続カウンタ。参照ごとに +1、UserDefaults persist{{counter:invoice|format:%04d}} — printf 形式の format{{counter:invoice|reset}} — カウンタをリセット{{if hasField name}}Hi {{name}}{{endif}} — mail-merge field の有無で条件分岐{{if equals lang "ja"}}こんにちは{{endif}} — 文字列一致の条件分岐設定 → Pasty について → 「スニペットカウンタ」で一覧とリセットボタン提供。
リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.9.5-beta
このリリースの専用ページを開く →.draggable + .dropDestination (高レベル Transferable API) で組んでいたフォルダタブの並べ替えを廃止app.pasty.pinboard-tab を新設し、フォルダ並べ替え専用のドラッグペイロード PinboardDragItem をクリップ系ペイロードと完全に分離PinboardReorderDelegate (DropDelegate) に集約。validateDrop / dropEntered / dropExited / performDrop をすべて明示的にハンドリングし、pastyPinboardTab 以外のドロップは確実に弾く.onDrop(of: [.pastyPinboardTab], delegate: PinboardReorderDelegate(...)) だけのシンプルな構造に。SwiftUI の再評価で順序が入れ替わってもヒットテストが壊れないMiniClipDragPreview に置き換え80×24、.regularMaterial ベース + opacity 0.55 の半透明四角に統一2, 3, ... )Color.accentColor ストロークで強く縁取られるscale 1.05 に spring(response: 0.3, dampingFraction: 0.7) でリアクティブに浮き上がり、「ここに入る」を強く視覚化scale 1.0 + 縁取り消失に滑らかに復帰Transferable API (.draggable + .dropDestination) で実装しており、モディファイアの積層順や SwiftUI 内部の差分検知に強く依存していた.onDrop(of:delegate:) + DropDelegate) に降格させ、SwiftUI の自動再評価から独立した明示的なステートマシンに作り直したTransferable 経路を維持し、影響範囲を最小化PinboardReorderDelegate (DropDelegate), MiniClipDragPreview (View)app.pasty.pinboard-tab (exported, conformsTo public.data)Sources/Pasty/DragDropSupport.swift, Sources/Pasty/StripPanel.swiftdocs/design/v0.9.4-folder-reorder-redesign.mdTransferable ペイロード経路は変更なしPinboardStore.reorder のロジックには変更なしfolderTab の SwiftUI モディファイア順回帰: .acceptClipReferenceDrop が .draggable の外側に積まれてしまい、ギャップ側 PinboardDragItem の dropDestination が反応しなくなっていた.draggable(PinboardDragItem) を最外側) に戻し、タブ間ギャップでのホバー検知と PinboardStore.reorder 発火を v0.8.7 / v0.8.8 / v0.9.1 と同じ感触で復活Rectangle に置き換え、macOS ネイティブのドラッグカーソルだけが表示されるようにdraggedBoardId はプレビュー内部の onAppear で立て、reorder 確定 or キャンセル時には folderDropGap / 後段の onDrop ハンドラ側で nil 化されますfolderTab の SwiftUI モディファイアチェーンのみ変更 (順序の入れ替え + ドラッグプレビュー差し替え)Transferable ペイロード経路は一切変更なしfolderDropGap.dropDestination / PinboardStore.reorder のロジックには変更なしPinboardDragItem) のドラッグ表示のみ変更ClipDragItem / MultiClipDragItem) はフォルダタブをフェードさせません — v0.9.1 と同じ挙動folderDropGap.dropDestination ロジックには変更なしfolderTab の SwiftUI モディファイア順を入れ替え、.draggable(PinboardDragItem) を .acceptClipReferenceDrop より先に適用することで、ギャップ側の dropDestination が正しくホバーを受け取れるようにPinboardStore.reorder 発火) が v0.8.7 / v0.8.8 と同じ感触で復活しましたfolderTab 内で 1 箇所スワップしただけのピンポイント修正io.pasty.perf をフィルタすると各 show のミリ秒が見えますノッチが「降りてくる」を超えて、ついに「そこに在る」レベルに到達しました。
dwellDelay を 80ms → 0ms (即時) に変更makeKey() と マウス/キー モニタも事前装備 → 初回 hover でも「初回コスト」がゼロscheduleShow の DispatchWorkItem 経由を 0ms 時に skip し、同じ run-loop tick で show() を叩くSettings → サーフェス に 2 つのピッカーを追加しました。
「ふっと触れただけで開く」が気になる方は 50ms / 100ms に上げてください。アニメだけ戻したい場合は 60ms / 120ms を選べます。
panel.makeKey() を毎回払っていたのを prewarm に移動installMouseMonitors を起動時の installPersistentMonitors に変更し、show ごとに addGlobalMonitorForEvents ×3 を呼ぶコストを削除show() の orderFrontRegardless 直前に layoutSubtreeIfNeeded を再度呼び、初回 real show の SwiftUI 再評価コストを潰すdismiss() も anim=0 時に setFrame を skip して orderOut 一発で閉じる体感が変わらない場合は Settings → サーフェス → ノッチ起動遅延 = 0ms / ノッチアニメ = 0ms に設定されているか確認してください。
このリリースの専用ページを開く →ノッチに触れた瞬間、すっとパネルが降りてくる。 カードをクリックした瞬間、ぱっとハイライトが出て、貼り付けが終わる。 v0.7 系の「気持ちよさ」を取り戻すために、Pasty の体感に効く 7 箇所を一気に直しました。
起動直後にノッチへマウスを乗せても、パネルがすぐ降りてくるようになりました。原因は 4 つあり、全部直してあります。
layoutSubtreeIfNeeded まで走らせ、初回 hover のときに body 評価が走らないようにしました。mouseExited で即キャンセルされていた問題を修正。24px に拡大し、加えて mouseExited 後 50ms は cancelShow を遅延させるようにしました。マウスがちらりと離れて即戻る程度ではキャンセルされません。entity_uuid バックフィルを lazy 化 (M-2): v0.8.0 で追加した全行 UPDATE のマイグレーションが cold-start のクリティカルパスに乗っていたのを、起動完了後に 500 行ずつバッチで走るバックグラウンド処理に分離。WHERE entity_uuid IS NULL ガードで新規 insert との衝突も防止しています。10k 行履歴で 500ms+ 短縮します。Strip カードをクリックしてから「光って消えて貼り付く」までの体感が、v0.7 級に戻りました。
simultaneousGesture を撤去して手動 double-click 検知に置換 (M-1): v0.8.1 で「snappy」と謳って入れた simultaneousGesture(TapGesture(count:2)) + count:1 の二段重ねが、実は SwiftUI 内部の double-tap 排他制御で count=1 の発火を ~250ms 遅延 させていました。今は .onTapGesture(count: 1) 一本に戻し、CACurrentMediaTime() の差分で NSEvent.doubleClickInterval を見て手動でダブルクリックを判定します。mouseUp 直後に即発火します。.animation(value: isCursor) 削除 + withAnimation 化 (M-5): カーソル移動時に StripCard の .animation(.spring, value: isCursor) が、ForEach 配下の 20 枚すべてで spring + scale + offset + shadow を同時に再合成していたのを撤廃。代わりに SelectionModel 側で withAnimation(.easeOut(duration: 0.12)) で囲み、差分のあった 2 枚 (抜けたカード + 選ばれたカード) だけが animate するようにしました。handleDoubleTap で cursorIndex を立てた直後に 16.67ms (1 frame at 60Hz) だけ待ってから dismiss + paste するようにしました。Web の button:active を 100ms 維持するのと同じ理屈で、「タップした」確証が視覚的に返ります。M-4 (init 2 段化) と M-2 (backfill lazy 化) の合わせ技で、cold-start のメインスレッド占有時間が 150〜500ms 短縮 されました。
7 箇所の修正が積み上がった結果、ノッチ表示は v0.7 級の体感即時、クリック反応は 100ms 以内のハイライト + 貼付に戻りました。何より、起動直後の最初の 1 操作が「あ、戻ってきた」と感じられるはずです。
リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.8.4-beta
このリリースの専用ページを開く →「いま、どのビルドを使ってるんだっけ?」を、もう探さない。
「Pastyについて」タブに、現在動いているビルドが一目でわかる バージョンバッジ を追加しました。
説明文と各種ボタン (使い方を見る / ショートカット一覧 / アップデートを確認 / リリースノート) のあいだに、v<version> · build <build> という小さなピル状のバッジが表示されます。等幅フォントなので、数字がきれいに揃います。
バッジをクリックすると、Pasty v<version> (build <build>) という文字列が自動でクリップボードにコピーされます。バグ報告のときに「環境を教えてください」と言われたら、設定を開いて 1 クリックするだけ。
コピー後はおなじみのトーストが表示され、ちゃんとコピーできたことが確認できます。
checkmark.seal.fill の認証バッジアイコン (青)v0.8.3-beta · build 30 を表示doc.on.doc のコピーアイコンを薄く配置 — クリックできることがひと目で伝わりますivygain.github.io/Pasty のヒーローも v0.8.3-beta に自動反映されます。v0.8.2 で導入したヒーロー自動更新の仕組みがそのまま走るので、トップを見れば「最新が何か」が常にわかります。
このリリースは「Pasty について」タブの UI 改善が中心です。クリップボード処理・キャプチャ・AI まわりの挙動には変更がありません。Sparkle 経由のアップデート通知は届きますが、現行 v0.8.2-beta から急いで更新する必要はありません。
リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.8.3-beta
このリリースの専用ページを開く →「ヒーロー、ちゃんと更新されますように。」
v0.8.1 まで docs/index.html のヒーロー部 — バージョンバッジ、説明文、DMG サイズ、フィーチャーチップ — が初期リリース当時の文言のまま固まっており、リリースしてもトップが更新されないという問題がありました。
このリリースで <!-- HERO:BEGIN/END --> などのセンチネルを導入し、scripts/build-pages.py がリリース時に毎回ヒーローを最新版で差し替えるようにしました。
## 見出しから 3〜4 個抽出)dist/Pasty-<ver>.dmg の実ファイルサイズを du -h で取得)#releases セクションへリンク)python3 scripts/build-pages.py を 2 回続けて実行すると、2 回目は差分ゼロになります。リリース自動化のドライランや、CI 再実行時にも安全です。
初期リリースの「新機能」紹介として固定されていた深い "What's New" セクションは、機能ハイライト (「編集できる倉庫」) という通時的なセクションに自動で書き換わります。実装内容自体は引き続き紹介され、見た目だけが「過去のリリース推し」ではなくなります。
このリリースは Pages 更新フロー専用の hotfix です。アプリの動作・UI・機能には変更がありません。すでに v0.8.1-beta を使っている方も、Sparkle 経由のアップデート通知は届きますが、必須ではありません。
scripts/build-pages.py に extract_hero_summary / extract_hero_pills / detect_dmg_size_mb / refresh_hero を追加リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.8.2-beta
このリリースの専用ページを開く →「触れた瞬間に応答する。」
v0.8.0 のリリース後、複数のユーザーから「クリックしてからクリップが選ばれるまでがもっさりする」という声をいただきました。 徹底的に hot path を計測した結果、3 系統の遅延 が積み重なっていたことがわかり、すべて潰しました。
1. シングルクリックとダブルクリックの判別待ち (約 250ms) onTapGesture(count: 2) と onTapGesture(count: 1) を二段重ねていたため、SwiftUI が「次のタップが来ないか」を約 1/4 秒待ってからシングルタップを発火していました。これが「もっさり」の主因です。 対策: simultaneousGesture ペアに置き換え、シングルタップは タッチダウン直後に即発火 するように変更。ダブルクリック (= 貼付) も従来通り動作します。
2. paste 経路の不要な sleep を削減 PasteAutomator の前後 sleep を 60ms→30ms / 100ms→50ms に短縮 (合計 80ms カット)。 貼付先アプリが既にアクティブな場合は restoreFocus のグレース期間を完全スキップするようにしました。
3. カードのアニメーションを軽量化 StripCard の 3 段重ねシャドウを 2 段に減らし、スプリング応答を response: 0.18 に短縮。 隣接カードへのクリック時は scrollTo アニメーションをスキップ (3 枚以上離れた場合のみアニメ)。
4. ホバープレビューのキャンセル & スクロールキャッシュ タップ時に保留中のホバープレビュー (500ms 遅延ポップ) を即座にキャンセル。 WheelToHorizontalCatcher が毎回サブビューツリーを歩いていた処理をキャッシュ化。
ローカル計測で、クリックからクリップ選択の視覚フィードバックまで 約 250ms 短縮、貼付完了までも 約 80ms 短縮 されました。 「触れたら反応する」リズムに戻っています。
https://ivygain.github.io/Pasty/ で 常に最新版の DMG を 1 クリックダウンロード できるようになりました。 ページ下部には 全リリースノートが折りたたみ式で一覧表示 され、過去のバージョン履歴も追えます。
各バージョンには専用パーマリンク (/Pasty/whats-new/<version>.html) も用意され、特定リリースのリンク共有が可能になりました。
./scripts/release.sh を実行すると、appcast.xml だけでなく docs/index.html と docs/whats-new/<version>.html も自動再生成され、同じコミットにステージされるようになりました。 今後すべてのベータ版で Pages とアプリ内アップデート通知が 同時に最新化 されます。
HoverPreviewController.dismissNow() をタップ経路のフェイルセーフとして活用PreviousAppTracker.restoreFocus が app.isActive で早期 returnWheelCatcherNSView に cachedScrollView を導入し、scroll wheel ハンドラの 1 イベントあたりのコストを大幅削減scripts/build-pages.py (独自 markdown→HTML 変換器内蔵) を新規追加リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.8.1-beta
このリリースの専用ページを開く →「マウスでもサクサク、これから iCloud 同期。」
ストリップ/ノッチホバーの上でマウスホイールを縦に回すと、カルーセルが横にスクロールします。 トラックパッドはもちろん、Magic Mouse やクラシックなホイールマウスでも快適に切り替えられるようになりました。
複数の Mac 間でクリップ履歴を同期する大型機能の 設計フェーズが完了 しました。 今リリースでは UI 上の設定項目は「実験的・未実装」として無効化されており、実装は v0.9 で進めます。
設計ドキュメント (3 本) は .ai/decisions/c1-icloud-sync-*.md に格納:
sync_journal テーブル DDL、各テーブルへの soft delete + entity_uuid + origin_device_id カラム追加ReviewAgent によるクロスドキュメント整合性チェックも完了し (Score 88/100)、Go 判定 で実装フェーズへ進みます。
v0.9 で本実装される iCloud 同期に備えて、今リリースで DB スキーマだけ先に拡張 しました。 既存ユーザーの DB は起動時に自動でマイグレーションされます。
具体的に増えるもの:
sync_journal テーブル (Lamport / device_id / encrypted_payload / nonce / schema_version)clips / pinboards / pinboard_items に deleted_at / updated_at / origin_device_id / entity_uuid カラムorigin_device_id と entity_uuid がスタンプされますCloudSyncEngine 自体は phase 2 で稼働します。今は no-op スタブ — 既存の動作には一切影響しません。
v5.sync_journal / v5.soft_delete_columns / v5.entity_uuid_backfill)リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.8.0-beta
このリリースの専用ページを開く →「もっと早く、もっと静かに、もっとあなた色に。」
ストリップを開き直しても、直前の検索クエリと種類フィルタが復元されます。 設定 → サーフェス → 「検索とフィルタ」でいつでも OFF にできます。
パネルを開かずに、直近 1〜5 件目のクリップを 1 アクションで貼り付け。 連続貼付が日常な人ほどに刺さるはずです。
パスワードや個人情報を扱う前に 1 発で 60 秒間キャプチャを停止。 もう一度押せば即座に解除。トースト + サウンドで状態が分かります。
「特定ドメインを含む URL は『リサーチ』フォルダへ」「特定アプリからのコピーは 『仕事』フォルダへ」 — そんな個人ルールを最大 20 件まで登録できます。 デフォルトの 8 カテゴリ判定より優先されます。
このダイアログ自体が新機能 :) アップデート直後に「何が変わったか」を さっと確認できます。設定 → Pasty について → 「リリースノート」から いつでも再表示できます。
複数の AI アクションを 1 クリックで連結実行。 プリセット例: 「英訳 → メール風」「要約 → メール風」など。
インサイトダッシュボードに「累計どのくらいの時間を節約したか」を表示。 1 回の貼付を 28 秒換算でざっくり可視化します。
リリース詳細: https://github.com/IvyGain/Pasty/releases/tag/v0.7.0-beta
このリリースの専用ページを開く →リリースノートは docs/appcast.xml もしくは https://ivygain.github.io/Pasty/ を参照。
このリリースの専用ページを開く →リリースノートは docs/appcast.xml もしくは https://ivygain.github.io/Pasty/ を参照。
このリリースの専用ページを開く →