convert-farcaster-miniapp-to-app

Convertit les projets SDK de miniapp Farcaster en applications Base/web classiques. Démarre par un quiz interactif pour choisir entre la conversion en application classique par défaut et une surface Farcaster isolée au minimum lorsque quelque chose doit vraiment rester séparé. Gère les connecteurs wagmi, les providers, l'auth, les actions SDK, les routes de manifest, les balises meta, les dépendances et la préservation en lecture seule.

npx skills add https://github.com/base/skills --skill convert-farcaster-miniapp-to-app

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 :

  1. Supprimez le couplage du host/runtime Mini App.
  2. Décidez si une fonctionnalité orientée Farcaster doit subsister.
  3. 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 :

  1. Découverte — Analyse rapide + quiz pour choisir un chemin
  2. Analyse — Analyse détaillée en lecture seule limitée au chemin choisi
  3. Conversion — Supprimez les modèles du SDK Mini App et isolez toute surface Farcaster intentionnellement préservée
  4. Nettoyage — Supprimez le code mort, les variables d'env et les dépendances
  5. 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 :

  1. Détectez le framework à partir de package.json (next, vite, react-scripts, @remix-run/*)
  2. Comptez les packages Farcaster dans dependencies et devDependencies
  3. 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 fetch api.neynar.com (oui/non)
  4. 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, openMiniApp ou sdk.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 logique isInMiniApp conditionnelle
  • (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.js
  • vite → Vite
  • react-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 coinbaseWallet dans la config wagmi
  • utilisation de SIWE / package siwe
  • connectkit, rainbowkit ou @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.) :

  1. Supprimez l'import de farcasterMiniApp ou miniAppConnector de @farcaster/miniapp-wagmi-connector

  2. Supprimez l'appel farcasterMiniApp() / miniAppConnector() du tableau connectors

  3. Si aucun connecteur de portefeuille ne reste, ajoutez :

    import { coinbaseWallet } from "wagmi/connectors";
    
    coinbaseWallet({ appName: "<app name>" })
  4. Si coinbaseWallet existe déjà, laissez-le tel quel

  5. 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 :
    1. Obtenez l'adresse du portefeuille à partir de useAccount() (wagmi)
    2. Créez un message SIWE avec siwe
    3. Signez avec useSignMessage() (wagmi)
    4. Envoyez la signature + message au backend pour vérification

Côté serveur (ex. app/api/auth/sign-in/route.ts) :

  • Supprimez la vérification @farcaster/quick-auth
  • Remplacez par la vérification SIWE :
    1. Parsez le message SIWE
    2. Vérifiez la signature avec siwe ou viem
    3. 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.ts
  • public/.well-known/farcaster.json
  • api/farcaster-manifest.ts ou 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> avec property="fc:miniapp*" ou property="fc:frame*"
  • les entrées Metadata.other qui n'existent que pour les tags Farcaster
  • la logique generateMetadata qui 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/react et 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 :

  • siwe si 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/ ou app/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_KEY
  • NEXT_PUBLIC_NEYNAR_CLIENT_ID
  • FARCASTER_*
  • 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 @neynar restants 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 coinbaseWallet ou 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

Skills similaires