What's New in React Native SDK 2.1
React Native SDK 2.1.0 and 1.2.0 were both tagged on 14 October 2026. There is no 2.0.0 tag: 2.1.0 is the release after 1.2.0. This post covers both, picking up from React Native SDK 1.1. 1.2.0 changes no runtime code. 2.1.0 changes how the list looks on both platforms, adds dark mode, and fixes a set of defects that went back to 1.0.
The short version
- New look:
FeedbackListdraws Showcase cards by default.listStyle="classic"keeps the 1.x list. - New sheet: one Sort & Filter button with sort options and status and category filter chips, filtering on the device.
- Dark mode:
colorSchemeon the provider, following the device by default. - Your icons:
renderIcondraws the list's icons with your own icon set. - Fixed:
localeapplies on the opening render, stale responses no longer overwrite newer ones, the vote button follows new props, and a failed comment send is shown. - Breaking: the re-exported
TrackedEvent.createdAtmay beundefined, and admin replies need a server token.
Installing 2.1
npm still holds 1.0.0 and 1.0.1 of feedbackkit-react-native and feedbackkit-js, so npm install gives you 1.0.1 of both. The 1.2.0 and 2.1.0 tags are in the SwiftlyFeedbackKit-React-SDK repository on GitHub, but neither the repository nor its README documents a way to install 2.1.0. Its install line resolves the npm packages, and React Native SDK 2.1.0 does not build against feedbackkit-js 1.0.1: it uses JavaScript SDK APIs that arrived in 1.1 and 2.1, such as FeedbackSort and the bearerToken option. So 2.1.0 needs JavaScript SDK 2.1.0, which is not on npm either; What's New in JavaScript SDK 2.1 shows how to build that one from its tag. The React Native package still points Metro at its TypeScript source through the react-native field, as it did in 1.1, but FeedbackKit does not document a route for it.
If you would rather stay on the registry, 1.0.1 keeps working, and the React Native SDK 1.0 tutorial covers it.
1.2: tests that run
1.2.0 aligns the version number with the other SDKs and changes no runtime code. Its one fix is in the repository's tests, which had not been running at all, plus new tests that check the SDK's types against the server's.
The Showcase list
FeedbackList now draws a card per request. Each card has a status line with a glyph whose shape tells the statuses apart, the whole title and description, the category, the comment count when there are comments, and a vote capsule. The capsule fills once you have voted and turns to plain text on Completed and Rejected requests. Your existing code does not change:
import { FeedbackList } from 'feedbackkit-react-native';
export function TrailIdeasScreen({ navigation }) {
return (
<FeedbackList
onFeedbackPress={(feedback) => navigation.navigate('Idea', { id: feedback.id })}
showAddButton
onAddPress={() => navigation.navigate('SuggestIdea')}
/>
);
}
On Android the list follows Material 3, with elevated cards, ripples and 48dp touch targets. On iOS it uses flat rounded cards on the grouped background, a press highlight and 44pt targets. Both survive a font scale of 2.0, lay out right to left in Arabic, and give screen readers a role, a state and a label for every control.
The Sort & Filter button opens a sheet with the sort options and chips for status and category. The sort is still done by the server. The status and category chips filter the requests already loaded, so changing them does not reload. While a filter is on, a "Filtered by" row with Clear sits above the list, and a filter with no results shows No Matching Requests. filterByStatus and filterByCategory still fix a filter on the server, and hide that section of the sheet.
New props control the cards: showStatusFilter, showCategoryFilter, showStatusBadge, showCategoryBadge, showCommentCount, showVoteCount and allowUndoVote, all on by default. To keep the 1.x list, with its sort chips, pass listStyle="classic" to one list or to FeedbackProvider for all of them.
Dark mode and your own icons
FeedbackProvider takes colorScheme: 'system', the default, follows the device, and 'light' or 'dark' pins it. If your theme sets its own background, card or text colour, the provider keeps your colours under 'system' instead of mixing them with the dark palette.
The Showcase icons are drawn with plain views, so the SDK adds no icon dependency. If your app already has an icon set, renderIcon draws them with it. Return null for any name to keep the built-in glyph:
<FeedbackProvider
apiKey={FEEDBACK_API_KEY}
colorScheme="system"
renderIcon={(name, { size, color }) =>
name === 'bug' ? <TrailIcon name="bug" size={size} color={color} /> : null
}
>
The names are tune, lightbulb, bug, more, comment, filter, filterActive, arrowUp, check and close.
Fixes
localeandtranslationsapply before the views render. The 1.1 notes advised callingsetLocaleat startup because the provider applied itslocaletoo late. 2.1 applies both props before its children render, and when they change.clearOverrideStringsis new.- A slow response no longer overwrites a newer one.
useFeedbackList,useFeedbackanduseCommentsignore a result that lands after a newer request or after the screen has gone. - Prop changes reach the list.
FeedbackListappliesfilterByStatus,filterByCategoryandsortBywhen they change after mount, and keeps a sort picked in the list whensortByis not set. - The vote button follows its props.
VoteButtonupdates when a laterfeedbackprop brings a new count or voted state. Voting is allowed on Pending, Approved, In Progress and TestFlight, and an unknown status is not votable. - The user id is kept. A
userIdprop onFeedbackProvideris saved to AsyncStorage, where 1.x saved an id fromsetUserId()but never from the prop, and a stored id no longer replaces a prop that arrives while storage is loading. - Errors keep what is on screen. A failed refresh keeps the loaded rows and shows the error with Retry. A failed comment send is stored as
addErroronuseCommentsand shown onFeedbackDetailViewwithout clearing the comments. - Accessibility and languages. The add button, sort chips, cards and mailing-list checkboxes have accessible names and states. The sort chips are translated in all eleven languages, where they used to show English. Arabic lays out the list, card, submit form and detail screen right to left, without changing your app's own direction.
- Unknown values show. A status or category this build does not know is labelled with its raw value instead of nothing.
Breaking changes and how to migrate
The default list looks different
No prop was removed, but every FeedbackList now draws Showcase cards, and with colorScheme defaulting to 'system' the views turn dark when the device does. If your screens were designed around the 1.x look, pass listStyle="classic" and colorScheme="light" to the provider, then move over when you are ready. Showcase does not tint cards with categoryColors, and it lifts status and category colours used as text to WCAG AA contrast.
What comes from the JavaScript SDK
This package re-exports feedbackkit-js, so JavaScript SDK 2.1's changes reach your app through it. The one that breaks compilation is TrackedEvent.createdAt, now string | undefined: handle the missing case where you read it. At runtime, a baseUrl on plain http:// is refused unless it is localhost, event properties must be strings, numbers or booleans, and a 429 arrives as RateLimitError. The JavaScript SDK 2.1 notes cover each one.
Admin replies need a bearer token
addComment(content, true) from useComments used to send the admin flag with the project API key, so any app could mark its own reply as the team's. In 2.1 it throws without calling the server unless FeedbackProvider has a bearerToken, a server-side credential that never belongs in an app you ship. Ordinary comments are unchanged, and your team still replies from the dashboard or the admin apps.
Additive API
setFilter from useFeedbackList also accepts an updater function, so you can change one field without dropping the others: setFilter((current) => ({ ...current, sort: FeedbackSort.Newest })). formatString is exported for filling catalog strings, and the feedbackkit-js peer range is now >=1.0.0.
How FeedbackKit fits in
The cards make long lists easier to scan, so the requests with the most support stand out. Your team gets a push notification for each new request and comment, and the person who filed a request gets an email when its status changes. Here is how voting looks in FeedbackKit, with sample data from a fictional hiking app:
Votes from inside the app
Upgrading
From 1.2 or 1.1: 2.1.0 needs JavaScript SDK 2.1.0 alongside it, and neither is on npm. Once both are in place, decide between Showcase and Classic and between following the device and staying light, handle a missing createdAt, and move admin replies off the app. If you called setLocale early to work around the 1.1 timing, the locale prop now does the job.
The reference is in the React Native SDK docs. If you are starting today, follow the current React Native tutorial, and for where the SDK started, see What's New in React Native SDK 1.0.
Every plan includes the React Native SDK. Start free and add the new board to your app.