SQLiteで履歴を管理!Electron製クリップボードアプリ


Electron × SQLiteで最強のクリップボードアプリを実現!

前回はlocalStorageを使ったシンプルなクリップボード履歴アプリを紹介しましたが、今回はSQLiteを採用したバージョンをご紹介します。

SQLiteを使うことで、

  • 長期間の履歴保存
  • 高速な検索機能
  • フラグ付きのお気に入り管理
    といった機能をローカル環境で安定して実現できます。

✔ コードは非公開にしている理由

このアプリは、既に有料で販売されているプロダクトと同等のクオリティを目指して開発しており、今後の展開も考慮してコードの一般公開は行っていません。

  • 有料販売されている同種アプリと機能が重複しており、トラブル回避のため
  • 一部セキュリティ対策が含まれており、公開による悪用リスクを防ぐため
  • 中級者以上が活用できるノウハウを応用しているため、商用展開も視野に

このような理由から「公開しないという選択」もまた、開発者として大切な判断だと考えています。


SQLite版にした理由

前回ご紹介した「localStorage版」のクリップボードアプリは、シンプルかつ軽量で扱いやすいのが特徴でした。しかし、長期運用や実務ユースを見据えると、以下のような課題が見えてきました。

  • 保存上限がブラウザ依存で不安定
  • ブラウザのクリアや更新でデータが消えるリスク
  • ファイル管理や検索性の低さ

そこで、今回のSQLite版は、こうした課題をすべて解決する方向で構築しました。ローカルファイルとしての安定性に加え、SQLによる柔軟な検索・抽出が可能になり、より実用的なツールとなっています。


SQLite版の特徴

本アプリでは、Electron環境においてbetter-sqlite3を使ってSQLiteデータベースを操作しています。特徴としては以下の通りです:

  • 軽量かつ高速なローカルDBで、大量の履歴もストレスなく保存
  • お気に入り管理や検索機能もDBのクエリで効率的に実装可能
  • Mac/Windowsに対応したデスクトップアプリとして配布可能

また、今回はUIにもこだわり、タブ切り替えによる「通常履歴」と「お気に入り」の分離表示、さらにダークモードもサポート。開発者だけでなく、非エンジニアの方にも使いやすいUIを目指しました。


コード非公開にした理由

本アプリのソースコードはあえてGitHubで非公開としています。

理由は以下の通りです:

  • 他サイトでは有料で販売されているレベルの完成度
  • セキュリティ面からもロジックの一部を公開しない方が望ましい
  • 「使う人のためのUI/UX設計」も含め、真剣に作り込んでいるため

一見、オープンにした方がアクセスは集まりやすいように感じるかもしれません。しかし、コードそのものではなく、「なぜこの構成にしたのか」「どう設計したのか」をしっかり伝えることで、十分に価値のある記事になると思っています。


localStorage版との違い

比較項目localStorage版SQLite版
保存方法ブラウザのストレージローカルDBファイル(.sqlite
容量制限ブラウザ依存(約5〜10MB)実質制限なし(ディスク容量依存)
永続性ブラウザキャッシュ削除で消える可能性あり半永続的(ファイルが削除されない限り保持)
データ操作JSONベースで手動管理SQLで柔軟な検索・更新が可能
複雑な処理不向きクエリで簡単に実現可能
導入の手軽さ非常に簡単初期セットアップがやや必要

localStorage版は「軽く試すには最適」ですが、SQLite版は「本気で使う人のための設計」と言えるレベルです。特に履歴が増えてくると、検索やお気に入り管理の面で圧倒的に差が出てきます。


開発のハマりポイント

SQLite版にすることで得られるメリットは多い一方、開発中にはいくつかのハマりポイントがありました。ここではその一部を共有します。

1. GitHubにpushできない(ファイルサイズ制限)

Electronビルド後のdist/node_modules/に含まれる一部ファイル(特にElectron Framework)が100MBを超え、GitHubにpushできない問題が発生。.gitignoreで除外しても、既にコミットされた履歴が残っていては意味がないため、

git filter-repo --path dist/ --invert-paths --force<br>

を使って履歴ごと削除し、--forceで再pushする必要がありました。

2. ElectronとSQLiteのバージョン競合

ElectronでSQLiteを使うにはbetter-sqlite3などのネイティブモジュールを使用しますが、ElectronのバージョンとNodeのABIに対応するバイナリが必要です。うまく合っていないと以下のようなエラーが出てハマりました:

この対処にはelectron-rebuildまたはnpm rebuildを明示的に使う必要がありました。

3. プリロードスクリプトのセキュリティ対策

Electronのpreload.jsでSQLiteにアクセスさせるため、contextIsolationnodeIntegrationなどの設定調整が必要でした。安全性を保ちつつ、ipcMain/ipcRendererでやり取りできるようにしたのも学びのポイントです。


実務Tips(ベストプラクティス集)

セキュリティ設定を最優先に

  • BrowserWindowcontextIsolation: truenodeIntegration: false を基本に。
  • レンダラとメインの通信は contextBridge + 安全な IPC 経由で限定公開。
  • クリップボード内容は任意コードとして実行しない(貼り付け時の HTML/Rich Text はサニタイズ)。

データ保存場所と権限

  • SQLite の保存先は OS ごとの ユーザーデータディレクトリ(例:app.getPath('userData') 配下)に。
  • macOS は「システム設定 > プライバシーとセキュリティ」で アクセシビリティ/入力監視の許可 が必要な場合あり。権限が無いと監視が動かないことがあるので導線を用意。

パフォーマンスと安定性

  • DB は WAL モードPRAGMA journal_mode=WAL;)で同時アクセスと復旧性を改善。
  • よく使う検索列に index を付与(例:created_at, text_hash)。
  • クリップボード監視は デバウンス/レート制限(例:300–500ms)で CPU スパイク防止。重複は text_hash で排除。

マイグレーション運用

  • スキーマ変更は マイグレーションスクリプト(バージョンテーブル管理)で段階適用。
  • 破壊的変更の前に バックアップ(DBファイルコピー) を自動取得。

機密・プライバシー配慮

  • 「除外ワード」や「除外アプリ」設定を実装(例:password, token, 銀行サイトのプロセス名など)。
  • エクスポート時は 暗号化 ZIPパスワード付き を選べるようにする。

自動起動・配布

  • 自動起動は OS ごとの API(Windows Startup / macOS Login Items / Linux autostart)で切替可能に。
  • 配布は electron-builder などで 署名・アップデート(autoUpdater)まで一貫管理。

UXの小技

  • 「ピン留め」「お気に入り」「タグ」機能で再利用性UP。
  • プレーンテキスト化(Strip formatting)ボタン、ショートカット割当、検索は インクリメンタル に。

よくある質問

Q. セキュリティ設定は何を入れるべき?

A. contextIsolation: true/nodeIntegration: false を前提に、preload で必要最小限の API を contextBridge で公開します。IPC ではチャンネル名をホワイトリスト化し、引数のバリデーションを行ってください。

Q. SQLite はどこに保存するのが安全?

A. app.getPath('userData') 配下が推奨です。権限やバックアップの観点でも安全で、ユーザー単位で分離できます。

Q. 監視しても取りこぼす/重くなる

A. ポーリング間隔を 300–500ms 程度に調整し、重複排除用の text_hash を導入。WAL モードとインデックス付与で検索・挿入を高速化します。

Q. 自動起動は実装できますか?

A. 可能です。OS ごとの機能で有効化/無効化を切り替え、初回起動時はダイアログで明示的に同意を取るとトラブルを避けられます。

Q. データを複数端末で同期したい

A. まずはローカルに完結させ、後からエクスポート/インポートを実装するのが安全です。オンライン同期は暗号化・競合解決・キー管理が必要で実装コストが高いです。

Q. 機密情報を保存したくない

A. 除外ワード/アプリ設定を用意し、マッチ時は保存せず即時破棄。さらに「一時保存のみ(セッション終了で消す)」モードも用意すると安心です。

Q. 文字化け・改行崩れが起きる

A. 取得時は UTF-8 を基本に、HTML/RTF はプレーンテキスト変換を用意。改行は OS 差(CRLF / LF)を吸収して保存します。


まとめ

今回ご紹介したElectron×SQLiteによるクリップボード履歴アプリは、本格的なローカルアプリ開発の第一歩として非常におすすめできる構成です。localStorage版と比べても、

  • データ容量の制限がほぼない
  • SQLで高速かつ柔軟な検索が可能
  • 永続化・お気に入り管理に強い

という実用面での大きなアドバンテージがあります。

その一方で、Electronの特性やネイティブモジュールの扱いには独自の学習が必要であり、開発環境の構築やデプロイには注意が必要です。今回の開発で得た知見は、今後のデスクトップアプリ開発に大きく活きると感じています。


今後の展望

SQLite版の完成により、以下のような追加機能を今後実装していく予定です。

  • 🔍 全文検索機能の追加:Fuzzy Searchや正規表現検索への対応
  • お気に入りの並び替え:自由なソート順で整理可能に
  • 🌙 ダークモードの自動切り替え:システム設定に応じて切り替え
  • クラウド同期機能の検討:DropboxやGoogle Driveとの連携で複数端末共有
  • 🔐 パスワードロック機能:セキュリティ面の強化

特に「軽くて便利だけど実用的」なローカルツールとして、一般公開・配布の検討も進めていく予定です。