ICTラウンドアプリ「めぐる君」 技術仕様書

文書番号: ICT-TS-001
対象者: 情報システム部門・委員会担当者
作成日: 2026年4月18日
最終更新日: 2026年9月16日
対象バージョン: 1.13.0


1. システム概要

項目 内容
システム名 ICTラウンドアプリ「めぐる君」
種別 クライアントサイド Web アプリケーション / PWA
目的 感染対策ラウンドの記録、保存、報告書作成の効率化
利用者 ICT メンバー、感染対策ラウンド実施者
配布形態 静的ファイル配信
データ保管先 ブラウザメモリおよび localStorage
ラウンド入力データの外部送信 なし(第7章・第8章を参照)
アクセス解析 Google Analytics 4 を導入(送信項目は 7.4 を参照)

2. アーキテクチャ

2.1 構成

[利用者端末]
  ├── Webブラウザ
  │     ├── React アプリ
  │     ├── Service Worker
  │     ├── localStorage
  │     └── Web APIs
  │          ├── File API
  │          ├── Canvas API
  │          └── Web Share API
  │
  ├── 静的ファイル配信サーバー
  ├── Google Fonts(フォント取得)
  └── Google Analytics 4(アクセス解析 / ラウンド入力データは送信しない)

2.2 バックエンド

2.3 主要技術スタック

分類 技術 実装上のバージョン
フレームワーク React ^19.2.4
言語 TypeScript ~5.9.3
ビルドツール Vite ^8.0.1
CSS Tailwind CSS ^4.2.2
Word 生成 docx ^9.6.1
ファイル保存 file-saver ^2.0.5
チェックリスト読込 read-excel-file ^9.3.5

3. 画面構成

3.1 画面一覧

  1. ラウンド開始画面
  2. 保存済みラウンド一覧画面
  3. メイン画面
  4. 写真追加画面
  5. レポートプレビュー画面

3.2 メイン画面のタブ

固定ヘッダーには以下を表示します。

固定フッターには以下を表示します。

3.3 インストールバナー

未インストール環境では、ホーム画面追加を促すバナーを表示します。

3.4 アプリ本体以外の公開ページ

同一ホスト上に、アプリ本体とは独立した静的ページを配置しています。

パス 内容
/about 紹介ページ
/updates 更新履歴ページ(/updates/releases.json を読み込み)

これらは React アプリではなく単体の HTML です。ラウンド入力機能は持ちません。外部リソースの読込先は 7.1 を参照してください。


4. データモデル

4.1 チェックリスト定義

interface ChecklistItemDef {
  id: string;
  category: string;
  description: string;
}

interface ChecklistCategory {
  category: string;
  items: ChecklistItemDef[];
}

interface SavedChecklist {
  id: string;
  name: string;
  createdAt: string;
  isDefault?: boolean;
  categories: ChecklistCategory[];
}

4.2 ラウンドデータ

type Rating = 'A' | 'B' | 'C' | null;

interface Photo {
  id: string;
  dataUrl: string;
  comment: string;
  timestamp: string;
}

interface ChecklistItemResult {
  itemId: string;
  rating: Rating;
  photos: Photo[];
}

interface RoundData {
  inspectorName: string;
  wardName: string;
  startTime: string;
  checklistResults: ChecklistItemResult[];
  generalPhotos: Photo[];
  overallEvaluation: string;
  checklistName?: string;
}

interface SavedRound {
  id: string;
  title: string;
  savedAt: string;
  version: 1;
  checklistId: string;
  roundData: RoundData;
}

5. 永続化仕様

5.1 localStorage キー

キー 内容
icn-round:checklist-library 保存済みチェックリスト一覧
icn-round:active-checklist-id 選択中チェックリスト ID
icn-round:saved-rounds 保存済みラウンド一覧(担当者名・病棟名・評価・写真・総評を含む)
icn-round-theme テーマ設定
icn-round-icon アイコン設定
pwa_install_tracked インストール計測の重複送信防止フラグ
pwa_banner_dismissed インストールバナーを閉じたかどうか

IndexedDBCookiesessionStorage はアプリ本体では使用していません。Cookie は Google Analytics 4 が設定します(7.4 を参照)。

5.2 保存方針

5.3 保存形式と暗号化

暗号化を実装していない理由

本アプリはバックエンドを持たないため、暗号鍵の保管場所が JavaScript のバンドル内しかありません。バンドルは誰でも取得して内容を確認できるため、鍵を同梱した暗号化は次のいずれの脅威にも効果がありません。

脅威 バンドルに鍵を同梱した暗号化の効果
端末の紛失・盗難 効果なし(OS のストレージ暗号化と画面ロックが防御にあたる)
共用端末で他者がアプリを開く 効果なし(アプリが自動的に復号するため素通りする)
XSS・悪意のあるブラウザ拡張 効果なし(同一コンテキストから鍵を参照できる)
ストレージの物理的な解析 効果なし(鍵が公開されているため。OS 暗号化が防御にあたる)

実効性を持たせるには利用者ごとのパスフレーズ入力と鍵導出(PBKDF2 等)が必要ですが、起動のたびに入力が発生すること、失念時に復号不能となりデータを失うことから、ラウンド業務での可用性を著しく損ないます。

以上より、保存データの機密性は端末側の管理策(画面ロック、ストレージ暗号化、MDM)で担保する方針としています。施設の要件として利用者認証つきの暗号化が必要な場合は、別途ご相談ください。

併用を推奨する運用上の対策

暗号化の有無にかかわらず、端末内に記録が残り続けること自体が主要なリスクです。次の運用を推奨します。

5.4 初期データ

初回起動時、seedDefaultIfFirstRun() により標準チェックリストを 1 件生成します。


6. 機能仕様

6.1 ラウンド開始

6.2 チェックリスト評価

6.3 チェックリスト取り込み

6.4 写真入力

6.5 総評入力

6.6 レポートプレビュー / 出力

6.7 外観設定


7. 通信・オフライン

7.1 外部通信

アプリ本体(/)から発生する通信は以下がすべてです。

通信先 用途 ラウンド入力データの送信
配信元ホスト HTML / JS / CSS / 画像配信 なし
fonts.googleapis.com Google Fonts CSS なし
fonts.gstatic.com Google Fonts 本体 なし
www.googletagmanager.com gtag.js の取得 なし
www.google-analytics.com アクセス解析イベントの送信(7.4) なし

紹介ページ /about と更新履歴ページ /updates は、上記に加えて以下を読み込みます。これらのページにラウンド入力機能はありません。

通信先 用途
cdn.tailwindcss.com Tailwind CSS(CDN 版)
api.qrserver.com アプリ URL の QR コード画像生成(/about のみ)

/about には問い合わせフォーム(forms.gle)へのリンクを設置していますが、これはページ読込時に通信するリソースではなく、利用者がリンクを押して遷移した場合にのみ通信が発生する外部サイトです。フォームへ入力した内容は Google のサービス上で処理されます。

7.2 Service Worker

index.html./sw.js を登録します。

キャッシュ戦略は以下です。

7.3 オフライン動作

7.4 アクセス解析(Google Analytics 4)

7.4.1 構成

7.4.2 送信するイベント

イベント 送信契機 パラメータ
page_view 初回表示時(SPA のため実質1回) gtag 標準項目
pwa_install インストール検知時 methodappinstalled / standalone_first_launch
pwa_install_banner_click インストールバナーの操作 method
pwa_install_prompt_result インストールプロンプトの結果 outcome
pwa_install_banner_dismiss バナーを閉じた時 method

上記に加え、GA4 が自動収集する session_startfirst_visituser_engagement が送信されます。 ユーザープロパティとして display_modestandalone / browser)を設定します。

7.4.3 送信しないもの

以下は GA4 へ一切送信しません。送信する実装が存在しません。

アプリは SPA であり、URL に入力値を含めないため、page_view の URL 経由で入力内容が送信されることもありません。

7.4.4 GA4 側で取得される標準情報

gtag.js の標準動作として、以下が Google に送信・記録されます。

データ保持期間は GA4 の設定で 14 ヶ月としています。

7.4.5 エラーログ収集

Sentry 等のエラー監視サービスは導入していません。例外情報を外部へ送信する実装はありません。

7.5 音声入力について

本アプリに音声入力機能はありません。 マイクを使用せず、音声データを扱う実装も持ちません。

なお、利用者が端末キーボードの音声入力(iOS の音声入力、Android の音声認識など)を用いて総評を入力することは可能です。この場合の音声データの扱いは端末 OS の機能に属し、本アプリの管理外です。OS の実装によっては音声が OS 提供元のサーバーへ送信されて認識されるため、利用可否は各施設のポリシーに従って判断してください。


8. セキュリティ・個人情報

8.1 取り扱うデータ

これらはすべて利用端末内にとどまります。バックエンドが存在しないため、サーバー側に保管される複製はありません。

8.2 外部送信

8.3 保存データの暗号化

8.4 個人情報上の留意点

8.5 認証


9. ホスティング要件

9.1 配信条件

9.2 Vite 設定

9.3 配置ファイル


10. ビルド・運用

10.1 コマンド

npm install
npm run dev
npm run build
npm run preview
npm run lint

10.2 本番ビルド

10.3 更新反映


11. 既知の実装前提


12 関連文書

文書 内容 公開 URL
docs/privacy-policy.md プライバシーポリシー https://ict-round.conect.llc/docs/privacy-policy
docs/user-guide.md 取扱説明書 https://ict-round.conect.llc/docs/user-guide
docs/ga4-plan.md アクセス解析の運用方針 非公開

この技術仕様書自体も https://ict-round.conect.llc/docs/technical-spec で公開しています。公開ページは上記の公開対象3文書の Markdown からビルド時に生成しており、内容は同一です。docs/ 配下のその他の文書は公開していません。


13 ライセンス

Apache 2.0