15 KiB
Posimai Brain プロジェクト: 実装ロードマップ
作成日: 2026-02-23 目的: Chrome 100タブ問題の解決 + AI自動整理システム 方針: 段階的実装、最小構成から開始
🎯 プロジェクト目標
解決したい課題
-
情報の洪水
- Chrome 100タブ常時開きっぱなし
- Slack DM / LINE Keepへの手動転送
- カテゴリ分けなし → 必要な記事を探せない
-
共同開発者との情報共有
- 手動でURLを送る手間
- 文脈情報が欠落
- 過去の共有記事を探せない
-
関連情報の取得
- 記事を読んだ後、関連情報を手動で検索
- 最新動向のキャッチアップに時間がかかる
理想の状態
スマホで気になる記事を見つける
↓
「共有」ボタン → 「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 セットアップ:
- DSM → パッケージセンター → Chat インストール
- Chat起動 → 統合 → Incoming Webhook 作成
- 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 アプリ):
- ショートカットアプリ起動
- 新規ショートカット → 「入力を受け取る」
- アクション追加:
- URL の内容を取得 (入力: ショートカットの入力)
- Web を取得:
- URL:
https://your-vercel-app.vercel.app/api/save-article - メソッド: POST
- 本文: JSON
{"url": "ショートカットの入力"}
- URL:
- 通知を表示: "記事を保存しました"
Android (HTTP Shortcuts アプリ):
- Google Playから「HTTP Shortcuts」インストール
- 新規ショートカット作成:
- URL:
https://your-vercel-app.vercel.app/api/save-article - Method: POST
- Body:
{"url": "{url}"} - Share target: ON
- URL:
成功基準:
- スマホから記事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 # ローカルキャッシュ
主要機能:
-
記事一覧画面
- カテゴリ別フィルタ
- 日付順・重要度順ソート
- 無限スクロール
-
検索機能
- 全文検索(PostgreSQL tsvector)
- タグ検索
- カテゴリ絞り込み
-
記事詳細画面
- 要約表示
- 元記事リンク
- 関連記事表示
- 共有ボタン(URL生成)
-
ダークモード
- システム設定連動
- 手動切り替え
実装タスク
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 は以下に転用可能:
-
テック管理ダッシュボード
- GitHub連携
- 技術記事管理
-
RFM分析ダッシュボード
- 顧客データ可視化
- kintone連携(収益化案件用)
-
香道アプリ管理画面
- 香木データベース
- 履歴管理
テンプレート共通コンポーネント:
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%削減
- テンプレートを他プロジェクトに転用
🚀 次のアクション
今すぐ(今日)
- ✅ Synology Chat インストール
- ✅ PostgreSQL テーブル作成
- ✅ Incoming Webhook URL取得
今週中
- ⏳ Vercel API デプロイ
- ⏳ スマホショートカット作成
- ⏳ Phase 1 動作確認
来週
- ⏳ Gemini API統合
- ⏳ AI自動要約テスト
- ⏳ Phase 2 完成
作成者: Claude (Sonnet 4.5) + Antigravity + Gemini の総合判断 方針: 段階的実装、実用性優先、テンプレート化で横展開