ponshu-room-lite/docs/POSIMAI_BRAIN_ROADMAP_2026.md

15 KiB
Raw Blame History

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分)

# SSH接続
ssh admin@100.76.7.3

# PostgreSQL起動既存docker-compose.ymlを使用
cd /volume1/docker/posimai-stack
nano docker-compose.yml

追加サービス:

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:

-- 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時間)

# ローカル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:

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:

{
  "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"
  }
}

デプロイ:

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 更新:

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時間)

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時間)

// リッチ通知フォーマット
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テンプレ

カラーパレット (日本酒アプリから流用):

// 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時間)

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日)

// 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日)

// lib/services/api_service.dart
class ApiService {
  static const baseUrl = 'https://your-vercel-app.vercel.app/api';

  Future<List<Article>> 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分)

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 の総合判断 方針: 段階的実装、実用性優先、テンプレート化で横展開