ikon_sdk 1.13.0
ikon_sdk: ^1.13.0 copied to clipboard
Official Ikon AI client SDK for native Flutter frontends — connect to an Ikon server and render the server-driven Parallax UI with audio streaming.
Changelog #
1.13.0 #
Internal improvements and maintenance.
1.12.0 #
New Features #
- Deployed Flutter apps can now sign users in with Google, Apple, Microsoft, bank ID or an emailed code, stay signed in across launches, and sign out.
Bug Fixes #
- On Flutter, motion tracking with Background turned off now pauses while the app is in the background.
- Flutter uploads now report failure, with the server's reason, when the server rejects or never confirms a file, and selecting many files at once no longer fails the extra ones.
- Flutter apps keep you signed in through a network drop at launch, fully sign you out, and handle dialogs, scroll-to hints and fast typing more reliably.
- Links in Flutter apps now work: in-app paths navigate within the app, and web, email and phone links open in the phone's browser, mail or dialer.
- Dialogs in Flutter apps now work with VoiceOver and TalkBack, and the page behind an open dialog is no longer read out.
- In Flutter apps, a switch or checkbox's label no longer touches the control.
- Flutter apps now match the web for icon-button accessibility labels, negative margins, wrapping chips, button badges, dropdown borders, chat inputs clearing after send, tap targets of tall text fields, and chat auto-scroll.
- On iOS and Android, the areas behind the status bar and home indicator now continue the app's header and footer colours instead of showing a band of another colour.
- On iOS and Android, the status bar and home-indicator areas now dim with the rest of the screen beside an open drawer or side panel.
- Flutter apps run locally with
ikon app run --flutter-ios/--flutter-androidnow sign in as the logged-in developer, as the web frontend already did. - The Flutter SDK guide's code samples now analyse against the SDK, and its API-key connection sample now works.
1.11.0 #
New Features #
- Guest connect accepts a test link's secret, so a native build can admit testers the same way the web app does.
- New
IkonPageScaffoldwraps the Parallax view so the status-bar and home-indicator areas take the page's own background colour instead of the Material theme's; the colour is also exposed asikonPageBackgroundfor custom shells. - Flutter apps get the built-in feedback button and form by wrapping their view in
IkonPlatformOverlay. - An unmounted
IkonParallaxViewnow shows the app's default screen only.
Bug Fixes #
- The feedback button shows, and the app stays tappable, while the feedback sheet is closed.
1.10.0 #
New Features #
- Flutter apps can now route a tapped notification to the path it carries, via the new
IkonNavigation.navigateToand the newly exported notification-tap stream and push-token hook. - Flutter apps can wire the Android back gesture to server-driven navigation: the SDK now tracks the navigation history and reports each back step to the app the way a browser back does.
Bug Fixes #
- Date, time and colour pickers now render correctly on native Flutter clients, including on light themes where the closed control was previously invisible.
- Native Flutter clients now open the keyboard a field actually needs (numeric, decimal, email, phone, URL, search) from the type or inputMode the server sends, and dropdowns match the height of text fields beside them.
- Single-line text inputs now centre their text vertically at every input height.
- Flutter clients now recover their UI after a reconnect instead of freezing, and no longer boot with unstyled screens when the opening frames race the renderer.
- A hold-to-talk button whose microphone fails to open now returns to idle instead of showing as recording.
- A single failed audio frame no longer silently ends microphone capture or leaves the microphone running after it is stopped.
- A hand-written eight-digit hex colour with an alpha suffix now renders with the right channels instead of a rotated colour.
- Disposing the media manager now releases the microphone recorder instead of leaving it allocated.
- A client that joins or reconnects while several audio streams are active no longer sets up its audio device more than once.
- Calling
connect()again on a Flutter client no longer leaves the previous connection open. - When several motion sensors stream at once with a reduced live rate, every sensor now reaches the app instead of some being dropped.
- A client whose WebRTC session is rejected by the server no longer raises an unhandled error while falling back to the standard media path.
- A video canvas no longer drops out of Picture-in-Picture when the surrounding UI updates.
- Apps now leave Picture-in-Picture when the video it was showing goes away, instead of leaving the window up and refusing to enter Picture-in-Picture for the rest of the session.
- Images captured on Flutter clients now report their real pixel width and height instead of zero, matching the browser SDK.
- Picked videos now stream from disk whatever accept filter selected them, instead of loading into memory for some filters, and HEIF photos upload with the correct image type.
- Recorded activity is no longer held entirely in memory to upload, so a long recording uploads without risking an out-of-memory crash on the device.
- Apps no longer risk creating two separate installation identities when two connections start at once on a fresh install, which could strand a guest user's earlier data.
- Flutter clients now report failure instead of success when the app pushes a theme name the client cannot render.
- Files picked by
std.file-pickernow upload when the matching upload node receives its seed selection id after it is already on screen, instead of being silently dropped. - Flutter frontends build again against the current Lucide icon package; the icon named
circle-euro-signis nowcircle-euro, matching Lucide.
1.9.0 #
New Features #
- Flutter apps can now route a tapped notification to the path it carries, via the new
IkonNavigation.navigateToand the newly exported notification-tap stream and push-token hook. - Flutter apps can wire the Android back gesture to server-driven navigation: the SDK now tracks the navigation history and reports each back step to the app the way a browser back does.
Bug Fixes #
- Date, time and colour pickers now render correctly on native Flutter clients, including on light themes where the closed control was previously invisible.
- Native Flutter clients now open the keyboard a field actually needs (numeric, decimal, email, phone, URL, search) from the type or
inputModethe server sends, and dropdowns match the height of text fields beside them. - Single-line text inputs on Flutter now centre their text vertically at every input height.
- Flutter clients now recover their UI after a reconnect instead of freezing, and no longer boot with unstyled screens when the opening frames race the renderer.
- Calling
connect()again on a Flutter client no longer leaves the previous connection open. - A hand-written eight-digit hex colour with an alpha suffix now renders with the right channels instead of a rotated colour.
- Flutter clients now report failure instead of success when the app pushes a theme name the client cannot render.
- A hold-to-talk button whose microphone fails to open now returns to idle instead of showing as recording.
- A single failed audio frame no longer silently ends microphone capture on Flutter or leaves the microphone running after it is stopped.
- Disposing the Flutter media manager now releases the microphone recorder instead of leaving it allocated.
- A Flutter client that joins or reconnects while several audio streams are active no longer sets up its audio device more than once.
- A Flutter client whose WebRTC session is rejected by the server no longer raises an unhandled error while falling back to the standard media path.
- Flutter apps now leave Picture-in-Picture when the video it was showing goes away, and a video canvas no longer drops out of Picture-in-Picture when the surrounding UI updates.
- When several motion sensors stream at once with a reduced live rate, every sensor now reaches the app instead of some being dropped.
- Images captured on Flutter clients now report their real pixel width and height instead of zero, matching the browser SDK.
- Flutter apps now stream a picked video from disk whatever accept filter selected it, instead of loading it into memory for some filters, and upload HEIF photos with the correct image type.
- Flutter apps no longer hold an entire recorded activity in memory to upload it, so a long recording uploads without risking an out-of-memory crash on the device.
- Flutter apps no longer risk creating two separate installation identities when two connections start at once on a fresh install.
- Flutter apps now upload a file picked by
std.file-pickerwhen the matching upload node receives itsseedSelectionIdafter it is already on screen, instead of silently dropping the file. - Flutter frontends build again against the current Lucide icon package; the icon named
circle-euro-signis nowcircle-euro, matching Lucide.
1.8.0 #
New Features #
- Ikon apps can now run as native Flutter (iOS/Android) clients: SVG images,
var(--token)theme colours, and theme-correct icons render correctly, connections recover after a dropped socket, and uploads stream from the device.
Bug Fixes #
- Microphone buttons now ask for permission as their own step instead of during a push-to-talk hold, which used to cancel the hold and capture nothing. They show an "Enable microphone" affordance until permission is granted, confirm when it is, and surface a blocked microphone instead of silently doing nothing. New
onPermissionChangedcallback,permissionText/permissionDeniedTextwording, and aTheming.MicButton.Statestoken covering every capture state. - Starting microphone capture on a device with no microphone now fails immediately instead of streaming silence (new
hasMicrophoneHardware()helper). - Flutter apps now load images given as root-relative paths (for example
src="/logo.png"), which previously failed and showed their alt text. - A horizontally scrollable row now scrolls on Flutter clients instead of overflowing when it carries no other styling.
1.7.0 #
New Features #
- Notifications can now carry inline action buttons; tapping a button opens the in-app path set for it on both Android and iOS, with the tapped action reported through the new
ikonNotificationTapsstream. - High-priority notifications now arrive as a prominent heads-up (raised Android importance and time-sensitive on iOS), while low-priority ones arrive quietly.
1.6.0 #
Bug Fixes #
- Fixed Flutter apps failing to build for Android ("cannot find symbol FilePickerPlugin") on Android Gradle Plugin 9 templates by upgrading
file_pickerto 12.0.0 and pinningwakelock_plusbelow 1.7.0.
1.5.0 #
Breaking Changes #
IkonClient.connectGuestandIkonAuthenticator.authenticateGuestno longer take anorgIdparameter — it had no effect, since a guest session's organisation comes from its space.
1.4.2 #
Internal improvements and maintenance.
1.4.1 #
Bug Fixes #
- Flutter web builds can now connect: 64-bit protocol fields no longer fail to decode on the web, where Dart has no 64-bit integer type.
- Flutter clients now decode protocol messages containing a dictionary or array nested inside another container, instead of discarding them.
- Flutter clients now report their real theme, locale and timezone, and apply the theme the app selects — a light-themed app no longer renders dark, and in-app theme toggles take effect.
- Flutter clients no longer render unstyled text invisibly on light themes.
- Scrollable panels sized with
overflow-y-autoand a max height now scroll on Flutter clients instead of clipping their content, withoverflow-x-*andoverflow-y-*now honoured per axis. - Flutter clients now render toolbars, menu bars, navigation menus, virtualized lists, OTP and password fields, and drag-and-drop content instead of falling back to placeholders.
1.4.0 #
Bug Fixes #
- Email sign-in can now be completed from the Flutter SDK: send a code with
startEmailLoginand exchange it with the newverifyEmailCode. - Fixed email sign-in requests being sent to an address that did not exist.
1.3.0 #
Internal improvements and maintenance.
1.2.0 #
Internal improvements and maintenance.
1.1.0 #
New Features #
- The Flutter SDK now exposes
IkonLogandIkonLogger, so apps can set a minimum level and route SDK diagnostics anywhere. Protocol messages that fail to decode are now reported instead of being discarded silently in release builds. - Client contexts now carry an explicit
IsAnonymousflag that marks anonymous (guest) users, available to apps viaContext.IsAnonymous.
Bug Fixes #
- A Flutter app calling a server function whose result could not be parsed now receives an error instead of waiting forever.
Breaking Changes #
- Flutter apps can now build and send protocol messages through the generated classes (
toTeleport/toProtocolMessage) instead of writing Teleport fields by hand, and the fullGlobalState— clients, streams, app session id, Ikon server id — is exposed in place of the previous nine-fieldIkonGlobalState. Numeric protocol enums are now int-backed extension types so flag combinations survive a round trip. - The channel layer is gone: a space's app now runs as AppSessions keyed by space and session identity. Removed protocol fields
ChannelId/ChannelName/ChannelLocale;ChannelInstanceId,ChannelUrl, andSessionChannelUrlare nowAppSessionId,SpaceUrl, andSessionUrl. SDK configs no longer take a channel key and asset URIs no longer carry a channel segment.
1.0.5 #
Breaking Changes #
- The old
ActionKind.ShowNotificationUI action has been removed — show notifications withapp.Notificationsinstead.
New Features #
- Flutter apps can now receive and play live WebRTC audio and video — video streams render in the video canvas and audio continues in the background, matching the web client.
- Flutter apps can now capture and send camera/screen over WebRTC and keep live video in a Picture-in-Picture window when backgrounded.
- Flutter apps can now pick and upload files natively — file upload, drop-zone, and file-picker components work on mobile through the same upload pipeline as the web.
- The Flutter SDK can now capture the microphone and stream it to the server (Opus), powering CaptureButton and push-to-talk.
- Flutter native clients now play server-streamed audio (Opus-decoded) through the device speaker.
- The Flutter SDK now automatically recovers dropped connections through a soft → medium → hard reconnect ladder (reuse tickets, refresh tickets, then full re-auth), and no longer flashes a connecting spinner for brief reconnects.
- Flutter clients render styles consistently with the web: styles merge like the CSS cascade, percent/viewport units and responsive breakpoints work, custom app themes reach native clients, and
dark:follows the app theme toggle. - flex-grow utilities (
grow,flex-1,flex-auto) are now carried through to native clients so flex children can fill their row. - Images respect object-fit, children respect align-self, and dashed/dotted borders render correctly.
- Flutter frontends now render the full Lucide icon set, matching the web renderer, instead of a small curated subset.
- Apps can now show notifications via
app.Notifications(browser and Flutter native, with lazy permission).
Bug Fixes #
- Flutter clients no longer corrupt streamed text on mid-string insertions, and all SDK clients now handle property removal and out-of-order UI updates consistently with the server.
- Flutter apps no longer hit an undismissable popover, get invisible text on light themes, or render charts with the wrong orientation/interactivity.
- Flutter apps now render charts, data tables, submit-on-Enter, password fields, floating popovers, and theme-correct chrome that previously broke or rendered with the wrong colors.
- The Flutter SDK now reports its SDK type correctly and subscribes to all server opcode groups during connection, fixing missed messages from the two most recently added groups.
- The Flutter SDK now opens a dedicated WebSocket channel for audio frames, fixing server-streamed audio that previously never arrived.
- An image (or other fill child) inside a centered aspect-ratio container now fits the box instead of overflowing.
- Containers, grids, wraps, selects, carousels, scroll areas, and tab panels no longer crash with infinite-width/unbounded-height layout errors when nested in rows or scrolling contexts.
flex-wrapcontainers now wrap into a grid instead of stacking, and tooltips render their text (shown on hover or long-press) instead of crashing the surrounding layout.- Legacy and shorthand icon names (home, trash, warning, dashboard, …) now resolve to the same glyph as the web renderer instead of rendering blank.
- The inline Calendar renders a native month-grid date selector instead of an empty box.
- Popover and HoverCard content stays hidden until opened instead of always rendering inline.
- Nested Tabs no longer leak their triggers into an outer Tabs' tab bar; each Tabs renders only its own tabs.
- Fixed two renderer crashes — a tri-state checkbox and baseline-aligned rows/columns — that could blank the entire app UI.
1.0.4 #
Internal improvements and maintenance.
1.0.3 #
Internal improvements and maintenance.
1.0.2 #
Internal improvements and maintenance.