SavvyBot
会話を邪魔しない、グループチャット専属AIアシスタント
LINE Messaging APIとOpenAI APIを連携させた対話型チャットボット。GAS MVP実装から始まり、Supabase Edge Functionsへの移行を完了。個人向けから「グループチャット特化型AIアシスタント」への戦略的ピボットを経て、管理ダッシュボード実装完了。SaaS化に向けた収益化フェーズへ。
Technologies Used
プロジェクト概要
SavvyBotは、LINE Messaging APIとOpenAI APIを連携させた対話型チャットボットです。Google Apps Script(GAS)でのMVP実装から開始し、Supabase Edge Functionsへの移行を完了(Phase 2)。現在はグループチャット特化型AIアシスタントへの戦略的ピボットを経て、SaaS化に向けた開発フェーズ(Phase 3)に移行しています。
コアコンセプト
「会話を邪魔しない、グループチャット専属AIアシスタント」
- 人の会話の邪魔をしない(基本は沈黙、裏で記録・分析)
- 裏方に徹する(コマンドで呼ばれた時だけ発言)
- まとめる、追跡する、リマインドする(議事録、決定事項、TODO管理)
ビジネス目標
年内に収益化の可能性を探る(副業ベース、リーンスタートアップアプローチ)
技術スタック
バックエンド
- TypeScript / Deno
- Supabase Edge Functions
- LINE Messaging API
- OpenAI API(GPT-4 + Function Calling)
- Tavily API(Web検索)
インフラ・DevOps
- GitHub Actions(CI/CD)
- Supabase CLI
- HMAC-SHA256署名検証
将来のフロントエンド
- Next.js / React
- Tailwind CSS
プロジェクトの進化
Phase 1: GAS での MVP(2023年3月 - 完了)
LINE Messaging APIとOpenAI APIの基本連携を実現。簡易的なチャットボット機能を実装しましたが、セキュリティ脆弱性とシークレット管理の困難さが課題となりました。
Phase 2: Supabase Edge Functionsへの移行(2025年10月 - 完了)
達成事項
- HMAC-SHA256署名検証の実装(セキュリティ強化)
- Result型によるエラーハンドリング
- 構造化ログによる可観測性の確保
- GitHub ActionsによるCI/CDパイプライン構築
- 実機テストでの動作確認完了
技術的成果
- 署名検証エラー(403 Forbidden)の解決
- 非同期Web Crypto APIの正しい実装
- 定数時間比較によるタイミング攻撃対策
- 診断ログによる運用性向上
Phase 3: 戦略的ピボット(2025年10月 - 完了)
背景と課題認識(2025年10月ブレインストーミングセッション)
- 個人向けチャットボットは無料のChatGPTと差別化が困難
- 市場分析の結果、グループチャット領域に明確なペインポイントを発見
- 収益化可能性の探索のため、ニッチ市場への特化を決定
差別化戦略
競合(ChatGPT公式、他社Bot)の弱点:
- 個人利用がメイン
- グループでは会話に割り込んでうるさい
- 議事録機能が弱い
- 最新情報の取得が不十分
SavvyBotの強み:
- グループチャット特化
- 沈黙がデフォルト(会話を邪魔しない)
- 構造化された議事録
- 決定事項の自動追跡
- 豊富なコマンド体系(
/sv:*プレフィックス) - Web検索統合で最新情報に対応
Phase 3の成果
- Phase 3.2: Web検索統合(OpenAI Function Calling + Tavily API)
- Phase 3.3: Personal Mode実機テスト(Web検索機能の包括的検証)
- Phase 3.4: Group Mode実機テスト +
/sv:questionsコマンド実装
Phase 4: API使用量トラッキング(2025年10月 - 完了)
SaaS化に向けた基盤整備として、API使用量の自動トラッキングシステムを構築しました。
達成内容
- OpenAI API使用量の自動記録(トークン数、コスト)
- グループ別・日次集計ビュー
- Personal Mode自動検出バグ修正
- PostgreSQLでのコスト計算関数実装
- 実機テスト成功(複数ユーザーで動作確認)
はじめに
動くものから、人の役に立つものへ
2023年3月、ChatGPTの登場に刺激を受けて、個人的な実験として開発を始めました。「AIを使ったLINE Botが動くかどうか試してみたい」――最初はただそれだけでした。
動くだけで満足していた頃
Google Apps Scriptで署名検証もなく、セキュリティも考えず、ただ「動く」ことに喜びを感じていました。自分と数人の友人が使えれば十分。技術的な興味が満たされれば、それで良かったのです。
使ってくれる人が増えてきた
気づけば、登録者が30名弱まで増えていました。「便利だから使ってる」「助かってる」という声をもらうようになって、意識が変わりました。
動くものから、人の役に立つものへ
「動くだけで満足」から「多くの人に使ってもらいたい」という気持ちに変わったとき、プロジェクトの方向性を見直す必要性を感じました。
個人向けChatGPTは、すでに完成されている。無料で使えるChatGPT公式アプリは、個人ユーザーにとって完璧に近い体験を提供しています。
グループチャットには、まだ解決されていない課題がある
一方、グループチャットでのAI活用には明確なペインポイントがありました:
- 既存のBotは会話に割り込んでうるさい
- 議事録作成が手動で面倒
- 決定事項が埋もれて見つからない
- TODOが口約束で終わってしまう
この気づきから、「グループチャット特化型AIアシスタント」へのピボットを決断しました。単なる技術実験から、本当に人の役に立つプロダクトへ。
コアコンセプト
会話を邪魔しない裏方AI
SavvyBotは、グループチャットでの裏方に徹する設計思想を持っています。
基本は沈黙
- 人の会話に割り込まない
- 裏で会話を記録・分析
- コマンドで呼ばれた時だけ発言
まとめる、追跡する、リマインドする
- 議事録の自動生成
- 決定事項の追跡
- TODOの管理
- 質問と回答のトラッキング
モード設計
個人モード(1対1チャット)
- 積極的に会話
- 会話履歴保持
- ChatGPT的な対話体験
グループモード(複数人チャット)
- 基本は沈黙
- 裏で記録・分析
- コマンドで呼ばれた時のみ発言
Phase 2完了
堅牢な基盤の構築
セキュリティの強化
GASでは困難だった署名検証を、Supabase Edge Functionsで実装しました。
HMAC-SHA256による署名検証
export async function verifyLineSignature(
body: string,
signature: string,
channelSecret: string
): Promise<boolean> {
const enc = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw',
enc.encode(channelSecret),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(body))
const calcB64 = btoa(String.fromCharCode(...new Uint8Array(sig)))
// Constant-time比較(タイミング攻撃対策)
if (calcB64.length !== signature.length) return false
let diff = 0
for (let i = 0; i < calcB64.length; i++) {
diff |= calcB64.charCodeAt(i) ^ signature.charCodeAt(i)
}
return diff === 0
}
セキュリティ対策
- HMAC-SHA256による署名検証
- Constant-time比較(タイミング攻撃防止)
- テキストサニタイゼーション
- 環境変数検証(Zodスキーマ)
CI/CDパイプラインの構築
GitHub Actionsによる自動デプロイを実現しました。
name: Deploy to Supabase
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Supabase CLI
uses: supabase/setup-cli@v1
- name: Deploy Function
run: supabase functions deploy savvybot
デプロイフロー
mainブランチへpush- GitHub Actionsが自動起動
- Supabase CLIでシークレット設定
- Edge Functionデプロイ
- 本番環境に即座反映
実機テスト成功
2025年10月13日、署名検証からLINE API連携まで、エンドツーエンドでの動作を確認しました。
テスト結果
- 署名検証:成功(403エラーなし)
- LINE API:成功(401エラーなし)
- メッセージ送受信:正常動作
Phase 3.2完了
Web検索と時間認識の実装
OpenAI Function Callingによる自動ツール選択
Tavily APIとOpenAI Function Callingを組み合わせ、AIが自動的に最新情報が必要かを判断し、Web検索を実行する機能を実装しました。
ツール定義
const SEARCH_TOOLS = [
{
type: 'function',
function: {
name: 'search_web',
description: '最新の情報やニュースをWeb検索します。',
parameters: {
type: 'object',
properties: {
query: { type: 'string', description: '検索クエリ' },
},
required: ['query'],
},
},
},
]
const response = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages,
tools: SEARCH_TOOLS,
tool_choice: 'auto', // AIが必要性を判断
})
自動判断の流れ
- ユーザー:「去年のワールドシリーズで優勝したチームは?」
- AI:最新情報が必要と判断 →
search_webを呼び出し - システム:Tavily APIでWeb検索実行
- AI:検索結果を基に回答生成 → 「2024年ロサンゼルス・ドジャース」
時間表現の正確な解釈(Temporal Context Pattern)
問題: AIモデルの学習データカットオフ(2023年10月)により、「去年」などの相対的な時間表現が誤って解釈される
例
- ユーザー:「去年のワールドシリーズで優勝したチームは?」
- AI(誤):2022年のデータを返答(学習カットオフの視点から「去年=2022年」と解釈)
解決策: システムプロンプトに現在日付を動的に追加
const now = new Date()
const currentDate = now.toISOString().split('T')[0] // YYYY-MM-DD
const enhancedSystemPrompt = `${config.app.systemPrompt}
【重要】今日の日付: ${currentDate}
「去年」「今年」「最近」などの時間表現は、この日付を基準に解釈してください。`
const messages: OpenAIMessage[] = [
{ role: 'system', content: enhancedSystemPrompt },
// ...
]
結果
- 現在日付(2025-10-16)を明示
- AIが「去年=2024年」と正しく認識
- Web検索を実行
- 正確に2024年ロサンゼルス・ドジャースの優勝を回答
3つの根本原因と段階的解決
- TAVILY_API_KEYがGitHub Actionsワークフローに含まれていない → 追加
- SYSTEM_PROMPTが空白で、Web検索使用の指示がない → 指示を含むプロンプトを設定
- 時間表現をAIが学習データの視点から解釈 → 現在日付を動的に追加(決定的な解決策)
Phase 3.3完了
Personal Mode 実機テスト
Web検索機能の包括的検証(2025年10月17日)
Phase 3.2で実装したWeb検索機能を、実際のLINE環境で包括的にテストしました。
テストシナリオ
- ノーベル物理学賞2024: AIの知識カットオフ後の情報
- 最新iPhone価格: カットオフ8ヶ月後の製品情報
- 大谷翔平ニュース: 最新スポーツ情報
- 第二次世界大戦終結: 学習データ内の歴史的事実
テスト結果(4/4 PASS, 100%達成率)
- ノーベル物理学賞2024 → Hopfield & Hinton(正確な受賞者情報)
- 最新iPhone価格 → iPhone 17シリーズ価格(知識カットオフ8ヶ月後の製品)
- 大谷翔平ニュース → 50-50達成、プレーオフ勝利(最新スポーツ情報)
- 第二次世界大戦終結 → 1945年(学習データから回答、Web検索不使用)
重要な発見
iPhone 17ケース: AI知識カットオフ(2025年1月)の8ヶ月後にリリースされた製品の正確な価格情報を取得できました。これはWeb検索の価値を完璧に実証するケースです。学習データのみでは不可能な情報提供が可能になっています。
ツール呼び出し判定の精度: 「最新」というキーワードで検索を実行し、歴史的事実は学習データを使用するという適切な判断を確認しました。
時間表現解釈: 現在日付コンテキストの効果を実証し、「去年」を正しく2024年と認識できることを確認しました。
Phase 3.4完了
Group Mode 実機テスト + ,[object Object], コマンド
グループチャット機能の完全実装(2025年10月19日)
達成事項
- グループチャット設定問題の解決(LINE設定でグループ参加許可が必要)
- 全コマンドの実機テスト成功(
/sv:help,/sv:minutes,/sv:decisions,/sv:todo) - グループモードのサイレント動作確認(通常メッセージには反応しない)
- 自動抽出機能の検証(100%精度で決定事項・TODO抽出)
- 構造化議事録生成の動作確認
技術的成果
- TODO表示バグ修正(
[object Object]→ スマートな Object/String 処理) - 全コマンドのレスポンスタイム目標達成(<5秒)
- 議事録生成の高品質出力確認(OpenAI Function Calling活用)
/sv:questions コマンド実装
機能概要
グループチャット内の質問を自動的に抽出・追跡し、未回答の質問を可視化する機能です。
主要機能
- 質問の自動抽出と表示
- 重複チェック機能(1時間以内の同一質問をスキップ)
- 日本時間(JST)表示対応(全コマンド統一)
- フィルター機能(unanswered/all)
実装詳細
// 重複チェック機能
async checkQuestionDuplicate(
groupId: string,
question: string,
withinMinutes: number = 60
): Promise<boolean> {
const { data, error } = await this.client
.from('questions')
.select('id')
.eq('group_id', groupId)
.eq('question', question)
.gte('asked_at', new Date(Date.now() - withinMinutes * 60 * 1000).toISOString())
.limit(1)
return (data && data.length > 0) || false
}
日本時間表示の統一
// JST変換の統一実装
const jstDate = new Date(isoString).toLocaleString('en-US', {
timeZone: 'Asia/Tokyo'
})
実機テスト結果
- 質問抽出精度:100%
- 重複チェック:正常動作(1時間以内の同一質問を適切にスキップ)
- JST表示:全コマンドで統一実装完了
- ユーザーID表示:シンプル表示に改善
Phase 4完了
API 使用量トラッキング実装
自動コスト管理システムの構築(2025年10月19日)
SaaS化に向けて、OpenAI API使用量の自動トラッキングシステムを実装しました。
達成事項
- OpenAI API使用量の自動トラッキング
- トークン数とコスト計算の記録
- グループごとの使用量集計
- Personal mode自動検出バグ修正
- 実機テスト成功(複数ユーザーで動作確認)
データベーススキーマ
usage_logs テーブル: API使用履歴を記録
CREATE TABLE usage_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
group_id TEXT NOT NULL,
operation_type TEXT NOT NULL,
model TEXT NOT NULL,
prompt_tokens INTEGER NOT NULL,
completion_tokens INTEGER NOT NULL,
total_tokens INTEGER NOT NULL,
estimated_cost_usd NUMERIC(10, 6) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ DEFAULT (NOW() + INTERVAL '365 days')
);
集計ビュー
daily_usage_summary: 日次集計group_usage_summary: グループ別集計
コスト計算関数: PostgreSQLでのモデル別価格計算
CREATE FUNCTION calculate_openai_cost(
model TEXT,
prompt_tokens INTEGER,
completion_tokens INTEGER
) RETURNS NUMERIC AS $$
BEGIN
RETURN CASE model
WHEN 'gpt-4o' THEN
(prompt_tokens * 2.50 / 1000000.0) + (completion_tokens * 10.00 / 1000000.0)
WHEN 'gpt-4o-mini' THEN
(prompt_tokens * 0.15 / 1000000.0) + (completion_tokens * 0.60 / 1000000.0)
-- ...
END;
END;
$$ LANGUAGE plpgsql;
使用量トラッキングロジック
OpenAI API関数の拡張
全API関数の戻り値に使用量情報を追加しました:
getAIResponse→AIResponseWithUsagegetAIResponseWithTools→AIResponseWithUsageextractInformation→ExtractionResultWithUsagegenerateStructuredMinutes→StructuredMinutesWithUsage
export interface UsageInfo {
prompt_tokens: number
completion_tokens: number
total_tokens: number
}
export type AIResponseWithUsage = Result<
{ response: string; usage: UsageInfo },
AppError
>
使用量ロギング
await logUsage(
groupId,
'personal_chat',
'gpt-4o',
usage.prompt_tokens,
usage.completion_tokens,
usage.total_tokens
)
Personal Mode 自動検出バグの解決
問題: 新規ユーザーが1対1チャットでメッセージを送っても返信がない(group_mode.silent と認識される)
根本原因: getOrCreateGroupSettings() がデフォルトで mode: 'group' を設定していた
修正内容
getOrCreateGroupSettings()にdefaultModeパラメータを追加- モード検出を2段階に分離:
- 自動検出(settings なし)→ autoMode
- settings 取得時に autoMode.mode をデフォルトとして渡す
- 最終的なモード決定(settings を含めて再検出)
結果: source.type === 'user' → mode: 'personal' で作成、source.type === 'group' → mode: 'group' で作成
実機テスト結果
Personal Chat:
operation_type: "personal_chat"
model: "gpt-4o"
total_tokens: 414, 706
estimated_cost: $0.001155, $0.001923
Auto Extraction:
operation_type: "auto_extraction"
model: "gpt-4o"
total_tokens: 485-506
estimated_cost: $0.001317-$0.001490
Group Summary:
2ユーザー、9回の操作
合計4,572トークン
推定コスト: $0.012795(約1.9円)
技術的成果
- 型安全な使用量トラッキング(Result型パターンの維持)
- エラーハンドリング完備(失敗時も処理継続)
- リアルタイムコスト推定(トークン数からUSDコストを自動計算)
- 1年間のデータ保持期間(TTL: 365 days)
- インデックス最適化とビューによる高速集計
Phase 5完了
管理ダッシュボード実装
公式Webサイトと認証システムの構築(2025年10月24-25日)
SaaS化に向けた重要なマイルストーンとして、管理ダッシュボードを完全実装しました。
達成事項
- Next.js 15プロジェクトセットアップ(TypeScript + Tailwind CSS + shadcn/ui)
- Supabase Auth統合(email/password認証)
- データベーススキーマ実装(8テーブル + RLS policies)
- 認証フロー(login/signup/callback)
- ミドルウェアによるルート保護
- セッション管理
実装した管理機能
1. ランディングページ
- Hero Section(SavvyBotキャラクター画像配置)
- Features Section(4つの主要機能)
- How to Use Section(3ステップガイド)
- Pricing Section(3プラン: 個人/チーム/ビジネス)
- CTA Section(行動喚起)
- Footer(ナビゲーションリンク)
- SEO最適化(メタデータ、OpenGraph)
- レスポンシブデザイン(モバイルファースト)
- ダークモード対応
2. ダッシュボードレイアウト
- サイドバーナビゲーション
- ヘッダーとユーザープロフィールドロップダウン
- サインアウト機能
- レスポンシブデザイン
3. ダッシュボードホーム
- 概要統計表示(グループ数、会話数、トークン、コスト)
- アクティビティフィード
- クイックアクションカード
- ウェルカムメッセージ
4. 使用量ダッシュボード
- 期間フィルター(7/30/90日)
- トークン使用量バーチャート(Recharts)
- コストトレンドラインチャート
- グループ別統計テーブル
- データ集計とゼロ埋め処理
5. グループ管理UI
- グループ一覧ページ(カード表示)
- グループ詳細ページ(統計 + 設定)
- 設定エディター(権限ベース)
- モード選択(personal/group)
- 自動機能トグル(4種類)
- 権限システム実装(owner/admin/member)
6. 設定ページ
- ユーザープロフィール設定
- LINE連携状態表示
- 通知設定(メール通知トグル)
- アカウント管理(パスワード変更、アカウント削除)
- 2段階確認フロー(アカウント削除)
データベース設計
8テーブル + RLS policies
profiles: ユーザープロフィールuser_groups: ユーザー-グループ関連(role: owner/admin/member)group_settings: グループ設定(mode, auto_features)conversations: 会話履歴(90日TTL)decisions: 決定事項todos: タスク管理questions: 質問追跡usage_logs: API使用量(365日TTL)
Row Level Security(RLS)実装
- ユーザー別データ分離
- グループベースのアクセス制御
- ロールベースの権限管理
プロダクションビルド成功
✓ Compiled successfully in 1464ms
✓ All 20 routes generated
✓ 0 TypeScript errors
✓ 0 ESLint errors (dashboard)
Total Bundle Size: 102 kB (shared)
Largest Page: /dashboard/usage (105 kB - Recharts)
All Other Pages: < 6 kB each
技術スタック
- Next.js 15.5.6(App Router)
- TypeScript 5
- Tailwind CSS 4
- shadcn/ui(Button, Card, Badge, Switch, Label, Table, Dropdown Menu)
- Recharts(データ可視化)
- Supabase(Auth, Database, RLS)
技術的成果
- マイグレーションベースのスキーマ管理
- セキュアな認証フロー(cookie-based sessions)
- マルチテナント対応のデータ分離
- 複雑なデータ集計ロジック
- Recharts TypeScript型定義の解決
- カスタムツールチップ実装
- 日付連続性の確保(ゼロ埋め)
- 楽観的UI更新
- フォームバリデーション
- パフォーマンス最適化(バンドルサイズ、ビルド時間)
技術的なハイライト
1. Result型による型安全なエラーハンドリング
従来のtry-catchではなく、RustのResult型をTypeScriptで実装し、コンパイル時にエラー処理の漏れを防ぎます。
export type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E }
// 使用例
const result = await openaiAdapter.sendMessage(userMessage, SYSTEM_PROMPT)
if (!result.ok) {
logError(result.error)
return err(new AppError('AI response failed'))
}
const aiResponse = result.value // 型安全にアクセス
2. SYSTEM_PROMPTの一元管理
会話のトーン、ルール、禁止事項を一箇所に集約し、チーム全体で簡単に更新・レビューできる仕組みを構築しました。
export const SYSTEM_PROMPT = `
あなたは親切で知識豊富なアシスタントです。
【応答ルール】
- 簡潔で分かりやすい日本語で回答してください
- 不確実な情報には「〜かもしれません」など推測であることを明示
【禁止事項】
- 医療・法律の専門的アドバイス
- 金融商品の取引推奨
`
3. 依存性逆転の原則(DIP)適用
アダプターパターンにより、外部APIに依存しない設計を実現。OpenAIから別のAIサービスへの切り替えも容易です。
export interface ChatAdapter {
sendMessage(prompt: string, systemPrompt: string): Promise<Result<string, Error>>
}
export class OpenAIAdapter implements ChatAdapter {
async sendMessage(prompt: string, systemPrompt: string) {
// 実装
}
}
// 実行時に具体的な実装を注入
const openaiAdapter = new OpenAIAdapter(config)
const service = new ConversationService(openaiAdapter)
// テスト時はモックを注入
const mockAdapter = new MockChatAdapter()
const testService = new ConversationService(mockAdapter)
4. 構造化ログによる可観測性
JSON形式の構造化ログで、障害時の原因特定を迅速化しました。
interface LogContext {
request_id: string // リクエスト追跡
user_id?: string // ユーザー識別
event_type: string // イベント種別
latency_ms?: number // レイテンシ計測
error_code?: string // エラー分類
}
logRequest({
request_id: 'req_abc123',
user_id: 'U1234567',
event_type: 'message.received',
latency_ms: 234
}, 'Message processed successfully')
解決した課題
1. セキュリティの脆弱性
課題: GASでは署名検証が困難で、不正なリクエストを防げない
解決策: HMAC-SHA256 + Constant-time comparisonによる堅牢な署名検証を実装しました。
2. シークレット管理の改善
課題: GASではスクリプトプロパティに直接保存、Git管理が困難
解決策
.env.exampleでテンプレート管理- Supabase SecretsでセキュアにSecret管理
- GitHub Actionsでの自動デプロイ時に環境変数を注入
3. テスタビリティとメンテナンス性
課題: GASでは依存関係が密結合で、テストが困難
解決策: アダプターパターンで外部APIを抽象化し、モックに差し替え可能な設計にしました。
4. 運用性の向上
課題: エラーログが不十分で、障害時の原因特定が困難
解決策: 構造化ログで可観測性を確保しました。
実装済み機能
LINEボット機能
コマンド体系(/sv: プレフィックス)
/sv:help- ヘルプ表示/sv:minutes- 議事録生成/sv:decisions- 決定事項確認/sv:todo- TODO抽出/sv:questions- 質問管理(未回答追跡)
自動抽出機能(OpenAI Function Calling活用)
- 議題の自動抽出
- 決定事項の検出と追跡
- TODOの自動リスト化
- 質問の検出と未回答追跡
デュアルモード設計
- 個人モード(1対1チャット): 積極的に会話、会話履歴保持、Web検索統合
- グループモード(複数人チャット): 基本は沈黙、裏で記録・分析、コマンドで呼ばれた時のみ発言
Web検索統合
- OpenAI Function Callingによる自動ツール選択
- 最新情報の自動取得(Tavily API)
- 時間表現の正確な解釈
管理ダッシュボード機能(NEW - Phase 5)
認証システム
- Email/passwordサインアップ・ログイン
- セッション管理
- ルート保護
- ロールベース権限制御(owner/admin/member)
ダッシュボード機能
- 概要統計(グループ数、会話数、トークン、コスト)
- 使用量グラフ(期間フィルター、トークン/コストチャート)
- グループ管理(一覧、詳細、設定エディター)
- 設定ページ(プロフィール、LINE連携、通知、アカウント管理)
データベース設計(Supabase PostgreSQL)
- 8テーブル + RLS policies
profiles: ユーザープロフィールuser_groups: ユーザー-グループ関連group_settings: グループ設定管理conversations: 会話履歴の永続化(90日TTL)decisions: 決定事項の追跡todos: タスク管理questions: 質問と回答のトラッキングusage_logs: API使用量トラッキング(365日TTL)- インデックス最適化とビューによる高速集計
今後の展開
Phase 6: 収益化とリリース(2025年11月〜12月)
目標: SaaS化完了と正式リリース
- Stripeサブスクリプション統合
- 請求管理システム
- プラン別機能制限
- LINE Bot連携ガイド(ダッシュボード内)
- クローズドベータテスト(5-10チーム)
- フィードバック収集と改善
- 正式リリース(年内目標)
収益モデル
- Freeプラン: 個人利用(Personal modeのみ)、基本機能
- Teamプラン(¥2,980/月): 3-10人チーム、全機能、グループ対応
- Businessプラン(¥9,800/月): 11-50人、API連携、優先サポート
目標: 年内に5-30チームの有料ユーザー獲得、MRR ¥15,000-¥90,000
長期展望(2026年以降)
- ナレッジベース機能(過去の決定事項・議事録の検索)
- 多言語対応
- エンタープライズ向け機能(SSO、監査ログ)
- 音声会議の自動文字起こし&議事録生成
- Slack/Teams連携
参考リソース
Phase 2: 基盤構築
Phase 3-4: グループチャット特化 & 使用量管理
Phase 5: 管理ダッシュボード
プロジェクトステータス
- ✅ Phase 1完了(2023年3月): GAS MVP実装
- ✅ Phase 2完了(2025年10月): Supabase Edge Functions移行、セキュリティ強化
- ✅ Phase 3完了(2025年10月): 戦略的ピボット、グループチャット特化
- ✅ Phase 3.2: Web検索統合(OpenAI Function Calling + Tavily API)
- ✅ Phase 3.3: Personal Mode実機テスト(100%成功率)
- ✅ Phase 3.4: Group Mode実機テスト +
/sv:questionsコマンド
- ✅ Phase 4完了(2025年10月19日): API使用量トラッキング実装
- ✅ Phase 5完了(2025年10月24-25日): 管理ダッシュボード実装
- ✅ Phase 5.1: 公式Webサイト LP実装
- ✅ Phase 5.2: 認証システム & データベース設計
- ✅ Phase 5.3: ダッシュボード完全実装(7サブフェーズ)
- ✅ Phase 5.3.7: 最終テスト & プロダクションビルド成功
- 📅 Phase 6計画済み(2025年11月〜12月): Stripe統合、収益化、年内リリース目標
現在の機能実装状況
LINEボット:
- グループチャット機能: 完全実装(議事録、決定事項、TODO、質問管理)
- Web検索統合: 実機テスト完了(知識カットオフ超える情報取得を実証)
- 使用量トラッキング: 自動記録・集計システム稼働中
- コマンド体系: 5つの主要コマンド実装済み
管理ダッシュボード(NEW):
- 認証システム: Supabase Auth完全統合
- ダッシュボード: 全20ルート生成成功
- データ可視化: Rechartsによる使用量グラフ
- グループ管理: CRUD操作完備
- 設定ページ: プロフィール・通知・アカウント管理
- プロダクション品質: TypeScript型エラー0件、ビルド時間1.5秒
次のマイルストーン
- 2025年11月末: Stripe統合完了(課金システム実装)
- 2025年12月中旬: クローズドベータテスト開始(5-10チーム)
- 2025年12月末: 正式リリース(一般公開)
Outcomes & Results
- ✓セキュリティ強化(HMAC-SHA256署名検証、タイミング攻撃対策)
- ✓Web検索統合(OpenAI Function Calling + Tavily API)
- ✓時間表現解釈の精度向上(現在日付コンテキスト追加)
- ✓CI/CDパイプライン構築(GitHub Actions自動デプロイ)
- ✓グループチャット機能完全実装(議事録、決定事項、TODO、質問管理)
- ✓API使用量トラッキングシステム構築(コスト管理の自動化)
- ✓管理ダッシュボード実装(Next.js 15、認証、データ可視化)
- ✓プロダクションビルド成功(1.5秒、TypeScript型エラー0件)
Challenges Overcome
- 個人向けChatGPTとの差別化(戦略的ピボット)
- 署名検証エラー(403 Forbidden)の解決
- 時間表現の誤認識(「去年」が2022年と解釈される問題)
- グループチャット特化機能の設計と実装
- Personal Mode自動検出バグの解決
- TODO表示とJST対応の実装
- Recharts TypeScript型定義の解決
Key Learnings
- Result型による型安全なエラーハンドリング
- アダプターパターンによるテスタビリティ向上
- OpenAI Function Callingによる自動ツール選択
- Temporal Context Patternによる時間認識精度の改善
- ニッチ市場への特化によるプロダクト差別化
- PostgreSQLビューとTTLによる効率的なデータ管理
- モード自動検出ロジックの段階的設計
- Next.js App Routerとサーバーコンポーネントの活用
- Row Level Security(RLS)によるマルチテナント実装