convert-farcaster-miniapp-to-app について
Farcaster Mini Appを標準的なBase/Webアプリに変換するスキルです。Farcaster機能を削除するか、独立した領域に残すかを選び、分析から変換、整理、検証まで進めます。
主な機能
- 01プロジェクトのスキャンと変換方針の選択
- 02コードと依存関係の読み取り専用分析
- 03Mini Appランタイム依存の除去
- 04残すFarcaster機能の分離
- 05整理とビルド検証
活用シーン
- 01Mini Appを通常のBase/Webアプリに変換
- 02限定的なFarcasterページをメインアプリから分離
- 03変換前にSDK、認証、コネクターの利用箇所を特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ base/ skills --skill convert-farcaster-miniapp-to-appインストール後、Claude Code で/convert-farcaster-miniapp-to-appを入力して読み込まれたか確認します。
詳細
Farcaster Miniapp を Base App に変換する
Farcaster のミニアプリを、Base 上の通常のアプリに変換します。変換後は、Base アプリのブラウザーとオープンウェブの両方で動作する通常のウェブアプリとなり、Farcaster Mini App ホストとの結合は取り除かれます。
Farcaster の機能をどうしても残す必要がある場合は、メインアプリの画面とは分けてください。まずは読み取り専用データを優先します。ユーザーが明示的に希望した場合に限り、Mini App 固有の動作を残し、アプリ全体に持ち込むのではなく、専用のルートまたはページに隔離してください。
基本原則
次の判断は、必ず個別に行ってください。
- Mini App のホスト/ランタイムとの結合を取り除く。
- Farcaster 向けの機能を残すべきか判断する。
- 何かを残す場合は、メインアプリから分離し、デフォルトでは新たなベンダー依存を導入しない。
「一部の Farcaster 機能を残す」を、自動的に「Neynar に移行する」と解釈しないでください。プロジェクトがすでに Neynar を使用しており、ユーザーが隔離された Farcaster 専用領域を残したい場合は、既存の統合を維持してもかまいません。新たに Neynar を導入することを、デフォルトの推奨として提示しないでください。
クイックスタート
次の 5 つのフェーズを順番に進めます。
- 調査 — 簡易スキャンとクイズで方針を選択
- 分析 — 選択した方針の範囲で、詳細な読み取り専用分析を実施
- 変換 — Mini App SDK のパターンを取り除き、意図的に残す Farcaster の画面を分離
- クリーンアップ — 使用されていないコード、環境変数、依存関係を削除
- 検証 — 型チェックとビルドを実行し、結果を要約
変換パス
クイズでは、ユーザーを次の 2 つのパスのいずれかに案内します。
| パス | 名前 | 対象 | 実施内容 |
|---|---|---|---|
| A | 通常のアプリ(デフォルト) | ほとんどのプロジェクト | Farcaster Mini App との結合を取り除き、通常の Base/ウェブアプリにする |
| B | Farcaster 画面の分離 | 小規模な Farcaster 固有領域が引き続き必要なアプリ | メインアプリを通常のアプリに変換し、残す機能だけを別の Farcaster ルート/ページに維持する |
パス B でも、複雑さを取り除くことを優先します。
- Farcaster のデータは読み取り専用を優先します。
- ユーザーが明示的に求めない限り、Mini App のホスト/ランタイム動作を維持しないでください。
- 残す Farcaster のロジックは、メインアプリのシェル、共有プロバイダー、主要な認証フローから切り離してください。
フェーズ 0:調査
0A. 簡易スキャン(自動、ユーザーとのやり取りなし)
質問する前に、軽量なスキャンを実行します。内部用の集計結果を作成してください。
package.jsonからフレームワークを検出する(next、vite、react-scripts、@remix-run/*)dependenciesとdevDependencies内の Farcaster パッケージ数を数える- ソースファイル(
.ts、.tsx、.js、.jsx)を grep して、以下を調べる:sdk.actions.*の呼び出し数(合計)sdk.quickAuthの使用(はい/いいえ)sdk.contextの使用(はい/いいえ).well-known/farcaster.json(はい/いいえ)farcasterMiniApp/miniAppConnectorコネクター(はい/いいえ)@farcaster/をインポートしているファイルの合計数@neynar/のインポートまたはapi.neynar.comへの fetch 呼び出し(はい/いいえ)
- 影響範囲を特定する:
- Farcaster 関連の記述はメインアプリのシェル全体に散在しているか
- すでに
app/farcaster/、pages/farcaster/のようなルート、または少数のコンポーネントにほぼ限定されているか - ハプティクス、通知、
openMiniApp、sdk.context.clientなど、ホスト専用の機能があるか
この集計結果を使って、クイズの選択肢を提示してください。クイズを尋ねる前に、スキャンの生出力をそのままユーザーに見せないでください。
0B. 対話形式のクイズ
次の質問を1つずつ尋ねてください。クイックスキャンの結果を使って、最も可能性の高い回答を提案してください。
Q1(必ず尋ねる):
スキャンの結果、Farcaster SDK を使用しているファイルが [X] 個あり、[使用されている機能の概要] であることがわかりました。
どのような結果を希望しますか?
- (a) どこでも使える通常のアプリ — Farcaster 固有の動作を削除し、通常の Base/ウェブアプリだけを残す
- (b) 通常のアプリを中心に、別個の Farcaster 領域を追加 — メインアプリはシンプルに保ち、本当に必要な場合に限り、小規模で分離されたルート/ページを残す
Q2(必ず尋ねる):
現在、Mini App SDK はどの程度使われていますか?
- (a) 最小限 — 主に
sdk.actions.ready()といくつかのヘルパーを使用- (b) 中程度 —
context、openUrl、プロフィールリンク、条件付きのisInMiniAppロジックを一部使用- (c) 大規模 — 認証、ウォレットコネクター、通知、投稿作成フロー、ホスト固有の動作を使用
Q3(Q1 = b の場合に尋ねる):
実際に残す必要がある Farcaster の機能は、どれが最小限ですか?
- (a) 読み取り専用のみ — プロフィールやキャストの表示、Farcaster プロフィールへの外部リンク、必要に応じて小規模なソーシャルページ
- (b) Farcaster 固有の操作も一部必要 — 読み取り専用を超える動作が引き続き必要な、別個のページ/パスがある
- (c) 不明 — すでに分離されている機能を分析し、残す範囲を可能な限り小さくする方法を提案する
Q4(Q1 = b で、既存の分離された Farcaster コードまたは Neynar の使用がある場合に尋ねる):
プロジェクトには、可能であればそのまま残したい、分離済みの Farcaster 専用ルート/ページまたは統合がすでにありますか?
- (a) はい — その分離された部分だけを残す
- (b) いいえ — 残す強い理由がない限り、削除する
Q5(quick auth またはその他の Mini App 認証がある場合に尋ねる):
変換後、メインアプリでどの認証方式を使用しますか?
- (a) SIWE — 通常のアプリ向けのウォレットベース認証
- (b) 既存の Farcaster 以外の認証 — すでにある通常のウェブ認証を維持する
- (c) 認証なし — 認証をすべて削除する
0C. パスの選択
回答を次のパスに対応付けます。
| 希望する結果 | 一般的な結果 |
|---|---|
Q1 = regular app everywhere | パス A — 通常のアプリをデフォルトにする |
Q1 = regular app first, plus separate Farcaster area | パス B — Farcaster の機能を分離して残す |
次に、推奨内容を調整します。
- ユーザーが
Path Bを選んだ場合、明示的に別の要件が示されない限り、読み取り専用で残すことを優先します。 - スキャンの結果、ホスト/ランタイムとの強い結合が見つかり、ユーザーが
Path Aを希望する場合、一部の機能は再作成されずに削除されることを警告します。 - プロジェクトですでに Neynar を使用している場合は、分離された Farcaster の機能内に留まる場合に限り残します。メインアプリに広げないでください。
選択したパスを伝えます。
回答に基づき、パス [X]:[名前] を使用します。これは[1文で説明]を行います。これからプロジェクトを詳しく分析します。
クイズの回答を内部で記録します。回答は、エージェントが次のどれを行うべきかを判断するために使います。
- Farcaster の機能をすべて削除する
- 分離された読み取り専用の機能だけを残す
- 避けられない Farcaster 固有のロジックを専用ルート/ページに隔離する
フェーズ 1 に進みます。
フェーズ 1:分析(読み取り専用)
1A. フレームワークの検出
package.json を読み取ります。
next→ Next.jsvite→ Vitereact-scripts→ Create React App@remix-run/*→ Remix
1B. Farcaster の依存関係をスキャン
次に一致するパッケージをすべて一覧表示します。
@farcaster/miniapp-sdk、@farcaster/miniapp-core、@farcaster/miniapp-wagmi-connector@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit@neynar/*(互換性のためのみ。残るとは限りません)
1C. Farcaster コードを grep
ソースファイル(.ts、.tsx、.js、.jsx)で次を検索します。
SDK のインポート:
@farcaster/miniapp-sdk
@farcaster/miniapp-core
@farcaster/miniapp-wagmi-connector
@farcaster/frame-sdk
@farcaster/frame-wagmi-connector
@farcaster/quick-auth
@farcaster/auth-kit
@neynar/
SDK の呼び出し:
sdk.actions.ready
sdk.actions.openUrl
sdk.actions.close
sdk.actions.composeCast
sdk.actions.addMiniApp
sdk.actions.requestWalletAddress
sdk.actions.viewProfile
sdk.actions.viewToken
sdk.actions.sendToken
sdk.actions.swapToken
sdk.actions.signIn
sdk.actions.setPrimaryButton
sdk.actions.openMiniApp
sdk.quickAuth
sdk.context
sdk.isInMiniApp
sdk.getCapabilities
sdk.haptics
sdk.back
sdk.wallet
コネクターとプロバイダー:
farcasterMiniApp()
miniAppConnector()
farcasterFrame()
MiniAppProvider
MiniAppContext
useMiniApp
useMiniAppContext
マニフェストとメタデータ:
.well-known/farcaster.json
fc:miniapp
fc:frame
環境変数:
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
FARCASTER_
FC_
1D. 既存の Web3 設定を確認する
以下を確認します。
- wagmi 設定内の
coinbaseWalletコネクター - SIWE/
siweパッケージの使用状況 connectkit、rainbowkit、または@coinbase/onchainkit- 既存のウォレット接続 UI
1E. 分離境界を確認する
現在、Farcaster のロジックがどこにあるかを整理します。
- ルートプロバイダーまたはアプリシェル
- 共通フックまたは認証ミドルウェア
- 個別のコンポーネント
app/farcaster/*のような専用ルート/ページ- Farcaster 機能専用のサーバールート
各箇所に、次のいずれかの対応を指定します。
- 削除
- スタブ化
- 分離したルート/ページの背後に移動
- 読み取り専用として維持
1F. 調査結果を報告する
パスごとに範囲を限定した要約を作成します。
すべてのパスに含める項目:
## Conversion Analysis — Path [X]: [Name]
**Framework:** [detected]
**Farcaster packages:** [list]
**Files with Farcaster code:** [count]
### Wagmi Connector
- File: [path]
- Current connector: [farcasterMiniApp / miniAppConnector / farcasterFrame / none]
- Other connectors: [list]
- Action: [replace with coinbaseWallet / leave existing wallet setup / remove only]
### MiniApp Provider
- File: [path]
- Pattern: [simple / complex]
- Consumers: [files importing from this]
- Action: [stub / remove / isolate]
### SDK Action Calls
[list each: file, what it does, action]
### Manifest & Meta
- Manifest route: [path or N/A]
- Meta tags: [file or N/A]
Path A に追加で含める項目:
### Main App Outcome
- Action: remove Farcaster-specific UI and flows from the main app entirely
### Authentication
- Quick Auth used: [yes/no, file]
- Action: replace with SIWE / keep existing non-Farcaster auth / remove
### Existing Neynar Usage
- Package or files: [list or N/A]
- Action: remove entirely unless the user later re-scopes to Path B
### Environment Variables
[list all FC/Neynar vars that will be removed]
Path B に追加で含める項目:
### Main App Outcome
- Action: convert the main app into a normal web app first
### Isolated Farcaster Surface
- Route/page to keep: [path or proposed path]
- Scope: [read-only / mixed / host-specific]
- Recommended target scope: [prefer read-only / quarantine existing behavior / remove]
### Authentication
- Quick Auth used: [yes/no, file]
- Main app action: replace with SIWE / keep existing non-Farcaster auth / remove
- Isolated Farcaster surface action: [remove auth coupling / preserve existing isolated flow only if explicitly requested]
### Existing Neynar Usage
- Package or files: [list or N/A]
- Action: [remove / keep only inside isolated surface]
### Environment Variables
- Remove from main app: [FC_*, FARCASTER_*, etc.]
- Keep only if isolated surface truly still needs them: [NEYNAR_API_KEY, etc. or N/A]
すべてのパスの末尾に含める項目:
### Potential Issues
- [ ] FID used as database primary key
- [ ] Farcaster colors in tailwind config
- [ ] `isInMiniApp` branches with unique else logic
- [ ] Components only meaningful inside Farcaster
- [ ] Farcaster code mixed into shared providers or root layout
次のように確認します。
この分析で問題ありませんか? 変換を進めてもよいですか?
Phase 2 に進む前に、必ず停止してユーザーの確認を待ってください。
Phase 2:変換
手順は機能領域ごとに整理されています。各手順には、対象となるパスと Path B での対応の違いが記載されています。
2A. Wagmi コネクター(すべてのパス)
wagmi の設定ファイル(lib/wagmi.ts、config/wagmi.ts、providers/wagmi-provider.tsx など)を探します。
@farcaster/miniapp-wagmi-connectorからのfarcasterMiniAppまたはminiAppConnectorのインポートを削除します。connectors配列からfarcasterMiniApp()/miniAppConnector()の呼び出しを削除します。- ウォレットコネクターが残らない場合は、次を追加します。
import { coinbaseWallet } from "wagmi/connectors"; coinbaseWallet({ appName: "<app name>" }) coinbaseWalletがすでにある場合は、そのままにします。- 空行と不要になったインポートを整理します。
プロジェクトに wagmi がない場合は、この手順をスキップします。
2B. MiniApp プロバイダー/コンテキスト(すべてのパス)
アプリに共通の Mini App プロバイダーがある場合は、メインアプリからホスト/ランタイムへの依存を取り除きます。
パターン A:シンプルなプロバイダー
安全なスタブに置き換えます。
'use client'
import React, { createContext, useContext, useMemo } from "react";
interface MiniAppContextType {
context: undefined;
ready: boolean;
isInMiniApp: boolean;
}
const MiniAppContext = createContext<MiniAppContextType | undefined>(undefined);
export function useMiniAppContext() {
const context = useContext(MiniAppContext);
if (context === undefined) {
throw new Error("useMiniAppContext must be used within a MiniAppProvider");
}
return context;
}
export default function MiniAppProvider({ children }: { children: React.ReactNode }) {
const value = useMemo(
() => ({
context: undefined,
ready: true,
isInMiniApp: false,
}),
[]
);
return <MiniAppContext.Provider value={value}>{children}</MiniAppContext.Provider>;
}
利用側に影響が出ないよう、エクスポート形式とフック名を維持します。
パターン B:複雑なプロバイダー
- 多くの利用箇所が依存している場合は、まずスタブ化します。
- 使用しているファイルが少数の場合は、プロバイダーを削除し、それらのインポートを直接更新します。
Path Bでは、分離した Farcaster サーフェスでこのプロバイダーをルートアプリシェル経由で接続したままにしないでください。必要であれば、分離したルート内だけで使用します。
2C. 認証
メインアプリでは、Mini App 認証ではなく通常の Web 認証を使用します。
両方のパスに適用されるデフォルトルール:
sdk.quickAuth.getToken()が使用されている場合は、SIWE に置き換えるか、削除します。- Farcaster 以外の通常の認証システムがすでにある場合は、新たに認証を追加するよりもそちらを優先します。
- デフォルトの変換先として、新たな Farcaster または Neynar 認証を導入しないでください。
SIWE への置き換えパターン
クライアント側(例:useSignIn.ts):
import sdk from "@farcaster/miniapp-sdk"を削除します。sdk.quickAuth.getToken()を削除します。- 次の処理に置き換えます。
useAccount()(wagmi)からウォレットアドレスを取得します。siweを使って SIWE メッセージを作成します。useSignMessage()(wagmi)で署名します。- 検証用に、署名とメッセージをバックエンドに送信します。
サーバー側(例:app/api/auth/sign-in/route.ts):
@farcaster/quick-authによる検証を削除します。- SIWE による検証に置き換えます。
- SIWE メッセージを解析します。
siweまたはviemで署名を検証します。- 復元したウォレットアドレスを、通常のアプリ内アイデンティティとして使用します。
FID をデータベースの主キーとして使用している場合:
- スキーマを自動で変更しないでください。
- 後続の移行用に TODO コメントを追加します。
- Phase 4 の要約で警告します。
Path B に関する注意:
- 分離した Farcaster サーフェスに独自の認証または統合フローがすでにあり、ユーザーが明示的に維持を希望している場合は、その範囲内だけに隔離します。
- そのフローをアプリ全体のデフォルト認証システムとして残さないでください。
2D. SDK アクション呼び出し
2D-1. 両方のパスにおける主な置換
| 元のコード | 置換後 |
|---|---|
sdk.actions.ready() | 完全に削除 |
sdk.actions.openUrl(url) | window.open(url, "_blank") |
sdk.actions.close() | window.close() に置き換えるか、削除 |
sdk.actions.composeCast(...) | メインアプリから削除 |
sdk.actions.addMiniApp() | 呼び出しと UI を削除 |
sdk.actions.requestWalletAddress() | 削除。ウォレットへのアクセスは wagmi が処理します |
sdk.actions.viewProfile(fid) | window.open(\https://warpcast.com/~/profiles/${fid}\`, "_blank")` |
sdk.actions.viewToken(opts) | window.open(\https://basescan.org/token/${opts.token}\`, "_blank")` |
sdk.actions.sendToken(opts) | この機能が重要なら wagmi のフローに置き換え、それ以外は削除 |
sdk.actions.swapToken(opts) | Farcaster 外にアプリ固有のスワップ機能が実際にない限り、呼び出しと UI を削除 |
sdk.actions.signIn(...) | 削除。認証は通常の Web 認証で処理します |
sdk.actions.setPrimaryButton(...) | 完全に削除 |
sdk.actions.openMiniApp(...) | メインアプリから削除 |
sdk.isInMiniApp() | 条件分岐を削除し、Farcaster 以外の分岐を残す |
sdk.context | メインアプリから削除 |
sdk.getCapabilities() | 削除するか、async () => [] に置き換え |
sdk.haptics.* | 完全に削除 |
sdk.back.* | 完全に削除 |
sdk.wallet.* | 削除。ウォレットへのアクセスは wagmi が処理します |
isInMiniApp の条件分岐について:
// BEFORE
if (isInMiniApp) {
sdk.actions.openUrl(url);
} else {
window.open(url, "_blank");
}
// AFTER
window.open(url, "_blank");
通常の Web 分岐は常に残してください。
2D-2. パス B の上書きルール
Path B は「すべてを再構築する」という意味ではありません。「メインアプリを整理し、可能な限り小規模な Farcaster 専用のサーフェスを別に維持する」という意味です。
-
sdk.context- メインアプリから削除
- 独立したサーフェスでは、読み取り専用の取得データまたは明示的なルートパラメーターへの置き換えを優先
- ユーザーがホスト固有のページの維持を明示的に希望しない限り、
context.location、context.client、セーフエリアなど、ホスト由来の前提を削除
-
sdk.actions.composeCast(...)- メインアプリから削除
- ユーザーが読み取り専用のみを必要としている場合は、完全に削除
- 維持を強く希望する場合は、専用のページ/パスに分離し、デフォルトで再構築せず、手動での後続対応事項として明示
-
sdk.actions.openMiniApp(...)- メインアプリから削除
- ユーザーが Farcaster 専用のサーフェスを明示的に希望する場合に限り、独立したルートに残す
-
通知/ハプティクス/ホストボタン
- メインアプリから削除
- 独立したルートで本当に必要であり、かつユーザーがその複雑さを明示的に受け入れた場合に限り維持
2E. Farcaster の読み取り専用データ(パス B のみ・任意)
ユーザーが Farcaster 専用のサーフェスを希望する場合は、まず読み取り専用のデータを優先してください。
アプリで必要な場合に限り、lib/farcaster-readonly.ts(または同等のファイル)を作成します。
const HUB_URL = "https://hub.farcaster.xyz";
export async function getUserData(fid: number) {
const res = await fetch(`${HUB_URL}/v1/userDataByFid?fid=${fid}`);
if (!res.ok) throw new Error(`Hub user data fetch failed: ${res.status}`);
return res.json();
}
export async function getCastsByFid(fid: number, pageSize = 25) {
const res = await fetch(`${HUB_URL}/v1/castsByFid?fid=${fid}&pageSize=${pageSize}`);
if (!res.ok) throw new Error(`Hub casts fetch failed: ${res.status}`);
return res.json();
}
その後:
- これらの呼び出しは、独立したルート/ページ内にのみ置く
- Farcaster のデータ要件をメインアプリのシェル全体に広げない
- プロジェクトにすでに小規模な Neynar ベースの読み取り専用連携がある場合、それを削除することで削減できる労力よりも変更が増える場合に限り、維持してもかまいません
- この目的で、新たに Neynar パッケージを追加しないでください
2F. マニフェストルート(すべてのパス)
.well-known/farcaster.json のルートを削除します:
app/.well-known/farcaster.json/route.tspublic/.well-known/farcaster.jsonapi/farcaster-manifest.tsまたは同様のヘルパー
.well-known ディレクトリが空になった場合は、削除します。
2G. メタタグ(すべてのパス)
ルートレイアウトまたはメタデータファイルから、次の項目を削除します:
property="fc:miniapp*"またはproperty="fc:frame*"を持つ<meta>タグ- Farcaster タグのためだけに存在する
Metadata.otherエントリー - Mini App のメタデータを生成するためだけの
generateMetadataロジック
2H. 依存関係
すべてのパス — 削除:
@farcaster/miniapp-sdk、@farcaster/miniapp-wagmi-connector、@farcaster/miniapp-core@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit
パス A — さらに削除:
@neynar/nodejs-sdk、@neynar/react- その他の Neynar パッケージやヘルパー
パス B — デフォルトでは削除:
@neynar/nodejs-sdk、@neynar/react、および Neynar ヘルパー。ただし、意図的に分離された Farcaster の範囲内に残す場合を除きます
すべてのパス — 本当に必要な場合のみ追加:
- SIWE 認証を導入し、まだ存在しない場合は
siwe
デフォルトの変換の一環として、新しい Neynar パッケージを追加しないでください。
2I. Farcaster 固有のルートとコンポーネント
パス A:
app/farcaster/、pages/farcaster/、および Farcaster 専用コンポーネントをすべて削除します/api/farcaster/*や/api/neynar/*など、Farcaster 専用の API ルートを削除します- 削除したルートへのナビゲーションリンクを削除します
パス B:
- メインアプリのルートツリーをすっきりと保ちます
- Farcaster の UI を残す場合、すでに分離されていなければ、専用のルート/ページの背後に移動します
- Farcaster のロジックを汎用の共有ページ全体に散在させるのではなく、
app/farcaster/やapp/social/などの名前を優先します - 分離された範囲以外に用途のないコンポーネントを削除します
- Neynar の使用が残る場合は、専用のルート/ページと、そのサーバーヘルパー内のみに限定します
フェーズ 3:クリーンアップ
3A. package.json の更新
すべてのパス — Mini App パッケージを削除:
@farcaster/miniapp-sdk、@farcaster/miniapp-wagmi-connector、@farcaster/miniapp-core@farcaster/frame-sdk、@farcaster/frame-wagmi-connector@farcaster/quick-auth、@farcaster/auth-kit
パス A — さらに削除:
- すべての
@neynar/*パッケージ
パス B — 分離して意図的に残す場合を除き削除:
@neynar/*
すべてのパス — 導入する場合は追加:
siwe
3B. 環境変数
パス A — すべての .env* ファイルから削除:
NEYNAR_API_KEYNEXT_PUBLIC_NEYNAR_CLIENT_IDFARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
パス B — デフォルトではメインアプリから削除:
FARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
NEYNAR_* 変数は、分離された範囲が既存の Neynar 統合に明示的に依存している場合に限り残します。
環境変数の検証スキーマ(env.ts、env.mjs、zod スキーマなど)も更新します。
3C. 不要なコードのクリーンアップ
- 変更したファイルから未使用のインポートを削除します
- 未使用の Farcaster 型とヘルパー関数を削除します
- 空のインポート文を削除します
- Mini App SDK 専用だった不要なフックや API ラッパーを削除します
3D. Tailwind のカラー
tailwind.config.ts または tailwind.config.js に farcaster: "#8B5CF6" のような Farcaster のブランドカラーが含まれている場合、そのブランディングを分離された Farcaster 専用の範囲内に意図的に残す場合を除き、削除します。
3E. 依存関係のインストール
ユーザーに次のように伝えます:
npm install
フェーズ 4:検証
4A. 残っている参照を検索
すべてのパス — 次を検索:
@farcaster
farcasterMiniApp
miniAppConnector
sdk.actions
sdk.quickAuth
sdk.context
fc:miniapp
fc:frame
パス A — さらに検索:
@neynar
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
api.neynar.com
パス B — Neynar を意図的に残した場合:
- 残っている
@neynarのインポートと環境変数が、分離された Farcaster の範囲内とそのサーバーヘルパー内のみに存在することを確認します
node_modules、ロックファイル、Git の履歴を除外して、ソース内の該当箇所を報告します。
4B. 型チェック
npx tsc --noEmit
型エラーを報告して修正します。
4C. ビルドチェック
npm run build
ビルドエラーを報告して修正します。
4D. 変換の概要
## Conversion Complete — Path [X]: [Name]
**Files modified:** [count]
**Files deleted:** [count]
**Files created:** [count, if any]
**Packages removed:** [list]
**Packages added:** [list, if any]
### What was done
- [x] Removed Farcaster Mini App wagmi connector
- [x] Stubbed or removed Mini App provider/context
- [x] Replaced Mini App auth with normal web auth or removed it
- [x] Removed or replaced SDK action calls
- [x] Deleted manifest route
- [x] Removed Farcaster meta tags
- [x] Cleaned up dependencies and env vars
パス B の概要には、さらに次を含めます:
- [x] Kept the main app as a normal web app
- [x] Confined remaining Farcaster functionality to a dedicated route/page
- [x] Preferred read-only Farcaster data where possible
- [x] Removed Farcaster host/runtime coupling from shared app infrastructure
すべてのパスの最後に、次を記載します:
### Manual steps
- [ ] Run `npm install`
- [ ] Test wallet connection flow
- [ ] If FID migration is needed, migrate from FID-based identity to wallet address
- [ ] If Path B preserves a Farcaster-only area, verify it stays isolated from the main app shell
### Verification
- TypeScript: [pass/fail]
- Build: [pass/fail]
- Remaining Farcaster references: [none / list]
エッジケース
wagmi がない場合
フェーズ 2A をスキップします。アプリが実際にウォレット接続を必要としない限り、wagmi を導入しないでください。
認証システムがない場合
フェーズ 2C をスキップします。必要もないのに SIWE を追加しないでください。
旧バージョンの @farcaster/frame-sdk
@farcaster/miniapp-sdk と同様に扱います。
モノレポ
変換するワークスペースを確認します。指定されたワークスペースのみを変更します。
データベースの主キーとしてのFID
スキーマを自動で変更しないでください。Phase 4でその旨を記録し、警告してください。
条件付きのisInMiniApp分岐
通常のWeb分岐は常に維持し、Mini App分岐は削除してください。
Farcaster以外の目的がないコンポーネント
Path Aでは完全に削除してください。Path Bでは、隔離されたFarcasterのルート/ページ内にある場合に限り維持してください。
既存のNeynarの使用
プロジェクトですでにNeynarを使用している場合:
Path Aでは削除してください- 隔離された
Path Bの範囲内に残る場合に限り維持してください - ユーザーが明示的にリクエストしない限り、既存の使用量を超えてNeynarを追加しないでください
通常は読み取り専用で十分です
ユーザーが「Farcaster関連の機能を残したい」と言う場合は、次を優先してください:
- プロフィールへのリンク
- 読み取り専用のプロフィールまたはキャストの表示
- 専用のソーシャルページ
書き込み権限、通知、ホスト/ランタイムの動作まで必要だと決めつけないでください。
クイズの曖昧さ
スキャン結果とクイズの回答が食い違う場合は、その点を指摘し、残す範囲を最小限に絞ってユーザーに確認してください。
セキュリティ
- ウォレット設定を検証する —
coinbaseWalletまたは選択したウォレットコネクターが正しく設定されていることを確認してください - FIDベースのID — 主キーとして使用する場合、データベースの手動移行が必要です
- SIWEの検証 — 署名を信頼する前に、サーバー側で検証してください
- 隔離された範囲の維持 — Farcaster専用のルート/ページから、ホスト/ランタイムに関する前提がメインのアプリシェルに漏れないようにしてください
- 既存のNeynarの使用 — APIキーはサーバー側だけに保持し、隔離された範囲で引き続き必要な場合に限り使用してください