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でやり取りできるようにしたのも学びのポイントです。


まとめ

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

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

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

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


今後の展望

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

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

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

✪ 画像素材がないものはランダムで表示されるようになっています。フリー素材などでご用意ください。

おすすめChromeプラグイン一覧

プラグイン名特徴
GoFullPageウェブページ全体のスクリーンショットを簡単に取得できるブラウザ拡張機能です。
ColorZilla色を抽出するための拡張機能です。
WhatFontウェブページ上のフォントの情報を簡単に確認できるブラウザ拡張機能です。
PerfectPixelデザイナーが作成したデザインと実際にコーディングされたウェブページがどの程度一致しているかを確認・調整するためのブラウザ拡張機能です。

模写の手順

ステップ内容
ステップ 1構図を手書きか全画面スクショ(Go full page等)した後、ペイントツールで四角で囲い、大まかなclass,命名規則をあらかじめ決める。
ステップ 2HTMLの基本構造を作成する
ステップ 3CSSでレイアウトを模写する
ステップ 4 中級〜JavaScriptを追加して動きを再現する
ステップ 5最終調整を行い、検証ツールやPerfectPixel(chromeプラグイン)などで完成を確認する。