NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
A Flutter plugin for building AR applications using ARCore on Android and RealityKit on iOS. Enables pure Dart AR development without native code.
Last release 7 days ago
01 Oct 2026
Release timing varies
gaps range from 9 days to 5 months
Nearly every release is documented
notes for 28 of 28 stable releases
Nothing withdrawn
no release was ever pulled
12 months old
28 releases · first in 2025
One column per month.
iOS: modular AugenFeature architecture with a shared session-configuration pipeline; native handlers for all 150 Dart platform methods (animation, phy
Minor release: every Augen feature is now implemented natively on iOS. Previously the iOS plugin handled only core AR, lighting and occlusion, so apps saw "not supported" for most features.
idle, walk, run, jump, spin, bounce, pulse,
wobble); blend sets, crossfades, blend trees, state machines, layers.PhysicsBodyComponent bodies, forces, impulses, velocities,
world config; joints/constraints and cross-node collisions on iOS 18+.ARReferenceImage targets from assets, files, URLs or
bytes, with ARKit validation; nodes attached to tracked images.ARFaceTrackingConfiguration with landmarks,
expressions and nodes attached to faces.ARWorldMaps (no cloud backend).example/integration_test/ios_features_e2e_test.dart — strict on-device
test of every feature against the real native layer.Map<String, dynamic> before
dispatch. Physics, occlusion, multi-user, lighting and probe events
previously threw a cast error and never reached their streams.Release v1.4.2 — Android camera preview fix
Release v1.4.2 — Android camera preview fix
Patch release: fixes the Android AR camera preview not rendering. The live camera background now displays correctly during AR sessions.
sTexture sampler uniform — previously the background could appear black
because the camera texture was never bound during the draw pass. Thanks
@deandreamatias. See
#12 /
#13.CameraBackgroundRenderer now resolves its
shader attribute/uniform handles once after the program links instead of
querying them on every frame.Release v1.4.1 — Swift Package Manager support (iOS)
Release v1.4.1 — Swift Package Manager support (iOS)
Patch release: the iOS plugin now ships with Swift Package Manager support alongside CocoaPods, and the Android build is compatible with 16 KB memory page sizes (required by Google Play for apps targeting Android 15+).
ios/augen/Package.swift and
relocated the Swift sources to ios/augen/Sources/augen/, so the plugin
resolves as a Swift Package while continuing to work with CocoaPods. The
PrivacyInfo.xcprivacy manifest is now bundled by both build systems. See
#9.2.2.0, Android Gradle Plugin 8.12.1,
Gradle 8.13, Java 17, and ARCore 1.54.0. See
#7.> Minor release: the lighting and occlusion method channels are now fully
Minor release: the lighting and occlusion method channels are now fully implemented on iOS and Android. Calls that previously slipped past the support checks and then threw
MissingPluginExceptionnow return real, platform-truthful data.
getLightingCapabilities(),
setLightingConfig(), addLight(), removeLight(), and updateLight() are
now handled natively. iOS creates real RealityKit DirectionalLight /
PointLight / SpotLight entities; both platforms report a truthful lighting
capability map (maxLights, shadowQuality, light-estimation flags).getOcclusionCapabilities(),
setOcclusionConfig(), setOcclusionEnabled(), and isOcclusionEnabled() are
now handled natively. iOS toggles people-occlusion frame semantics
(personSegmentation, plus personSegmentationWithDepth on LiDAR devices);
Android toggles the ARCore Depth API (Config.DepthMode.AUTOMATIC) on
supported devices. Capabilities are reported from real device queries rather
than hard-coded values.MissingPluginException on getLightingCapabilities and
setOcclusionConfig (and the rest of the lighting/occlusion surface). These
methods previously had no native handler, so once a device reported
isLightingSupported == true / isOcclusionSupported == true, the follow-up
capability and config calls crashed the demo. They now answer truthfully and
degrade gracefully (return empty / no-op) on older OS versions or when no
session is running.#available and a running ARWorldTrackingConfiguration; Android guards
behind ARCore depth-support checks and an initialized session.Note: On Android the renderer does not yet draw added lights or placed nodes (ARCore here renders the camera background and plane detection only). These handlers stop the crashes and report honest capabilities; full scene-graph rendering on Android remains future work.
Release v1.3.0 — iOS environmental-probe capabilities + WebAssembly-r…
Release v1.3.0 — iOS environmental-probe capabilities + WebAssembly-r…
Minor release: environmental-probe capabilities are now implemented on iOS, the web pipeline is WebAssembly-ready, and the example app is verified stable across iOS, Android, and Web.
getEnvironmentalProbesCapabilities() implemented on iOS. The native
handler reports real ARKit/RealityKit environment-texturing capabilities
(supported resolutions, max active probes, automatic/manual placement) instead
of returning MissingPluginException.dart2wasm; the web
build now passes the wasm dry-run cleanly.getEnvironmentalProbesCapabilities() and the environmental-probe
configuration path degrade gracefully (return empty / no-op) when a native
handler is absent, instead of surfacing MissingPluginException in the UI.flutter analyze with no issues and all 611 tests green.Release v1.2.1 — graceful native/disposed handling
Release v1.2.1 — graceful native/disposed handling
Bug-fix release focused on iOS demo crashes reported by early adopters. The plugin now degrades gracefully when a capability is missing on the running platform or when the controller has been disposed.
MissingPluginException on iOS — isEnvironmentalProbesSupported,
isCloudAnchorsSupported, isOcclusionSupported, and the other support
checks no longer crash when the native side has no handler. They now
return false and log a debug-only warning.Bad state: Controller is disposed — setImageTrackingEnabled and
setFaceTrackingEnabled no longer throw when fired during tab switches
or widget rebuilds. They return false and push a user-friendly message
to errorStream instead.AugenARView.swift using real ARKit capability APIs
(ARImageTrackingConfiguration.isSupported,
ARFaceTrackingConfiguration.isSupported,
supportsFrameSemantics(.personSegmentation), etc.) instead of
hard-coded true. Cloud anchors and multi-user honestly report false
because no backend ships with Augen.0.1.0 to 1.2.1, fixed placeholder
author / homepage metadata, and aligned the iOS deployment target.platform :ios, '13.0' so the demo
app builds against the documented minimum iOS version.AugenController.isDisposed — public getter so callers can guard before
invoking mutation methods (which still throw StateError after dispose
by design).setImageTrackingEnabled and setFaceTrackingEnabled now return
Future<bool> instead of Future<void>. Existing await call sites
continue to compile without changes; new code can use the return value
to drive UI state.MissingPluginException, PlatformException,
and UnsupportedError paths for all 7 support checks and both toggle
methods, plus isDisposed getter behavior and dispose idempotency.Release v1.2.0 - Web marker AR, performance & mobile fixes
Release v1.2.0 - Web marker AR, performance & mobile fixes
Augen now runs on three platforms — Android (ARCore), iOS (RealityKit/ARKit), and Web (WebAssembly + getUserMedia). Marker-based AR works in the browser with an image-template detector that matches a PNG/JPG marker against the live camera feed.
package:web + dart:js_interop (no dart:html, dart:js, dart:js_util, or package:js)ARMarkerTarget, ARTrackedMarker, ARMarkerDetectionOptions, Vector2 modelsimagePath field on ARMarkerTarget for PNG/JPG markersARSessionConfig.markerTracking and ARSessionConfig.markerDetectionOptionsAugenController — addMarkerTarget, removeMarkerTarget, setMarkerTrackingEnabled, setMarkerDetectionOptions, addNodeToTrackedMarker, removeNodeFromTrackedMarker, plus markerTargetsStream and trackedMarkersStreamAugenWebPlugin registration with platform-view factory for augen_ar_viewWebCameraService with getUserMedia, soft facingMode hint, automatic fallback to any camera, bounded permission timeout, typed exceptions for NotAllowedError / NotFoundError / OverconstrainedError / SecurityErrorWasmMarkerDetector running on requestAnimationFrame with FPS gate, frame-in-flight guard, visibilitychange listener (pauses when tab is hidden), and errorStreamWebSceneRenderer with pooled Float64List transform buffer and typed JSFloat64Array JS interopWebMarkerAnchorManager skips updates for markers with no attached nodesWebAssetLoader with static Completer race guard, window.AugenWebAR auto-detection, and path-injection validationweb/augen_web_ar.js — multi-scale normalized cross-correlation (NCC) template matching against PNG/JPG markers, with pose estimation from apparent marker size and configured physical widthdart.library.io / dart.library.js_interop)example/web_marker_ar/ runnable with flutter run -d chrome --wasmARMarkerTarget, ARTrackedMarker, ARMarkerDetectionOptions, Vector2, updated ARSessionConfigonPlanesUpdated shape)flutter drive + Chrome (example/web_marker_ar/integration_test/)AugenController now routes through AugenPlatformBackend instead of using MethodChannel directlyAugenView uses conditional imports for platform-specific implementationsinvokeMethod to typed backend methods (failing fast on unsupported platforms instead of MissingPluginException)FlutterMethodNotImplemented instead of silently succeedingaddNode(modelPath:) no longer re-reads the bundleTimer.periodic → requestAnimationFrame (vsync-aligned)List<double>/List<Vector2> in _convertResult, single DateTime.now() per batch instead of per markerFloat64List reused per updateMarkerTransform; JSArray<JSNumber> → JSFloat64Array typed arrayList<ARTrackedMarker> passes directly from web backend to controller, skipping the toMap/fromMap round-tripdeinit releasing ARSession, anchors, planes, channel handler, and Combine subscriptionshitTest GL race: session.update() + frame.hitTest() now run on the GL thread via glSurfaceView.queueEvent, results returned on the UI thread (fixes sporadic SessionPausedException and frame-state corruption)onPlanesDetected, Dart listened for onPlanesUpdated (silently dropped events) — both platforms now agree on onPlanesUpdated{center: {x,y,z}, extent: {x,y,z}, type: "horizontal"|"vertical"}notifyPlanesUpdated and didFailWithError now dispatch to main via DispatchQueue.main.asyncarSession data race: marked @Volatiledispose ordering: anchors detached, planes/nodes cleared, session paused before close — prevents resource leaks on hot-restartdispose clears scene anchors and nils the session delegateARSessionConfig.markerTracking now auto-enables marker tracking on web during initialize() (previously had to call setMarkerTrackingEnabled(true) manually)_processFrame guards against adding to a closed stream controllererrorStream instead of being silently swallowedassets/ prefix, no .., no absolute URLs)isSecureContext check before getUserMedia with clear HTTPS errorweb_camera_permission_denied, web_camera_unavailable, web_camera_overconstrained, web_camera_permission_pending, web_camera_play_timeout, web_camera_fallbackfacingMode: 'environment' fails, retry with {video: true} (fixes desktops with only a front camera)getUserMedia (10s) and video.play() (5s) — never hangs indefinitelygetUserMedia (Safari requires attached element for play() to resolve)pause()/resume() on web also pause/resume the video element_disposed flag on web backend prevents operations after disposalmaxDetectionFps clamped to minimum 1 with assertionloadBridgeScript race condition prevented with static Completerwindow.AugenWebAR is already defined (e.g. via <script> in index.html)videoWidth === 0 and readyState < 2 guard in _processFramedispose() idempotent on controller (safe to call twice)AugenWebPlugin.viewRegistry cleared on backend disposal (no leak)addLight / addEnvironmentalProbe return types aligned with backend interfaceFlutterMethodNotImplemented rather than silently succeeding. Planes, anchors, hit-test, basic nodes, and marker tracking (web) work end-to-end.Gate MeshResource.generateCylinder(height) behind
Gate MeshResource.generateCylinder(height:radius:) behind
#available(iOS 18.0, *) with a box fallback for older
deployment targets.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
MeshResource.generateCylinder(height:radius:) is only available in iOS 18.0+. Gated the call behind an #available(iOS 18.0, *) check with a box fallback for older deployment targets.README — Rewrote from 940 lines to ~200 lines. Removed duplicated code examples, completed roadmap, inline changelogs, and emoji clutter. Focused on i
^0.4.0, now ^1.1.0)1.0.0)🤖 Android AR Camera Not Rendering - Fixed critical issue where the AR camera feed was not displayed on Android devices
GLSurfaceView with OpenGL ES 2.0 renderer for ARCore camera background renderingsession.resume() was never called)Activity context handling — ARCore requires an Activity, not applicationContextAugenPlugin implement ActivityAware to provide the correct contextinitialize method reading config from wrong source (creationParams instead of call.arguments)GLSurfaceView lifecycle management in pause/resume/dispose🎨 Enhanced TabBar - Horizontal scrolling with compact labels and better alignment
🔧 Code Formatting - Applied Dart formatter to all files for consistent code style
🌍 Environmental Probes and Reflections - Complete environmental lighting system for AR
isEnvironmentalProbesSupported() - Check if environmental probes are supportedgetEnvironmentalProbesCapabilities() - Get environmental probe capabilitiesaddEnvironmentalProbe(probe) - Add a new environmental proberemoveEnvironmentalProbe(probeId) - Remove a specific environmental probeupdateEnvironmentalProbe(probe) - Update an existing environmental probegetEnvironmentalProbes() - Get all environmental probesgetEnvironmentalProbe(probeId) - Get a specific environmental probesetEnvironmentalProbeConfig(config) - Set global environmental probe configurationgetEnvironmentalProbeConfig() - Get current environmental probe configurationupdateEnvironmentalProbePosition(probeId, position) - Update probe positionupdateEnvironmentalProbeRotation(probeId, rotation) - Update probe rotationupdateEnvironmentalProbeInfluenceRadius(probeId, radius) - Update influence radiusupdateEnvironmentalProbeQuality(probeId, quality) - Update probe qualitysetEnvironmentalProbeEnabled(probeId, enabled) - Enable/disable probeupdateEnvironmentalProbeCaptureSettings(probeId, settings) - Update capture settingsforceEnvironmentalProbeUpdate(probeId) - Force probe updateclearEnvironmentalProbes() - Clear all environmental probesprobesStream - Stream of environmental probe updatesprobeConfigStream - Stream of environmental probe configuration updatesprobeStatusStream - Stream of environmental probe status updates💡 Real-time Lighting and Shadows - Complete lighting system for AR
isLightingSupported() - Check lighting supportgetLightingCapabilities() - Get device lighting capabilitiesaddLight() - Add new light to sceneremoveLight() - Remove light from sceneupdateLight() - Update existing light propertiesgetLights() - Get all lights in scenegetLight() - Get specific light by IDsetLightingConfig() - Configure global lighting settingsgetLightingConfig() - Get current lighting configurationsetShadowsEnabled() - Enable/disable shadows globallysetShadowQuality() - Set shadow quality levelsetAmbientLighting() - Set global ambient lightingupdateLightPosition() - Update light positionupdateLightRotation() - Update light rotationupdateLightIntensity() - Update light intensityupdateLightColor() - Update light colorsetLightEnabled() - Enable/disable specific lightsetLightCastShadows() - Control shadow casting per lightclearLights() - Remove all lights from scene🔧 Code Formatting - Applied Dart formatter to all files
👥 Multi-User AR Experiences - Complete shared AR system
isMultiUserSupported() - Check multi-user supportcreateMultiUserSession() - Create new shared AR sessionjoinMultiUserSession() - Join existing sessionleaveMultiUserSession() - Leave current sessiongetMultiUserSession() - Get current session infogetMultiUserParticipants() - Get all participantsshareObject() - Share AR object with all participantsunshareObject() - Remove shared objectupdateSharedObject() - Update shared object propertiesgetMultiUserSharedObjects() - Get all shared objectssetParticipantRole() - Change participant rolekickParticipant() - Remove participant from sessionupdateParticipantDisplayName() - Update participant name⚛️ Physics Simulation for AR Objects - Complete physics system
isPhysicsSupported() - Check physics supportinitializePhysics(config) - Initialize physics worldstartPhysics() / stopPhysics() / pausePhysics() / resumePhysics() - Physics controlcreatePhysicsBody() / removePhysicsBody() - Body managementapplyForce() / applyImpulse() - Force applicationsetVelocity() / setAngularVelocity() - Velocity controlcreatePhysicsConstraint() / removePhysicsConstraint() - Constraint managementgetPhysicsBodies() / getPhysicsConstraints() - Data retrievalgetPhysicsWorldConfig() / updatePhysicsWorldConfig() - Configuration management👁️ Occlusion for Realistic Rendering - Complete occlusion system
Fixed Dart formatting issues in core files
dart format to all source filesThe format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
☁️ Cloud Anchors for Persistent AR - Complete cloud anchor system
ARCloudAnchor - Represents cloud anchors with position, rotation, scale, and stateCloudAnchorState - Enum for cloud anchor states (creating, created, resolving, resolved, failed, expired)CloudAnchorStatus - Real-time status updates for cloud anchor operationscreateCloudAnchor(String localAnchorId) - Convert local anchor to cloud anchorresolveCloudAnchor(String cloudAnchorId) - Resolve cloud anchor by IDgetCloudAnchors() - Get all cloud anchors in current sessiongetCloudAnchor(String cloudAnchorId) - Get specific cloud anchor by IDdeleteCloudAnchor(String cloudAnchorId) - Delete cloud anchorisCloudAnchorsSupported() - Check if cloud anchors are supportedsetCloudAnchorConfig() - Configure cloud anchor settingsshareCloudAnchor(String cloudAnchorId) - Share cloud anchor sessionjoinCloudAnchorSession(String sessionId) - Join shared sessionleaveCloudAnchorSession() - Leave current sessioncloudAnchorsStream - Stream of cloud anchor updatescloudAnchorStatusStream - Stream of cloud anchor status updates👤 Face Tracking and Recognition - Complete face tracking system
ARFace - Represents tracked faces with position, rotation, scale, and landmarksFaceLandmark - Represents specific facial feature points (eyes, nose, mouth, etc.)FaceTrackingState - Enum for face tracking states (tracked, notTracked, paused, failed)setFaceTrackingEnabled(bool enabled) - Enable/disable face trackingisFaceTrackingEnabled() - Check if face tracking is enabledgetTrackedFaces() - Get all currently tracked facesaddNodeToTrackedFace(String nodeId, String faceId, ARNode node) - Add content to tracked faceremoveNodeFromTrackedFace(String nodeId, String faceId) - Remove content from tracked facegetFaceLandmarks(String faceId) - Get facial landmarks for a specific facesetFaceTrackingConfig(...) - Configure face tracking parametersfacesStream - Stream of tracked faces with real-time updates🖼️ Image Tracking and Recognition - Complete image tracking system
ARImageTarget - Represents image targets for trackingARTrackedImage - Represents currently tracked imagesImageTargetSize - Physical dimensions of image targetsImageTrackingState - Tracking state enumerationaddImageTarget() - Register image targets for trackingremoveImageTarget() - Remove image targetsgetImageTargets() - Get all registered targetsgetTrackedImages() - Get currently tracked imagessetImageTrackingEnabled() - Enable/disable image trackingisImageTrackingEnabled() - Check tracking statusaddNodeToTrackedImage() - Anchor content to tracked imagesremoveNodeFromTrackedImage() - Remove anchored contentimageTargetsStream - Real-time image target updatestrackedImagesStream - Real-time tracked image updates🚀 Advanced Animation Blending and Transitions - Professional-grade animation system
AnimationBlend and AnimationBlendSet - Complex animation blendingAnimationTransition and CrossfadeTransition - Smooth transitionsAnimationStateMachine and AnimationState - State-based animation workflowAnimationBlendTree and various blend tree nodes - Parameter-driven animationTransitionStatus and StateMachineStatus - Real-time status trackingplayBlendSet(), updateBlendWeights(), blendAnimations()startCrossfadeTransition(), crossfadeToAnimation()startStateMachine(), updateStateMachineParameters()startBlendTree(), updateBlendTreeParameters()playAdditiveAnimation(), setAnimationLayerWeight(), getBoneHierarchy()transitionStatusStream - Monitor transition progressstateMachineStatusStream - Monitor state machine updatesDocumentation.md consolidating all guides (3,500+ lines)AugenController extended with 18 new animation methodsARNode support for complex animation workflowsBuildContext across async gaps in example app (8 fixes)Documentation.mdUpdated README.md dependency version to ^0.3.0
🎬 Model Animation and Skeletal Animation Support
playAnimation() - Play animations with speed and loop mode controlpauseAnimation() - Pause animation playbackstopAnimation() - Stop and reset animationresumeAnimation() - Resume paused animationseekAnimation() - Jump to specific time in animationgetAvailableAnimations() - Query available animationssetAnimationSpeed() - Change playback speed dynamicallyARAnimation model class with full configurationAnimationStatus class for animation state trackingAnimationState, AnimationLoopModeanimationStatusStream for real-time animation updatesANIMATIONS_GUIDE.md - Complete animation documentationARNode now supports animations parameterARNode.fromModel() accepts animations listFormatted all Dart files to match Dart formatter standards
augen_method_channel.dartar_node.dart✨ Custom 3D model loading support
ARNode.fromModel() factory constructoraddModelFromAsset() and addModelFromUrl() helper methodsModelFormat enum (gltf, glb, obj, usdz)CUSTOM_MODELS_GUIDE.md comprehensive documentationARNode now supports modelPath and modelFormat parametersInitial release of Augen AR plugin
For more details about each release, visit the GitHub releases page.
Your coding agent can read these notes before it upgrades. Set up the MCP server →