NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1708 most downloaded on pub.dev
Platform detection and utilities for Flutter apps running on Apple TV (tvOS). Provides runtime checks for tvOS, device info, and capability queries.
Last release 2 months ago
05 Aug 2026
Release timing varies
gaps range from 1 weeks to 6 weeks
Nearly every release is documented
notes for 8 of 8 stable releases
2 versions withdrawn
withdrawn after publishing
5 months old
10 releases · first in 2026
One column per month.
Documentation: the README no longer says this package wires the Siri Remote to Flutter's focus system. The engine does that — an app using only Focus,
Focus,
FocusTraversal, Shortcuts and standard focusable widgets responds to the
remote without depending on flutter_tvos at all. The README now says what the
package is actually for (tuning key synthesis, the analog touch stream, swipe
events) and calls out raw touch forwarding as the one feature that genuinely
requires it.$(WRAPPER_NAME) instead of $(PRODUCT_NAME).app (the latter is wrong
whenever the product name is overridden), and gained a build phase that
code-signs the Flutter.framework embedded through the Swift Package Manager
umbrella — Xcode embeds it but does not sign it, so device installs otherwise
carry nested code signed by a foreign team. These landed in the repository
earlier but had never been published, because the package version was not
bumped at the time.lib/ and tvos/Classes/ are
byte-identical to 1.1.2.Documentation: list Siri Remote support in the README feature summary and bump the install snippet to the current version. No functional or API change
Patch release. No Flutter SDK or engine-artefact change — pinned versions match v1.1.0.
Patch release. No Flutter SDK or engine-artefact change — pinned versions match v1.1.0.
--obfuscate and --split-debug-info are now honoured by
release/profile (AOT) builds. The tvOS AOT step runs gen_snapshot
directly (rather than going through upstream AOTSnapshotter), and
previously dropped these flags entirely — the build succeeded but the
App binary kept readable Dart symbols and the split-debug-info
directory stayed empty. The gen_snapshot invocation now forwards
--obfuscate, the --dwarf-stack-traces / --resolve-dwarf-paths /
--save-debugging-info=<dir>/app.tvos-arm64.symbols trio, and any
--extra-gen-snapshot-options, matching upstream
AOTSnapshotter.build (issue #10).configure handshake racing native plugin
registration at startup. TvRemoteController.init() now retries the
configure call until the native FlutterTvRemotePlugin acknowledges it,
so the touchpad reliably starts forwarding swipe/touch events instead of
intermittently appearing dead when the first push landed before the native
handler was registered. The retry now only swallows the expected
MissingPluginException / PlatformException (any other error — e.g. a
config serialization bug — propagates instead of being silently retried),
and if the handshake is never acknowledged within the retry budget it
surfaces via FlutterError.reportError rather than giving up silently.Minor release — the "porter release". Adds the entire flutter-tvos plugin port command for scaffolding federated *_tvos plugins from existing iOS / ma
Minor release — the "porter release". Adds the entire
flutter-tvos plugin port command for scaffolding federated
*_tvos plugins from existing iOS / macOS plugins, first-class
flutter-tvos create --platforms=tvos, a build-time nudge for
plugins missing tvOS support, and a handful of build-pipeline
fixes. No Flutter SDK or engine-artefact change — pinned versions
match v1.0.1.
flutter-tvos plugin port — new command. Scaffolds a
federated <plugin>_tvos sibling from any existing iOS or macOS
Flutter plugin. The source plugin is never modified. Source
loaders: positional local path, --from-pub <name>, or
--from-git <url> --ref <ref>. The 11 packages published at
fluttertv/plugins /
pub.dev/publishers/fluttertv.dev
were all produced this way. Built in 7 phases — scaffold → copy
native verbatim → Swift transformer → Objective-C transformer →
--include-example → fetch loaders → polish. The transformer:
#if os(iOS) / #elseif os(macOS) and
Objective-C #if TARGET_OS_IOS so tvOS follows the iOS branch
(UIKit / AVFoundation / Flutter embedder shape);@available iOS X, * / #available /
API_AVAILABLE(ios()) to also list tvOS X (Apple ships
those symbols on tvOS at the same OS version);UIPasteboard, AVAudioSession Bluetooth / speaker options,
CoreTelephony, GoogleSignIn SDK, …) and either strips the
import + stubs the enclosing method-channel handler, or wraps
type-level uses behind #if !os(tvOS) (graceful partial port —
package still compiles with the feature disabled);_objc / _ios / _macos siblings) into one CocoaPods module,
dropping the macOS-only target;dart:ffi + package:objective_c + hook/build.dart)
that the tvOS toolchain can't build for as-is, so the user
still gets a working scaffold to hand-finish;lib/ —
_plus-style packages bundle Linux / Windows / Web / macOS /
Android implementations alongside the iOS one; none reachable
at runtime on tvOS, and their transitive imports
(package:web, flutter_web_plugins, win32, package:nm,
…) aren't in the generated pubspec, so shipping them inflates
the package and breaks pana / dart pub publish analysis.
Every transformation is recorded in a PORTING_REPORT.md
written alongside the package.flutter-tvos create --platforms=tvos / --tvos-only —
first-class tvOS-only project scaffold. No more
"create-iOS-then-strip" — the generated project ships a
tvos/ Apple TV target only, with no iOS / Android / web /
desktop platforms to delete by hand.flutter-tvos build/run, each plugin in the app's dep graph
that has a FlutterTV-published <name>_tvos sibling the user
hasn't added is surfaced as a one-line warning, e.g.
audioplayers_tvos is available on pub.dev under the fluttertv.dev verified publisher. Did you forget to add it to pubspec.yaml?.
Keyed on the user-facing aggregator name, so the federated iOS
implementation (audioplayers_darwin) and platform-specific
siblings (audioplayers_android, audioplayers_linux, …) don't
produce duplicate or noisy warnings. Plugins outside the
curated list are silently ignored.doc/port-plugin.md — proper user guide for plugin port,
matching the existing doc/ style: quick start, full flag
reference, what the transformer does and doesn't do, after-
porting workflow, troubleshooting.flutter-tvos build/run now reads the app's version: from
pubspec.yaml and writes the parsed FLUTTER_BUILD_NAME /
FLUTTER_BUILD_NUMBER into Generated.xcconfig (1.2.3+4 →
1.2.3 / 4). Previously they were hardcoded to 1.0.0 / 1
unless explicitly passed via --build-name / --build-number,
which broke package_info_plus and any code reading
CFBundleShortVersionString / CFBundleVersion. Resolution
order now matches iOS via xcode_backend.dart: CLI flag →
project.manifest.buildName / buildNumber → canonical
default.FLTAssetsPath is now baked into the generated Info.plist so
Flutter's plugin asset lookup (Asset / lookupKey(forAsset:))
resolves correctly on a real Apple TV — previously only worked
on the simulator.-allowProvisioningUpdates to xcodebuild
so the first build on a fresh team / device can refresh
provisioning profiles itself instead of failing.path_provider_foundation, package_info_plus) no longer
fails with Target native_assets required define SdkRoot on
first build (issue #3).doc/port-plugin.md. The platform-key paragraph also points
at the published
fluttertv/plugins repo
and the
fluttertv.dev
verified publisher in place of the older "FlutterTV-curated
index being assembled and will be published soon" wording.doc/ index gains "Porting an existing plugin" under "Plugin
development".559ffa3f75e7402d65a8def9c28389a9b2e6fe42).bin/internal/engine.version to v1.0.0-flutter3.44.0.packages/flutter_tvos to 1.0.5.flutter_tvos now ships a
tvos/Package.swift alongside its podspec, so apps using SPM-based plugin
integration link it through the generated FlutterGeneratedPluginSwiftPackage
umbrella. Previously this FFI plugin was CocoaPods-only because its symbols,
resolved at runtime via dart:ffi, had no compile-time caller and the static
linker dropped them. The plugin now declares its exported C symbols under
flutter.plugin.platforms.tvos.ffiSymbols; flutter-tvos reads that list to
emit forced link references in the app's generated registrant, and each export
is annotated __attribute__((used)) / visibility("default") so it reaches
the binary's dynamic symbol table. Requires flutter-tvos 1.3.0 or newer; older
CLIs ignore ffiSymbols and the plugin continues to work via CocoaPods.Updated compatibility with Flutter 3.44.0.
Fixed dart:ffi and dart:io compile errors on Web. flutter_tvos can now be added to a core package shared across tvOS, iOS, Android, and Web targets wi
dart:ffi and dart:io compile errors on Web. flutter_tvos can now
be added to a core package shared across tvOS, iOS, Android, and Web targets
without stub workarounds. All TvOSInfo properties return safe defaults
(false / '' / 0) on Web.Example: call WidgetsFlutterBinding.ensureInitialized() before TvRemoteController.instance.init() so the Flutter binding is ready when the platform ch
WidgetsFlutterBinding.ensureInitialized() before TvRemoteController.instance.init() so the Flutter binding is ready when the platform channel attaches.issue_tracker link so GitHub issues surface on pub.dev.Removed the runTvApp helper from the public API; apps should use normal runApp.
runTvApp helper from the public API; apps should use normal runApp.TvRemoteController.instance.init() now attaches Dart touch handlers explicitly and remains a no-op off tvOS.Patch release updating the pinned Flutter SDK and tvOS engine artifacts to Flutter 3.41.9.
Patch release updating the pinned Flutter SDK and tvOS engine artifacts to Flutter 3.41.9.
bin/internal/flutter.version to Flutter 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694.bin/internal/engine.version to v1.0.0-flutter3.41.9.First public release. Targets Flutter 3.41.4.
First public release. Targets Flutter 3.41.4.
TextField widgets identically to native tvOS text inputs.Ten commands are available in this release:
| Command | Description |
|---|---|
build tvos |
Build an IPA or app bundle for tvOS device or simulator |
run |
Build, install, and launch on a simulator or device with hot reload |
create |
Scaffold a new tvOS app or plugin |
clean |
Delete build artefacts |
devices |
List connected Apple TV devices and running simulators |
doctor |
Check that the toolchain is configured correctly |
attach |
Attach to an already-running Flutter app for debugging |
drive |
Run integration tests via flutter_driver |
test |
Run unit tests |
precache |
Pre-download engine artifacts |
appletvsimulator SDKflutter-tvos devices and flutter-tvos run -d <id>xcrun devicectlappletvos SDK.pbxproj setting → keychain lookupgen_snapshot to produce ahead-of-time compiled binariesflutter-tvos create --template=plugintvos platform entry in their pubspec.yamlflutter_tvos Platform PackageA companion Dart/Swift package providing:
TvOSInfo — device model, OS version, and screen size queries74 unit tests covering command parsing, artifact resolution, build configuration, code signing logic, and device discovery. All tests use Flutter's standard test infrastructure and run without a connected device.
TvRemoteController.init() — Siri Remote wired to
Flutter's keyboard/focus pipeline on tvOS; passthrough on iOS/Android.TvRemoteConfig — runtime-tunable thresholds (swipe, D-pad dead
zone, auto-repeat delays); shipped to native via method channel.TvRemoteController.addRawListener — raw touchpad events for
custom swipe zones (video scrubbers etc.).TvRemoteController.addSwipeListener — receive aggregated
SwipeEvent notifications (direction + magnitude + isFast) without
hand-rolling a SwipeDetector from raw touches. Raw and swipe
listeners fire in parallel for the same gesture.MPRemoteCommandCenter) forwarded to
flutter/keyevent so widgets reacting to
LogicalKeyboardKey.mediaPlay/Pause/Stop/... light up for free.Select → LogicalKeyboardKey.enter (was select). Flutter's
default ActivateIntent binds to enter, so standard buttons and
list items now activate on Select press without any app-level
shortcut registration.
Menu → Navigator.maybePop via flutter/navigation popRoute
(was a dead press(key=menu) method call). Mirrors Android's
physical back-button behavior.
Play/Pause → LogicalKeyboardKey.mediaPlayPause (was a dead
press(key=playPause) method call). Via Android keymap (Flutter's
macOS map has no media entries).
Touches channel no longer spams "message discarded" warnings
when no addRawListener is registered — engine installs a no-op
drain, transparently replaced by Dart handler on attach.
Initial release
Platform detection: isTvOS, isSimulator
Device info: tvOSVersion, deviceModel, machineId
Capability queries: supports4K, supportsHDR, supportsMultiUser
Display info: displayResolution
Result caching with clearCache() support
Your coding agent can read these notes before it upgrades. Set up the MCP server →