金曜の夜、ふと思いついたアイデアがあります。月曜の朝までに動くプロダクトにして、最初の1人に課金してもらう。開発者なら誰もが一度は夢見ることです。Claude Code があれば、それは妄想ではなくなりました。
個人開発者として5年以上アプリを作り続けてきた経験から、今、45分で実装できることが以前は2日かかっていました。その時間短縮が、金曜夜から日曜夜までの48時間でアイデアをお金に変える現実性をもたらしています。
ここでは実際に私が Claude Code を使ってMVPを立ち上げるときの工程を、各段階でのプロンプトと出力、そして何度もぶつかる落とし穴をリアルに記録しました。タイムライン形式で、一緒に進めていきます。
金曜夜:アイデア検証(19:00〜22:00)
アイデアが思いついても、その先には3つの選別があります。「本当に需要があるのか」「誰なら払うのか」「月20時間程度の保守で済むのか」の3つです。
Claude Code でマーケットリサーチを始めます。ただし、Claude Code は AI CLI なので、ネットに繋ぐわけではありません。むしろ「あなたの知識に基づいて、このアイデアの市場性を整理してくれ」という思考の整理ツールとして使います。
claude code --project weekend-mvp "
あなたは個人開発者です。以下のアイデアについて、
1. 競合他社(既存プロダクト)は誰か
2. 差別化ポイントは何か
3. 最初のターゲット(Who)は誰か
4. 月額課金か買い切りか、その理由
5. 月20時間の保守で続けられるか
これを整理してください:
アイデア:「YouTubeの長尺動画を2分の要約に。AIで自動生成、テキスト・音声・ビジュアルは全カスタマイズ可」
" Claude Code の出力:
【市場分析】
1. 競合他社
- Summify(テキスト要約特化)
- Opus Clip(短編動画特化)
- 自作スクリプト使用者(数万人)
2. 差別化ポイント
✓ テキスト・音声・ビジュアルの3軸カスタマイズ
✓ 長尺から短編への自動化(手動編集ゼロ)
✓ YouTube公開まで自動
3. ターゲット
- YouTubeクリエイター(アニメ解説系、教育系)
- 月30〜100時間のコンテンツ制作者
- 予算:月$30〜100(ツール支払い意欲あり)
4. 課金方式
→ 月額 $29 (買い切り不可、継続性が支援要因)
5. 保守難易度
⚠️ 高い。YouTube API変更、動画エンコード、外部API依存
→ MVP段階では「仮トランスコード」で複雑さを下げる
→ 実動画処理は将来機能として延期
ここで気づくのは「フル機能は不可能」という現実です。それなら、逆に「最小限の本質」を問い直します。
claude code "
上記の分析から、金曜夜〜日曜夜の48時間でMVP化するなら、
以下のうちどれに絞るべきか?
A. テキスト要約のみ実装。YouTube短編化は来月
B. デモ動画を事前制作。ユーザーは「仕様書提出→翌日納品」モデル
C. テキスト要約 + 静止画スライドショー化。動画化は外部ツール併用推奨
プロダクト化の観点からアドバイスしてください。
"出力:「Cがベスト。テキスト要約と静止画スライドは API 負荷が軽く、内製化可能。ユーザー体験は『動画のような見映え』で満足度高い。週1回の保守で対応可能」
金曜夜22:30、アイデアは絞られました。ウェブUI(テキスト要約表示)+ 静止画スライドショー自動生成 + Stripe月額決済がMVPです。
土曜午前:プロジェクト初期化(09:00〜12:30)
プロジェクトディレクトリを作って、Claude Code で /init を実行します。
mkdir weekend-mvp && cd weekend-mvp
claude code /init/init コマンドはインタラクティブなプロンプトを始めます。答える内容:
Project name: YouTubeGlance
Tech stack: Next.js + TypeScript + Tailwind CSS + Stripe
Database: Supabase(認証・ユーザー管理)
Deployment: Vercel
Key features:
- YouTube URL → テキスト自動抽出・要約
- 要約 → 静止画スライドショー生成
- 月額 $29 Stripe決済
- ダッシュボード(過去の要約一覧)
/init が生成する CLAUDE.md を確認します。ここは個人開発ワークフローに合わせてカスタマイズします。
# YouTubeGlance — Rapid Development
## Priority 1(金土日で実装)
- [ ] Next.js プロジェクト + Tailwind
- [ ] YouTube 動画ID取得(入力フォーム)
- [ ] OpenAI API で字幕抽出・要約
- [ ] 要約テキストの表示ページ
- [ ] Stripe Checkout 統合
- [ ] Supabase ユーザー認証(Google OAuth)
- [ ] Vercel デプロイ
## Priority 2(来週以降)
- [ ] ダッシュボード(過去の要約履歴)
- [ ] Midjourney or DALL-E で自動画像生成
- [ ] スライドショー動画出力
- [ ] ユーザーサポート機能土曜朝10:00、Claude Code にスカフォルディングを頼みます。
claude code "
Next.js アプリの初期スケルトンを作ってください。
- pages/index.tsx(ランディング + 入力フォーム)
- pages/auth(Supabase Google OAuth)
- pages/api/summarize(YouTube URL → 要約API)
- pages/dashboard(ユーザーの過去の要約一覧)
- components/StripeCheckout.tsx
- lib/openai.ts(要約ロジック)
- lib/stripe.ts(決済ロジック)
実行可能な Next.js TypeScript プロジェクトにしてください。
"15分待つと、完全なスケルトンが生成されます。
npm install
# 必要なパッケージ:next、react、typescript、@supabase/supabase-js、stripe、tailwindcssここで多くの開発者が陥るのが「フルスタック構築」です。しかし MVP では、まず「ローカルで動く最小版」を作る点が肝心です。
土曜午後:コア機能の実装(13:00〜18:00)
YouTube から動画ID抽出、OpenAI API で字幕を要約する部分を組みます。
// lib/openai.ts
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
export async function summarizeYouTubeContent(
videoId: string
): Promise<string> {
// 実運用:youtube-transcript API で字幕取得
// MVP:ダミーテキスト(実装すると30分かかる)
const dummyTranscript = `
[00:00] こんにちは、今日はClaudeについて話します
[00:30] Claude Code を使うことで開発速度が...
[02:15] 実際のコード例をお見せします
[05:00] このようにして24時間でプロダクト化が可能です
`;
const response = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{
role: "user",
content: `以下の動画の字幕を300字以内に日本語で要約してください。見出し3つ、箇条書き形式で\n\n${dummyTranscript}`,
},
],
});
return response.choices[0].message.content || "";
}重要な決定:YouTube字幕の自動取得は API 複雑性が高いので、MVP では「YouTube URL + 手動テキスト貼り付け」に変更しました。 これで実装時間が4時間から30分に短縮されます。
土曜夜17:00、フロントエンドの入力フォームを作ります。
// pages/index.tsx
import { useState } from "react";
import StripeCheckout from "@/components/StripeCheckout";
export default function Home() {
const [content, setContent] = useState("");
const [summary, setSummary] = useState("");
const [isLoading, setIsLoading] = useState(false);
const handleSummarize = async () => {
setIsLoading(true);
try {
const response = await fetch("/api/summarize", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ content }),
});
const data = await response.json();
setSummary(data.summary);
} catch (error) {
console.error("Error:", error);
} finally {
setIsLoading(false);
}
};
return (
<div className="min-h-screen bg-gradient-to-br from-slate-900 to-slate-800 p-8">
<div className="max-w-2xl mx-auto">
<h1 className="text-4xl font-bold text-white mb-4">YouTubeGlance</h1>
<p className="text-gray-300 mb-8">
動画コンテンツを2分で要約。次のアイデアを見つけるために
</p>
<textarea
value={content}
onChange={(e) => setContent(e.target.value)}
placeholder="動画の内容やトランスクリプトを貼り付けてください"
className="w-full h-40 p-4 rounded-lg bg-slate-700 text-white placeholder-gray-400 mb-4"
/>
<button
onClick={handleSummarize}
disabled={isLoading}
className="w-full bg-blue-600 hover:bg-blue-700 disabled:opacity-50 text-white font-bold py-3 px-4 rounded-lg mb-6"
>
{isLoading ? "要約中..." : "要約する"}
</button>
{summary && (
<div className="bg-slate-700 p-6 rounded-lg mb-8">
<h2 className="text-xl font-bold text-white mb-4">要約結果</h2>
<p className="text-gray-200 whitespace-pre-wrap">{summary}</p>
</div>
)}
<StripeCheckout />
</div>
</div>
);
}この段階で何度も「本当に必要な機能か」を問い直します。ダッシュボードは?ユーザー認証は?いや、月曜まで待てない機能だけ今やる。
土曜夜:Stripe 最小決済の組み込み(19:00〜22:00)
Stripe がなければ売上はゼロです。最小限の実装を優先します。
// pages/api/checkout.ts
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export default async function handler(req, res) {
if (req.method !== "POST") {
return res.status(405).end();
}
try {
const session = await stripe.checkout.sessions.create({
payment_method_types: ["card"],
line_items: [
{
price_data: {
currency: "jpy",
product_data: {
name: "YouTubeGlance Pro — 月額プラン",
description: "無制限の動画要約 + Slack 連携(近日対応)",
},
unit_amount: 2900, // ¥2,900
},
quantity: 1,
},
],
mode: "subscription",
success_url: `${req.headers.origin}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${req.headers.origin}/?canceled=true`,
customer_email: req.body.email,
});
res.status(200).json({ sessionId: session.id });
} catch (error) {
res.status(500).json({ error: error.message });
}
}フロントエンドから Stripe Checkout Session を呼び出します。
// components/StripeCheckout.tsx
import { loadStripe } from "@stripe/js";
export default function StripeCheckout() {
const handleCheckout = async () => {
const email = prompt("メールアドレスを入力してください");
if (!email) return;
const response = await fetch("/api/checkout", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email }),
});
const { sessionId } = await response.json();
const stripe = await loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY!);
await stripe?.redirectToCheckout({ sessionId });
};
return (
<button
onClick={handleCheckout}
className="w-full bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-4 rounded-lg"
>
月額 ¥2,900 で今すぐ始める
</button>
);
}これで「課金できる最小版」が完成です。土曜夜22:00、ローカルでは動いています。
日曜午前:UIの磨き込みとデプロイ(09:00〜13:00)
デザインはシンプルに。Tailwind CSS のデフォルトで十分です。重要なのは「信頼感」と「読みやすさ」です。
// pages/success.tsx
export default function SuccessPage() {
return (
<div className="min-h-screen bg-gradient-to-br from-green-900 to-green-800 flex items-center justify-center p-8">
<div className="max-w-md text-center">
<h1 className="text-4xl font-bold text-white mb-4">
✓ 登録完了です
</h1>
<p className="text-green-200 mb-8">
これからは無制限に動画を要約できます。
</p>
<a
href="/"
className="inline-block bg-white text-green-800 font-bold py-3 px-6 rounded-lg hover:bg-gray-100"
>
要約を始める
</a>
</div>
</div>
);
}Vercel へのデプロイは 1 行です。
vercel deploy --prodVercel はオンボーディング画面で GitHub 連携を促し、自動デプロイされます。環境変数(OPENAI_API_KEY、STRIPE_SECRET_KEY)をダッシュボードで設定するだけ。
日曜午前13:00、https://youtubeglance.vercel.app が公開されています。
日曜午後:ランディングページとローンチ準備(14:00〜18:00)
既存の home ページでも最低限の機能は果たしていますが、「説得力」を高めます。
// pages/landing.tsx
export default function Landing() {
return (
<div className="min-h-screen bg-white">
{/* Hero */}
<section className="bg-gradient-to-br from-blue-600 to-blue-800 text-white py-20 px-8 text-center">
<h1 className="text-5xl font-bold mb-4">YouTubeGlance</h1>
<p className="text-xl mb-8">
長尺動画を2分の要約に。毎日の学習を効率化する。
</p>
<button className="bg-white text-blue-700 font-bold py-3 px-8 rounded-lg hover:bg-gray-100">
今すぐ試す(無料)
</button>
</section>
{/* Features */}
<section className="py-20 px-8 max-w-5xl mx-auto">
<h2 className="text-3xl font-bold mb-12 text-center">3つのメリット</h2>
<div className="grid md:grid-cols-3 gap-8">
{[
{
title: "AI が要約",
desc: "OpenAI の最新モデルが、動画の本質を3行に",
},
{
title: "1秒で完成",
desc: "貼り付けて、クリック。複雑な設定は不要",
},
{
title: "月額 ¥2,900",
desc: "無制限に要約。毎月 1 本の有料 note より安い",
},
].map((item, i) => (
<div key={i} className="text-center">
<h3 className="text-xl font-bold mb-2">{item.title}</h3>
<p className="text-gray-600">{item.desc}</p>
</div>
))}
</div>
</section>
{/* CTA */}
<section className="bg-blue-50 py-16 px-8 text-center">
<h2 className="text-3xl font-bold mb-6">はじめての方へ</h2>
<p className="text-gray-600 mb-8">
初月は全機能を無料で試せます。キャンセルはいつでも。
</p>
<button className="bg-blue-600 text-white font-bold py-3 px-8 rounded-lg hover:bg-blue-700">
月額 ¥2,900 で登録
</button>
</section>
</div>
);
}この landing.tsx を / にマウントしてもいいし、別ページにしてもいい。重要なのは「ユーザーが何ができるか、いくら払うのか」が一瞬で理解できることです。
日曜夜:ローンチと初売上(19:00〜24:00)
土曜の朝、会ったスタートアップ仲間に Twitter で URL を送ります。「やってみた」のトーン。
🚀 やっと作った。YouTubeGlance。
長い動画を AI が 2 分に要約します。
月額 ¥2,900。
48 時間で「アイデア → 売上」まで。
この瞬間が、一番好きです。
https://youtubeglance.vercel.app
Twitter から数十人がクリック。その中から最初の有料登録者が出たのは日曜23:47。
Stripe ダッシュボードに通知が来ます:
Payment successful
Amount: ¥2,900
Customer: contact@example.com
Subscription: YouTubeGlance Pro
最初の $1 ではなく最初の ¥2,900。でもその意味は同じです。「他人がお金を払った」という事実が、プロダクトに現実性をもたらします。
実際にかかったコスト
| 項目 | 金額 | 説明 |
|---|---|---|
| Claude Pro(月額) | ¥20,000 | 事前購入済み。このMVP開発で大活躍 |
| ドメイン(youtubeglance.com) | ¥1,199(年額) | 日曜昼に取得。Vercel Custom Domain対応 |
| Vercel Hobby(無料枠) | ¥0 | 最初の月は月額$0。スケール後は$20/月程度 |
| Stripe 決済手数料 | 2.9% + ¥30 | 最初の ¥2,900 から ¥84 が Stripe 手数料 |
| OpenAI API(概算) | ¥500 | 100回程度の要約テスト |
合計実コスト:¥21,699(ドメインを除くと ¥20,500)
最初の ¥2,900 の売上から、Stripe 手数料を差し引いた ¥2,816 がビジネスになりました。
実装時に気をつけたこと 5 つ
1. 認証の先延ばし
最初は「Google OAuth で認証」を計画していました。でも、ユーザーのメールを決済フロー内で取得すれば、認証は必須ではありません。デプロイ直後の 1 週間は「名前なしで使える」状態でいい。
2. データベースを避ける
Supabase を最初に組もうとしました。しかし、最初の 1 週間は「過去の要約履歴」が無くても困りません。Stripe の event log でユーザー把握できます。データベースは 2 週目から。
3. エラーハンドリングの最小化
production で try-catch を書きすぎるのは時間の無駄。重要な部分(Stripe API、OpenAI API)だけ。その他は「壊れたらslackに通知」くらいで十分。
4. 測定より反復
GA やユーザー behavior tracking の実装は Sunday に入らありません。「何人が paid か」だけ。改善は月曜から。
5. API キーは環境変数
これは絶対。.env.local に OPENAI_API_KEY=YOUR_API_KEY などと書いて、git に上げありません。Vercel env vars で本番設定。
月曜朝以降のやること
日曜夜にローンチして「初売上 ¥2,900」を確認したら、月曜はこれをやります。
- ユーザーのフィードバック回収:最初の有料ユーザーに直接メール。「使ってどうだった?」
- エラーログ設定:Sentry へのエラー自動通知(20 分で設定完)
- Google Analytics:landpage と
/api/summarizeのCV 測定 - Slack webhook:新規 paid user 通知(1 時間で実装)
そしてここからが本当の仕事です。「¥2,900 の課金を続けてもらう」の方が、「最初の ¥2,900」より難しい。
なぜ 48 時間でできたのか
最後に、なぜこれが週末にできたのか。それは 「制約が設計を良くする」 からです。
- 24 時間で終わらせるなら、YouTube 字幕 API なんて使わありません。テキスト手貼りでいい
- ユーザー認証がいらないなら、Supabase なんて要らありません。メールアドレスだけ
- ダッシュボードが要らないなら、UI は 1 ページで十分
- email notification が不要なら、Stripe webhook なんて触らない
制約の中で「本当に必要な機能」が浮かぶ。そして Claude Code は、その制約下での実装を 40% 高速化してくれる。
プロンプトの書き方は「完璧を求めない」。「動かしたい状態」をざっくり伝えれば、Claude Code は「この人はこう言っているから、こういう実装だろう」と補間してくれます。
最初の ¥1 は、その後の ¥1,000 より価値があります。なぜなら、ビジネスが「妄想から現実に変わる瞬間」だから。
金曜夜のアイデアが日曜夜のお金に変わる時代。Claude Code があれば、それは確実に起きます。