case-vault Svelte Themes

Case Vault

法務担当者のためのローカル完結型事件メモアーカイブ PWA (Svelte 5 + Dexie + Web Crypto API, offline-capable & E2E encrypted on-device)

case-vault

法務担当者のためのローカル完結型事件メモアーカイブ PWA。事件・ノートをブラウザのローカルストレージに暗号化保存し、iPhone のホーム画面から起動して使う想定です。

インターネット通信は Service Worker 登録とアプリ本体の初回配信以外には 一切発生しません。データも暗号化鍵も自分のデバイスから外に出ない設計になっています。

主な特徴

  • 完全ローカル動作 — データは IndexedDB に保存、オフラインでもフル機能
  • 暗号化されたストレージ — Web Crypto API (AES-GCM 256-bit + PBKDF2 100,000 反復)
  • マスターパスワード でアンロック、10 分アイドルで自動ロック
  • Markdown ノート — プレビュー付きで時系列記録
  • 全文検索 — 日本語バイグラム対応 (MiniSearch)
  • 暗号化バックアップ — パスワード付き .cvbackup ファイルへエクスポート/復元
  • PWA — iPhone/Android/PC の任意のブラウザからホーム画面に追加可能

技術スタック

分野 選定
ビルド Vite 7
UI Svelte 5 + TypeScript
PWA vite-plugin-pwa (Workbox)
ストレージ Dexie.js (IndexedDB)
暗号化 Web Crypto API (AES-GCM + PBKDF2)
Markdown marked + DOMPurify
検索 MiniSearch
テスト Vitest + fake-indexeddb

必要環境

  • Node.js 20 以上
  • npm (または pnpm / bun)
  • Mac / Windows / Linux のいずれか

ローカル開発

npm install
npm run dev

ブラウザで http://localhost:5173/ を開き、初回はマスターパスワードを設定します。

スクリプト

コマンド 用途
npm run dev 開発サーバー起動 (Service Worker は無効)
npm run build 本番ビルド (dist/ に出力)
npm run preview ビルドされた成果物をローカルサーバーで確認
npm run check 型チェック + Svelte チェック
npm run test Vitest でテスト実行
npm run test:watch Vitest watch モード

アイコンの再生成

public/pwa-icon.svg を編集したら次のコマンドで PNG バリエーションを再生成します。

node scripts/gen-icons.mjs

デプロイ

GitHub Pages

  1. GitHub にプライベートリポジトリを作成し、main ブランチに push
  2. リポジトリの Settings > PagesSource: GitHub Actions を選択
  3. .github/workflows/deploy.yml が提供されているので、push すれば自動デプロイされる
  4. デプロイ URL: https://<username>.github.io/<repo>/

リポジトリ名が case-vault でない場合は、ワークフローファイルの BASE_PATH を実際のパスに書き換えてください。

Cloudflare Pages (drag & drop)

  1. npm run build でビルド
  2. Cloudflare Pages でプロジェクト作成
  3. dist/ フォルダをアップロード
  4. カスタムドメイン配下で使う場合は BASE_PATH 不要 (デフォルトの /)

iPhone で使う

  1. デプロイ URL を iPhone のブラウザ (Safari / Chrome / Brave など iOS 16.4 以降の任意のブラウザ) で開く
  2. 共有 → 「ホーム画面に追加」
  3. ホーム画面のアイコンから起動 → 初回マスターパスワードを設定
  4. 以降は完全オフラインで動作する (機内モードでも OK)

⚠️ データ永続性の注意

iOS Safari は 7 日間使用しない PWA のキャッシュを退避 することがあります。 アプリは起動時に navigator.storage.persist() を呼んで永続ストレージを要求しますが、 確実な保全のため、定期的に暗号化バックアップを取ることを強く推奨 します。

パスワード運用

  • マスターパスワードは 復旧不可 です。忘れるとデータは永久に取り出せません
  • iCloud キーチェーンやパスワードマネージャに 必ず記録 してください
  • バックアップパスワードも同様です (マスターと別のものを設定可能)

ライセンス

個人利用のため明示的なライセンスは設定していません。必要に応じて追加してください。

Top categories

Loading Svelte Themes