1. プロジェクト概要

飲食店向け Instagram 自動投稿サービス。店舗スタッフが料理写真を Web アプリにアップロードし、AI がキャプションとハッシュタグを自動生成、Instagram 風プレビューを確認してワンタップで投稿する。

項目内容
プロジェクト名AIインスタ担当
協業先カプセル社
通常プラン月額 ¥20,000
上位プラン月額 ¥35,000
リポジトリ~/projects/insta-auto/

1.1 現在のステータス

フェーズステータス期間
Phase 1 — MVP完成済みデプロイ済み
Phase 2 — 拡張機能開発待ち2026-04-17 〜 2026-05-31
USEN セミナーデモ直近2026-04-16

1.2 デプロイ先・デモ情報

対象URL / 情報
フロントエンドhttps://insta-auto.pages.dev
バックエンド APIhttps://insta-auto-api.yuya-takagi0520.workers.dev
デモモードstoreId: demo_store / password: demo

2. 技術スタック

要素技術備考
フロントエンドReact 18 + ViteCloudflare Pages
バックエンドCloudflare Workers + Honoエッジ実行
DBCloudflare D1 (SQLite)APAC リージョン
画像一時保管Cloudflare KVTTL 10分
AIClaude API (claude-sonnet-4-20250514)画像分析 + キャプション生成
Instagram 投稿Instagram Graph API v21.0単一 + カルーセル
認証JWT (HS256) + PBKDF224時間有効
トークン暗号化AES-GCM (Web Crypto API)IG トークン保護

2.1 デプロイ環境

リソース
D1 Databaseinsta-auto-db (ID: c1639e6f-1bd0-4be1-8721-8c40cbd3b21b)
KV NamespaceTEMP_IMAGES (ID: a8381fbb02d849f49034642957deda7a)
Workers シークレットANTHROPIC_API_KEY, JWT_SECRET, TOKEN_ENCRYPTION_KEY

3. リポジトリ構成

~/projects/insta-auto/
├── packages/
│   ├── web/                        # React SPA
│   │   └── src/
│   │       ├── App.tsx
│   │       ├── api/
│   │       │   ├── client.ts
│   │       │   └── demo.ts
│   │       ├── components/
│   │       │   ├── LoginForm/
│   │       │   ├── Header/
│   │       │   ├── ImageUploader/
│   │       │   ├── PostPreview/
│   │       │   └── SuccessScreen/
│   │       ├── hooks/
│   │       │   └── useToast.ts
│   │       └── types/
│   └── worker/                     # Cloudflare Workers
│       └── src/
│           ├── index.ts            # Hono + CORS + セキュリティヘッダー
│           ├── routes/
│           │   ├── auth/
│           │   ├── upload/
│           │   ├── generate/
│           │   └── publish/
│           ├── services/
│           │   ├── claude.ts
│           │   ├── instagram.ts
│           │   ├── store.ts
│           │   ├── password.ts
│           │   └── crypto.ts
│           ├── middleware/
│           │   └── auth.ts
│           └── db/
│               └── schema.sql

4. Phase 1 API 設計 完成済み

4.1 POST /api/auth/login

レートリミットあり: 5回/15分(IP + storeId)
方向フィールド説明
RequeststoreIdstring店舗ID
Requestpasswordstringパスワード
Responsesuccessboolean成否
ResponsetokenstringJWT(24h有効)
ResponsestoreNamestring店舗表示名

4.2 POST /api/upload JWT必須

方向フィールド説明
Requestimagesmultipart1〜10枚の画像ファイル
Responseimages[].idstring画像ID
Responseimages[].urlstring一時URL
Responseimages[].originalNamestring元ファイル名

バリデーション: MIME チェック、サイズ 10MB 以下、マジックバイト検証

4.3 POST /api/generate JWT必須

処理フロー: 店舗設定取得 → 直近5件のネタ被り防止 → Claude API 呼び出し

Request

{
  "images": [
    { "id": "img_xxx", "url": "https://..." }
  ]
}

Response 型定義

type ImageAnalysis = {
  dishName: string;
  dishCategory: string;
  visualDescription: string;
  appealPoints: string[];
}

type CaptionResult = {
  text: string;
  hashtags: string[];
  postingSuggestion: string;
}

4.4 POST /api/publish JWT必須

方向フィールド説明
Requestimagesarray画像情報配列
Requestcaptionobjectキャプション+ハッシュタグ
ResponsemediaIdstringIG メディアID
ResponsepostIdstringDB投稿ID

Instagram Graph API 投稿フロー

// 単一画像
POST /{ig_user_id}/media         → container_id
waitForContainer(container_id)
POST /{ig_user_id}/media_publish → media_id

// カルーセル(複数画像)
for each image:
  POST /{ig_user_id}/media       → child_container_id
  waitForContainer(child_container_id)

POST /{ig_user_id}/media         → carousel_container_id (children指定)
waitForContainer(carousel_container_id)
POST /{ig_user_id}/media_publish → media_id

5. DB スキーマ

5.1 stores(店舗マスタ)

カラム説明
idTEXT PK店舗ID
nameTEXT店舗名
planTEXTプラン(standard / premium)
ig_user_idTEXTInstagram ユーザーID
access_tokenTEXTIG アクセストークン(AES-GCM 暗号化)
token_expires_atTEXTトークン有効期限
brand_voiceJSONトーン・語り口・一人称・文体・絵文字密度
hashtag_configJSON固定タグ・上限設定
caption_configJSON文字数上限・書き出しスタイル・CTA例
prohibitedJSON禁止表現リスト
sns_methodTEXTSNS運用手法(上位プランのみ)
posting_scheduleTEXT推奨投稿スケジュール
feedback_enabledBOOLEANフィードバック学習の有効/無効
password_hashTEXTPBKDF2 ハッシュ値

5.2 posts(投稿履歴)

カラム説明
idTEXT PK投稿ID
store_idTEXT FK店舗ID
ig_media_idTEXTIG メディアID
ig_permalinkTEXT投稿パーマリンク
image_idsJSON画像ID配列
image_urlsJSON画像URL配列
caption_textTEXTキャプション本文
hashtagsTEXTハッシュタグ
dish_namesJSON料理名配列
analysis_rawJSONAI分析結果(生データ)
statusTEXTdraft / published / scheduled / failed
published_atTEXT公開日時
scheduled_atTEXT予約日時

5.3 post_metrics(Phase 2用、定義済み未使用)

カラム説明
idTEXT PKメトリクスID
post_idTEXT FK投稿ID
fetched_atTEXT取得日時
likesINTEGERいいね数
commentsINTEGERコメント数
savesINTEGER保存数
reachINTEGERリーチ数
impressionsINTEGERインプレッション数
engagement_rateREALエンゲージメント率

5.4 feedback_summaries(Phase 2用、定義済み未使用)

カラム説明
idTEXT PKサマリーID
store_idTEXT FK店舗ID
periodTEXT集計期間
summaryTEXT分析サマリー
prompt_patchTEXTプロンプト改善パッチ

6. Claude API プロンプト設計

buildSystemPrompt() が店舗設定から動的にシステムプロンプトを生成する。

6.1 プロンプト構成要素

要素ソース説明
ブランドボイスstores.brand_voiceトーン、語り口、一人称、文体、絵文字密度
ハッシュタグ戦略stores.hashtag_config固定タグ、上限15個
キャプション設定stores.caption_config文字数上限300、書き出しスタイル、CTA例
SNSメソッドstores.sns_method上位プランのみ適用
禁止表現stores.prohibited使用禁止ワードリスト
直近投稿posts テーブル直近5件を参照しネタ被りを防止

7. セキュリティ

対策仕様
パスワードハッシュPBKDF2 (SHA-256, 100,000回, salt 16byte)
認証トークンJWT HS256, 24時間有効
IGトークン暗号化AES-GCM (12byte IV, Web Crypto API)
レートリミットKVベース、IP + storeId で 5回失敗/15分
画像バリデーションMIME チェック + マジックバイト検証
CORSlocalhost:5173(開発)、insta-auto.pages.dev(本番)のみ許可

8. Phase 2 開発要件 開発待ち

開発期間: 2026-04-17 〜 2026-05-31

推奨実装順: F-06 → F-03 → F-02 → F-01 → F-04 → F-05

F-06: IG トークン自動更新 [優先: 高] 小規模

最優先で実装すること。トークン失効すると全店舗の投稿が停止する。

F-03: 店舗設定画面 [優先: 高] 大規模

F-02: 投稿履歴画面 [優先: 高] 中規模

F-01: 予約投稿 [優先: 高] 中規模

F-04: フィードバック学習 [優先: 中] 大規模

データ蓄積が必要なため、他機能の実装後に着手。

F-05: 助っ人 API 連携 [優先: 中] 中規模

外部依存: カプセル社の API 仕様確定を待って着手。

9. API 一覧(全エンドポイント)

9.1 Phase 1(稼働中)

メソッドパス認証説明
GET/api/health不要ヘルスチェック
GET/api/temp-image/:id不要一時画像取得
POST/api/auth/login不要ログイン(レートリミットあり)
POST/api/uploadJWT画像アップロード
POST/api/generateJWTAI キャプション生成
POST/api/publishJWTInstagram 投稿

9.2 Phase 2(実装予定)

メソッドパス認証機能ID説明
POST/api/scheduleJWTF-01予約投稿作成
DELETE/api/schedule/:postIdJWTF-01予約投稿キャンセル
GET/api/postsJWTF-02投稿履歴一覧
POST/api/posts/:postId/retryJWTF-02失敗投稿の再投稿
GET/api/store/settingsJWTF-03店舗設定取得
PUT/api/store/settingsJWTF-03店舗設定更新
GET/api/store/metricsJWTF-04フィードバック指標取得

10. Cron 設定 / wrangler.toml

10.1 スケジュール一覧

Cron 式頻度機能機能ID
*/5 * * * *5分ごと予約投稿の実行チェックF-01
0 2 * * *毎日 AM 2:00IG トークン自動更新F-06
0 3 * * 1毎週月曜 AM 3:00フィードバック学習バッチF-04

10.2 wrangler.toml 最終形(triggers セクション)

[triggers]
crons = ["*/5 * * * *", "0 2 * * *", "0 3 * * 1"]

11. コスト試算(10店舗想定)

項目月額コスト
Cloudflare + imgbb~$5
Claude API$50 〜 $100
合計$55 〜 $106(約 ¥8,000 〜 ¥16,000)
指標
月間売上(10店舗)¥200,000
粗利率90 〜 95%

12. 依頼事項

Phase 1 は完成済み・デプロイ済み。Phase 2 の6機能の実装を依頼する。
機能ID機能名規模優先度備考
F-06IG トークン自動更新最優先トークン失効防止
F-03店舗設定 GUISQL直接投入からの脱却
F-02投稿履歴画面ステータス管理・再投稿
F-01予約投稿Cron 5分ごと実行
F-04フィードバック学習データ蓄積後に着手
F-05助っ人 API 連携カプセル社 API 提供待ち

既存コード: ~/projects/insta-auto/