featurely 0.7.0
featurely: ^0.7.0 copied to clipboard
In-app feedback sheet for the self-hosted Featurely platform: feature requests, issue reports, voting, and comments — themed by your app and localized in 34 languages.
Changelog #
0.7.0 #
Push notifications: the package is now a Flutter plugin with native iOS
and Android code. It registers the device for pushes your team sends from
the Featurely dashboard or your backend, and for Featurely's own "the team
replied", "shipped" and public-reply pushes. Needs a Featurely server that
reports pushEnabled (push credentials set up under Settings → Push);
against older servers, or without credentials, no push calls are made.
- Upgrading: do a full rebuild after upgrading (not a hot restart), since
the package now contains native code. Android apps need
minSdk23. - Registration is automatic after
init: the device is registered when a token is known and re-registered on any change of token, permission, time zone, locale, app version or opt-out, and at least every 24 h.logout()and account switches unregister the old device ID first and register the same token under the new one. Failures never throw; they go toonError. - New
Featurely.push(FeaturelyPush):requestPermission({provisional})(the only way the SDK ever prompts),permission(),optOut()/optIn()/isOptedOut()(per install, survives logout),setTags/getTags(validated client-side,ArgumentErroron bad input),setOpenHandler(handler)and, for Android apps that also usefirebase_messaging,handleForegroundMessage(data, title:, body:). - New
navigatorKeyparameter onFeaturely.init: a tap on a chat reply opens the chat, and "shipped" / "team replied" open the feedback list; a pushurlopens with the OS. A tap that launches the app is held untilinitcompletes; the open handler and URL opening then run without waiting for the navigator (so they work without anavigatorKeytoo), and only presenting the chat or list waits for it, for up to 30 s. - Every tap is saved to a small on-device queue (20 entries) before it is reported, and stays there until the server answers — including while push isn't available yet.
FeaturelyApiException.retryAfterHeader: theretry-afterheader of a429as sent (null when absent). A registration429without one pauses registration for 60 s.- Featurely pushes show in the foreground too — except a chat reply while the chat is on screen, which refreshes the chat right away instead.
- iOS: set
UNUserNotificationCenter.current().delegate = selfin yourAppDelegateand add the Push Notifications capability; the plugin reads the APNs token and environment itself. Pushes from other senders are left alone. - Android: no
google-services.jsonor Google Services plugin needed — the SDK starts its own Firebase app from the config uploaded in Featurely, and falls back to your default Firebase app. Featurely pushes use a "Notifications" channel, localized in all 34 locales (sdkPushChannelName). - The iOS plugin ships as a Swift package and as a CocoaPods pod; the example app uses Swift Package Manager only.
- Dependencies raised to their current releases (
http1.6,http_parser4.1.2,image_picker1.2.3,shared_preferences2.5.5,intl0.20.2+). The SDK now declares whatdevice_info_plus13 andpackage_info_plus10 already required: Flutter 3.38.1 / Dart 3.10. Android hosts needcompileSdk36 and Android Gradle Plugin 8.9.1 or newer; iOS 15.0. - New error codes
FeaturelyErrorCode.validationErrorandFeaturelyErrorCode.tooManyTags;SdkConfigdecodespushEnabled.
0.6.1 #
- Assistant replies are labeled with the assistant's name only (default
"Assistant"); the small "AI" tag is gone. The
sdkChatAiTagstring is removed. - Removed the chat's "Get replies by email" card, along with its
PUT /conversation/emailcall and the sixsdkChatEmail*strings. The feedback form's optional email field is unchanged.
0.6.0 #
AI Support Assistant: a Featurely project can let an AI assistant answer chat messages within seconds and hand off to the team when it can't help. Needs a Featurely server with the assistant enabled for the environment; against older servers everything below is ignored and chat works as before.
- Every chat send now declares
assistantCapable: true, so the assistant may answer conversations from this SDK. - Assistant replies show the assistant's name and a small "AI" tag. They are plain text (no markdown); numbered lines get a hanging indent.
- While the assistant is writing, the chat shows "{name} is typing…" and polls every 1.5 s, returning to 5 s when the reply lands or after 60 s.
- New
Featurely.setChatDiagnosticsProvider(provider): a live app-state snapshot sent with each message. The provider gets 1 s; a timeout, a throw, or a result over the limits (4 096 bytes of JSON, 3 levels deep, 200-character strings, 30-item lists) sends the message without it. If the server rejects the snapshot, the message is re-sent once without it. - New
Featurely.registerChatActions([FeaturelyChatAction(id:, title:)])andFeaturely.setChatActionHandler(handler): the assistant can suggest registered actions, shown as buttons under its reply. The handler returnsFeaturelyChatActionResult.stayor.dismiss(closes the chat sheet); a tapped action shows as used for the session. - Localized "AI", "Assistant" and "{name} is typing…" strings
(
sdkChatAiTag,sdkChatAssistantName,sdkChatAssistantTyping) in all 34 locales.
0.5.0 #
- Refreshed the chat screen. Messages are grouped under day separators (Today, Yesterday, the weekday, then the date), so each message shows only its time. Bubbles have a smaller corner on the sender's side, and team messages no longer carry a visible "Team" label (screen readers still announce it). A message that failed to send shows as a tinted outline bubble.
- The "Get replies by email" row is now a card above the composer instead of a bar under the header. The composer and send button were resized.
- Localized "Today" and "Yesterday" strings (
sdkChatToday,sdkChatYesterday) in all 34 locales.
0.4.0 #
- 8 new locales: Bulgarian (
bg), Greek (el), Finnish (fi), Indonesian (id), Lithuanian (lt), Romanian (ro), Slovak (sk) and Albanian (sq) — and Traditional Chinese (zh-Hant): 34 in total, matching the Featurely server. - Locale resolution now honors script subtags like the server: a
Hantscript, or a script-lesszhwith region TW, HK or MO, resolves tozh-Hant(previouslyzh);zh-Hans-*and other regions stayzh, and unsupported scripts are ignored (pt-Latn-BR→pt-BR). - New
Featurely.hasUnreadMessages()—truewhenunreadMessageCount()is above zero, for a simple badge. Never throws;falsebeforeinit, when chat is unavailable, and on any error. Featurely.showChat(context, initialMessage: text)prefills the chat composer (cursor at the end, field focused). It is never sent automatically; blank text is ignored, it is capped to the 4 000-character limit, and it is applied once pershowChatcall.- Chat metadata: new
Featurely.setChatMetadata(map)attaches app-wide context (e.g. plan, app version) to every chat message sent from then on, andFeaturely.showChat(context, metadata: map)adds per-presentation context (it wins on key collisions). The team sees it next to the message in the Inbox and the alert email; it is never shown to the user. The SDK trims and caps it to the server's limits (20 entries, 64-character keys, 500-character values) instead of failing the send, and a retried message keeps its original metadata. The field is omitted when empty; servers that predate chat metadata ignore it.
0.3.0 #
In-App Chat: a private one-to-one thread between the device and your
team, answered from the dashboard Inbox. Needs a Featurely server that
reports chatEnabled in GET /config; older servers keep working with chat
hidden.
- New
Featurely.showChat(context)presents the chat as a standalone sheet. - New
Featurely.unreadMessageCount()returns the number of unread team messages for a host-app badge. It never throws and returns0when chat is unavailable. - The feedback sheet shows a "Message us" action (when the server supports chat) that opens the chat inside the same sheet.
- The chat has optimistic sends with tap-to-retry, "Load earlier" history,
an optional "Get replies by email" row, 5 s polling while the chat is on
screen and the app is in the foreground (paused for 30 s after a
429), and read markers. It also shows the SANDBOX strip and supports RTL. - The thread is tied to the device ID, so
logout()starts a fresh chat. FeaturelyErrorCodegainsinvalidMessageandconversationNotFound.- 16 new
sdk.chat.*strings in all 25 locales.
0.2.3 #
- Releases are now published to pub.flutter-io.cn automatically from CI when a version tag is pushed. No package changes.
0.2.2 #
- The header close and filter buttons are larger: 40pt circles (up from 32pt), with the icon scaling up accordingly — a more comfortable tap target.
0.2.1 #
- The submit form's description hints are now just the question, in all 25 locales: "What should {appName} do?" (Feature) and "What went wrong in {appName}?" (Issue) — the trailing coaching sentences are dropped.
0.2.0 #
Breaking: the environment is no longer derived from the API key prefix.
Each project now has a single key (fk_…, always visible in Project
Settings); the SDK declares the environment on every request via the
X-Featurely-Environment header. Requires a Featurely instance running the
single-key migration or later — and older fk_live_…/fk_test_… keys are
regenerated by that migration, so update the key when upgrading.
-
Featurely.initacceptsenvironment:(FeaturelyEnvironment, now exported). Default: debug builds → Sandbox, release builds → Live. -
The key-prefix assert now only checks for
fk_; the sandbox strip is driven by the resolved environment instead of the key. -
Featurely.initacceptsonError, an observability hook receiving every API operation that ultimately fails;FeaturelyApiException,FeaturelyErrorCode, andFeaturelyNetworkExceptionare now exported. -
Comment composer enforces the server's
commentMaxclient-side, matching the title and description fields. -
Feedback list rows show a one-line description excerpt, and vote boxes announce "N votes" to screen readers.
-
A failed next-page load now renders an inline Retry footer instead of waiting silently for another scroll.
-
The filter sheet's apply button reads "Show 100+ requests" when more results exist beyond the count preview page (new
sdkFilterShowResultsOverflowstring in all 25 locales). -
Screenshot re-encodes (e.g. HEIC) are downscaled to at most 2048 px on the longest edge, so large photos no longer produce PNGs that exceed the instance upload limit.
-
Example app: the dark-mode switch now exercises the
FeaturelyTheme.brightnessoverride.
0.1.0 #
Initial release.
Featurely.init/Featurely.showtwo-call integration.- Feedback list with cursor pagination, pull-to-refresh, filter & sort sheet, and optimistic toggleable voting.
- Submit form: Feature/Issue, title with live counter, description, optional email, one screenshot (photo library; HEIC transcoded to PNG), auto-captured device metadata, full-screen confirmation.
- Detail screen with attachment, large vote button, and the public comment thread (Team badges, optimistic composer).
- Host theming (accent, radius, brightness, font) with fixed status colors;
amber SANDBOX strip for
fk_test_…keys. - Identity linking:
login/logoutwith automatic device-ID rotation and account-switch handling;setPlan. - All 25 Featurely locales, RTL included, resolved independently of the host app's locale.