# NoteDeck Roadmap マーケティング戦略・ポジショニング・競合分析・収益化については [STRATEGY.md](STRATEGY.md) を参照。 設計原則は [DESIGN.md](DESIGN.md#設計原則) を参照。 --- ## 構造的に対応しない領域 低頻度・管理系の操作は Web UI の責務とし、実装しない。 **ただし、ユーザーが迷わず Web UI へ到達できるリンク導線を整備する。** | 領域 | 理由 | リンク導線 | |---|---|---| | 管理画面 | サーバー管理者は SSH + Web UI で運用しており、NoteDeck の責務外 | ✅ アカウントメニュー → Admin | | プロフィール編集 | 年に数回の操作。Web UI リンクで十分 | ✅ プロフィールバナー → 編集ボタン | | チャンネル管理 | 閲覧は対応。作成・編集は Web UI で | ✅ カラムヘッダー → 外部リンク | | ミュート・ブロック | 設定の下位項目。一覧管理は Web UI で | ✅ アカウントメニュー → Settings | | フォロー管理画面 | 一覧表示・整理は Web UI で。フォロー操作のみ対応 | ✅ プロフィール → Following / Followers | | 設定画面の網羅 | Misskey 本家の膨大な設定項目は Apple 式の思想と矛盾 | ✅ アカウントメニュー → Settings | | ノート詳細 | アプリ内で会話チェーン・タブ表示済み。Web UI リンクは補助導線 | ✅ ノートメニュー → Web UIで開く | | 他人のプロフィール | アプリ内で閲覧・ノート一覧・フォロー操作済み。Web UI リンクは補助導線 | ✅ プロフィールバナー → 外部リンクボタン | | Misskey Games | 物理演算ゲーム・リアルタイム対戦の移植は過大。Web UI で遊べば十分 | ✅ アカウントメニュー → Misskey Games | **判断基準**: 月 1 回以下の操作 / Web UI リンクで代替可能 / 情報フロー(収集→分類→知識化)を中断しない > **Note**: リスト・アンテナ・クリップの CRUD は情報分類パイプラインの中核であるため、 > 「構造的に対応しない領域」から外し L2「情報整理 CRUD」で対応する。 --- ## レイヤーモデル NoteDeck の機能は 5 つのレイヤーで構成される。各レイヤーは前の層の上に乗り、 下が成熟していないと上の価値を発揮できない。 ``` Layer 0: 収集 ───────────────────────────────── マルチサーバー │ ストリーミング │ 全カラム種別 ↓ Layer 1: 蓄積 ───────────────────────────────── SQLite FTS5 │ 永久キャッシュ │ notecli 分離 ↓ Layer 2: 反応 ◀ 現在のフロンティア ──────────── デッキ UI │ Vim モード │ 投稿 │ マルチウィンドウ ↓ Layer 3: 検索・整理 ─────────────────────────── 全文検索 │ 横断検索 │ 外部PKM連携 │ エクスポート ═══════════════ v1.0.0 ════════════════════════ ↑ v1.0.0: Layer 0〜2 完成 + Layer 3 検索 ↓ v1.0.0 以降: PKM 連携 + Layer 4 ↓ Layer 4: 拡張 ───────────────────────────────── HTTP API │ CLI │ AI 統合 │ Nd:* API ``` --- ## Layer 0: 収集 — 情報を大量に集める **思想: 複数サーバーの情報を一箇所に引き込む。NoteDeck の価値の根源。** ### マルチサーバー接続 - [x] **複数サーバー同時接続** — SQLite 管理(UNIQUE(host, user_id) 制約)、サーバー単位のアカウント分類 - [x] **アカウント切替** — アカウントメニューから即座に切替 - [x] **サーバー情報キャッシュ** — TTL 24 時間、ソフトウェア検出、バージョン追跡、機能検出 - [x] **接続状態インジケーター** — アカウントごとのストリーミング接続状態 (接続中 / 再接続中 / 切断)をアイコンで表示 ### ストリーミング・データ取得 - [x] **WebSocket ストリーミング** — requestAnimationFrame バッファリング、forceUpdate 定期実行 - [x] **カスタム絵文字** — ホスト単位キャッシュ、`@.` リモート絵文字、並列フェッチ重複排除 - [x] **OGP リンクプレビュー** — IntersectionObserver 遅延読み込み、Rust バックエンドでメタデータ抽出&キャッシュ - [x] **3 層画像キャッシュ** — メモリ→ディスク→ネットワーク(Rust image_cache.rs) - [x] **画像プロキシ** — `http://127.0.0.1:19820/proxy/image` 経由でキャッシュ付き配信 ### カラム種別 - [x] タイムライン(HTL / LTL / STL / GTL / カスタム) - [x] 通知カラム(リアルタイム、タイプ別アイコン・ラベル、ユーザーホバープレビュー) - [x] 検索カラム(ローカル FTS5 + サーバー検索ハイブリッド、重複排除マージ) - [x] リストカラム - [x] アンテナカラム - [x] ダイレクト投稿カラム(visibility: specified) - [x] チャットカラム(Misskey v2025.2.0+ chat API、リアルタイム WS 対応) - [x] クリップカラム - [x] ユーザーノート一覧カラム - [x] メンションカラム - [x] チャンネルカラム - [x] お気に入りカラム - [x] ウィジェットカラム(AiScript Console / App 実行環境) - [x] スクラッチパッドカラム(旧 AiScript エディタ。独立カラム、上下分割レイアウト、Web Worker LSP、UI インスペクター) - [x] ページカラム(Misskey Pages の閲覧・いいね。MFM + AiScript 実行、Plugin:register_page_view_interruptor 対応) - [x] お知らせカラム(サーバーからの告知を閲覧) - [x] ドライブカラム(ファイル一覧の閲覧、フォルダナビゲーション、ファイルD&D アップロード) - [x] ギャラリーカラム(ギャラリー投稿の閲覧) - [x] 実績カラム(実績一覧の表示) - [x] フォローリクエストカラム(フォローリクエストの管理) - [x] Explore カラム(notes/featured の閲覧) - [x] API コンソールカラム(Misskey API をインタラクティブに実行・レスポンス確認) - [x] API ドキュメントカラム(OpenAPI 仕様を Scalar で表示、ダーク/ライト自動切替、ワイドカラム対応) - [x] 照会カラム(URL or @user@host でノート・ユーザーを照会。同一サーバー直接取得 + ap/show リモート解決) - [x] サーバー情報カラム(サーバーの概要・管理者・ルール・統計・リンクを Misskey 本家 /about 準拠で表示) - [x] Misskeyについてカラム(Misskey ソフトウェアの紹介・クレジットを /about-misskey 準拠で表示。meta API からバージョン取得、プロジェクトメンバー・スポンサー・I❤Misskey 投稿ボタン。改変版フォーク検出対応) - [x] カスタム絵文字カラム(サーバーのカスタム絵文字一覧。カテゴリ別グルーピング・検索フィルタ・クリックでショートコードコピー。既存の絵文字キャッシュを流用) - [x] 広告カラム(サーバー広告の一覧表示。全広告種別を表示、ミュート対応。既存の useAds.ts + meta API の ads フィールドを流用) - [ ] 連合カラム(federation/instances の一覧表示。ソフトウェア・ユーザー数・最終通信日時等。ソート・フィルタ付き) - [ ] チャートカラム(charts/* API によるサーバー統計グラフ。ユーザー活動・ノート数・連合等。グラフ描画ライブラリの導入が必要) ### サーバー運営者との共生 - [x] **サーバー広告表示** — `/api/meta` から広告データを取得し TL に自然に差し込み(デフォルト ON)。 サーバー設定の `notesPerOneAd` に従った表示間隔、ratio による重み付きランダム選択、dayOfWeek ビットマスクフィルタ対応。 画像右上の i ボタンから「Ads by {host}」表示・表示頻度低下(ミュート)が可能。アカウント単位で 10 分キャッシュ - [x] **広告表示ポリシーの明示** — README で「サーバー広告を尊重する」方針を明記。 サーバー管理者に安心感を与え、NoteDeck を推薦してもらうための信頼構築 ### フォーク adapter | フォーク | 状態 | 備考 | |---|---|---| | Misskey 本家 | 基本対応済み | Chat API (v2025.2.0+) 含む | | yamisskey 系 | 必要に応じて対応 | Misskey API 準拠のため差異は小さい | | misskey-tempura 系 | 必要に応じて対応 | Misskey API 準拠のため差異は小さい | --- ## Layer 1: 蓄積 — 集めた情報を失わない **思想: サーバーが消えても、あなたのタイムラインはここにある。** ### データ永続化 - [x] **SQLite FTS5** — trigram トークナイザーによる日本語対応全文検索基盤。 ストリーミング受信・API 取得時にノートを自動キャッシュ - [x] **ノートキャッシュ永久保存** — `cleanup_cache()` を no-op 化し無期限保存。 サーバーからノートが消えてもローカルに残る - [x] **キャッシュファースト表示** — 全カラムでローカルキャッシュを先読みし即座に表示。 サーバーからは差分のみ取得(sinceId)。オフライン時もキャッシュ済み TL を表示継続 - [x] **OS キーチェーン連携** — Keychain / DPAPI / Secret Service で暗号化保管。 SQLite フォールバック、メモリキャッシュ + zeroize ### notecli(ストレージエンジン分離) notecli は NoteDeck の Rust バックエンドから Tauri 非依存のコードを分離した独立リポジトリ ([github.com/hitalin/notecli](https://github.com/hitalin/notecli))。 NoteDeck は `Cargo.toml` で git 依存として参照。 - [x] **API クライアント** — Misskey HTTP API ラッパー(api.rs) - [x] **SQLite データベース** — ノートキャッシュ・FTS5 検索・アカウント管理(db.rs) - [x] **データモデル** — Misskey エンティティの型定義(models.rs) - [x] **エラー型** — 統一エラーハンドリング(error.rs) - [x] **イベントバス** — tokio broadcast ベースの pub/sub(event_bus.rs) - [x] **streaming の notecli 移行** — `AppHandle.emit()` を `FrontendEmitter` trait に抽象化。 notedeck 側は薄い TauriEmitter アダプタのみ ### 未完了 - [x] **ワンファイルバックアップ** — `notecli.db` を丸ごとコピーで完全バックアップ。 サーバーが消滅しても自分の投稿・お気に入りは残る。 GUI 設定(デッキレイアウト・テーマ・キーバインド等)もJSONバンドルで一括バックアップ可能。 設定メニュー →「DBバックアップ」「設定バックアップ」でファイル保存ダイアログ経由のエクスポート - [x] **完全オフライン動作** — キャッシュ済みノートの閲覧・検索はネットワーク不要。 飛行機の中でも過去の TL を読み返せる。 アプリレベルのオフラインモード(ナビバー / コマンドパレット / システムトレイから切替)で 全通信を停止し、キャッシュのみで動作。書き込み操作はブロック、再開時に差分フェッチで復帰 - [ ] **サーバー移転支援** — 旧サーバーのキャッシュを保持したまま新サーバーに移行。 「あのノートなんだっけ」がローカル検索で見つかる - [x] **ログアウト時のデータ保持選択** — ログアウト時に「データを残す/すべて削除」を選択可能にする。 「データを残す」ではトークンのみ削除し、カラムとキャッシュは読み取り専用で残る。 オフラインファースト表示(A-8)と同じ仕組みでキャッシュ済みノートを閲覧可能。 プライバシー保護はアプリロック(OS 認証連携)で担保する - [ ] **アプリロック** — OS のバイオメトリクス/PIN 認証と連携したアプリロック。 離席時の覗き見防止、ログアウト後のローカルデータ保護に使用 --- ## Layer 2: 反応 — 人間が情報に対してアクションする **思想: 見て、反応して、発信する。マウスに手を伸ばした時点で負け。** ### デッキ UI - [x] **カラム管理** — 追加・削除・並べ替え(ドラッグ&ドロップ)、レイアウト localStorage 永続化 - [x] **カラムリサイズ** — ドラッグで 280px〜600px に自由変更、幅を localStorage に永続化 - [x] **カラムスタック(上下分割)** — カラムをグループ化して上下分割表示。ドラッグ&ドロップで スタック内の並べ替え・スタック間のカラム移動・空きエリアへのドロップで独立カラム化が可能 - [x] **ナビバー構造** — 折りたたみ/展開(68px↔250px)、ドラッグリサイズ、120px 以下で自動折りたたみ - [x] **フローティングウィンドウ** — ノート詳細・ユーザープロフィール・ログインをウィンドウで表示。 ドラッグ移動、最小化/最大化、Z-index 自動管理、同一対象の重複排除、サーバーテーマ反映 - [x] **カスタムタイトルバー** — 最小化/最大化/閉じる、サイドバー切替、モバイルサイズ切替、PiP トグル - [x] **カラムフィルター** — Renote 除外・リプライ除外・ファイル付きのみ・Bot 除外(timelineFilter) - [x] **カラムサウンド** — カラム単位のミュート/アンミュート、通知サウンド再生 - [x] **デッキプロファイル** — 名前付きプリセット(「仕事用」「趣味用」等)でカラム構成を保存・切替。 `Alt+1`〜`9` で即切替、コマンドパレットからも実行可能 ### 投稿・リアクション - [x] **投稿** — テキスト・CW・公開範囲・ファイル添付・ドライブファイル添付・投票・編集・ローカルオンリー・Ctrl+Enter 送信 - [x] **下書き管理** — localStorage、最大10件、アカウント別、保存・復元・削除UI - [x] **リアクション / リプライ / リノート / 引用** - [x] **リアクション楽観的更新** — UI 即時反映+失敗時ロールバック - [x] **フォロー / アンフォロー** - [x] **投票表示** — 投票結果の表示、投票操作 - [x] **ドラッグ&ドロップ投稿** — デスクトップからファイルをドロップ → アップロード。 ドライブカラムへのファイル D&D にも対応 - [x] **ノートコピー(テキスト・リンク)** — ノートメニュー →「内容をコピー」「リンクをコピー」。 Misskey 本家と同じ 2 ボタン構成 ### レンダリング・表示 - [x] **MFM 完全レンダリング** — bold/italic/strike/code/mention/hashtag/URL/link/カスタム絵文字/ Unicode 絵文字/コードブロック + アニメーション関数(spin/shake/bounce/jelly/tada/jump/twitch/ rainbow/sparkle/blur/fontSize/color/bgColor/border 等) - [x] **Twemoji** — Unicode 絵文字を自動変換、リアクション絵文字 URL 生成 - [x] **コードハイライト** — Shiki(Dark Plus テーマ)、17 言語対応 (bash/c/cpp/css/go/html/java/js/json/kotlin/markdown/python/ruby/rust/sql/ts/yaml) - [x] **メディアグリッド** — 画像/動画/音声の表示(最大 4 ファイル)、NSFW 切替、ライトボックス、遅延読み込み - [x] **ユーザーホバープレビュー** — アバターホバー 400ms でユーザー情報ポップアップ表示 - [x] **リアクション者一覧** — リアクションホバーでリアクションしたユーザー一覧をポップアップ表示 - [x] **インスタンスティッカー** — リモートユーザーのサーバー favicon + テーマカラー表示 ### キーボード操作 - [x] **基本ノートナビゲーション** — `j` / `k` でノート移動、`Enter` で詳細展開(useNoteFocus) - [x] **ノートアクション** — `r` リプライ、`e`/`+` リアクション、`q` リノート/引用、`b` ブックマーク、`v` CW トグル - [x] **カラム間移動** — `H` / `L` でカラム切替、`Ctrl+1`〜`9` でカラム直接選択。 キーバインドカスタマイズで変更可能 - [x] **クイックリアクションキー** — `1`〜`9` でお気に入りリアクション(pinnedReactions)を即送信。 ノートにフォーカスした状態で数字キー一発。キーバインドカスタマイズで変更可能 - [x] **コマンドパレット** — Ctrl+K で起動、fuzzy 検索、ショートカットキー連携 - [x] **キーバインドカスタマイズ** — `useKeybindsStore` でデフォルト+ユーザー上書きを管理。 VSCode の `keybindings.json` と同じ思想。設定 UI からリマップ可能 - [x] **投稿コマンド** — コマンドパレットから直接投稿。`post ここに本文` で即送信 - [x] **Quick Note** — `Ctrl+Alt+N` でコマンドパレットを `post` モードで起動(アプリ非アクティブ時も動作)。 テキスト入力 → Enter で即送信、パレットは自動で閉じる - [x] **Boss Key** — `Ctrl+Shift+B` で即座にウィンドウを非表示。 上司が来た時に一瞬で消す(タスクバーからも消える) - [x] **ダイアログ・フォーカストラップ** — 確認ダイアログ・カラム追加・リアクションピッカー等で `Esc` 閉じ、`Tab` がダイアログ内でループ、初期フォーカス自動設定(useFocusTrap) - [x] **ポップアップメニュー・キーボード操作** — ノート操作メニュー・設定メニュー・プロフィールメニュー・ アカウントメニュー等で `↑`/`↓` アイテム移動、`Enter` 選択、`Home`/`End`、`Esc` 閉じ(useMenuKeyboard) - [x] **ライトボックス・キーボード操作** — `Esc` 閉じ、`←`/`→` で前後の画像に移動 - [x] **リアクションピッカー・キーボード選択** — 検索入力 → `↓` で結果に移動 → `←`/`→` で絵文字間ナビ → `Enter` で選択 - [x] **カラム並び替えコマンド** — コマンドパレットから「カラムを左/右に移動」で実行可能 ### テーマ - [x] **Misskey 互換テーマコンパイラ** — Misskey テーマ定義を CSS 変数にコンパイル - [x] **アカウント別テーマ** — サーバーのデフォルトテーマ(meta.themeDark / meta.themeLight)を自動取得、 アカウント単位でカラム・ウィンドウに適用 - [x] **ダーク/ライト自動選択** — システム設定に連動 - [x] **テーマ手動切替** — ナビバーの太陽/月トグルでダーク/ライト切替 - [x] **テーマ JSON5 インストール** — Misskey テーマコードを貼り付けてインストール - [x] **テーマエディタカラム** — カラム上でテーマカラーをリアルタイム編集、プレビュー反映 - [x] **カスタム CSS カラム** — ユーザー独自の CSS をエディタで記述・即時適用、プリセット機能付き ### デスクトップ統合 - [x] **システムトレイ** — 常駐、トレイアイコン - [x] **デスクトップ通知** — リアルタイム通知(ノート・リアクション・フォロー等)、 アプリフォーカス中は非表示、通知アクション(クリックでノート/ユーザーを開く) - [x] **通知サウンド** — AudioContext デコード+キャッシュ、カラム単位ミュート、フェードイン再生 - [x] **自動アップデート** — Tauri updater で起動時チェック、ダウンロード+インストール+自動再起動 - [x] **自動起動** — tauri-plugin-autostart でOS起動時に自動起動 - [x] **仮想スクロール** — @tanstack/vue-virtual で全カラムを仮想化、DOM 30-50 件に抑制、CSS @keyframes で新着アニメーション維持 ### マルチウィンドウ - [x] **ミラー式マルチウィンドウ** — タイトルバーから同等のウィンドウを複数作成。 全ウィンドウが同じカラム構成を共有し、Tauri イベントで状態を同期 - [x] **デッキのウィンドウ分離** — カラムヘッダーメニューから「別ウィンドウで開く」で カラムをサブウィンドウにポップアウト。サブウィンドウからは「メインウィンドウに戻す」で回収。 モニター 1 に TL 系カラム、モニター 2 に通知 + 検索 + AI カラム等の配置が可能 - [x] **ウィンドウ間カラム移動** — ドラッグ&ドロップでカラムをウィンドウ間で移動。 カーソルがウィンドウ外に出るとドロップオーバーレイが表示され、クリックで移動を確定。 Tauri IPC イベント(deck:drag-start / deck:drag-end)で同期 - [x] **ウィンドウレイアウト永続化** — プロファイル = 全体スナップショット方式。 ウィンドウの数・位置・サイズ・カラム割当をプロファイルに含めて保存。 `Alt+1`〜`9` で切替時にウィンドウレイアウトごと復元(余剰ウィンドウは閉じ、不足分は開く) - [x] **モニター記憶** — ウィンドウがどのモニターに配置されていたかを記憶し、次回起動時に復元。 Tauri `currentMonitor()` でモニター名を保存、`availableMonitors()` で復元時に検証 - [x] **モニター切断時のフォールバック** — 保存されたモニターが切断された場合、 プライマリモニターの中央にウィンドウを配置。画面外にはみ出す場合は座標をクランプ - [x] **ウィンドウスナップ統合** — OS のスナップ機能(Win+矢印等)に対応。 `decorations: false`(カスタムタイトルバー)でも Windows の端スナップが正常動作 ### PiP ウィンドウ デッキのカラムを常前面フローティングウィンドウとして切り離す機能。 - [x] **ウィンドウ管理** — 375×700px(リサイズ可能)、`alwaysOnTop`、複数同時起動(動的ラベル `pip-*`) - [x] **任意カラム表示** — 全カラムタイプをフル機能で表示。カラムヘッダーと統一されたデザイン - [x] **起動導線** — コマンドパレット / タイトルバー PiP ボタン / カラムメニューの 3 経路 - [x] **メインウィンドウ連携** — アカウント切替オーバーレイ、ノートクリックでメインウィンドウをフォーカス ### ナビバー機能 **カラムで再現できる機能はナビバーに置かない。** カラムを超えた操作のみをナビバーに配置する。 - [x] **投稿ボタン** — 新規ノート作成(展開時テキスト付き / 折りたたみ時 FAB 化) - [x] **アカウント管理** — アバター一覧、切替、モード設定、ログアウト、アカウント追加 - [x] **横断検索** — 全アカウントのキャッシュ+サーバー検索を統合。 単一アカウントの検索カラムでは不可能な、全アカウント横断の検索体験 - [x] **横断通知** — 全アカウントの通知を統合表示するウィンドウ - [x] **テーマ切替** — ダーク / ライト手動切替トグル(太陽/月アイコン) - [x] **設定** — ボトムバーの設定ボタンからアプリ設定メニューにアクセス (カスタムCSS・壁紙・テーマインストール等) ### Web UI リンク導線 - [x] **アカウントメニュー → Admin** — 管理者のみ表示、外部ブラウザで管理画面を開く - [x] **アカウントメニュー → Settings** — サーバーの設定画面を外部ブラウザで開く - [x] **プロフィールバナー → 編集ボタン** — 自分のプロフィール編集を Web UI で開く - [x] **プロフィールバナー → 外部リンクボタン** — 他人のプロフィールを Web UI で開く - [x] **プロフィール → Following / Followers** — フォロー管理画面を Web UI で開く - [x] **カラムヘッダー → 外部リンク** — リスト・アンテナ・チャンネルの管理画面を Web UI で開く - [x] **ノートメニュー → Web UIで開く** — ノート詳細を外部ブラウザで表示 ### 未完了 - [ ] **ノートの Markdown 保存** — ノート右クリック →「Markdown で保存」。 ローカルファイルに直接書き出し。L3 エクスポートの単一ノート版 - [ ] **添付ファイル一括ダウンロード** — 特定ユーザー / カラムの全添付ファイルを `~/Downloads/notedeck/{user}/` にバッチ保存 - [ ] **ノートコピー形式拡充** — MFM / Markdown 形式でのコピーを追加。 MFM は Misskey 再投稿用、Markdown は PKM・AI 向け - [ ] **リッチテキスト → MFM 変換** — Word やブラウザからリッチテキストをコピペ → 太字・リンク等を MFM 記法に自動変換 ### Misskey Web UI 互換(未完了) Misskey 本家 Web UI と食い違うポイント。アプリ独自のデッキ UI 等は除外。 「構造的に対応しない領域」の方針(設定画面は Web UI)は維持しつつ、 日常操作で本家ユーザーが違和感を覚える箇所を埋める。 #### 情報整理 CRUD 情報フロー(収集→分類→知識化)のパイプラインで「分類」を担う機能群。 閲覧カラムは実装済みだが、箱の作成・編集ができないと分類フローが Web UI 往復で中断する。 - [ ] **クリップ CRUD** — クリップの新規作成・名前編集・削除。 ノートメニュー →「クリップに追加」の選択リスト末尾に「+新規クリップ」を配置し、 分類フローを中断させない。クリップカラムヘッダーからも管理可能 - [ ] **リスト CRUD** — リストの新規作成・名前編集・削除・メンバー管理。 カラム追加ダイアログ・リストカラムヘッダーから操作可能。 ユーザーメニューからの「リストに追加」は実装済み - [ ] **アンテナ CRUD** — アンテナの新規作成・条件編集・削除。 カラム追加ダイアログ・アンテナカラムヘッダーから操作可能。 条件設定 UI は本家準拠(キーワード・除外・ユーザー・返信含む等) #### ノート操作 - [x] **ミュート / ブロック操作** — ユーザーメニュー・ノートメニューからワンクリックで実行。 一覧管理は従来通り Web UI リンク導線のまま - [x] **通報(レポート)** — ノートメニュー・ユーザーメニューから通報ダイアログを表示。 SNS の基本的な自衛手段として必須 - [x] **クリップに追加** — ノートメニューからクリップ選択・追加。 クリップカラムでの閲覧は実装済み、追加操作が未対応 - [x] **リストに追加** — ユーザーメニューからリストへの追加・削除。 リストカラムでの閲覧は実装済み、メンバー操作が未対応 - [x] **削除して編集** — ノートメニューに「削除して編集」を追加。 本家ユーザーが慣れている操作フロー - [x] **リアクション詳細モーダル** — リアクションクリックでリアクション別ユーザー一覧を表示。 モーダル + ホバーポップアップの両方に対応 #### 通知 - [x] **通知フィルター** — 通知カラムでタイプ別フィルタ(リアクション / フォロー / メンション等)。 通知が多いユーザーにとって必須 - [x] **通知グループ化** — 同一ノートへのリアクションをまとめ表示。 reaction:grouped / renote:grouped 対応、サーバー非対応時はフォールバック #### ユーザープロフィール - [x] **フォロー / フォロワー一覧** — プロフィール内でフォロー・フォロワーをスクロール閲覧。 現在は Web UI リンクのみ。簡易一覧はアプリ内で見られると利便性向上 - [x] **フィールド表示** — プロフィールのカスタムフィールド(自由記述項目)の表示 - [x] **ロール / バッジ表示** — サーバーロール・バッジの表示(Bot/Cat バッジ含む) **プロフィールタブ(現在は「該当」タブの内容のみ実装済み):** - [ ] **ノートタブ** — ユーザーの投稿一覧 - [ ] **アクティビティタブ** — 投稿頻度ヒートマップ / グラフ - [ ] **ファイルタブ** — ユーザーがアップロードしたファイル一覧 - [ ] **実績タブ** — ユーザーの実績(アチーブメント)一覧 - [ ] **リアクションタブ** — ユーザーがしたリアクションの一覧 - [ ] **クリップタブ** — ユーザーのクリップ一覧 - [ ] **リストタブ** — ユーザーが作成したリスト一覧 - [ ] **ページタブ** — ユーザーが作成した Pages 一覧 - [ ] **Play タブ** — ユーザーが作成した Misskey Play 一覧 - [ ] **ギャラリータブ** — ユーザーのギャラリー投稿一覧 - [ ] **Raw タブ** — ユーザー情報の生データ(JSON)表示 #### タイムライン・表示 - [x] **スレッド表示** — 会話チェーンをインデント / ツリーで表示。 最大 5 階層ネスト、超過時は「スレッドを続ける」で詳細遷移 - [ ] **ハッシュタグトレンド** — Explore カラム等でトレンドハッシュタグを表示 - [ ] **ノートの言語タグ表示** — 多言語環境での視認性向上 --- ## Layer 3: 検索・整理 — 蓄積データを引き出し構造化する **思想: Layer 1 で蓄積されたデータを「キャッシュ」から「知識」に昇格させる。** ### 検索 - [x] **ローカル全文検索** — SQLite FTS5 trigram トークナイザーで日本語対応。 検索カラムで入力中に即座にローカル結果を表示、Enter でサーバー検索結果とマージ - [x] **横断検索** — 複数サーバー × 全カラムのノートを統合検索。 全アカウントのローカルキャッシュ+サーバー検索を並列実行し、結果をマージ表示。 サーバー A のリスト + サーバー B のアンテナ + サーバー C の HTL をまたいだ検索は NoteDeck だけの体験 - [x] **正規表現検索** — 検索カラム・横断検索で正規表現パターンによる検索が可能。 `.*` トグルで正規表現モードに切替、ローカル/サーバー検索結果をクライアント側で正規表現ポストフィルタ。 構造化フィルタビルダー(いずれかを含む/すべてを含む/除外する)で直感的に条件構築 - [x] **クロスサーバー検索** — 複数サーバーの API 検索結果を統合表示。 ローカル検索 + API 検索のハイブリッド(横断検索ウィンドウで実装済み) - [x] **TL 履歴タイムマシン** — 日付指定で過去の TL を再現。 時計ボタンから日付選択、キャッシュ済みノートを閲覧、Live ボタンで復帰 ### 未完了(外部 PKM 連携)— v1.0.0 以降 > Layer 0〜2 の完成・安定を優先し、PKM 連携は v1.0.0 以降に着手する。 > 基盤が安定していない段階で上位レイヤーの仕様を固めても、手戻りが発生する。 NoteDeck は Misskey クライアントであり、PKM ツールではない。 ノートの整理・知識化は Obsidian / Logseq 等の専門ツールに委ね、NoteDeck はデータの橋渡しに徹する。 - [ ] **Markdown エクスポート** — ノート・検索結果単位で Markdown ファイルに書き出し。 Obsidian / Logseq / Notion / HackMD 等に直接保存可能 - [x] **JSON エクスポート** — `export_settings_json` / `import_settings_json` で GUI 設定の一括バックアップ・復元を実装済み。DB バックアップと合わせて全データ対応 - [ ] **PKM 連携(Obsidian / Logseq)** — ノートメニュー →「PKM に送る」で直接保存。 Obsidian は URI スキーム経由、Logseq はグラフディレクトリへの Markdown 書き出し。 保存先パスの設定のみで連携完了 --- ## Layer 4: 拡張 — 外部ツール・AI がデータにアクセスする **思想: NoteDeck を閉じた箱にせず、外部ツール・AI・プラグインがデータにアクセスするプラットフォームにする。** ### HTTP API(localhost:19820) - [x] **HTTP サーバー基盤** — localhost で起動 - [x] **Bearer トークン認証** — 起動時にランダムトークンを生成しファイルに書き出し。 Jupyter Notebook 方式で同一マシンの認可済みプロセスのみアクセス可能 - [x] **コマンド実行 API** — 登録済みコマンドを HTTP 経由で実行。 コマンドパレットで人間ができることは全て API からもできる - [x] **状態取得 API** — カラム一覧、アクティブカラム、ノート取得等の読み取り操作 - [x] **イベントストリーム** — SSE で状態変化を購読。 AI が「新着通知があったら要約して」等のリアクティブ処理を実現 - [x] **API ドキュメント公開** — OpenAPI 形式で API 仕様を公開(`/api/openapi.json`)。 Scalar API Reference をアプリ内カラムとして表示。ダーク/ライトテーマ自動切替、ワイドカラム対応 **発展的な可能性: HTTP API をフロントエンドから叩く** notecli デーモンが localhost:19820 で全操作を API 公開しているため、 Tauri invoke の代わりに HTTP API を叩くアダプタ層を書けば、理論上はブラウザから NoteDeck の機能にアクセスできる。 「ブラウザ版 NoteDeck」をそのまま作る価値はないが、この構造は以下のような拡張に活かせる可能性がある: - **Web ダッシュボード** — 蓄積データの統計・可視化を別画面で表示(アクティビティヒートマップ、フォロー関係グラフ等) - **リモートアクセス** — 同一 LAN 内の別端末からノート検索・投稿(モバイルから PC の DB を横断検索) - **外部ツール連携の UI** — PKM エクスポートのプレビュー画面、AI チャットの Web UI 等、 デスクトップアプリに組み込むほどではないが GUI が欲しいユースケース 現時点では構想段階。HTTP API の成熟度と実際の需要を見て判断する。 ### AiScript プラグイン - [x] **AiScript ランタイム基盤** — @syuilo/aiscript v1.2.1 を WebView 内で実行。 ウィジェットカラム(Console / App)およびスクラッチパッドカラム(旧 AiScript エディタ)で記述・実行可能。 CodeMirror 6 エディタ統合(VS Code Dark+ テーマ、行番号、横スクロール、Web Worker LSP による補完・診断) - [x] **Misskey Play 互換 API** — `Mk:dialog`, `Mk:confirm`, `Mk:toast`, `Mk:api`, `Mk:save`, `Mk:load`, `Mk:remove`, `Ui:render`, `Ui:get`, `Ui:root`, `Ui:C:*`(text/mfm/button/buttons/textInput/textarea/numberInput/ switch/select/container/folder/postFormButton/postForm/spacer)。 `Mk:dialog`/`Mk:confirm`/`Mk:toast` は専用 Vue コンポーネント(AiScriptDialog/AiScriptToast)で表示 - [x] **Misskey Plugin API 完全互換** — Misskey 本家の全 Plugin API を実装: `Plugin:register_note_action`, `Plugin:register_user_action`, `Plugin:register_post_form_action`, `Plugin:register_note_view_interruptor`, `Plugin:register_note_post_interruptor`, `Plugin:register_page_view_interruptor`, `Plugin:open_url`, `Plugin:config`。 コロン区切りエイリアス(`Plugin:register:*`)にも後方互換対応。 レガシー AiScript(v0.13.2 / v0.19.0)のプラグインにも対応 - [x] **プラグイン管理 UI** — インストール・有効/無効切替・アンインストール。 Misskey 本家と同じくテキストベースでコピペインストール、AiScript エディタによるシンタックスハイライト - [x] **NoteDeck 拡張 API(Nd:*)** — Misskey 本家にない NoteDeck 固有の拡張ポイント。 名前空間は `Nd:*` に統一し、Misskey 本家の `Mk:*` / `Plugin:*` との衝突を回避。 フィーチャーディテクション用の定数で、プラグインが実行環境を判別できる。 AiScript カラム・Play カラム・ウィジェット・プラグインの全実行ポイントに統合済み - `NOTEDECK` — bool 定数。`exists("NOTEDECK")` でフィーチャーゲート可能 - `Nd:version` — NoteDeck のバージョン文字列 - `Nd:register_command` — コマンドパレットにカスタムコマンドを登録(ライフサイクル管理付き) - `Nd:columns` / `Nd:addColumn` / `Nd:removeColumn` — カラム操作 API(型バリデーション付き) ### notecli CLI(外部インターフェース) - [x] **CLI モード** — notecli 単体での CLI 実行(投稿・検索・TL 取得等)。 clap ベースのサブコマンド: `accounts`, `post`, `tl`, `search`, `notifications`, `note`, `delete`。 `--json` フラグで AI エージェント向けマシンリーダブル出力 - [x] **デーモンモード** — バックグラウンドでストリーミング接続を維持し、HTTP API + SSE で配信。 `EventBusEmitter` により WebSocket → EventBus → SSE のパイプラインが完結 ### 未完了: AI 統合 — v1.0.0 以降 > Layer 0〜2 の完成・安定を優先し、AI 統合は v1.0.0 以降に着手する。 > 基盤が安定していない段階で上位レイヤーの仕様を固めても、手戻りが発生する。 NoteDeck に AI を統合する。ただし AI を「持つ」のではなく「受け入れる」プラットフォームとして。 **なぜ新プロトコル(MCP 等)を追加しないか:** notecli CLI + notedeck HTTP API で AI が必要とする操作は全てカバー済み。 MCP は需要が出た時点で CLI / API の薄いラッパーとして追加すれば十分。 **Step 1: 要約・チャット** - [ ] **AI アシスタントウィンドウ** — ナビバーに AI ボタンを配置。 横断検索・横断通知と同じパターンで、フローティングウィンドウとして開く - [ ] **AI チャットカラム** — カラム追加ダイアログから追加可能。 他カラムと同じくリサイズ・削除可能 - [ ] **離席サマリー** — 離れていた間の TL を AI が要約して表示 **AI × Layer 3 連携:** - [ ] **自然言語検索** — 「先月の技術的な議論」等の曖昧なクエリを AI が FTS5 クエリに変換 **AI × AiScript:** - [ ] **自然言語 → AiScript** — 「○○するプラグイン作って」で AI がコード生成・インストールまで完結 - [ ] **プラグイン生成 API** — AI がプラグインコードを生成し、HTTP API 経由でインストール ### 未完了: Nd:* API 拡充 - [ ] **Nd:db.query** — ローカル DB(SQLite FTS5)への読み取りアクセス。 プラグインが蓄積された全ノートを検索・集計できる - [ ] **Nd:db.stats** — ノート数・ユーザー数・期間等の統計情報取得 - [ ] **Nd:http** — 外部 HTTP API コール(GET/POST)。 翻訳 API・天気 API・RSS フィード等との連携が可能。CORS 制約なし(デスクトップネイティブの強み) - [ ] **Nd:on** — イベント購読 API。ストリーミングイベント(新着ノート・通知・フォロー等)を プラグインがリアクティブに受け取れる。 これにより IFTTT 的な自動化ルールをプラグインとして記述可能 - [ ] **Nd:storage** — プラグイン専用のローカルストレージ(Mk:save/load の拡張版)。 名前空間分離・容量制限付き - [ ] **Nd:ui.notify** — プラグインからデスクトップ通知を送信 - [ ] **Nd:accounts** — ログイン済みアカウント一覧の取得(トークンは非公開) ### 未完了: プラグイン開発支援 プラグイン作者を増やすための開発体験の整備。 ストアやレジストリはエコシステムが育ってから検討する。まずは作者を増やすことに集中。 - [ ] **テンプレートギャラリー** — 「TL フィルター」「外部 API 連携」「カスタムカラム」 「通知カスタマイズ」等のユースケース別テンプレートから開発を開始できる - [ ] **プラグイン開発ドキュメント** — Nd:* API リファレンス、チュートリアル、サンプル集 - [ ] **ホットリロード** — AiScript エディタカラムで編集 → 即座にプラグインに反映。 保存するたびにアプリ再起動不要 --- ## 実装優先度まとめ | 優先度 | やること | Layer | 理由 | |--------|----------|-------|------| | **今すぐ** | 情報整理 CRUD(クリップ・リスト・アンテナ) | L2 | 分類パイプラインの中核。WebUI 往復で情報フローが中断する | | **今すぐ** | Markdown エクスポート + Obsidian 連携 | L3 | 知識化パイプラインの出口。蓄積データを外部に引き出す | | **次** | Nd:* API 拡充、プラグインテンプレート | L4 | エコシステム基盤の整備 | | **基盤強化** | オフライン動作 + バックアップ | L1 | データ主権の確立 | --- ## 技術的残課題 アーキテクチャ上の改善点。 ### テスト未カバー領域 notecli に DB テスト 18件、notedeck に 239件のユニットテストを追加済み。 **未カバー**: `normalize()` モデル変換、HTTP API 統合テスト、`StreamingManager` 接続管理 ### エラー型の粒度不足 [重要度: 低] `Auth(String)` や `WebSocket(String)` は文字列ベースで、パターンマッチによるプログラム的な回復処理が困難。認証エラーを `TokenExpired` / `TokenRevoked` / `NoToken` 等に細分化し、自動回復を可能にする余地がある。 ### 部分採用で完成していない機能 #### カスタム URI スキーム(`notedeck://`) `deck.ts` で URI を生成しタイトルバーに表示するのみ。OS レベルのディープリンク登録はなし。非公式クライアントとして Misskey URL を横取りするのは不自然なため、外部ツール連携用途に限定して検討。 #### Android バックグラウンド通知 [重要度: 中] `NotificationWorker.kt` で15分間隔のポーリングを実装済み。WebSocket ベースのフォアグラウンドサービスによるリアルタイム通知は未実装(最大15分の遅延)。 #### AiScript プラグインシステム [重要度: 低] Web Worker で LSP 搭載のコードエディタ、プラグイン実行エンジン、UI レンダラーまで実装済み。プラグインマーケットプレイス(共有・インストールの仕組み)がない。 --- ## 将来の検討材料 優先度は低いが、技術的に興味深い方向性。 | 項目 | メモ | |---|---| | ソーシャルアナリティクス | L1 蓄積データ + L4 AI で投稿傾向分析・TL 活性度グラフ。需要次第 | | プラグインストア | エコシステム成熟後。GitHub curated list から開始 | | ffmpeg 連携 | 動画トランスコード。サーバーのサイズ制限に合わせて圧縮 | | 多言語対応(i18n) | 海外ユーザー需要が明確になってから |