This is the report on the previous version. Current version: Adaptive Connect 4.0

Technical report · 20 October 2026

Colitu Adaptive Connect 3.0

Not only recovering the connection: choosing the right path on the first try, seeing an outage within seconds and making the same decision in all four apps.

As of 20 October 2026, Adaptive Connect 3.0 is available to everyone in the current versions of the Android, Windows and iOS apps. On Linux, fast outage detection and the shared rules are in place; network hints and the recovery set are not yet enabled.

Published
Author
Colitu
References
RFC 8305 · RFC 9000 · RFC 5482
Applies to
Colitu for Android (incl. TV), Windows and iOS; partly on Linux

0Abstract

Adaptive Connect 2.0 taught the apps to notice a path that breaks while connected and to move traffic to a warm spare. Field data showed three weak points: diagnosing an outage took tens of seconds, the app tried blindly on a network it did not know, and because the same logic was written separately on four platforms, the decisions had drifted apart. Adaptive Connect 3.0 addresses these three points: network hints derived from anonymous aggregate data to start with the right connection mode on the first try, a recovery set that finds a working server even when the API cannot be reached, a watcher that diagnoses an outage in about 11 seconds, and a shared set of rules with 46 vectors that all four apps obey. This report describes the architecture of 3.0, its staged rollout and its measurements, and keeps apart the parts that are still alpha or only planned.

1Why 3.0?

In the first week after 2.0 was released we collected data from two sources: laboratory runs with injected faults, and the anonymous connection telemetry the apps send (its structure is in the privacy section). In the laboratory baseline measurement of 2.0 against 29 servers, 85.2 % of probes succeeded; the problems were concentrated in particular fault types (laboratory report).

FindingSourceResult
Slow outage diagnosisField telemetryAverage time between detection and recovery: 54 s on Android, 34 s on Windows
Long connection tail on WindowsField telemetry + test computerSuccessful first-attempt connections averaged 14.9 s; root cause: while the kill switch is held, the API addresses existed only in memory
The warm spare sometimes never took overLaboratoryBecause background traffic exceeded a threshold, the switch to the warm spare was postponed indefinitely
Blind start on a new networkField telemetryOn a network with no memory, the app tried the modes in a fixed order
Platforms had drifted apartCode reviewThe same rule had been written separately in four languages; Windows and Linux differed in ranking and in hint parsing

So the goal of 3.0 is not a new protocol but decision quality: fewer attempts, a shorter blind period, the same decision on every platform. No additional data is collected from the user, and a manually chosen location is never changed.

2Architecture: seven components

3.0 was designed from the start as a framework of seven components. They are not all at the same maturity; the table below states the current status of each one plainly.

ComponentWhat it doesStatus
Collective network hintsDerives from anonymous aggregate data which connection mode works on a networkLive
Predictive startOn a network it does not know, the app starts with the mode named in the hint; it relies on rules, there is no machine learningLive
Autonomous recoveryConnects with a recovery set stored on the device and with saved addresses, even when the API cannot be reachedLive
Fast outage detectionDiagnoses an outage while connected in ~11 s and decides when to leave the serverLive
Network laboratoryFault-injection packages and test vectors shared across platformsLive (internal tool)
Continuity engine (CSL)A session layer that keeps the session alive even when the tunnel changes; several carrier lanesAlpha (Windows, test accounts)
Adaptive camouflageChoosing traffic shape and transport settings according to the networkPlanned

Network hints v2

The apps anonymously report the outcome of each connection attempt (mode, success or failure, duration). The panel turns these into daily totals per network, that is, at the level of country + autonomous system (ASN). If a network has enough data, the server list is returned together with a `preferred` order: the modes that worked on that network in the last 24 hours, highest success rate first. When the network changes, the app fetches the list again and uses the new network's hint.

In the measurement on 16 October, 89 distinct networks were seen in the last seven days; 44 of them had enough data to decide, and a preference order was produced for 40. On some networks the success rate of the UDP-based Hysteria2 was 92 % while the TCP modes were in the range 44–54 %; a fixed order wasted time on every connection on those networks.

Recovery set

In 2.0, if the server list could not be fetched from the API, the app had nowhere to connect. In 3.0, while the API is responding, the app downloads a small recovery set about once a day and stores it on the device: full profiles for a few servers in different countries, valid for much longer than a normal configuration. First the servers this device has reached in recent days are chosen, then one server from each country; so even if access to the servers in one country is cut, the others remain. The set is used only when none of the API addresses respond and the normal cache cannot connect either; once connected, the app reaches the API from inside the tunnel and refreshes everything.

In addition, the Windows and Linux apps now store the API addresses on disk and refresh them in parallel. When the kill switch was held over from the previous run (automatic connection after a crash or a restart), system DNS was closed, so 2.0 tried to resolve the addresses one after another, and it took 21–25 seconds from startup to connection.

Fast outage detection

The watcher probes the main path once a second with a three-second timeout. A single loss is not yet a decision; once consecutive losses are confirmed, an outage decision is made within about 11 seconds. What happens after the decision depends on the scope of the outage:

SituationDecision
Only the main path went down, the warm spare worksTraffic stays on the warm spare; the other modes on the same server are tried first
The main path and the warm spare went down together, the device is onlineIn automatic mode the server is put in the background for this network for 30 minutes and the next server is tried
The device's own internet went awayNo mode or server is blamed; the app reconnects when the network returns
Manually chosen locationThe server is not changed; the app switches only between modes at the same location

A bug in 2.0 was also closed: when there was constant small background traffic, the switch to the warm spare was postponed indefinitely on the grounds that the connection was "busy". In 3.0 the postponement is limited to at most two minutes or 32 KB.

Instant device identity

Every device has its own identity on every server. In 2.0 a new identity reached the server only at the regular 15-second sync, so a new user's first connection could fail for 15–30 seconds. Now an identity change is passed to the servers immediately; the configuration request waits briefly, and if the identity is still not ready the app knows this and retries at two-second intervals.

3Shared decision rules and the Go engine

The rules of Adaptive Connect live in four apps in four different languages: Kotlin (Android), C# (Windows and Linux), Dart and Swift (iOS). With 3.0 these rules are tied to a single source: shared test vectors. Each vector contains an input (servers, measurements, memory, hints) and the expected decision; the test suites of the four apps run the same files.

Vector fileScope
rankingServer ranking in automatic mode: last working, ping, penalties, own-country rule (19 cases)
transportBase order of connection modes, hint-driven start, ignored flags
hintsParsing of the hint response
recoveryRecovery decision, refresh time, reading the set, next server

There are 46 cases in total across the four files. If a rule changes in one app and one of the vectors gives a different result, that app's test suite fails.

The first run of the vectors found real differences: Windows and Linux applied the rule of pushing back one's own country to every country; in these two apps a hint value that was not a number could break the reading of the whole server list; Linux ordered TCP modes by latency alone. All of them were merged into a single set of rules.

The same rules were also implemented in an open-source Go package, and it passes the same 46 vectors. The engine is built into the Android, Windows and Linux apps in shadow mode: while connecting, the app's own decision is compared with the engine's decision and any difference is logged, but the decision is the app's. If the engine returns an error it is disabled for ten minutes. When the differences in shadow mode drop to zero, the decision will be handed to the engine; the engine is not yet built into iOS.

4Staged rollout

The app side of 3.0 was added to the releases in such a way that the rollout decision can be made remotely: Android 2.9.2, Windows 2.9.7, Linux 1.5.3 and the iOS 5.9 series. The panel returns the `features.adaptive_connect_3` flag in the server list response. Which device falls into the rollout group is determined by a stable bucket derived from the SHA-256 digest of the device identity; the same device stays in the same group as long as the percentage does not change. The app stores the last flag and uses it for as long as it cannot reach the API.

DateSharePlatforms
16 October 202610 %Android, Windows, iOS
17 October 202615 %Android, Windows, iOS
20 October 2026100 %Android, Windows, iOS

The parts enabled remotely are the hint-driven start and the recovery set. Fast outage detection, the rule for leaving a server, the saved API addresses and the shared rules came to every user with the release. Linux was deliberately left out of the remote rollout: the number of users is too small to compare, and release 1.5.3 had a rise in connection errors unrelated to 3.0. Rollback is done with a single setting and needs no app update.

5Measurements

Measurement2.03.0How it was measured
Diagnosing an outage54 s (Android), 34 s (Windows), field average~11 sWatcher cadence; unit tests and the test computer
Total outage when traffic to the server is cut for 45 s50 s22.4 sWindows test computer, with a firewall rule on the device
From startup to connection while the kill switch is held21–25 s5.1–5.2 sWindows test computer, repeated restarts
First connection on a network with no memoryFixed mode order1.6 s (with the mode from the hint)Android test device
Connecting while the API cannot be reachedNowhere to connectConnected 12 s after the tapAndroid test device, API blocked, cache ignored

In the field, in the days after 16 October, connection success on Android was measured in the range 98.3–98.6 % (in earlier weeks it varied from day to day between 80 % and 98 %); on Windows 2.9.8 it was 97.4 %. We do not attribute this difference to 3.0 alone: because the telemetry is anonymous by design, devices in the 3.0 group cannot be separated from the others, and other fixes were released in the same versions. During the rollout no complaint or drop in success attributable to 3.0 was seen; the rollout decisions were based on this criterion.

6Privacy

The learning parts of 3.0 require no new user data. Connection telemetry is anonymous by design: events are written only as daily totals, to two separate tables that have no common row.

  • Network table: country + ASN (from the signed network token), mode, result counts. No server.
  • Server table: server × client country, result counts. No ASN.
  • No table contains an account, a device identity or an IP address; the two tables cannot be joined to reach a single user.
  • The memory of the last working server, stall marks and penalties is kept on the device and is not shared with the panel.
  • The rollout bucket is computed from a one-way digest of the device identity; which device is in which group is not stored.

Details are in the security report and the privacy policy.

7Continuity engine: CSL alpha

The Colitu Session Layer (CSL) is the session layer mentioned as future work in the 2.0 report. Its purpose is that open connections do not break even when the tunnel underneath changes: the session runs over several carrier lanes, and if one lane dies the session continues on another. The source code is open under the Apache-2.0 licence: github.com/colitu/csl.

CSL is in the alpha stage today: it is available only to test accounts and a separate test server, through the "Seamless session (alpha)" option in Advanced mode of the Windows app. A separate session identity is generated for each device; the server side listens only locally. When CSL is off or fails, the app falls back to the normal connection. We are not giving a date for general availability.

8Limitations

  • Rules, not a model. "Predictive" start means rules derived from anonymous aggregates, not a statistical model. Networks with little data have no hint, and 2.0 behaviour applies.
  • Scope of the measurements. The laboratory results were obtained with a single test computer and a single test phone, with faults produced on the device; no fault tests were run on servers that have real users. They cannot be generalised to every network.
  • The Go engine is in shadow mode. The decision is still in each app's own code; there is no engine on iOS.
  • On Linux network hints and the recovery set are not yet enabled.
  • Open TCP flows can break on a path change until CSL is generally available; browsers and apps usually reconnect by themselves.

9Next steps

  • Handing the decisions to the Go engine once the shadow-mode differences are closed; adding the engine to iOS.
  • Moving CSL to beta: Android, UDP datagram support, and a "call mode" that sends critical traffic over two lanes at once for voice and video calls.
  • Adaptive camouflage: choosing among the existing transport settings for each network.
  • Bringing Linux into the rollout after further verification.

These items are a roadmap, not a promise of dates or results. This report will be updated as each of them goes live.

10Conclusion

2.0 established the principle "notice the path that breaks and recover". 3.0 extends it in three directions: fewer blind attempts through anonymous network hints, connecting independently of the API through the recovery set and saved addresses, and outages diagnosed in about 11 seconds. The shared test vectors ensure that the four apps make the same decision in the same situation. The continuity and camouflage side is still at the beginning of the road; we will report on it with measured results. The design of the previous version and a one-hour fault test are in the Adaptive Connect 2.0 report.

·References

  1. RFC 8305, Happy Eyeballs Version 2: Better Connectivity Using Concurrency.
  2. RFC 9000, QUIC: A UDP-Based Multiplexed and Secure Transport.
  3. RFC 5482, TCP User Timeout Option.
  4. Colitu Adaptive Connect 2.0 technical report, 10 October 2026.
  5. Colitu Lab, Adaptive Connect fault regression test (faultlab).
  6. Colitu Session Layer (CSL) source code, github.com/colitu/csl.