
2026/07/09 5:37
ドキュメントの山を、検索可能な実用的なナレッジベースに変える
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
DocuBrowse v0.9.0 は、インターネット接続、クラウドストレージ、または API サブスクリプションを必要とせずに個人ファイルを索引化するように設計された堅牢なローカルフーストドキュメント管理ツールです。これは、ユーザーのマシン上で完全に動作し、
nomic-embed-text および dolphin3 という特定のローカル AI モデルを使用して、従来のキーワードエンジン(SQLite FTS5)に重み付けの 70% と併せて语义検索を提供することでこれを達成します。システムは PDF、電子書籍(AZW、EPUB)、Office ドキュメントなど幅広い形式をサポートしています。プライバシーに関わる重要な点として、インデックス化前以降のスキャンを行い、機密 PII(SSN またはクレジットカード号など)を検出し、影響を受けたドキュメントを自動的にブラックリストに追加して索引化を防ぎます。このソフトウェアは典型的な検索遅延が 150ms を下回る高速なパフォーマンスを提供し、ダーク/ライトテーマの対応、関連付けスコアリング、文字順インデックスを含む安定したインターフェースを備えています。Linux、Windows、macOS でクロスプラットフォームに対応し、/settings または CLI コマンドで構成可能であり、CSRF 保護や XSS 防止といった包括的なセキュリティ対策も含まれています。本文
DocuBrowse バージョン 0.9.0 リリースノート
📦 概要
対応プラットフォーム: Linux (RPM, DEB, tarball)、Windows (zip)、macOS (dmg)。インターフェースは安定しており、破壊的な変更を可能な限り回避しています。
DocuBrowse は、雑然としたドキュメントの山を、実際に検索できる状態に変換します。PDF、電子書籍、Word ドキュメント、ノートなど、あらゆるファイルを指し示すだけで、キーワードだけでなく「意味」を理解するスマートなインデックスを作成します。「リース更新に関する契約書」といった指示を出しても、その言葉がファイルに現れていなくても見つけることができます。結果をクリックすると、ファイルを開く前に即席で AI がサマリー(概要)を表示します。また、個人識別情報 (PII) への対応ができ、複数のドキュメントディレクトリを処理することも可能です。
DocuBrowse は完全にあなたのローカルマシン上で動作し、ローカル AI モデルを使用するため、インターネット接続や API キーの心配は一切ありません。あなたのデータ。あなたの AI。
仕組み: SQLite FTS5 キーワード検索に加え、Ollama (nomic-embed-text + dolphin3) を活用した AI による意味的類似度検出とサマリー生成機能を搭載しています。
🗺️ ナビゲーション
- 機能
- スクリーンショット
- クイックスタート
- CLI リファレンス
- 設定
- アーキテクチャ
- API エンドポイント
- 検索アルゴリズム
- セキュリティ
- ファイル構造
- トラブルシューティング
- 既知の制限事項
- ロードマップ
🚀 機能
🔍 二重検索モード
- キーワード検索: SQLite FTS5 を通じた高速フルテキスト検索(タイトル、著者、サブジェクト、タグ、スニペット)。
- 意味的検索: Ollama エンベッディング(nomic-embed-text:latest)を活用した AI による類似度検出。
- ハイブリッドモード (デフォルト): 70% の意味的スコアと 30% のキーワードスコアを合成し、再ランク付けされます。
📖 AI サマリー
- ドキュメントタイトルのいずれかをクリックすると、Ollama (dolphin3:latest) を使用してオンデマンド生成される Kindle 風の本表紙のようなサマリーが表示されます。
- 初回生成後: データベースにキャッシュされるため、高速化されます。
- 役割分担: 意味的検索用エンベッディングは別のローカルモデル (nomic-embed-text:latest) が担当します。
📚 ドキュメントインデックス化
- 形式: PDF, DOCX, PPTX, XLSX, EPUB, MOBI, AZW3, AZW, HTML, TXT, Markdown
- PDF の高度な解析:
- 優先的に
を使用 (pdfplumber
ファイルにはbloated-object
でフォールバック)。pypdf - 複雑なレイアウトに対して
で再試行。layout=False - スキャン済み(画像のみ)PDF は検出され
へルーティングされます。ocr_list_pdfs.txt
- 優先的に
- Word/プレゼン/スプレッドシート:
- Word (
): パラグラフ、テーブル、主要な属性(タイトル、著者、サブジェクト)の抽出。python-docx - プレゼン (
): スライドテキスト、ノート、および主要な属性の抽出。python-pptx - スプレッドシート (
): セル値とシート名の抽出。openpyxl
- Word (
- 電子書籍:
- EPUB:
/ MOBI/AZW3:ebooklib
+mobi package
フォールバック。Calibre - DRM 暗号化 AZW: メタデータのみインデックス化(タイトル/著者は表示可能、本文は検索不可)。
- EPUB:
- PII 保護: スキャナーが SSN クレジットカード情報、銀行振込元/口座番号、生年月日、MRN、免許証、パスポートのパターンを検出し、該当するドキュメントを削除し、永続的にブラックリストに載せます。
🎨 ユーザーインターフェース
- ダークモード/ライトモードテーマ切り替え
- ページネーションされた結果(1 ページ 50 ドキュメント)とナビゲーション
- 文字順インデックスバー (A–Z, 0–9): クイックナビゲーションが可能で、ページ読み込み間で状態が保持されます。
- トピックによるフィルタリング用のタグクラウド
- 各結果カード上の関連度スコアバッジ(0-100%)
- 「開く」ボタン:
を介してデフォルトアプリでファイルを起動。xdg-open - アクション: クリックすると AI サマリーを表示; 📋 クリップボードにパスをコピー; 🗑 ファイルをディスクとインデックスから削除(確認が必要)。
⚙️ 設定 (/settings
)
/settings- 全般パネル: ドキュメントディレクトリ(ライブブラウザ付き)、追加のスキャンディレクトリの管理、ワーキングディレクトリ、ポート設定。
- 無視ディレクトリパネル:
をブラウザから管理可能。削除前に確認プロンプトが表示されます。ignore_dirs.txt
⚡ パフォーマンス
- 検索レイテンシ: 通常で <150ms
- 並列処理: プロセスプールエグゼキューターを使用した並列 PDF 抽出(物理コア数の感知されたワーカー数)。
- メモリ安全: カーネル強制 RLIMIT_AS (6 GB/ワーカー) + フリー RAM しきい値でのポーズ/再開。
📸 スクリーンショット
- ダークモード
- ライトモード
縮小画像をクリックしてフルサイズを表示します。
⚡ クイックスタート
必須要件
- Python 3.9+
- Ollama (起動時不足の場合は自動インストール)
- モデル:
(エンベッディング),nomic-embed-text:latest
(サマリー生成)dolphin3:latest
- モデル:
- ブラウザ (Chrome, Firefox, Safari, Edge)
- Calibre (電子書籍用): Linux では
などsudo apt install calibre
詳細な手順については INSTALL.md を参照してください。
インストール(推奨)
Releases ページから適切なパッケージをダウンロードしてください。
Fedora / RHEL
sudo dnf install ./docubrowser-foss-0.9.0-7.noarch.rpm
Debian / Ubuntu / Mint
sudo apt install ./docubrowser-foss_0.9.0-7_all.deb
任意の Linux (tarball)
tar xzf docubrowser-foss-0.9.0-7.tar.gz cd docubrowser-foss-0.9.0-7 sudo ./install.sh
Windows
- zip ファイルを解凍します。
をダブルクリックしてください。Install.bat- 事前インストール:Python 3.9+ と Ollamaが必要です。
- インストール先:
%USERPROFILE%\DocuBrowse
macOS
- dmg を開きます。
をダブルクリック(初回の場合は右クリック→「開く」が必要)します。Install.command- 事前インストール:**Python 3.9+**が必要です。
- インストール先:
~/Applications/DocuBrowse/
コマンドの使用
インストール後、CLI は
docubrowser コマンドになります(例)。
docubrowser rescan # ドキュメントのスキャンおよびインデックス化 docubrowser start # サーバーの起動 docubrowser open # UI の表示
注意: 開発環境やクローンしたリポジトリでは
と記述する必要があります。./docubrowser.py <コマンド>
アンインストール
- RPM:
sudo dnf remove docubrowser-foss - DEB:
sudo apt remove docubrowser-foss - Tarball:
sudo ./uninstall.sh - Windows:
をダブルクリックUninstall.bat - macOS:
をダブルクリックUninstall.command
🔧 設定ファイル
設定は
/settings という独立したページとして存在します。
デフォルト値と優先順位
設定は以下の順序で読み取ります:
(システム全体)/etc/docubrowse.config
(docubrowser.py の隣に)./docubrowse.config- Web UI の設定ギアアイコン
インストール後
- CLI コマンド (
,rescan
) はドキュメントディレクトリが設定されるまでエラーになります。report - Web UI でもドキュメントディレクトリの構成が必要です(ギアアイコンまたは
経由)。docubrowse.config
の例:docubrowse.config
doc_dir = /mnt/data/Documents db_path = /home/user/DocuBrowse/du-docs.db port = 8643 work_dir = /home/user/DocuBrowse
⌨️ CLI リファレンス
使用方法:
docubrowser.py <command> [options]
| コマンド | 説明 |
|---|---|
| 検索サーバーを起動 (Ollama チェックを実行) |
/ | サーバーの停止/再起動 |
| サーバー状態、ドキュメント数などを表示 |
| ドキュメントのスキャンおよびインデックス化(エンベッディングなし) |
| スキャン + エンベッディング生成 (推奨) |
| 単一ファイルの抽出、インデックス化、エンベッディング |
| エンベッディング未処理ドキュメントへの処理更新 |
| デフォルトブラウザで UI を開く |
| インデックスを PII でスキャンして該当するドキュメントを削除 |
| スキャン除外ディレクトリの管理 |
| ファイルタイプの詳細表示(DB 変更なし) |
| オプトインのクリーンアップ:未発見/マウント不能ファイル処理 |
/ | 重複ドキュメントの検出およびクリーンアップ TUI |
グローバルオプション
: SQLite データベースパス(設定を上書き)--db PATH
: サーバーポート(設定を上書き)--port PORT
: 設定ファイルパス--config FILE
コマンド例
サーバー管理
docubrowser start --port 9000 docubrowser status docubrowser stopall
スキャン (Type フィルター)
./docubrowser.py scan # すべてのサポートされたタイプ ./docubrowser.py rescan pdf # PDF のみ ./docubrowser.py rescan --no-embed # エンベッディングステップなし
単一ファイルインデックス化 (ブラックリスト解除用)
docubrowser scan-file --file /path/to/problem.pdf
重複検出
docubrowser duplist # 正確な SHA256 の duplicates docubrowser dupclean # インタラクティブ TUI (Keep A/B)
🏗️ アーキテクチャ
DocuBrowse は以下のスクリプトから構成されます。
| スクリプト | ロール |
|---|---|
| CLI ランチャー |
| Ollama バイナリ/モデルのチェック/インストール |
| HTTP サーバー (API + UI) |
| ドキュメント発見、抽出、DB 書き込み |
| PDF 抽出 ( + ) |
| テキストを Ollama に送信;ベクトル格納 |
| PII スキャンと削除 |
| 重複検出 |
| SQLite データベース (FTS5 + Embeddings) |
ブラックリストファイル
: 抽出失敗したファイル(再試行時に除外)。scan_blacklist.txt
: PII を含むため削除されたファイル(永続的)。pii_blacklist.txt
: OCR が必要な画像のみ PDF。ocr_list_pdfs.txt
: スキャンから除外されるディレクトリ。ignore_dirs.txt
🌐 API エンドポイント
ベース URL:
http://localhost:8643
| メソッド | パス | 説明 |
|---|---|---|
| GET | | UI (CSRF トークン注入) |
| GET | | 設定画面 |
| GET | | ドキュメント数、埋め込み数など |
| GET | | ページネーション付き検索 |
| GET | | AI サマリー生成/取得 |
| 🔒 POST | | / ファイル起動 (検証あり) |
| 🔒 POST | | 削除 (DB/ディスク) |
| 🔒 POST | | サーバー設定保存 |
検索レスポンス例:
{ "documents": [ { "id": 1, "name": "doc.pdf", "score": 0.95, "sem_score": 0.98, "fts_score": 0.8 } ], "total": 312, "count": 50 }
CSRF セキュリティ:
,/api/openなどの変化系エンドポイントは、プロセス固有の/api/deleteとループバック Origin を必要とします。UI から呼び出す限り安全です。X-CSRF-Token
🧠 検索アルゴリズム
スコアリングは以下の通りです: $$ \text{final_score} = 0.3 \times \text{keyword_score} + 0.7 \times \text{semantic_score} $$
- キーワード (FTS5 BM25):
- SQLite FTS5 インデックスを使用(単純なサブstring スキャンではない)。
- タイトル・著者などフィールド優先度に基づく正規化スコア。
- 意味的:
- クエリとドキュメントの余弦類似度 (768 次元ベクトル)。
- ミニマスしきい値:
(これ未満は無視)。SEM_FLOOR=0.30
🔒 セキュリティ
DocuBrowse はローカル使用を前提に強化されています。
- ホストヘッダー許可リスト: すべてリクエストは
のみ受理され、DNS リバインディング対策が行われます。localhost/127.0.0.1/[::1] - CSRF 保護:
,/api/delete
は/api/open
とループバック Origin を必須としています(UI からしかアクセスできない)。X-CSRF-Token - XSS 防御: HTML エスケープとデータ属性ベースのイベントリスナーを使用。
- PII 検証: SSN、クレジットカードなどは規則やチェックサムで厳密に検証してから削除します。
📂 ファイル構造
DocuBrowse/ ├── docubrowser.py # CLI エントリポイント ├── doc_search.py # HTTP サーバー ├── du-docs.db # データベース (gitignored) ├── scan_blacklist.txt # 抽出失敗リスト ├── pii_blacklist.txt # PII 削除リスト (永続的) ├── ignore_dirs.txt # 除外ディレクトリ └── index.html # フロントエンド UI
⚠️ トラブルシューティング
inotify watch limit exceeded
大規模ドキュメントコレクションでエラーが起きた場合、
/etc/sysctl.conf で fs.inotify.max_user_instances を上げてください (例: 256)。その後 sudo sysctl -p。
PDF がフリーズする (Hang)
でオブジェクト数が 8000 を超えている場合、ExifTool メタデータ更新起因の可能性があります。自動的にpdfinfo
で処理されますが、必要であればpypdf
で再試行してください。scan-file --file ...- スキャン済み PDF (OCR 必要) は検索には一致しません(OCR が必要か
を確認)。ocr_list_pdfs.txt
Ollama が起動しない
ollama serve ollama list # モデルがあるか確認 ollama pull nomic-embed-text:latest ollama pull dolphin3:latest
📝 既知の制限事項
| 制限事項 | ステータス/対応策 |
|---|---|
| DRM AZW | 検索不可。メタデータのみインデックス。 |
| 移動されたファイル | インデックス更新されない( または次の で対応)。 |
| 認証なし | ローカル利用に限定されています(セキュリティ機能により公開へのアクセス防止)。 |
| 英語専用 | 検索プロンプトやタグ生成は英語向けです。 |
🔄 最近の変更点 (Changelog)
v0.9.0 (2026-07-05)
- ネイティブパッケージング: Linux (RPM/DEB/tarball), Windows (zip), macOS (dmg) を対応。
- Windows 完全サポート:
/Install.bat
による簡易インストール、レジストリショートカット作成。install.ps1 - クロスプラットフォーム: 新しい
で OS 固有の処理を一元管理。platform_paths.py - UI/UX 改良: ダークモードパレット刷新、ダッシュボードレイアウト最適化。
v0.8.x (2026-06-13 ~ 2026-07-02)
- v0.8.4: コードベースクリーンアップ(不使用機能削除)、サーバーコード約 300 ライン削減。
- v0.8.3: 「Show 🙈」トグルによる非表示ドキュメント管理、UI パレット完全リデザイン。
- v0.8.2: Open ボタンがファイルパスリンクを置き換え、
連携強化。xdg-open - v0.8.1: DB スキーマミグレーションのバグ修正。
🚀 ロードマップ
| フェーズ | 内容 | ステータス |
|---|---|---|
| Phase 2b | フォーマット展開 (EPUB, MOBI) | ✅ 完了 |
| Phase 2 | コード整理、設定 UI の導入 | ✅ 完了 |
| Phase 3 | ポリッシュ(高度なフィルター、エクスポート) | 🔄 開発中 |
| Phase 3+ | API キー認証、Docker 化 | ⏳ 予定 |
👨💻 AI 支援開発
DocuBrowse は Claude をコーディングパートナーとして利用しています。プロジェクトの状態を知るには以下のファイルを参照してください。
(ルールと学習).claude/CLAUDE.md
(進捗状況)status_docs/project_status.md
(意思決定ログ)status_docs/DECISIONS.md
全状況を AI に投与するには:
cat .claude/CLAUDE.md status_docs/project_status.md status_docs/DECISIONS.md
⚖️ ライセンス
GNU General Public License v3.0 以降 (GPL-3.0-or-later)
Copyright (C) 2026 James Sparenberg。詳細は LICENSE を参照してください。