Your Mini App’s Manifest proves ownership of your app and powers search, discovery, and rich embeds in the Base App.
Since Vite projects are frontend-only applications, you have several options for serving the manifest:
Option 1: Static Manifest File
Create a static farcaster.json
file in your public/.well-known/
directory:
public/.well-known/farcaster.json
{
"accountAssociation": {
"header": "your_farcaster_header_here",
"payload": "your_farcaster_payload_here",
"signature": "your_farcaster_signature_here"
},
"frame": {
"version": "1",
"name": "YourAppName",
"subtitle": "Short subtitle",
"description": "Describe what your app does",
"screenshotUrls": [],
"iconUrl": "https://your-app.vercel.app/icon.png",
"splashImageUrl": "https://your-app.vercel.app/splash.png",
"splashBackgroundColor": "#000000",
"homeUrl": "https://your-app.vercel.app",
"webhookUrl": "https://your-app.vercel.app/api/webhook",
"primaryCategory": "social",
"tags": [],
"heroImageUrl": "https://your-app.vercel.app/og.png",
"tagline": "Play instantly",
"ogTitle": "Your App",
"ogDescription": "Fast, fun, social",
"ogImageUrl": "https://your-app.vercel.app/og.png",
"noindex": true
}
}
Visit https://yourdomain.com/.well-known/farcaster.json
to verify JSON output.
Option 2: Use Serverless Functions
For dynamic manifests, you can use serverless functions:
Vercel Functions
Create api/well-known/farcaster.json.js
:
api/.well-known/farcaster.json.js
function withValidProperties(properties) {
return Object.fromEntries(
Object.entries(properties).filter(([_, value]) => (Array.isArray(value) ? value.length > 0 : !!value))
);
}
export default function handler(req, res) {
const URL = process.env.VITE_PUBLIC_URL;
res.status(200).json({
accountAssociation: {
header: process.env.FARCASTER_HEADER,
payload: process.env.FARCASTER_PAYLOAD,
signature: process.env.FARCASTER_SIGNATURE,
},
frame: withValidProperties({
version: '1',
name: process.env.VITE_PUBLIC_ONCHAINKIT_PROJECT_NAME,
subtitle: process.env.VITE_PUBLIC_APP_SUBTITLE,
description: process.env.VITE_PUBLIC_APP_DESCRIPTION,
screenshotUrls: [],
iconUrl: process.env.VITE_PUBLIC_APP_ICON,
splashImageUrl: process.env.VITE_PUBLIC_APP_SPLASH_IMAGE,
splashBackgroundColor: process.env.VITE_PUBLIC_SPLASH_BACKGROUND_COLOR,
homeUrl: URL,
webhookUrl: `${URL}/api/webhook`,
primaryCategory: process.env.VITE_PUBLIC_APP_PRIMARY_CATEGORY,
tags: [],
heroImageUrl: process.env.VITE_PUBLIC_APP_HERO_IMAGE,
tagline: process.env.VITE_PUBLIC_APP_TAGLINE,
ogTitle: process.env.VITE_PUBLIC_APP_OG_TITLE,
ogDescription: process.env.VITE_PUBLIC_APP_OG_DESCRIPTION,
ogImageUrl: process.env.VITE_PUBLIC_APP_OG_IMAGE,
// use only while testing
noindex: true,
}),
});
}
Netlify Functions
Create netlify/functions/farcaster-manifest.js
and configure redirects.
Option 3: Framework with SSR
For the most flexibility, consider using a framework with server-side rendering:
- Next.js (recommended for full Mini App features)
- SvelteKit
- Nuxt.js
These frameworks provide API routes and can generate dynamic manifests with environment variables.
Review the full Manifest guide and update all fields. Be sure to update your deployment environment with these values.
Static manifests require manual updates when credentials change. Consider serverless functions for production apps.