TL;DR
- Claude Code + 既存ナレッジで、セキュリティスキャナーSaaSのMVPを半日で構築した
- 技術スタック: Next.js 16 + TypeScript + NextAuth.js + Stripe + Vercel
- スキャンエンジン: 14カテゴリ・93ルール、LLM不使用の静的解析
- Qiita 75K PVの発信力 → 海外向けSaaS の導線に転用
この記事の背景
先月まで1ヶ月間、Claude Code Skillsの有料販売をやっていた。
結果:
- Qiita記事 49本、75,000+ PV
- Dev.to記事 2本
- 有料購入: 0件
原因ははっきりしていた。Claude Code Skills有料市場の累計売上は全セラーで$1,400。市場自体が存在しなかった。
ただ、1つだけ手元に残ったものがあった。セキュリティスキャナースキル — 14カテゴリ・95+項目の検出ロジックと、それを記事で解説した際のPV実績。
「ファイルとして売れないなら、ツールとして売ればいい」
これがピボットの出発点だった。
なぜ「AI生成コード特化」なのか
スキャナースキルを開発する過程で、ChatGPT・Copilot・Claudeが生成するコードを何百件もスキャンした。
見つかったパターン:
- ほぼ全てのAPI呼び出しサンプルにハードコードされたAPIキー
- ユーザー入力をそのままシェルコマンドに渡すユーティリティスクリプト
- SSL検証を無効化する「修正」コード
- 空のcatchブロックがそこら中に
既存のセキュリティツール(Snyk, SonarQube, Semgrep)は優秀だが、これらは人間が書くコード前提の設計。AI特有の脆弱性パターンにフォーカスしたツールは見当たらなかった。
このギャップが商品になると判断した。
半日の実装タイムライン
午前: 設計 + エンジンPoC
やったこと:
- 既存スキャナースキルの95+項目を棚卸し
- 82項目(77%): 正規表現で直接変換可能
- 10項目: ヒューリスティクスで近似
- 7項目: 再設計必要
- 7項目: LLM専用のため除外
- TypeScript + Next.jsプロジェクト初期化
- 5カテゴリ・40ルールでPoCエンジン実装
- スコアリングモジュール(重大度 × 信頼度)
ハマったポイント:
-
tsconfig.jsonのverbatimModuleSyntax: trueがCommonJS + ESMの混在でエラー →falseに変更 -
noUncheckedIndexedAccessで配列アクセスがstring | undefinedに →as stringキャスト
午後: フルスタック実装
やったこと:
- 残り9カテゴリ追加 → 全14カテゴリ・93ルール完成
- NextAuth.js v5 + GitHub OAuth(認証)
- Stripe Checkout + Webhook(決済: Free/$0, Pro/$29, Enterprise/$99)
- ランディングページ(Hero, Stats, Features, Pricing, CTA)
- スキャナーページ(/scan)、ダッシュボード(/dashboard)
ハマったポイント:
- Stripe APIバージョン不一致:
2025-04-30.basil→2026-02-25.cloverに更新が必要だった - WSL2環境でNext.js devサーバーのポート占有問題 →
npm run build成功で検証に切り替え - プロダクト名: 「VibeSafe」を候補にしたら競合が既に存在。vibe系は全滅 → 「CodeHeal」に決定
夕方: デプロイ
- Vercel(Hobbyプラン・無料)にデプロイ
- 環境変数設定(Stripe, GitHub OAuth, Auth Secret)
- GitHub OAuth コールバックURL更新
- 本番環境でスキャンAPI動作確認 → 正常
技術的な判断で重要だったこと
LLMを使わない選択
最初はLLMでコード解析する方向も検討した。が、テストで致命的な問題が発覚:
同じコードを5回スキャンして、5回とも違うスコアが出た。
セキュリティスキャナーに再現性がないのは致命的。CI/CDに組み込めない。コンプライアンスレポートに使えない。
静的解析(正規表現 + パターンマッチ)に切り替えた結果:
- 100%再現性(同じコード → 同じ結果)
- 50ms以下のスキャン速度
- API費用ゼロ
地味だが、プロダクトとしてはこちらが正解だった。
スコアリング設計
単純なパターンマッチだと誤検知が多い。2つの軸で解決した:
-
重大度 × 信頼度:
AKIA(AWSキー接頭辞)が変数代入にあれば高信頼度。コメント内なら低信頼度。 - 複合リスク検出: 「外部通信 + シークレット漏洩」が同時に見つかれば、単体以上のリスク加算。
これで誤検知率を大幅に下げつつ、複合的な脅威も検出可能になった。
既存資産が効いた部分
| 資産 | 効果 |
|---|---|
| スキャナースキル(14カテゴリ設計済み) | エンジン設計のゼロからの工数を削減 |
| Qiita 75K PVの記事群 | 集客の導線として転用可能 |
| Dev.to 2本の英語記事 | 海外向け発信のベース |
| MCP 3つ(Dev.to/Qiita/Gumroad) | 記事投稿・PV計測の自動化 |
ゼロからスキャナーを設計していたら1-2週間はかかる。既存のナレッジベースがあったから半日で形になった。
その後の進捗(追記)
半日でMVPを出した後、以下も実装済み:
- GitHub OAuth・Stripeフローの本番テスト完了
- Stripe本番化(実課金可能状態)
- レート制限の実装(Free: 5回/日)
- Supabase接続(スキャン履歴のDB永続化)
- Dev.to英語記事で海外集客開始
- カスタムドメイン(codeheal.com)設定
- VS Code拡張 / CI/CD統合
まとめ
「Skillsが売れない → SaaSに転換」という判断自体は珍しくないと思う。
でも既存のナレッジ資産とClaude Codeの実装速度を組み合わせると、ピボットのコストが劇的に下がる。1ヶ月かけて作ったスキルの知識が、半日でSaaSの形になった。
個人開発で大事なのは「速く出して、市場の反応を見る」こと。完璧を待つより、動くものを出す方が学びが多い。
作ったもの
CodeHeal — AI生成コード特化セキュリティスキャナー
14カテゴリ・93ルールで、ハードコードされたシークレット、シェルインジェクション、バックドアパターンなどを検出します。LLM不使用、API費用ゼロ。
無料で使えるので試してみてください。フィードバック歓迎です。