# Posimai Brain プロジェクト: 実装ロードマップ **作成日**: 2026-02-23 **目的**: Chrome 100タブ問題の解決 + AI自動整理システム **方針**: 段階的実装、最小構成から開始 --- ## 🎯 **プロジェクト目標** ### **解決したい課題** 1. **情報の洪水** - Chrome 100タブ常時開きっぱなし - Slack DM / LINE Keepへの手動転送 - カテゴリ分けなし → 必要な記事を探せない 2. **共同開発者との情報共有** - 手動でURLを送る手間 - 文脈情報が欠落 - 過去の共有記事を探せない 3. **関連情報の取得** - 記事を読んだ後、関連情報を手動で検索 - 最新動向のキャッチアップに時間がかかる ### **理想の状態** ``` スマホで気になる記事を見つける ↓ 「共有」ボタン → 「Posimai Brain」選択 (1タップ) ↓ AIが自動で要約・カテゴリ分け・関連情報取得 ↓ Synology Chatに通知 + ダッシュボードに蓄積 ↓ 共同開発者も自動で閲覧可能 ``` --- ## 🏗️ **3フェーズ実装計画** ### **Phase 1: データパイプライン構築(今週: 3-4時間)** #### **目標**: Chromeタブを閉じられるようにする #### **アーキテクチャ** ``` [スマホ共有] ↓ [iOS/Android ショートカット] ↓ [Vercel Webhook API] (無料枠) ↓ [PostgreSQL (Synology)] ↓ [Synology Chat 通知] ``` #### **実装タスク** **Task 1.1: Synology PostgreSQL + Chat セットアップ (30分)** ```bash # SSH接続 ssh admin@100.76.7.3 # PostgreSQL起動(既存docker-compose.ymlを使用) cd /volume1/docker/posimai-stack nano docker-compose.yml ``` **追加サービス**: ```yaml services: # 既存のpostgres, redisに追加 # Posimai Brain用テーブル初期化 postgres_init: image: postgres:16-alpine depends_on: postgres: condition: service_healthy volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql environment: PGPASSWORD: ${POSTGRES_PASSWORD} command: > psql -h postgres -U posimai -d posimai_db -f /docker-entrypoint-initdb.d/init.sql ``` **init.sql**: ```sql -- Posimai Brain テーブル CREATE TABLE IF NOT EXISTS brain_articles ( id SERIAL PRIMARY KEY, url TEXT NOT NULL UNIQUE, title TEXT, content TEXT, summary TEXT, category VARCHAR(50), importance INT DEFAULT 0, tags TEXT[], related_urls TEXT[], created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), shared_by VARCHAR(50) DEFAULT 'maita' ); -- インデックス CREATE INDEX idx_category ON brain_articles(category); CREATE INDEX idx_created_at ON brain_articles(created_at DESC); CREATE INDEX idx_tags ON brain_articles USING GIN(tags); -- 全文検索用 CREATE INDEX idx_content_search ON brain_articles USING gin(to_tsvector('japanese', content)); ``` **Synology Chat セットアップ**: 1. DSM → パッケージセンター → **Chat** インストール 2. Chat起動 → **統合** → **Incoming Webhook** 作成 3. Webhook URL をメモ: `https://your-synology.tail72e846.ts.net/webapi/entry.cgi?api=...` **Task 1.2: Vercel Webhook API 作成 (1.5時間)** ```bash # ローカルPCで実行 cd C:\Users\maita\posimai-project mkdir posimai-brain-api cd posimai-brain-api npm init -y npm install @vercel/node pg node-fetch ``` **api/save-article.js**: ```javascript import { Pool } from 'pg'; const pool = new Pool({ host: process.env.DB_HOST, port: 5432, database: 'posimai_db', user: 'posimai', password: process.env.DB_PASSWORD, ssl: false // Tailscale経由のため }); export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).json({ error: 'Method not allowed' }); } const { url, source = 'mobile' } = req.body; if (!url) { return res.status(400).json({ error: 'URL required' }); } try { // Phase 1: URLのみ保存 const result = await pool.query( 'INSERT INTO brain_articles (url, title) VALUES ($1, $2) ON CONFLICT (url) DO NOTHING RETURNING id', [url, `Article from ${source}`] ); // Synology Chat通知 if (result.rows.length > 0) { await fetch(process.env.SYNOLOGY_CHAT_WEBHOOK, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: `📌 新しい記事を保存しました\n${url}` }) }); } res.status(200).json({ success: true, id: result.rows[0]?.id }); } catch (error) { console.error(error); res.status(500).json({ error: error.message }); } } ``` **vercel.json**: ```json { "version": 2, "builds": [ { "src": "api/**/*.js", "use": "@vercel/node" } ], "env": { "DB_HOST": "100.76.7.3", "DB_PASSWORD": "@db-password", "SYNOLOGY_CHAT_WEBHOOK": "@synology-chat-webhook" } } ``` **デプロイ**: ```bash vercel --prod # Secrets設定 vercel secrets add db-password "your_db_password" vercel secrets add synology-chat-webhook "your_webhook_url" ``` **Task 1.3: スマホショートカット作成 (30分)** **iOS (Shortcuts アプリ)**: 1. ショートカットアプリ起動 2. 新規ショートカット → 「入力を受け取る」 3. アクション追加: - **URL の内容を取得** (入力: ショートカットの入力) - **Web を取得**: - URL: `https://your-vercel-app.vercel.app/api/save-article` - メソッド: POST - 本文: JSON `{"url": "ショートカットの入力"}` - **通知を表示**: "記事を保存しました" **Android (HTTP Shortcuts アプリ)**: 1. Google Playから「HTTP Shortcuts」インストール 2. 新規ショートカット作成: - URL: `https://your-vercel-app.vercel.app/api/save-article` - Method: POST - Body: `{"url": "{url}"}` - Share target: ON **成功基準**: - [ ] スマホから記事URLを共有 → ショートカット実行 - [ ] PostgreSQLにURLが保存される - [ ] Synology Chatに通知が届く - [ ] Chromeタブを閉じられる --- ### **Phase 2: AI知能統合(来週: 4-6時間)** #### **目標**: 自動要約・カテゴリ分け・関連情報取得 #### **アーキテクチャ拡張** ``` [Vercel Webhook] ↓ [Article Scraper] (Vercel Functionまたはn8n) ↓ [Gemini API] - 要約生成(3行) - カテゴリ判定(技術/日本酒/本業/AI/その他) - 重要度スコア(1-10) - タグ抽出 - 関連情報検索 ↓ [PostgreSQL 更新] ↓ [Synology Chat通知] - リッチ要約付き ``` #### **実装タスク** **Task 2.1: Article Scraper追加 (2時間)** **api/save-article.js 更新**: ```javascript import { JSDOM } from 'jsdom'; import { Readability } from '@mozilla/readability'; async function scrapeArticle(url) { const response = await fetch(url); const html = await response.text(); const dom = new JSDOM(html, { url }); const reader = new Readability(dom.window.document); const article = reader.parse(); return { title: article.title, content: article.textContent.slice(0, 5000), // 最初の5000文字 excerpt: article.excerpt }; } ``` **Task 2.2: Gemini API統合 (2-3時間)** ```javascript import { GoogleGenerativeAI } from '@google/generative-ai'; const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); async function analyzeWithGemini(title, content) { const model = genAI.getGenerativeModel({ model: 'gemini-2.0-flash-exp', generationConfig: { responseMimeType: 'application/json' } }); const prompt = ` 以下の記事を分析してください: タイトル: ${title} 本文: ${content} 以下のJSON形式で回答してください: { "summary": "3行要約(各行60文字以内)", "category": "技術|日本酒|本業|AI|その他", "importance": 1-10のスコア, "tags": ["タグ1", "タグ2", "タグ3"], "related_keywords": ["関連キーワード1", "関連キーワード2"] } `; const result = await model.generateContent(prompt); return JSON.parse(result.response.text()); } ``` **Task 2.3: Synology Chat通知拡張 (1時間)** ```javascript // リッチ通知フォーマット const chatMessage = { text: `📰 **新しい記事**\n${analysis.category}`, attachments: [{ title: article.title, title_link: url, text: analysis.summary, color: getCategoryColor(analysis.category), fields: [ { title: '重要度', value: `${analysis.importance}/10`, short: true }, { title: 'タグ', value: analysis.tags.join(', '), short: true } ] }] }; ``` **成功基準**: - [ ] URLから記事本文を自動取得 - [ ] Gemini APIで要約・カテゴリ・タグ生成 - [ ] PostgreSQLに全データ保存 - [ ] Synology Chatにリッチ通知 --- ### **Phase 3: Posimai Dashboard作成(2週目: 1週間)** #### **目標**: 検索・フィルタ・共有可能なWebダッシュボード #### **技術スタック** - **フレームワーク**: Flutter Web (日本酒アプリの知識流用) - **デプロイ**: Vercel (または Synology Web Station) - **API**: Vercel Serverless Functions - **認証**: 簡易パスワード(共同開発者と共有) #### **デザインシステム: Posimai UIテンプレ** **カラーパレット** (日本酒アプリから流用): ```dart // lib/theme/posimai_colors.dart class PosimaiColors { // メインカラー: 和風トーン static const primary = Color(0xFF2C3E50); // 濃紺 static const accent = Color(0xFFD4A574); // 琥珀 static const background = Color(0xFFF5F1E8); // 和紙 // カテゴリ別カラー static const tech = Color(0xFF3498DB); // 技術: 青 static const sake = Color(0xFFE74C3C); // 日本酒: 赤 static const business = Color(0xFF2ECC71); // 本業: 緑 static const ai = Color(0xFF9B59B6); // AI: 紫 static const other = Color(0xFF95A5A6); // その他: グレー } ``` **コンポーネント構成**: ``` lib/ ├── main.dart ├── theme/ │ ├── posimai_colors.dart │ └── posimai_theme.dart ├── widgets/ │ ├── article_card.dart # 記事カード │ ├── category_chip.dart # カテゴリチップ │ ├── search_bar.dart # 検索バー │ └── filter_drawer.dart # フィルタドロワー ├── screens/ │ ├── home_screen.dart # 記事一覧 │ ├── article_detail_screen.dart # 記事詳細 │ └── search_screen.dart # 検索画面 └── services/ ├── api_service.dart # API通信 └── database_service.dart # ローカルキャッシュ ``` **主要機能**: 1. **記事一覧画面** - カテゴリ別フィルタ - 日付順・重要度順ソート - 無限スクロール 2. **検索機能** - 全文検索(PostgreSQL tsvector) - タグ検索 - カテゴリ絞り込み 3. **記事詳細画面** - 要約表示 - 元記事リンク - 関連記事表示 - 共有ボタン(URL生成) 4. **ダークモード** - システム設定連動 - 手動切り替え #### **実装タスク** **Task 3.1: Flutter Webプロジェクト作成 (2時間)** ```bash cd C:\Users\maita\posimai-project mkdir 01_active cd 01_active flutter create posimai_brain_dashboard --platforms=web cd posimai_brain_dashboard ``` **Task 3.2: Posimai UIテンプレ実装 (1日)** ```dart // lib/theme/posimai_theme.dart ThemeData posimaiLightTheme = ThemeData( useMaterial3: true, colorScheme: ColorScheme.light( primary: PosimaiColors.primary, secondary: PosimaiColors.accent, surface: PosimaiColors.background, ), // ... 日本酒アプリのテーマを流用 ); ``` **Task 3.3: API接続・記事一覧表示 (2日)** ```dart // lib/services/api_service.dart class ApiService { static const baseUrl = 'https://your-vercel-app.vercel.app/api'; Future> getArticles({ String? category, String? query, int limit = 50, }) async { final response = await http.get( Uri.parse('$baseUrl/articles').replace(queryParameters: { if (category != null) 'category': category, if (query != null) 'q': query, 'limit': limit.toString(), }), ); // ... JSONパース } } ``` **Task 3.4: Vercelデプロイ (30分)** ```bash cd posimai_brain_dashboard flutter build web --release cd build/web vercel --prod ``` **成功基準**: - [ ] Flutter Webでダッシュボード表示 - [ ] カテゴリフィルタ動作 - [ ] 全文検索動作 - [ ] モバイル・デスクトップ対応 - [ ] ダークモード切替 - [ ] Vercelで公開 - [ ] 共同開発者がURLアクセス可能 --- ## 🎨 **Posimai UIテンプレートの転用計画** Phase 3で作成した **Posimai Dashboard Template** は以下に転用可能: 1. **テック管理ダッシュボード** - GitHub連携 - 技術記事管理 2. **RFM分析ダッシュボード** - 顧客データ可視化 - kintone連携(収益化案件用) 3. **香道アプリ管理画面** - 香木データベース - 履歴管理 **テンプレート共通コンポーネント**: ``` 00_core/ui_components/ ├── posimai_theme/ # カラー・テーマ定義 ├── data_table.dart # データテーブル ├── chart_widget.dart # グラフ表示 ├── export_button.dart # CSVエクスポート └── auth_wrapper.dart # 簡易認証 ``` --- ## 📊 **開発スケジュール** | Week | フェーズ | タスク | 所要時間 | 成果物 | |------|---------|--------|---------|--------| | **Week 1** | Phase 1 | データパイプライン | 3-4h | Chromeタブ解放 | | **Week 2** | Phase 2 | AI知能統合 | 4-6h | 自動要約・通知 | | **Week 3-4** | Phase 3 | Dashboard作成 | 30-40h | 検索・共有可能UI | **合計**: 40-50時間(2-3週間) --- ## 🎯 **成功指標** ### **Phase 1完了時** - [ ] Chromeタブ100 → 10以下 - [ ] 1日5-10記事を自動保存 - [ ] Synology Chatで確認可能 ### **Phase 2完了時** - [ ] AI要約精度80%以上 - [ ] カテゴリ自動分類精度90%以上 - [ ] 情報収集時間50%削減 ### **Phase 3完了時** - [ ] 共同開発者が週1回以上アクセス - [ ] 過去記事検索時間90%削減 - [ ] テンプレートを他プロジェクトに転用 --- ## 🚀 **次のアクション** ### **今すぐ(今日)** 1. ✅ Synology Chat インストール 2. ✅ PostgreSQL テーブル作成 3. ✅ Incoming Webhook URL取得 ### **今週中** 1. ⏳ Vercel API デプロイ 2. ⏳ スマホショートカット作成 3. ⏳ Phase 1 動作確認 ### **来週** 1. ⏳ Gemini API統合 2. ⏳ AI自動要約テスト 3. ⏳ Phase 2 完成 --- **作成者**: Claude (Sonnet 4.5) + Antigravity + Gemini の総合判断 **方針**: 段階的実装、実用性優先、テンプレート化で横展開