Frequently asked questions
Evaluation
Do you need a copy of the game package?
Yes. Evaluation requires one runnable, representative package; interface names alone do not establish runtime behavior. We can sign an NDA first, or start with a stripped package that retains logic while removing production art.
What does the current device data cover?
Three games (PixiJS, Phaser, and native Canvas) each run 3 times on a Mate 30 Pro; see the performance page. All 80 shared conformance assertions pass across the Linux reference implementation, Android emulator, and physical device. Raw data is in migo-bench.
What evidence is planned next?
- Entry-level device comparisonIn progressCurrent measurements use a Mate 30 Pro. The same harness will run on an entry-level Redmi A-series device.
- Synchronized device videoIn progressOne uninterrupted recording of the same game on Migo and WebView, overlaid with PSS and CPU.
- Cross-OEM conformanceIn progressAdd one physical-device result for Xiaomi, OPPO, and vivo.
- Interface referenceIn progressPublish a searchable reference entry for each of the 369 interfaces.
- Additional benchmark gamesPlannedExtend the same-device harness beyond the current PixiJS, Phaser, and native Canvas workloads.
Integration
Can a mini-game export run without source changes?
Yes. This is the primary path. With migo-wx-adapter, existing wx.* calls remain unchanged. Cocos, Egret, and Laya mini-game exports load directly; Unity uses its WebGL export converted to a mini-game target. Browser targets use migo-web-adapter. Calls outside the published surface return an error instead of failing silently.
How does the web adapter map browser APIs?
With migo-web-adapter, browser names map to runtime functions as follows:
- document.createElement
document.getElementByIdAbsentAvailableThe adapter creates the minimal element tree required by engine startup code. getElementById("GameCanvas") returns the actual canvas. - document.querySelector
getElementsByTagNameAbsentnull / empty arrayThere is no CSS selector matching or HTML parser. Engines that locate elements through selectors need additional adaptation. - getComputedStyle
CSSStyleDeclarationAbsentStill absentMigo has no layout engine. The game draws its interface into the canvas. - addEventListeneronTouchStart()AvailableThe adapter converts touch, keyboard, and gamepad input into DOM-style events before dispatch.
- new Image()
XMLHttpRequestcreateImage()
request()AvailableExisting engine resource loaders continue to work. CORS, cookies, response streams, Blob, and FormData are not supported. - fetchrequest()Still absentNetworking uses the host channel, keeping domain allowlists and certificate policy under host control. Supply a polyfill when content requires fetch.
- WebSocketconnectSocket()AvailableLong-lived connections also use the host channel, so timeout and reconnection policy remain centralized.
- localStoragesetStorageSync()AvailableThe host manages quotas and cleanup. A missing key returns null.
- sessionStorageAbsentStill absentThe runtime has no browser-session concept. Keep short-lived state in memory.
- new Worker()createWorker()Still absentThe runtime creates worker threads and exposes postMessage / onMessage.
- window.innerWidth
devicePixelRatiogetWindowInfo()Load-time snapshotThe adapter does not subscribe to resize, avoiding conflict with engine layout caches. Read getWindowInfo() again after rotation.
Does the published API surface cover my game?
Interfaces are exposed under migo.*. With wx-adapter, wx.* references the same functions. The following twelve groups do not overlap:
Rewarded video, interstitial, banner, and grid placements with complete object lifecycles
Item purchases and capability detection, implemented by the host app
Login, user information, authorization settings, and privacy-contract entry points
A second JavaScript context and shared canvas for leaderboards
Callbacks for chats, social feeds, share images, and forwarding menus
Native input overlays and composition events without a DOM input element
Smaller initial packages, on-demand delivery, and resource or DNS prefetch
HTTP requests, WebSocket, TCP, and UDP through the host network channel
Touch, mouse, wheel, keyboard, and gamepad events, each with removal APIs
Toast, modal, scanner, customer service, and business views drawn by the host
A complete node graph with oscillators, filters, reverb, analysis, and channel routing
Per-frame callbacks, timers, and explicit target-frame-rate selection
Another 197 cover canvas and images, audio/video capture and streaming, device and system information, files, Bluetooth and Beacon, location, logging and performance reporting, Worker, mini-program navigation, and lifecycle.
11 are stubs (dashed outline): the names are published and calls do not throw, but they perform no operation. The list comes from data/surface.txt and is verified at build time.
AnalyserNodeAudioBufferAudioBufferSourceNodeAudioContextAudioDestinationNodeAudioListenerAudioNodeAudioParamBiquadFilterNodeChannelMergerNodeChannelSplitterNodeConstantSourceNodeDelayNodeDynamicsCompressorNodeFileManagerFloat16ArrayGainNodeIIRFilterNodeImageBitmapInnerAudioContextMediaAudioPlayerOscillatorNodePannerNodePeriodicWaveScriptProcessorNodeTemporalURLWaveShaperNodeWebGL2RenderingContextWebGLRenderingContextaddColorSignaddRecentColorSignalertauthPrivateMessageauthorizecancelAnimationFramecheckIsAddedToMyMiniProgramcheckIsSupportMidasPaymentcheckScenecheckSessioncheckUpdatecheckUserLocationcheckWritePhotosAlbumchooseImagechooseMessageFileclearIntervalclearStorageclearStorageSyncclearTimeoutcloseBLEConnectioncloseBluetoothAdaptercloseSocketcompressImageconfigconnectSocketcreateBLEConnectioncreateBannerAdcreateBufferURLcreateCameracreateCanvascreateCustomAdcreateFeedbackButtoncreateGameBannercreateGameClubButtoncreateGameIconcreateGamePortalcreateGridAdcreateImagecreateImageBitmapcreateImageDatacreateInnerAudioContextcreateInterstitialAdcreateLivePlayercreateLivePushercreateMediaAudioPlayercreatePageManagercreateRewardedVideoAdcreateTCPSocketcreateUDPSocketcreateUserInfoButtoncreateVideocreateVideoDecodercreateWebAudioContextcreateWorkerdecodedefinedownloadFileencodeenverrorexitApplicationexitMiniProgramfetchSecondFloorIconOptionSyncgetAccountInfoSyncgetAppAuthorizeSettinggetAppBaseInfogetAvailableAudioSourcesgetBLEDeviceCharacteristicsgetBLEDeviceRSSIgetBLEDeviceServicesgetBLEMTUgetBatteryInfogetBatteryInfoSyncgetBeaconsgetBluetoothAdapterStategetBluetoothDevicesgetClipboardDatagetConnectedBluetoothDevicesgetDeviceBenchmarkInfogetDeviceInfogetDirectAdStatusSyncgetEnterOptionsSyncgetFileSystemManagergetFriendCloudStoragegetFuzzyLocationgetGameClubDatagetGameLogManagergetGamepadsgetHeapStatisticsgetLaunchOptionsSyncgetLocalIPAddressgetLocationgetLogManagergetMenuButtonBoundingClientRectgetNetworkTypegetOpenDataContextgetPerformancegetPhoneNumbergetPotentialFriendListgetPrivacySettinggetRealtimeLogManagergetRecorderManagergetScreenBrightnessgetSettinggetSharedCanvasgetShowSplashAdStatusgetStoragegetStorageInfogetStorageInfoSyncgetStorageSyncgetSystemInfogetSystemInfoAsyncgetSystemInfoSyncgetSystemSettinggetTextLineHeightgetUpdateManagergetUserCryptoManagergetUserGameLabelgetUserInfogetUserProfilegetWhatsNewSubscriptionsSettinggetWindowInfogetWritePhotosAlbumhideKeyboardhideLoadinghideShareMenuhideToastisBluetoothDevicePairedisColorSignExistSyncloadFontloadSubpackageloginmakeBluetoothPairmodifyFriendInteractiveStoragenavigateBackMiniProgramnavigateToMiniProgramnavigateToScenenotifyBLECharacteristicValueChangeoffAccelerometerChangeoffAddToFavoritesoffAppHideoffAppShowoffAudioInterruptionBeginoffAudioInterruptionEndoffBLECharacteristicValueChangeoffBLEConnectionStateChangeoffBLEMTUChangeoffBeaconServiceChangeoffBeaconUpdateoffBluetoothAdapterStateChangeoffBluetoothDeviceFoundoffCompassChangeoffCompositionEndoffCompositionStartoffCompositionUpdateoffDeviceMotionChangeoffDeviceOrientationChangeoffDirectAdStatusChangeoffErroroffGamepadConnectedoffGamepadDisconnectedoffGyroscopeChangeoffHideoffKeyDownoffKeyUpoffKeyboardCompleteoffKeyboardConfirmoffKeyboardHeightChangeoffKeyboardInputoffMemoryWarningoffMessageoffMouseDownoffMouseMoveoffMouseUpoffNeedPrivacyAuthorizationoffNetworkStatusChangeoffNetworkWeakChangeoffShareAppMessageoffShareMessageToFriendoffShareTimelineoffShowoffSocketCloseoffSocketErroroffSocketMessageoffSocketOpenoffTouchCanceloffTouchEndoffTouchMoveoffTouchStartoffUnhandledRejectionoffUserCaptureScreenoffWheeloffWindowResizeonAccelerometerChangeonAddToFavoritesonAppHideonAppShowonAudioInterruptionBeginonAudioInterruptionEndonBLECharacteristicValueChangeonBLEConnectionStateChangeonBLEMTUChangeonBeaconServiceChangeonBeaconUpdateonBluetoothAdapterStateChangeonBluetoothDeviceFoundonCompassChangeonCompositionEndonCompositionStartonCompositionUpdateonDeviceMotionChangeonDeviceOrientationChangeonDirectAdStatusChangeonErroronGamepadConnectedonGamepadDisconnectedonGyroscopeChangeonHideonKeyDownonKeyUponKeyboardCompleteonKeyboardConfirmonKeyboardHeightChangeonKeyboardInputonMemoryWarningonMessageonMouseDownonMouseMoveonMouseUponNeedPrivacyAuthorizationonNetworkStatusChangeonNetworkWeakChangeonShareAppMessageonShareMessageToFriendonShareTimelineonShowonSocketCloseonSocketErroronSocketMessageonSocketOpenonTouchCancelonTouchEndonTouchMoveonTouchStartonUnhandledRejectiononUserCaptureScreenonWheelonWindowResizeopenAppAuthorizeSettingopenBluetoothAdapteropenBusinessViewopenCustomerServiceConversationopenPageopenPrivacyContractopenSettingopenSystemBluetoothSettingperformancepostMessagepreDownloadSubpackageprefetchAssetsprefetchDnsprefetchImagepreviewImagepreviewMediaqueueMicrotaskreadBLECharacteristicValuereadyremoveStorageremoveStorageSyncremoveUserCloudStoragereportEventreportMonitorreportPerformancereportScenerequestrequestAnimationFramerequestMidasPaymentrequestMidasPaymentGameItemrequestSubscribeMessagerequestSubscribeSystemMessagerequestSubscribeWhatsNewrequirerequirePrivacyAuthorizerestartMiniProgramrestartMiniProgramSyncrevokeBufferURLsaveAppToDesktopsaveFilesaveFileSyncsaveFileToDisksaveImageToPhotosAlbumscanCodesendSocketMessagesetBLEMTUsetClipboardDatasetDeviceOrientationsetEnableDebugsetImmediatesetInnerAudioOptionsetIntervalsetKeepScreenOnsetMessageToFriendQuerysetPreferredFramesPerSecondsetScreenBrightnesssetStoragesetStorageSyncsetTimeoutsetUserCloudStorageshareAppMessageshareMessageToFriendshowActionSheetshowKeyboardshowLoadingshowModalshowShareImageMenushowShareMenushowToaststartAccelerometerstartBeaconDiscoverystartBluetoothDevicesDiscoverystartCompassstartDeviceMotionListeningstartGyroscopestopAccelerometerstopBeaconDiscoverystopBluetoothDevicesDiscoverystopCompassstopDeviceMotionListeningstopGyroscopesubscribeAppMsgtriggerGCupdateAppupdateKeyboardupdateSecondFloorChannelupdateShareMenuuploadFilevibrateLongvibrateShortwriteBLECharacteristicValuePerformance and size
Can the 16 MB engine be delivered on demand?
Yes. Since v0.9.4, nojni.aar provides a 0.40 MB bootstrap package without the engine. The host downloads the engine on first launch through Play Feature Delivery or its own channel, verifies SHA-256, and caches it locally. The engine and native binaries are identical to the embedded AAR build. Failed downloads can be retried without restarting.
What happens at 220,000 sprites?
The Bunnymark sweep scales from 40,000 to 220,000 sprites and averages two runs at each level. Both runtimes reach the knee at 40,000; the difference appears after that point:
| Sprites | System WebView fps | Migo fps |
|---|---|---|
| 40000 | 60 | 60 |
| 70000 | 42.5 | 44.5 |
| 100000 | 31 | 32 |
| 140000 | 23 | 23 |
| 180000 | 16 | 17 |
| 220000 | 13 | 13 |
Both runtimes fall below 55 fps at the same level. Migo is 1 fps faster at 70k, 100k, and 180k. At 220k—well beyond the measured production workloads—both reach 13 fps.
How is cross-platform behavior verified?
The same conformance assertions run against the Linux reference implementation, Android emulator, and Mate 30 Pro. On 2026-08-30, all 80 shared assertions passed against v0.9.6; platform-only assertions are always reported when skipped. The first run found three real defects: an empty getImageData buffer, two sizes accepted in one ctx.font assignment, and an empty readback after the first clear of a new WebGL context. The suite is in migo-conformance.
Releases and platforms
Which platforms are released?
- AndroidReleasedarm64-v8a / x86_64. AAR with Java/Kotlin SDK; minSdk 26.
- LinuxReleasedx86_64 / aarch64. Static and shared libraries, pkg-config, CMake, and Qt 6 / X11 host references.
- WindowsReleasedx86_64 / aarch64. migo.dll, import library, and CMake.
- HarmonyOS NEXTReleasedaarch64 / x86_64. Third-party VMs cannot use JIT; see the next answer.
- iOSReleasedaarch64 device and simulator framework with C ABI.
- macOSReleasedaarch64 / x86_64.
- C ABI clientCandidateConnects a custom render loop directly through C without the Java layer. The interface is not frozen.
Artifacts are published in Releases, each with an .attestation.json.
What are the runtime constraints on HarmonyOS NEXT?
From 5.0.0(12), third-party VMs cannot use JIT, so V8 runs in interpreter mode. Android simulation with --jitless shows that content containing .wasm does not run. CPU-bound pure JavaScript reaches 1/2.4 to 1/16 of JIT frame rate, and the knee moves from 40,000 sprites to 2,000. Lightweight pure JavaScript on a high-end device is unaffected and uses 5–9% less memory. Data is in migo-bench JITLESS.md.
Operations
How does rollback work?
The runtime version is fixed in each app build. Rolling back to the preceding build also restores the preceding runtime. A system WebView version is outside host control and cannot be rolled back this way.
Who controls advertising, payments, and user data?
The host controls all three. The runtime bundles no ad network, holds no identity or merchant credentials, and only issues requests through explicit callbacks. Missing capabilities fail as documented, and the runtime never declares a payment successful. The host callback reference gives the fallback behavior for all 9 groups.
Can the source-available release be used directly in a commercial product?
The source is available under BSL 1.1 and may be modified within its terms. Before production use, read the license text. Commercial licensing is handled through licensing@minigame-labs.com; security reports follow SECURITY.md.