Version history

Pending Release

Breaking changes:

  • api: The enableGzip and enableBrotli APIs were renamed to enableGzipDecompression and enableBrotliDecompression (#25352)

  • ios/android: remove addH2RawDomains method. (:issue: #2590 <2590>)

  • build: building on macOS now requires Xcode 14.1. (#2664)

  • kotlin: always use getaddrinfo DNS resolver. Remove addDNSFallbackNameservers, enableDNSFilterUnroutableFamilies, and enableDNSUseSystemResolver methods from the Kotlin engine builder. (#2618)

  • Envoy Mobile’s release builds compile without admin support by default. (--define=admin_functionality=disabled) (:issue`#2693 <2693>`)

  • swift/kotlin: remove gauge, timer, and distribution methods from the PulseClient.

  • swift/kotlin: add cancel method to GRPCStream` type (#24780).

  • swift/kotlin: Replace close method of GRPCStream with cancel method (#24780 #26683).

  • all: enable HTTP/3 by default in Engine builders.

  • api: remove extendKeepaliveTimeout method from engine builders.

  • java: moved the Java builder to use the C++ builder’s generated bootstrap, rather than doing YAML string manipulation (:issue: #25392 <25392>)

  • api: remove addVirtualClusters APIs.

  • api: move dnsPreresolveHostnames APIs from taking concatenated cluster YAML to taking a list of String hostnames (:issue: #25297 <25297>, :issue: #25259 <25259>, :issue: #25457 <25457>)

  • api: added setRuntimeGuard APIs for all languages (:issue: #25434 <25434>)

  • api: added setRtdsLayer, addAggregatedDiscoveryService, setNodeId, setNodeLocality APIs for all languages

  • api: added setCdsLayer APIs for all languages (:issue: #26122 <26122>)

  • api: removed the enableSkipDNSLookup API. The runtime guard can still be set via setRuntimeGuard.

  • clusters: removing the base_h2 cluster. Requests with x-envoy-mobile-upstream-protocol set to http2 will be sent to the base cluster and use the best available protocol (:issue #25796 <25796>).

  • clusters: only creating the stats cluster if an endpoint is configured. Previously if no domain was configured a cluster would be configured pointed at (:issue: #25816 <25816>).

  • clusters: removing the base_h3 cluster. If HTTP/3 is enabled, the base cluster will use HTTP/3 instead. (:issue: #25814 <25814>).

  • listeners: switched the default listener from Envoy’s TCP listener to a lightweight API listener by default. (:issue: #25899 <25899>).

  • headers: removed the APIs for protocol based routing, as best available protocol is now automatically selected (#25893).

  • build: the minimum supported iOS version is now 13.0 and minimum MacOS version is 10.15 (:issue: #24994 <24994>).


  • android: fix engine startup crash for when admin interface is enabled. (#2520)

  • android: respect system security policy when determining whether clear text requests are allowed. (#2528)

  • android: fix JNI crashes when responses would have empty trailers. (#25516)


  • api: Add support for brotli and gzip request compression. (#25352, #25595)

  • api: Add a constructor which takes a URL to C++ RequestEngineBuilder.

  • api: add option to support platform provided certificates validation interfaces on iOS and Android. (:issue #2144 <2144>)

  • api: Add a setPerTryIdleTimeoutSeconds() method to C++ EngineBuilder.

  • swift/kotlin: add an option to enable DNS cache by calling enableDNSCache(_:) method.

  • kotlin: add a way to tell Envoy Mobile to respect system proxy settings by calling an enableProxying(true) method on the engine builder. (#2416)

  • kotlin: add a enableSkipDNSLookupForProxiedRequests(true) knob for controlling whether Envoy waits on DNS response in the dynamic forward proxy filter for proxied requests. (#2602)

  • api: Add various methods to C++ EngineBuilder to bring it to parity with the Java and Obj-C builders. (#2498)

  • api: Add support for String Accessors to the C++ EngineBuilder. (#2498)

  • api: Add support for Native Filters and Platform Filters to the C++ EngineBuilder. (#2498)

  • api: added upstream protocol to final stream intel. (#2613)

  • api: removed enableHappyEyeballs turning up happy eyeballs by default.

  • build: Add a build feature exclude_certificates to disable inclusion of the Envoy Mobile certificate list, for use when using platform certificate validation.

  • build: Add a build feature envoy_http_datagrams to allow disabling HTTP Datagram support. (#23564)

  • build: Add a build feature envoy_mobile_stats_reporting to allow disabling stats reporting. (26086)

  • swift: Add a new Swift implementation of generating the Envoy bootstrap that replaces the previous Objective-C implementation. This can be enabled by setting useSwiftBootstrap(true) and requires building with --define=envoy_mobile_swift_cxx_interop=enabled. (#26111)

  • android: log cleared JNI exceptions to platform layer as jni_cleared_pending_exception events (#26133).

0.5.0 (September 2, 2022)

Breaking changes:

  • api: replace the drainConnections() method with a broader resetConnectivityState(). (#2225).

  • api: disallow setting ‘host’ header directly (#2275)

  • android: respect Android’s NetworkSecurityPolicy isCleartextTrafficPermitted APIs.

  • net: enable happy eyeballs by default (#2272)

  • iOS: remove support for installing via CocoaPods, which had not worked since 2020 (#2215)

  • iOS: enable usage of NWPathMonitor by default (#2329)

  • iOS: replace enableNetworkPathMonitor with a new setNetworkMonitoringMode API to allow disabling monitoring (#2345)

  • iOS: release artifacts no longer embed bitcode

  • api: engines are no longer a singleton, you may need to update your code to only create engines once and hold on to them. You also cannot assume that an envoy_engine_t value of 1 will return the default engine. Support for using multiple engines concurrently is coming later. (#2129)


  • iOS: change release artifacts to use xcframeworks (#2216)

  • Cronvoy: Cancel the scheduled onSendWindowAvailable callback when a stream is cancelled (#2213)

  • fix bug where writing prevented the read loop from running (#2221)

  • Android: update Kotlin standard libraries to 1.6.21 (#2256)

  • fix bug where finalStreamIntel was not consistently set on cancel (#2285)

  • iOS: fix termination crash in ProvisionalDispatcher (#2059)

  • api: make headers lookup in HeadersBuilder and Headers case-insensitive. Rename allHeaders method to caseSensitiveHeaders. (#2383, #2400 <2400>`)

  • iOS: use correct DNS resolver when using C++ config builder (:issue: #2378 <2378 >)


  • Android, iOS, & C++: add support for registering a platform KV store (:issue: #2134 <2134>, :issue: #2335 <2335>, :issue: #2430 <2430>)

  • api: add option to extend the keepalive timeout when any frame is received on the owning HTTP/2 connection. (#2229)

  • api: add option to control whether Envoy should drain connections after a soft DNS refresh completes. (#2225, #2242)

  • api: add option to disable the gzip decompressor. (:issue: #2321 <2321>) (:issue: #2349 <2349>)

  • api: add option to enable the brotli decompressor. (:issue #2342 <2342>) (:issue: #2349 <2349>)

  • api: add option to enable socket tagging. (:issue #1512 <1521>)

  • configuration: enable h2 ping by default. (:issue: #2270 <2270>)

  • android: enable the filtering of unroutable families by default. (:issues: #2267 <2267>)

  • instrumentation: add timers and warnings to platform-provided callbacks (:issue: #2300 <2300>)

  • iOS: add support for integrating Envoy Mobile via the Swift Package Manager

  • android: create simple persistent SharedPreferencesStore (:issue: #2319 <2319>)

  • iOS: A documentation archive is now included in the GitHub release artifact (:issue: #2335 <2335>)

  • api: improved C++ APIs compatibility with Java / Kotlin / Swift (:issue #2362 <2362>)

  • Android: default to use a getaddrinfo-based system DNS resolver instead of c-ares (:issue: #2419 <2419>)

  • iOS: add KeyValueStore protocol conformance to UserDefaults (:issue: #2452 <2452>)

  • iOS: add experimental option to force all connections to use IPv6. (:issue: #2396 <2396>)

  • android: force the use of IPv6 addresses for all connections. (:issue: #2510 <2510>)

0.4.6 (April 26, 2022)

Breaking changes:

  • iOS: the minimum supported iOS version is now 12.0 (#2084)


  • happy eyeballs: fix missing runtime configuration (#2068)

  • iOS: fix CocoaPods releases (#2175)

  • android: fix Maven releases (#2183)

  • dns: prevent dns refresh if network is unchanged (#2122)

  • happy eyeballs: fix crash on Android (#2132)

  • ios: fix termination crash in ProvisionalDispatcher (#2059)


  • api: added Envoy’s response flags to final stream intel (#2009)

  • size: the size of the dynamic library was reduced by ~46% (#2053)

  • tls: updated the bundled root certificates (#2016)

  • api: expose “received byte count” in the Java API (#2004)

  • bazel: allow configuring Android toolchain versions (#2041)

  • ios: add explicit flow control onSendWindowAvailable to public interface (#2046)

  • api: add option to add a list of H2-Raw domain names (#2088)

  • ios: add support for toggling trust chain verification (#2104)

  • api: add support for configuring minimum DNS refresh rate and per-host max connections (#2123)

  • h3/quic: add experimental option to the Android/JVM EngineBuilder (#2163)

  • android: include debug info in release binary (#2188)

0.4.5 (January 13, 2022)

Based off Envoy v1.21.0


  • Decompressor: decompress even when no-transform is specified (#1995)


  • HTTP: any negotiated ALPN now passed up as x-envoy-upstream-alpn header (:issue: #1965 <1965>)

0.4.4 (December 30, 2021)


  • Explicit Flow Control: fix a reset-after-fin bug with explicit flow control (#1898)

  • HTTP: solve a race condition when resumeData is too early (#1926)

  • HTTP: fix race condition for last resumeData (#1936)

  • HTTP: expand response buffer limit to 1Mb (#1987)

  • JNI: fix support for non-direct byte buffers (#1950)

  • Network: make SrcAddrSocketOptionImpl safely handle null addresses (#1905)

  • Obj-c: fix NSString to envoy_data conversion (#1958)

  • Observability: fix V6 interface binding logging (#1959)


  • Cronvoy: use Explicit Flow Control (#1924)

  • DNS: add ability to use fallback nameservers. Android only (#1953)

  • DNS: add EngineBuilder API to filter unroutable families (#1984)

  • Interface Binding: support interface binding on Android (#1897)

  • Interface Binding: filter alt interfaces for binding by well-known prefixes (#1901)

  • Network: use NWPathMonitor to determine network reachability on iOS (#1874)

  • Networl: add iOS/Android support for enabling Happy Eyeballs (#1971)

  • Observability: instrument first active interfaces when switching socket modes (#1889)

0.4.3 (October 20, 2021)


  • Headers: delete splitting comma-separated header values and add specific logic to the RetryPolicy classes (#1752)

  • Headers: prevent nil header value crashes in obj-c (#1826)


  • Android: conditionally build internal getifaddrs support (#1772)

  • Connection handling: add API to drain connections (#1729)

  • Connection handling: remove alternate clusters (#1756)

  • DNS: use v4_preferred option (#1811)

  • DNS: EngineBuilder API addDnsQueryTimeoutSeconds (#1583)

  • HTTP: advertise h2 alpn string when forcing h2 (#1737)

  • HTTP: integrate callback-based error path (#1592)

  • HTTP: add H2 ping config API (#1770)

  • HTTP: per try idle timeout (#1805)

  • HTTP: Switching to Envoy Mobile HCM (#1716)

  • Interface Binding: allow to be configured in programmatic API (#1832)

  • Interface Binding: support conditionally binding active alt interface (#1834)

  • Interface Binding: implement initial heuristic for binding alternate interface (#1858)

  • Network: introduce singleton configurator (#1816)

  • Observability: emit events based on ENVOY_LOG_EVENT (#1746)

  • Observability: add engine API to dump stats (#1733)

  • Observability: emit envoy event every time envoy bug macro is called (#1771)

  • Observability: add method for enabling admin interface (#1636)

  • Observability: expose StreamIntel on stream callbacks (#1657)

  • Observability: emit events for assertions (#1703)

0.4.2 (July 27, 2021)


  • Filters: Prevent spurious cancellation callbacks from the gRPC error path (#1560)

  • JNI: null terminate strings before passing to NewStringUTF (#1589)


  • Cronvoy: explicit flow control mode (#1513)

  • Debugging: add Scope Trackers for ease of debugging (#1498)

  • DNS: prefetch DNS hostnames (#1535)

  • Exception Handling: convert Envoy Exceptions to crashes (#1505)

  • Stats: expose flushStats on the Engine (#1486)

0.4.1 (May 28, 2021)


  • Fixes platform-bridged filters crash when resumed asynchronously after stream termination.

  • Disables route timeout by default.


  • Connection classes will open minimum of 2 under most circumstances to a given endpoint and distribute requests between them (previously, only 1).

  • Adds Pulse support for stats tags.

  • Enables configuration of stream idle timeout.

  • Introduces a Python interface compatible with the popular Requests library.

  • Adds experimental QUIC integration test.

  • Adds pure JVM support.

0.4.0 (March 23, 2021)

This is a large release. Moving forward the team will aim to release smaller version updates. The following is a very high-level overview of the larger changes going into this release.

Richer Platform-level Feature Set:

  • Adds pluggable logging capabilities via setLogger

  • Adds platform APIs for emitting time-series data

  • Adds platform Filters

  • Adds API for accessing arbitrary strings from platform runtime via addStringAccessor

Additional Language Bindings:

  • Alpha version of python APIs via C++ bindings

  • Alpha version exposing cronet compatible APIs

Continued Bug fixes uncovered by additional testing:

  • Fixes several memory management corner-cases

  • Fixes several issues that have led to production crashes

Additional hardening of the codebase via extensive testing:

  • Adds end-to-end testing that covers roundtrip code execution from the platform layer to the core layer.

  • Adds coverage CI runs for core C++ core

0.3.1 (July 23, 2020)

In the last few months the team has continued to harden Envoy Mobile with production exposure.

Stability and Production Hardening:

  • Improves concurrency management for retries (#774, #811)

  • Adds complete coverage for c++ code (#791, #792)

  • Updates platform interfaces as production experience informs ergonomics (#798, #802, #808)

  • Updates termination signal handling (#835)

  • Updates battery and cpu analysis (#852)

  • Adds bi-directional compression support (#861)

  • Fixes SIGPIPE handling for iOS (#965)

  • Introduces formal style for cross-platform enums (#966)

  • Updates to build to C++17 (#964)


  • Adds emission rule for upstream_rq_active (#775)

  • Adds the ability to observe number of retries that happened on a particular stream (#821, #820, #813)

  • Adds Http::Dispatcher stats (#871)

  • Adds stats for 4xx codes (#902)


Lastly, and perhaps most importantly, we have adopted a formal inclusive language policy (#948) and updated all necessary locations (#944, #945, #946)

0.3.0 (Mar 26, 2020)

This is the first release of Envoy Mobile Lyft is using in a production application! 🎉

Since early November, when the team tagged v0.2.0, we have been hard at work to stabilize the library, and harden it via experiments with Lyft’s Alpha and Beta releases. We have released Lyft’s production binaries with Envoy Mobile for a couple weeks now, and are starting to expose a percentage of our production clients to Envoy Mobile with this release.

Since v0.2.3 we have largely focused on observability:

Additional changes:

  • Fixes trailers missing on iOS (#703)

  • Adds ability to set DNS failure refresh rate (#714)

  • Adds docs on the EnvoyClientBuilder (#745)

0.2.3 (Feb 21, 2020)

This release provides stabilization fixes as follow-up changes to 0.2.2:

  • Fixes race that caused double-deletion of HCM active streams crashing (#669)

  • Fixes DNS resolution when starting Envoy Mobile offline on iOS (#672)

  • Fixes for API listener crashes (#667 and #674)

  • Fixes for linking and assertions (#663)

  • Fixes bad access in ~DnsCache() in Envoy upstream (#690)

  • Fixes bug in Dynamic Forward Proxy Cluster in Envoy Upstream (#678)

  • Adds known issue assertion that prevents crash on force-close (#699)

Additional changes:

  • Allows zero for upstream timeout specification (#659)

  • Adds process logging for Android (#684)

  • Adds the ability to decide upstream protocol for requests (#697)

0.2.2 (Feb 3, 2020)

Envoy Mobile v0.2.2 changes how network requests are performed to no longer use Envoy’s AsyncClient and to instead consume the ApiListener directly (#616).

Additional changes:

  • Domain specification when starting the library is no longer supported (#641, #642). Envoy Mobile now uses the authority specified when starting a new stream

  • Less aggressive retry back-off policies (#652)

0.2.1 (Jan 6, 2020)

This release of Envoy Mobile contains some small improvements:

  • Maven release script for Android builds

  • Streams are now limited to a single “terminal” callback

  • Keepalive settings are now in place to better support connection switching and long-lived streams

  • Properly support IPv6 networks by using updated DNS settings

0.2.0 (Nov 4, 2019)

Envoy Mobile v0.2 is a fundamental shift in how mobile clients use Envoy. Envoy Mobile now provides native Swift/Kotlin APIs that call through to Envoy directly (rather than using Envoy as a proxy), which apps use to create and interact with network streams.

This release includes a variety of new functionality: - HTTP request and streaming support - gRPC streaming support through a built-in codec - Automatic retries using Envoy’s retry policies - Programmatic, typed configuration for launching the Envoy network library

0.1.1 (Sep 11, 2019)

This release is identical to v0.1.0, but packages the license and support for additional architectures.

0.1.0 (Jun 18, 2019)

Initial open source release.