$npx -y skills add basezh/agent-skills-on-base --skill converting-minikit-to-farcasterConverts Mini Apps from MiniKit (OnchainKit) to native Farcaster SDK. Use when migrating from @coinbase/onchainkit/minikit, converting MiniKit hooks, removing MiniKitProvider, or when user mentions MiniKit, OnchainKit, or Farcaster SDK migration.
| 1 | # MiniKit to Farcaster SDK |
| 2 | |
| 3 | ## Breaking Changes (SDK v0.2.0+) |
| 4 | |
| 5 | 1. `sdk.context` is a **Promise** — must await |
| 6 | 2. `sdk.isInMiniApp()` accepts **no parameters** |
| 7 | 3. `sdk.actions.setPrimaryButton()` has no onClick callback |
| 8 | |
| 9 | Check version: `npm list @farcaster/miniapp-sdk` |
| 10 | |
| 11 | ## Quick Reference |
| 12 | |
| 13 | | MiniKit | Farcaster SDK | Notes | |
| 14 | |---------|---------------|-------| |
| 15 | | `useMiniKit().setFrameReady()` | `await sdk.actions.ready()` | | |
| 16 | | `useMiniKit().context` | `await sdk.context` | **Async** | |
| 17 | | `useMiniKit().isSDKLoaded` | `await sdk.isInMiniApp()` | No params | |
| 18 | | `useClose()` | `await sdk.actions.close()` | | |
| 19 | | `useOpenUrl(url)` | `await sdk.actions.openUrl(url)` | | |
| 20 | | `useViewProfile(fid)` | `await sdk.actions.viewProfile({ fid })` | | |
| 21 | | `useViewCast(hash)` | `await sdk.actions.viewCast({ hash })` | | |
| 22 | | `useComposeCast()` | `await sdk.actions.composeCast({ text, embeds })` | | |
| 23 | | `useAddFrame()` | `await sdk.actions.addMiniApp()` | | |
| 24 | | `usePrimaryButton(opts, cb)` | `await sdk.actions.setPrimaryButton(opts)` | No callback | |
| 25 | | `useAuthenticate()` | `sdk.quickAuth.getToken()` | See [AUTH.md](AUTH.md) | |
| 26 | |
| 27 | ## Context Access Pattern |
| 28 | |
| 29 | ```typescript |
| 30 | // WRONG |
| 31 | const fid = sdk.context?.user?.fid; |
| 32 | |
| 33 | // CORRECT |
| 34 | const context = await sdk.context; |
| 35 | const fid = context?.user?.fid; |
| 36 | ``` |
| 37 | |
| 38 | In React components, use state: |
| 39 | |
| 40 | ```typescript |
| 41 | const [context, setContext] = useState(null); |
| 42 | |
| 43 | useEffect(() => { |
| 44 | const load = async () => { |
| 45 | const ctx = await sdk.context; |
| 46 | setContext(ctx); |
| 47 | }; |
| 48 | load(); |
| 49 | }, []); |
| 50 | ``` |
| 51 | |
| 52 | ## Conversion Workflow |
| 53 | |
| 54 | 1. Verify Node.js >= 22.11.0 |
| 55 | 2. Update dependencies — see [DEPENDENCIES.md](DEPENDENCIES.md) |
| 56 | 3. Replace imports: `@coinbase/onchainkit/minikit` → `@farcaster/miniapp-sdk` |
| 57 | 4. Convert hooks using reference above |
| 58 | 5. Add FrameProvider — see [PROVIDER.md](PROVIDER.md) |
| 59 | 6. Update manifest: `frame` → `miniapp` — see [MANIFEST.md](MANIFEST.md) |
| 60 | |
| 61 | ## Common Errors |
| 62 | |
| 63 | **"Property 'user' does not exist on type 'Promise<MiniAppContext>'"** |
| 64 | → Await `sdk.context` before accessing properties |
| 65 | |
| 66 | **"Expected 0 arguments, but got 1"** |
| 67 | → Remove parameters from `sdk.isInMiniApp()` |
| 68 | |
| 69 | **Context is null in components** |
| 70 | → Ensure FrameProvider is in your provider chain |
| 71 | |
| 72 | ## References |
| 73 | |
| 74 | - [MAPPING.md](MAPPING.md) — Complete hook-by-hook conversion reference |
| 75 | - [EXAMPLES.md](EXAMPLES.md) — Before/after code examples |
| 76 | - [PROVIDER.md](PROVIDER.md) — Provider setup with FrameProvider |
| 77 | - [PITFALLS.md](PITFALLS.md) — Common errors and solutions |
| 78 | - [DEPENDENCIES.md](DEPENDENCIES.md) — Package updates |
| 79 | - [AUTH.md](AUTH.md) — Quick Auth migration |
| 80 | - [MANIFEST.md](MANIFEST.md) — farcaster.json changes |