Feature Matrix

April 13, 2026 · View on GitHub

Last updated: 2026-04-13

This file tracks the public plugin contract and the current platform support level for each capability.

Current public contract

SurfaceContract todayNotes
getCapabilities()Resolves the runtime capability matrix on iOS, Android, and webUse this to branch app behavior by supported feature set.
getPluginVersion()Resolves { version: string } on iOS, Android, and webWeb returns "web" as a platform marker.
reencodeVideo(options)Resolves when the job is accepted by iOS and returns { jobId, status: "queued" } when availableAndroid and web reject with UNIMPLEMENTED.
convertImage(options)Resolves { outputPath, format } on iOS and AndroidWeb rejects with UNIMPLEMENTED.
convertAudio(options)Resolves { outputPath, format } on iOS for m4a outputAndroid and web reject with UNIMPLEMENTED.
progress listenerEmits { jobId, progress, state, message?, outputPath? }fileId is kept as a compatibility alias for jobId.

Failure contract

Use these codes as the shared error vocabulary for JS consumers:

CodeMeaningCurrent producers
UNIMPLEMENTEDThe API is not implemented on the current platformAndroid/web reencodeVideo, Android/web convertAudio, web convertImage
UNAVAILABLEThe API exists but cannot be used in the current environmentReserved for future capabilities
INVALID_ARGUMENTCaller input failed local validationiOS media wrapper validation
PLUGIN_NOT_INITIALIZEDNative core could not be initializediOS native wrapper
TRANSCODE_FAILEDThe media pipeline failed after acceptance or during setupiOS native wrappers and Rust bridge

Platform support

CapabilityiOSAndroidWebTest status
getCapabilitiesCovered by unit or contract tests on all platforms
getPluginVersionCovered by unit or contract tests on all platforms
reencodeVideo acceptance contractUNIMPLEMENTEDUNIMPLEMENTEDCovered for iOS helpers and web/Android unsupported behavior
reencodeVideo media execution⚠️ ExperimentalWrapper contract covered; media regression fixtures still pending
convertImagejpeg/pngwebp/jpeg/pngUNIMPLEMENTEDCovered by iOS native tests, Android unit tests, and Maestro flows
convertAudiom4aUNIMPLEMENTEDUNIMPLEMENTEDCovered by iOS native tests plus web and Android unsupported tests
progress listener contractCovered by iOS helper tests
probeMedia❌ Planned❌ Planned❌ PlannedNot started
generateThumbnail❌ Planned❌ Planned❌ PlannedNot started
extractAudio❌ Planned❌ Planned❌ PlannedNot started
remux❌ Planned❌ Planned❌ PlannedNot started
trim❌ Planned❌ Planned❌ PlannedNot started

Notes

  • iOS is still the reference platform for media work.
  • convertImage() does not depend on the Rust FFmpeg core and remains available even when reencodeVideo() is unavailable in SwiftPM builds.
  • convertAudio() currently relies on AVAssetExportSession on iOS and is limited to m4a output.
  • Android currently implements image conversion without the broader FFmpeg job pipeline.
  • getCapabilities() is the machine-readable source of truth for app-side feature gating.
  • Android and web should reject unsupported media APIs explicitly instead of failing implicitly.
  • Background continuation is not part of the current contract. The plugin currently guarantees queued background execution, not long-running background entitlement handling.