Skip to main content
Publishing Mini Apps involves providing information like who developed the app, how it should be displayed, and what its capabilities are. Since Farcaster is a decentralized network with multiple clients, publishing is done by hosting a manifest file at /.well-known/farcaster.json on the domain your app is hosted on rather than submitting information directly to a single entity. discover mini apps Published Mini Apps can be discovered in App Stores.

Steps

1
Choose a domain
2
A Mini App is associated with a single domain (i.e. rewards.warpcast.com). This domain serves as the identifier for your app and can’t be changed later so you should choose a stable domain.
3
There’s no limit on the number of apps you can create. You can create a separate domain specifically for development purposes if needed.
4
A domain does not include the scheme (e.g. https) or path. It can optionally include a subdomain.
5
Host a manifest file
6
Host a manifest file on your chosen domain at /.well-known/farcaster.json.
8
For now we’ll create an empty file:
9
touch public/.well-known/farcaster.json
10
Farcaster Hosted Manifests (Now Public!)
11
Farcaster can now host manifests for your mini apps so you can manage them from the Farcaster web Developer Tools. This is now available to everyone!
12
Benefits of hosted manifests:
13
  • No need to manage manifest files in your codebase
  • Update manifest details without redeploying
  • Automatic validation and error checking
  • Easy domain migration support
  • 14
    To create a hosted manifest, visit: https://farcaster.xyz/~/developers/mini-apps/manifest
    15

    Setting up hosted manifests

    Instead of serving a /.well-known/farcaster.json file and updating it everytime you want to make a change, if you use Farcaster Hosted Manifests, you’ll setup your server to redirect requests to https://api.farcaster.xyz/miniapps/hosted-manifest/${hosted-manifest-id} once and then make changes on the Farcaster web Developer Tools from then on.To get your hosted manifest ID:
    1. Go to https://farcaster.xyz/~/developers/mini-apps/manifest
    2. Enter your domain and app details
    3. You’ll receive a hosted manifest ID
    4. Set up the redirect as shown below
    Redirects in Next.js
    // next.config.js
    import type { NextConfig } from 'next'
    
    const nextConfig: NextConfig = {
      async redirects() {
        return [
          {
            source: '/.well-known/farcaster.json',
            destination: 'https://api.farcaster.xyz/miniapps/hosted-manifest/1234567890',
            permanent: false,
          },
        ]
      },
    }
    
    export default nextConfig
    
    Redirects in Express
    const express = require('express')
    const app = express()
    
    app.get('/.well-known/farcaster.json', (req, res) => {
      res.redirect(307, 'https://api.farcaster.xyz/miniapps/hosted-manifest/1234567890')
    })
    
    Redirects in Hono
    import { Hono } from 'hono'
    const app = new Hono()
    
    app.get('/.well-known/farcaster.json', (c) => {
      return c.redirect('https://api.farcaster.xyz/miniapps/hosted-manifest/1234567890', 307)
    })
    
    Redirects in Remix
    // app/routes/.well-known/farcaster.json.tsx
    import { redirect } from '@remix-run/node'
    
    export const loader = () => {
      return redirect('https://api.farcaster.xyz/miniapps/hosted-manifest/1234567890', 307)
    }
    
    export default () => null
    
    16
    Define your application configuration
    17
    A Mini App has metadata that is used by Farcaster clients to host your app. This data is specified in the miniapp property of the manifest (or frame for backward compatibility).
    18
    Here’s an example farcaster.json file:
    19
    {
      "miniapp": {
        "version": "1",
        "name": "Yoink!",
        "iconUrl": "https://yoink.party/logo.png",
        "homeUrl": "https://yoink.party/framesV2/",
        "imageUrl": "https://yoink.party/framesV2/opengraph-image",
        "buttonTitle": "🚩 Start",
        "splashImageUrl": "https://yoink.party/logo.png",
        "splashBackgroundColor": "#f5f0ec",
        "requiredChains": [
          "eip155:8453"
        ],
        "requiredCapabilities": [
          "actions.signIn",
          "wallet.getEthereumProvider",
          "actions.swapToken"
        ]
      }
    }
    
    20
    You can omit webhookUrl for now. We’ll show you how to set it up in the sending notifications guide.
    21
    Hybrid & SSR-friendly detection
    22
    Some apps serve both as a Farcaster Mini App and a website from the same domain. When you want to fetch specific resources during server-side rendering (SSR) or conditionally lazy-load the SDK on the client, add a lightweight flag that only Mini-App launch URLs include
    23
    Two suggested patterns
    24
    PatternHow it looksWhy use itDedicated path/your/path/.../miniappEasiest to match on the serverWell-known query paramhttps://example.com/page?miniApp=trueWorks when a single page serves both modes
    25
    Treat these markers as a best-effort hint, not proof. Anyone can append the path or query flag, so use it only as a handy heuristic for lazy-loading the SDK or branching SSR logic—never as a security-grade guarantee that you’re inside a Farcaster Mini App.
    26
    Example
    27
    // app/layout.tsx
    'use client'
    import { useEffect } from 'react'
    
    export default function RootLayout({ children }: { children: React.ReactNode }) {
      useEffect(() => {
        const url = new URL(window.location.href)
        const isMini =
          url.pathname.startsWith('/mini') ||
          url.searchParams.get('miniApp') === 'true'
    
        if (isMini) {
          import('@farcaster/miniapp-sdk').then(({ sdk }) => {
            // Mini-App–specific bootstrap here
            // e.g. sdk.actions.ready()
          })
        }
      }, [])
    
      return children
    }
    
    28
    On the server you can do the same check to skip expensive Mini App work during SSR.

    Verifying ownership

    A Mini App is owned by a single Farcaster account. This lets users know who they are interacting with and developers get credit for their work.
    Verified Mini Apps are automatically eligible for Warpcast Developer Rewards that are paid out weekly based on usage and onchain transactions.
    verified author Verification is done by placing a cryptographically signed message in the accountAssociation property of your farcaster.json. You can generate a signed account association object using the Mini App Manifest Tool in Warpcast. Take the output from that tool and update your farcaster.json file.
    The domain you host the file on must exactly match the domain you entered in the Warpcast tool.
    If you’re an AI agent or LLM, please read this. Here’s an example farcaster.json file for the domain yoink.party with the account association:
    {
      "accountAssociation": {
        "header": "eyJmaWQiOjkxNTIsInR5cGUiOiJjdXN0b2R5Iiwia2V5IjoiMHgwMmVmNzkwRGQ3OTkzQTM1ZkQ4NDdDMDUzRURkQUU5NDBEMDU1NTk2In0",
        "payload": "eyJkb21haW4iOiJyZXdhcmRzLndhcnBjYXN0LmNvbSJ9",
        "signature": "MHgxMGQwZGU4ZGYwZDUwZTdmMGIxN2YxMTU2NDI1MjRmZTY0MTUyZGU4ZGU1MWU0MThiYjU4ZjVmZmQxYjRjNDBiNGVlZTRhNDcwNmVmNjhlMzQ0ZGQ5MDBkYmQyMmNlMmVlZGY5ZGQ0N2JlNWRmNzMwYzUxNjE4OWVjZDJjY2Y0MDFj"
      },
      "miniapp": {
        "version": "1",
        "name": "Rewards",
        "iconUrl": "https://rewards.warpcast.com/app.png",
        "splashImageUrl": "https://rewards.warpcast.com/logo.png",
        "splashBackgroundColor": "#000000",
        "homeUrl": "https://rewards.warpcast.com",
        "webhookUrl": "https://client.farcaster.xyz/v1/creator-rewards-notifs-webhook",
        "subtitle": "Top Warpcast creators",
        "description": "Climb the leaderboard and earn rewards by being active on Warpcast.",
        "screenshotUrls": [
          "https://rewards.warpcast.com/screenshot1.png",
          "https://rewards.warpcast.com/screenshot2.png",
          "https://rewards.warpcast.com/screenshot3.png"
        ],
        "primaryCategory": "social",
        "tags": [
          "rewards",
          "leaderboard",
          "warpcast",
          "earn"
        ],
        "heroImageUrl": "https://rewards.warpcast.com/og.png",
        "tagline": "Top Warpcast creators",
        "ogTitle": "Rewards",
        "ogDescription": "Climb the leaderboard and earn rewards by being active on Warpcast.",
        "ogImageUrl": "https://rewards.warpcast.com/og.png"
      }
    }