Installation
From npm install to a working feedback modal in one flow — install peers, mount FeddyProvider, configure with your Project ID, drop in a button, verify in the dashboard.
This page takes you from a fresh React Native or Expo project to a working feedback submission landing in your Feddy dashboard. Read top-to-bottom; every section is a step in the same flow.
Requirements
| Item | Version |
|---|---|
| React Native | 0.73+ |
| React | 18+ |
| iOS deployment target | 15+ |
| Android minSdk | 24+ |
| TypeScript | 5+ (optional — full type declarations ship with the package) |
The SDK is pure JavaScript with optional Expo modules. There is no Pod install or Gradle config required, and it works in Expo Go.
Install the package
Install the core SDK plus its two required peer dependencies:
npm install @feddyapp/react-native @react-native-async-storage/async-storage react-native-safe-area-contextFor richer features, also install the optional Expo modules — each adds a specific capability and is gracefully no-op'd when missing:
npx expo install \
expo-application expo-device expo-localization \
expo-image-picker expo-image-manipulator expo-store-review \
expo-iapGet your Project ID
- Sign up at feddy.app and create a workspace
- Open Settings → API Keys
- Copy the Project ID — it looks like
fed_xxxxxxxxxxxx(thefed_prefix followed by 12 alphanumeric characters)
Project ID vs API Key
The Project ID (fed_xxxxxxxxxxxx) is safe to embed in your client
app — it only grants ingest. The dashboard also generates API Keys
(fed_sk_xxxxxxxxxxxx); those are server-to-server secrets and must
never be shipped in a client. The SDK rejects anything starting with
fed_sk_.
Configure and mount FeddyProvider
Call Feddy.configure(...) once at app launch and mount
<FeddyProvider /> at the root of your app. The provider mounts the
built-in compose modal and Smart Review sheet so the imperative APIs
(Feddy.openFeedback(), Feddy.requestReviewIfAppropriate()) work from
anywhere in your tree.
import { Feddy, FeddyProvider } from '@feddyapp/react-native';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import YourApp from './YourApp';
Feddy.configure({ apiKey: 'fed_xxxxxxxxxxxx' });
export default function App() {
return (
<SafeAreaProvider>
<FeddyProvider>
<YourApp />
</FeddyProvider>
</SafeAreaProvider>
);
}If your app uses expo-router, place setup in app/_layout.tsx:
import { Feddy, FeddyProvider } from '@feddyapp/react-native';
import { Stack } from 'expo-router';
import { SafeAreaProvider } from 'react-native-safe-area-context';
Feddy.configure({ apiKey: 'fed_xxxxxxxxxxxx' });
export default function RootLayout() {
return (
<SafeAreaProvider>
<FeddyProvider>
<Stack />
</FeddyProvider>
</SafeAreaProvider>
);
}Feddy.configure() is synchronous, fire-and-forget, and never
throws — invalid keys or network failures log to the console rather
than surfacing as a thrown error.
Verify the install
Drop the button below into any screen to confirm the SDK is wired up. It opens the bundled feedback modal — submit a quick test message:
import { Pressable, Text } from 'react-native';
import { Feddy } from '@feddyapp/react-native';
export function VerifyButton() {
return (
<Pressable
onPress={() => Feddy.openFeedback({ boardKey: 'features' })}
style={{ padding: 12 }}
>
<Text>Send Feedback</Text>
</Pressable>
);
}In the Feddy dashboard, navigate to Inbox — your test submission should appear at the top of the list within a second or two.
Offline retry
If the device was offline at submit time, the SDK queues the payload
locally (via AsyncStorage) and replays it on the next
Feddy.configure(...) call. You don't need to handle this manually —
but it does mean test submissions may take a moment to land if you're
on a flaky network.
What's next
You're integrated. Continue with:
Overview
Start here to understand the Feddy React Native SDK surface area — what ships in the box, the optional Expo modules that add capability, and where each piece fits.
Authentication
Identify signed-in users so feedback, votes, and comments attribute to a real account instead of a per-install anonymous token.