Convertir une Miniapp Farcaster en une App Base
Convertir une miniapp Farcaster en une app normale sur Base. Le résultat par défaut est une app web classique qui fonctionne dans le navigateur de l'app Base et sur le web ouvert, avec le couplage du host Mini App Farcaster supprimé.
Si certaines fonctionnalités Farcaster doivent vraiment survivre, gardez-les séparées de la surface principale de l'app. Préférez d'abord les données en lecture seule. Préservez uniquement le comportement spécifique à Mini App quand l'utilisateur l'exige explicitement, et isolez-le derrière une route ou une page dédiée plutôt que de le porter à travers toute l'app.
Principe fondamental
Séparez toujours ces décisions :
- Supprimez le couplage du host/runtime Mini App.
- Décidez si une fonctionnalité orientée Farcaster doit subsister.
- Si quelque chose persiste, isolez-le de l'app principale et évitez d'introduire de nouvelles dépendances fournisseur par défaut.
Ne transformez pas automatiquement « conserver une fonctionnalité Farcaster » en « migrer vers Neynar ». Si un projet utilise déjà Neynar et que l'utilisateur souhaite conserver une zone isolée réservée à Farcaster, vous pouvez préserver cette intégration existante. N'introduisez pas une nouvelle adoption Neynar comme recommandation par défaut.
Démarrage rapide
Suivez ces cinq phases séquentiellement :
- Découverte — Analyse rapide + quiz pour choisir un chemin
- Analyse — Analyse détaillée en lecture seule limitée au chemin choisi
- Conversion — Supprimez les modèles du SDK Mini App et isolez toute surface Farcaster intentionnellement préservée
- Nettoyage — Supprimez le code mort, les variables d'env et les dépendances
- Vérification — Vérification de type, build et résumé
Chemins de conversion
Le quiz doit diriger l'utilisateur vers l'un de deux chemins :
| Chemin | Nom | Pour qui | Ce qui se passe |
|---|---|---|---|
| A | App classique par défaut | La plupart des projets | Supprimez le couplage Mini App Farcaster et devenez une app Base/web normale |
| B | Surface Farcaster isolée | L'app a encore besoin d'une petite zone spécifique à Farcaster | Convertissez l'app principale en une app normale, puis gardez seulement une route/page Farcaster séparée pour la fonctionnalité restante |
Le chemin B privilégie toujours la suppression de la complexité :
- Préférez les données Farcaster en lecture seule.
- Évitez de préserver le comportement du host/runtime Mini App sauf si l'utilisateur l'exige explicitement.
- Gardez toute logique Farcaster préservée hors du shell principal de l'app, des fournisseurs partagés et du flux d'authentification primaire.
Phase 0 : Découverte
0A. Analyse rapide (automatisée, sans interaction utilisateur)
Exécutez une analyse légère avant de poser des questions. Produisez un décompte interne :
- Détectez le framework à partir de
package.json(next,vite,react-scripts,@remix-run/*) - Comptez les packages Farcaster dans
dependenciesetdevDependencies - Grep les fichiers source (
.ts,.tsx,.js,.jsx) pour :- appels
sdk.actions.*(comptez le total) - utilisation de
sdk.quickAuth(oui/non) - utilisation de
sdk.context(oui/non) .well-known/farcaster.json(oui/non)- connecteur
farcasterMiniApp/miniAppConnector(oui/non) - nombre total de fichiers avec une importation
@farcaster/* - importations
@neynar/ou appels fetchapi.neynar.com(oui/non)
- appels
- Identifiez le périmètre d'impact :
- Les références Farcaster sont-elles dispersées dans le shell principal de l'app ?
- Sont-elles déjà principalement confinées à une route comme
app/farcaster/,pages/farcaster/ou un petit ensemble de composants ? - Y a-t-il des fonctionnalités évidentes du host comme les vibrations, les notifications,
openMiniAppousdk.context.client?
Utilisez ce décompte pour éclairer les suggestions du quiz. Ne dumpez pas la sortie d'analyse brute à l'utilisateur avant de poser le quiz.
0B. Quiz interactif
Posez ces questions une à la fois. Utilisez les résultats de l'analyse rapide pour suggérer la réponse la plus probable.
Q1 (toujours poser) :
En fonction de mon analyse, votre projet a [X] fichiers utilisant le SDK Farcaster avec [résumé de ce qui est utilisé].
Quel résultat souhaitez-vous ?
- (a) App classique partout — supprimez le comportement spécifique à Farcaster et gardez juste une app Base/web normale
- (b) App classique d'abord, plus une zone Farcaster séparée — gardez l'app principale propre, mais préservez une petite route/page isolée si vraiment nécessaire
Q2 (toujours poser) :
À quel point le SDK Mini App est-il profondément utilisé aujourd'hui ?
- (a) Minimal — principalement
sdk.actions.ready()et quelques helpers- (b) Modéré — certains
context,openUrl, liens de profil ou logiqueisInMiniAppconditionnelle- (c) Lourd — authentification, connecteur de portefeuille, notifications, flux de composition ou comportement spécifique au host
Q3 (poser si Q1 = b) :
Quel est le plus petit ensemble de fonctionnalités Farcaster que vous avez réellement besoin de préserver ?
- (a) Lecture seule uniquement — affichage de profil ou de cast, liens vers les profils Farcaster, peut-être une petite page sociale
- (b) Certaines interactions spécifiques à Farcaster — il y a une page/chemin séparé qui a besoin de plus que du comportement en lecture seule
- (c) Je ne suis pas sûr — analysez ce qui est déjà isolé et recommandez la plus petite surface de préservation possible
Q4 (poser si Q1 = b et il y a une route/page Farcaster isolée existante ou une utilisation Neynar existante) :
Le projet a-t-il déjà une route/page isolée réservée à Farcaster ou une intégration que vous souhaitez conserver si possible ?
- (a) Oui — préservez seulement cette surface isolée
- (b) Non — préférez la supprimer sauf s'il y a une très bonne raison de la garder
Q5 (poser si quickAuth ou autre authentification Mini App est présente) :
Après conversion, quoi devrait utiliser l'app principale pour l'authentification ?
- (a) SIWE — authentification basée sur portefeuille pour l'app classique
- (b) Authentification non-Farcaster existante — gardez ce qu'il y a déjà comme authentification web normale
- (c) Pas d'authentification — supprimez l'authentification entièrement
0C. Sélection du chemin
Mappez les réponses à un chemin :
| Résultat souhaité | Résultat typique |
|---|---|
Q1 = app classique partout |
Chemin A — App classique par défaut |
Q1 = app classique d'abord, plus zone Farcaster séparée |
Chemin B — Surface Farcaster isolée |
Puis affinez la recommandation :
- Si l'utilisateur a choisi le
chemin B, préférez la préservation en lecture seule sauf s'il exige explicitement quelque chose d'autre. - Si l'analyse montre un couplage lourd du host/runtime mais que l'utilisateur veut le
chemin A, avertissez-le que certaines fonctionnalités seront supprimées plutôt que recréées. - Si le projet utilise déjà Neynar, gardez-le seulement s'il reste à l'intérieur de la surface isolée Farcaster. Ne l'étendez pas à l'app principale.
Annoncez le chemin choisi :
Sur la base de vos réponses, j'utiliserai le chemin [X] : [Nom]. Cela va [description d'une phrase]. Je vais maintenant faire une analyse détaillée de votre projet.
Enregistrez les réponses du quiz en interne. Elles guident si l'agent doit :
- supprimer complètement les fonctionnalités Farcaster
- préserver seulement une surface isolée en lecture seule
- confiner toute logique spécifique à Farcaster inévitable à une route/page dédiée
Passez à la phase 1.
Phase 1 : Analyse (lecture seule)
1A. Détecter le framework
Lisez package.json :
next→ Next.jsvite→ Vitereact-scripts→ Create React App@remix-run/*→ Remix
1B. Analyser les dépendances Farcaster
Listez tous les packages correspondant à :
@farcaster/miniapp-sdk,@farcaster/miniapp-core,@farcaster/miniapp-wagmi-connector@farcaster/frame-sdk,@farcaster/frame-wagmi-connector@farcaster/quick-auth,@farcaster/auth-kit@neynar/*(compatibilité uniquement ; ne supposez pas que cela persiste)
1C. Grep pour le code Farcaster
Recherchez dans les fichiers source (.ts, .tsx, .js, .jsx) :
Importations 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/
Appels 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
Connecteurs & fournisseurs :
farcasterMiniApp()
miniAppConnector()
farcasterFrame()
MiniAppProvider
MiniAppContext
useMiniApp
useMiniAppContext
Manifest & meta :
.well-known/farcaster.json
fc:miniapp
fc:frame
Variables d'environnement :
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
FARCASTER_
FC_
1D. Vérifier la configuration Web3 existante
Recherchez :
- connecteur
coinbaseWalletdans la config wagmi - utilisation de SIWE / package
siwe connectkit,rainbowkitou@coinbase/onchainkit- UI de connexion de portefeuille existante
1E. Vérifier les limites de séparation
Mappez où la logique Farcaster vit actuellement :
- Fournisseurs racine ou shell de l'app
- Hooks partagés ou middleware d'authentification
- Composants ponctuels
- Routes/pages dédiées comme
app/farcaster/*,pages/farcaster/ - Routes de serveur utilisées seulement par la fonctionnalité Farcaster
Marquez chaque emplacement avec une action :
- supprimer
- stub
- déplacer derrière une route/page isolée
- garder seulement en lecture seule
1F. Rapport de constatations
Créez un résumé limité au chemin.
Tous les chemins incluent :
## Analyse de conversion — Chemin [X] : [Nom]
**Framework :** [détecté]
**Packages Farcaster :** [liste]
**Fichiers avec code Farcaster :** [nombre]
### Connecteur Wagmi
- Fichier : [chemin]
- Connecteur actuel : [farcasterMiniApp / miniAppConnector / farcasterFrame / aucun]
- Autres connecteurs : [liste]
- Action : [remplacer par coinbaseWallet / laisser la config de portefeuille existante / supprimer seulement]
### Fournisseur MiniApp
- Fichier : [chemin]
- Modèle : [simple / complexe]
- Consommateurs : [fichiers important depuis ceci]
- Action : [stub / supprimer / isoler]
### Appels SDK Action
[listez chacun : fichier, ce qu'il fait, action]
### Manifest & Meta
- Route manifest : [chemin ou N/A]
- Meta tags : [fichier ou N/A]
Le chemin A inclut également :
### Résultat de l'app principale
- Action : supprimer complètement le comportement et les flux spécifiques à Farcaster de l'app principale
### Authentification
- Quick Auth utilisé : [oui/non, fichier]
- Action : remplacer par SIWE / garder l'authentification non-Farcaster existante / supprimer
### Utilisation existante de Neynar
- Package ou fichiers : [liste ou N/A]
- Action : supprimer entièrement sauf si l'utilisateur redéfinit ultérieurement le scope au chemin B
### Variables d'environnement
[listez toutes les vars FC/Neynar qui seront supprimées]
Le chemin B inclut également :
### Résultat de l'app principale
- Action : convertir l'app principale en une app web normale d'abord
### Surface Farcaster isolée
- Route/page à conserver : [chemin ou chemin proposé]
- Scope : [lecture seule / mixte / spécifique au host]
- Scope cible recommandé : [préférer lecture seule / confiner le comportement existant / supprimer]
### Authentification
- Quick Auth utilisé : [oui/non, fichier]
- Action de l'app principale : remplacer par SIWE / garder l'authentification non-Farcaster existante / supprimer
- Action de la surface Farcaster isolée : [supprimer le couplage d'auth / préserver le flux isolé existant seulement s'il est explicitement demandé]
### Utilisation existante de Neynar
- Package ou fichiers : [liste ou N/A]
- Action : [supprimer / garder seulement à l'intérieur de la surface isolée]
### Variables d'environnement
- Supprimer de l'app principale : [FC_*, FARCASTER_*, etc.]
- Garder seulement si la surface isolée en a vraiment besoin : [NEYNAR_API_KEY, etc. ou N/A]
Tous les chemins se terminent par :
### Problèmes potentiels
- [ ] FID utilisé comme clé primaire de la base de données
- [ ] Couleurs Farcaster dans la config tailwind
- [ ] Branches `isInMiniApp` avec une logique else unique
- [ ] Composants qui n'ont de sens que dans Farcaster
- [ ] Code Farcaster mélangé aux fournisseurs partagés ou au layout racine
Demandez :
Cette analyse vous paraît-elle correcte ? Prêt à passer à la conversion ?
ARRÊTEZ et attendez la confirmation de l'utilisateur avant la phase 2.
Phase 2 : Conversion
Les étapes sont organisées par domaine de fonctionnalité. Chaque étape note les chemins auxquels elle s'applique et quoi faire différemment pour le chemin B.
2A. Connecteur Wagmi (tous les chemins)
Trouvez le fichier de config wagmi (lib/wagmi.ts, config/wagmi.ts, providers/wagmi-provider.tsx, etc.) :
-
Supprimez l'import de
farcasterMiniAppouminiAppConnectorde@farcaster/miniapp-wagmi-connector -
Supprimez l'appel
farcasterMiniApp()/miniAppConnector()du tableauconnectors -
Si aucun connecteur de portefeuille ne reste, ajoutez :
import { coinbaseWallet } from "wagmi/connectors"; coinbaseWallet({ appName: "<app name>" }) -
Si
coinbaseWalletexiste déjà, laissez-le tel quel -
Nettoyez les lignes vides et les imports obsolètes
Ignorez cette étape si wagmi n'est pas dans le projet.
2B. Fournisseur/Context Mini App (tous les chemins)
Si l'app a un fournisseur Mini App partagé, supprimez les hypothèses du host/runtime de l'app principale.
Modèle A : fournisseur simple
Remplacez par un stub sûr :
'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>;
}
Préservez le style d'export et les noms de hook pour que les consommateurs ne se cassent pas.
Modèle B : fournisseur complexe
- Si de nombreux consommateurs en dépendent, créez d'abord un stub.
- Si seulement quelques fichiers l'utilisent, supprimez-le et mettez à jour ces imports directement.
- Dans le
chemin B, ne laissez pas la surface Farcaster isolée garder ce fournisseur câblé à travers le shell principal de l'app. Si nécessaire, rendez-le local à la route isolée seulement.
2C. Authentification
L'app principale doit utiliser une authentification web normale, pas une authentification Mini App.
Règle par défaut pour les deux chemins :
- Si
sdk.quickAuth.getToken()est utilisé, remplacez-le par SIWE ou supprimez-le. - Si un système d'authentification non-Farcaster normal existe déjà, préférez-le plutôt que d'ajouter une nouvelle authentification.
- N'introduisez pas la nouvelle authentification Farcaster ou Neynar comme cible de conversion par défaut.
Modèle de remplacement SIWE
Côté client (ex. useSignIn.ts) :
- Supprimez
import sdk from "@farcaster/miniapp-sdk" - Supprimez
sdk.quickAuth.getToken() - Remplacez par :
- Obtenez l'adresse du portefeuille à partir de
useAccount()(wagmi) - Créez un message SIWE avec
siwe - Signez avec
useSignMessage()(wagmi) - Envoyez la signature + message au backend pour vérification
- Obtenez l'adresse du portefeuille à partir de
Côté serveur (ex. app/api/auth/sign-in/route.ts) :
- Supprimez la vérification
@farcaster/quick-auth - Remplacez par la vérification SIWE :
- Parsez le message SIWE
- Vérifiez la signature avec
siweouviem - Utilisez l'adresse du portefeuille récupérée comme identité normale de l'app
Si FID est utilisé comme clé primaire de la base de données :
- Ne changez pas automatiquement le schéma
- Ajoutez un commentaire TODO pour une migration ultérieure
- Avertissez dans le résumé de la phase 4
Note du chemin B :
- Si la surface Farcaster isolée a déjà son propre flux d'authentification ou d'intégration et que l'utilisateur veut explicitement le garder, confinez-le là seulement.
- Ne laissez pas ce flux rester le système d'auth par défaut de l'app entière.
2D. Appels SDK Action
2D-1. Remplacements principaux pour les deux chemins
| Original | Remplacement |
|---|---|
sdk.actions.ready() |
Supprimez entièrement |
sdk.actions.openUrl(url) |
window.open(url, "_blank") |
sdk.actions.close() |
window.close() ou supprimez |
sdk.actions.composeCast(...) |
Supprimez de l'app principale |
sdk.actions.addMiniApp() |
Supprimez l'appel et l'UI |
sdk.actions.requestWalletAddress() |
Supprimez ; wagmi gère l'accès au portefeuille |
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) |
Remplacez par un flux wagmi si la fonctionnalité compte, sinon supprimez |
sdk.actions.swapToken(opts) |
Supprimez l'appel et l'UI sauf s'il y a une véritable fonctionnalité d'échange spécifique à l'app en dehors de Farcaster |
sdk.actions.signIn(...) |
Supprimez ; l'auth est gérée par l'authentification web normale |
sdk.actions.setPrimaryButton(...) |
Supprimez entièrement |
sdk.actions.openMiniApp(...) |
Supprimez de l'app principale |
sdk.isInMiniApp() |
Supprimez la branche conditionnelle et gardez la branche non-Farcaster |
sdk.context |
Supprimez de l'app principale |
sdk.getCapabilities() |
Supprimez ou remplacez par async () => [] |
sdk.haptics.* |
Supprimez entièrement |
sdk.back.* |
Supprimez entièrement |
sdk.wallet.* |
Supprimez ; wagmi gère l'accès au portefeuille |
Pour les branches isInMiniApp conditionnelles :
// AVANT
if (isInMiniApp) {
sdk.actions.openUrl(url);
} else {
window.open(url, "_blank");
}
// APRÈS
window.open(url, "_blank");
Gardez toujours la branche web normale.
2D-2. Overrides du chemin B
Le chemin B ne signifie pas « récréer tout ». Cela signifie « garder l'app principale propre et préserver la plus petite surface Farcaster séparée possible ».
-
sdk.context- Supprimez de l'app principale
- Pour la surface isolée, préférez le remplacer par des données récupérées en lecture seule ou des paramètres de route explicites
- Supprimez
context.location,context.client, safe area et autres hypothèses dérivées du host sauf si l'utilisateur insiste explicitement sur la préservation d'une page spécifique au host
-
sdk.actions.composeCast(...)- Supprimez de l'app principale
- Si l'utilisateur veut seulement la lecture seule, supprimez-la entièrement
- S'il insiste sur la préservation, gardez-la isolée derrière une page dédiée et marquez-la comme un suivi manuel plutôt que de la reconstruire par défaut
-
sdk.actions.openMiniApp(...)- Supprimez de l'app principale
- Gardez-la seulement dans une route isolée si l'utilisateur veut explicitement une surface réservée à Farcaster
-
notifications / vibrations / boutons du host
- Supprimez de l'app principale
- Préservez seulement si la route isolée en dépend vraiment et que l'utilisateur a explicitement opté pour cette complexité
2E. Données Farcaster en lecture seule optionnelle (chemin B seulement)
Si l'utilisateur veut une surface Farcaster isolée, préférez d'abord les données en lecture seule.
Créez lib/farcaster-readonly.ts (ou équivalent) seulement si l'app en a besoin :
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();
}
Puis :
- Gardez ces appels seulement à l'intérieur de la route isolée
- Ne thread pas les exigences de données Farcaster à travers le shell principal de l'app
- Si le projet a déjà une petite intégration isolée basée sur Neynar en lecture seule, vous pouvez la garder seulement si la supprimer créerait plus de churn qu'elle n'en sauve
- N'ajoutez pas de nouveaux packages Neynar pour cela par défaut
2F. Route Manifest (tous les chemins)
Supprimez la route .well-known/farcaster.json :
app/.well-known/farcaster.json/route.tspublic/.well-known/farcaster.jsonapi/farcaster-manifest.tsou helpers similaires
Si le répertoire .well-known devient vide, supprimez-le.
2G. Meta Tags (tous les chemins)
Dans le layout racine ou les fichiers de métadonnées, supprimez :
- les tags
<meta>avecproperty="fc:miniapp*"ouproperty="fc:frame*" - les entrées
Metadata.otherqui n'existent que pour les tags Farcaster - la logique
generateMetadataqui ne produit que des métadonnées Mini App
2H. Dépendances
Tous les chemins — supprimez :
@farcaster/miniapp-sdk,@farcaster/miniapp-wagmi-connector,@farcaster/miniapp-core@farcaster/frame-sdk,@farcaster/frame-wagmi-connector@farcaster/quick-auth,@farcaster/auth-kit
Chemin A — supprimez également :
@neynar/nodejs-sdk,@neynar/react- tout autre package ou helper Neynar
Chemin B — supprimez par défaut :
@neynar/nodejs-sdk,@neynar/reactet helpers Neynar sauf s'ils restent à l'intérieur de la surface Farcaster intentionnellement isolée
Tous les chemins — ajoutez seulement si vraiment nécessaire :
siwesi l'authentification SIWE est introduite et n'existe pas déjà
N'ajoutez pas de nouveaux packages Neynar dans le cadre de la conversion par défaut.
2I. Routes & composants spécifiques à Farcaster
Chemin A :
- Supprimez
app/farcaster/,pages/farcaster/et les composants réservés à Farcaster entièrement - Supprimez les routes d'API réservées à Farcaster comme
/api/farcaster/*et/api/neynar/* - Supprimez les liens de navigation qui pointent vers les routes supprimées
Chemin B :
- Gardez l'arborescence des routes principale propre
- Déplacez l'UI Farcaster préservée derrière une route/page dédiée si elle n'est pas déjà isolée
- Préférez les noms comme
app/farcaster/ouapp/social/plutôt que de disperser la logique Farcaster dans des pages génériques partagées - Supprimez tout composant qui n'a pas d'utilité en dehors de cette surface isolée
- Gardez toute utilisation Neynar restante confinée à cette route/page isolée et à ses helpers de serveur seulement
Phase 3 : Nettoyage
3A. Mettre à jour package.json
Tous les chemins — supprimez les packages 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
Chemin A — supprimez également :
- tous les packages
@neynar/*
Chemin B — supprimez sauf s'ils restent isolés et intentionnellement préservés :
@neynar/*
Tous les chemins — ajoutez si introduits :
siwe
3B. Variables d'environnement
*Chemin A — supprimez de tous les fichiers `.env` :**
NEYNAR_API_KEYNEXT_PUBLIC_NEYNAR_CLIENT_IDFARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
Chemin B — supprimez de l'app principale par défaut :
FARCASTER_*FC_*NEXT_PUBLIC_FC_*NEXT_PUBLIC_FARCASTER_*
Gardez seulement les vars NEYNAR_* si la surface isolée dépend explicitement de l'intégration Neynar existante.
Mettez également à jour les schémas de validation d'env (env.ts, env.mjs, schémas zod, etc.).
3C. Nettoyage du code mort
- Supprimez les imports non utilisés des fichiers modifiés
- Supprimez les types et fonctions helpers Farcaster non utilisés
- Supprimez les déclarations d'import vides
- Supprimez les hooks morts ou les wrappers d'API qui n'existaient que pour le SDK Mini App
3D. Couleurs Tailwind
Si tailwind.config.ts ou tailwind.config.js inclut les couleurs de marque Farcaster comme farcaster: "#8B5CF6", supprimez-les sauf si ce branding est intentionnellement gardé à l'intérieur d'une surface réservée à Farcaster isolée.
3E. Installer les dépendances
Dites à l'utilisateur :
npm install
Phase 4 : Vérification
4A. Rechercher les références restantes
Tous les chemins — recherchez :
@farcaster
farcasterMiniApp
miniAppConnector
sdk.actions
sdk.quickAuth
sdk.context
fc:miniapp
fc:frame
Chemin A — recherchez également :
@neynar
NEYNAR_API_KEY
NEXT_PUBLIC_NEYNAR_CLIENT_ID
api.neynar.com
Chemin B — si Neynar a été intentionnellement préservé :
- vérifiez que les imports
@neynarrestants et les vars d'env n'existent que à l'intérieur de la surface Farcaster isolée et de ses helpers de serveur
Signalez tout match de source, en ignorant node_modules, les fichiers de lock et l'historique git.
4B. Vérification de type
npx tsc --noEmit
Signalez et corrigez les erreurs de type.
4C. Vérification du build
npm run build
Signalez et corrigez les erreurs de build.
4D. Résumé de la conversion
## Conversion terminée — Chemin [X] : [Nom]
**Fichiers modifiés :** [nombre]
**Fichiers supprimés :** [nombre]
**Fichiers créés :** [nombre, si applicable]
**Packages supprimés :** [liste]
**Packages ajoutés :** [liste, si applicable]
### Ce qui a été fait
- [x] Suppression du connecteur wagmi Mini App Farcaster
- [x] Stub ou suppression du fournisseur/contexte Mini App
- [x] Remplacement de l'authentification Mini App par l'authentification web normale ou suppression
- [x] Suppression ou remplacement des appels SDK action
- [x] Suppression de la route manifest
- [x] Suppression des meta tags Farcaster
- [x] Nettoyage des dépendances et des vars d'env
Le résumé du chemin B inclut également :
- [x] Maintien de l'app principale comme une app web normale
- [x] Confinement de la fonctionnalité Farcaster restante à une route/page dédiée
- [x] Préférence aux données Farcaster en lecture seule si possible
- [x] Suppression du couplage du host/runtime Farcaster de l'infrastructure partagée de l'app
Tous les chemins se terminent par :
### Étapes manuelles
- [ ] Exécutez `npm install`
- [ ] Testez le flux de connexion du portefeuille
- [ ] Si la migration FID est nécessaire, migrez de l'identité basée sur FID à l'adresse du portefeuille
- [ ] Si le chemin B préserve une zone réservée à Farcaster, vérifiez qu'elle reste isolée du shell principal de l'app
### Vérification
- TypeScript : [pass/fail]
- Build : [pass/fail]
- Références Farcaster restantes : [aucune / liste]
Cas limites
Pas de wagmi
Ignorez la phase 2A. N'introduisez pas wagmi sauf si l'app a vraiment besoin de connectivité portefeuille.
Pas de système d'authentification
Ignorez la phase 2C. N'ajoutez pas SIWE inutilement.
@farcaster/frame-sdk (plus ancien)
Traitez identiquement à @farcaster/miniapp-sdk.
Monorepo
Demandez quels workspace(s) convertir. Modifiez seulement ceux-ci.
FID comme clé primaire de la base de données
Ne changez pas automatiquement le schéma. Signalez-le et avertissez dans la phase 4.
Branches isInMiniApp conditionnelles
Gardez toujours la branche web normale et supprimez la branche Mini App.
Composants sans utilité non-Farcaster
Supprimez-les entièrement dans le chemin A. Dans le chemin B, gardez-les seulement s'ils vivent à l'intérieur de la route Farcaster isolée.
Utilisation existante de Neynar
Si le projet utilise déjà Neynar :
- supprimez-le dans le
chemin A - gardez-le seulement s'il reste à l'intérieur de la surface isolée du
chemin B - n'ajoutez pas plus d'utilisation Neynar qu'il n'en existe déjà sauf si l'utilisateur l'exige explicitement
La lecture seule est généralement suffisante
Si l'utilisateur dit qu'il veut « garder les choses Farcaster », privilégiez :
- les liens de profil
- l'affichage de profil ou de cast en lecture seule
- une page sociale dédiée
Ne supposez pas qu'il veut l'accès en écriture, les notifications ou le comportement du host/runtime.
Ambiguïté du quiz
Si l'analyse et le quiz entrent en conflit, pointez-le et demandez à l'utilisateur de confirmer d'abord la plus petite surface de préservation.
Sécurité
- Valider la configuration du portefeuille — assurez-vous que
coinbaseWalletou le connecteur de portefeuille choisi est configuré correctement - Identité basée sur FID — nécessite une migration manuelle de la base de données si utilisée comme clé primaire
- Vérification SIWE — vérifiez les signatures côté serveur avant de leur faire confiance
- Surface isolée préservée — ne laissez pas une route/page réservée à Farcaster laisser échapper les hypothèses du host/runtime dans le shell principal de l'app
- Utilisation existante de Neynar — gardez les clés d'API côté serveur seulement et seulement si cette surface isolée en dépend encore