Skip to content

Releases: a3app/loft

loft 1.0.39

Choose a tag to compare

@github-actions github-actions released this 29 Oct 02:59

loft 1.0.39

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.39-macos-arm.dmg loft-1.0.39-macos-intel.dmg
macOS CLI loft-1.0.39-darwin-arm64.tar.gz loft-1.0.39-darwin-amd64.tar.gz
Linux CLI loft-1.0.39-linux-arm64.tar.gz loft-1.0.39-linux-amd64.tar.gz
Node loft-node-1.0.39-linux-arm64.tar.gz · loft-node_1.0.39_arm64.deb loft-node-1.0.39-linux-amd64.tar.gz · loft-node_1.0.39_amd64.deb
Panel loft-panel-1.0.39-linux-arm64.tar.gz · loft-panel_1.0.39_arm64.deb loft-panel-1.0.39-linux-amd64.tar.gz · loft-panel_1.0.39_amd64.deb
Android (sideload, GitHub channel) loft-1.0.39-android.apk · loft-1.0.39-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.39-windows-arm64.zip loft-1.0.39-windows-x86-64.zip · loft-1.0.39-windows-x86.zip
MikroTik container loft-mikrotik-1.0.39-arm64.tar · loft-mikrotik-1.0.39-armv7.tar loft-mikrotik-1.0.39-amd64.tar

Checksums: loft-clients-1.0.39-SHA256SUMS.txt, loft-node-1.0.39-SHA256SUMS.txt, loft-panel-1.0.39-SHA256SUMS.txt, loft-android-1.0.39-SHA256SUMS.txt, loft-windows-1.0.39-SHA256SUMS.txt, loft-mikrotik-1.0.39-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.39.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.39

Protocol stays loft/1.0.

Node:

  • A controller or relay no longer leaks a goroutine on every HTTP/1.1 hub or masked connection. The one-shot listener that hands the connection to the HTTP server never woke its second Accept, so the server parked forever and held the connection; it now returns when the connection closes. The leak grew without bound as WebSocket-front clients reconnected.
  • The config now rejects more than one standby relay with auto_promote set. Two standbys of the same generation would both promote on a controller outage and split-brain, which the fencing rule (newer generation wins) cannot resolve.

1.0.38

Protocol stays loft/1.0.

Android:

  • The launch splash is no longer clipped. On Android 12 and later the system masks the splash icon to a circle; it held the full lockup, so the mark and wordmark ends were cut off. The splash icon is now the mark alone, sized to sit inside the circle.

1.0.37

Protocol stays loft/1.0.

Android:

  • The Settings footer links no longer bunch in the middle: Reset sits at the left, Log in the centre, About at the right, each taking an equal third of the width.

1.0.36

Protocol stays loft/1.0.

Android:

  • On Android 15 and later the app is drawn edge to edge. Some screens put their top row — a title, the Route lists button, the back arrow — under the status bar and the camera cutout, where it could not be tapped. Every screen now keeps its content below the system bars and above the navigation bar and the keyboard.

1.0.35

Protocol stays loft/1.0.

Android:

  • Apps no longer crash while loft is connected with split routing on. Big lists gave the VPN about 7,000 routes, and Android could not deliver a route table that large to apps watching the network. The route table now stays under 1,200 routes: lists that fit are unchanged, larger ones are merged into wider blocks at the edges. Blocked addresses are still checked exactly.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for ...
Read more

loft 1.0.38

Choose a tag to compare

@github-actions github-actions released this 28 Oct 21:25

loft 1.0.38

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.38-macos-arm.dmg loft-1.0.38-macos-intel.dmg
macOS CLI loft-1.0.38-darwin-arm64.tar.gz loft-1.0.38-darwin-amd64.tar.gz
Linux CLI loft-1.0.38-linux-arm64.tar.gz loft-1.0.38-linux-amd64.tar.gz
Node loft-node-1.0.38-linux-arm64.tar.gz · loft-node_1.0.38_arm64.deb loft-node-1.0.38-linux-amd64.tar.gz · loft-node_1.0.38_amd64.deb
Panel loft-panel-1.0.38-linux-arm64.tar.gz · loft-panel_1.0.38_arm64.deb loft-panel-1.0.38-linux-amd64.tar.gz · loft-panel_1.0.38_amd64.deb
Android (sideload, GitHub channel) loft-1.0.38-android.apk · loft-1.0.38-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.38-windows-arm64.zip loft-1.0.38-windows-x86-64.zip · loft-1.0.38-windows-x86.zip
MikroTik container loft-mikrotik-1.0.38-arm64.tar · loft-mikrotik-1.0.38-armv7.tar loft-mikrotik-1.0.38-amd64.tar

Checksums: loft-clients-1.0.38-SHA256SUMS.txt, loft-node-1.0.38-SHA256SUMS.txt, loft-panel-1.0.38-SHA256SUMS.txt, loft-android-1.0.38-SHA256SUMS.txt, loft-windows-1.0.38-SHA256SUMS.txt, loft-mikrotik-1.0.38-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.38.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.38

Protocol stays loft/1.0.

Android:

  • The launch splash is no longer clipped. On Android 12 and later the system masks the splash icon to a circle; it held the full lockup, so the mark and wordmark ends were cut off. The splash icon is now the mark alone, sized to sit inside the circle.

1.0.37

Protocol stays loft/1.0.

Android:

  • The Settings footer links no longer bunch in the middle: Reset sits at the left, Log in the centre, About at the right, each taking an equal third of the width.

1.0.36

Protocol stays loft/1.0.

Android:

  • On Android 15 and later the app is drawn edge to edge. Some screens put their top row — a title, the Route lists button, the back arrow — under the status bar and the camera cutout, where it could not be tapped. Every screen now keeps its content below the system bars and above the navigation bar and the keyboard.

1.0.35

Protocol stays loft/1.0.

Android:

  • Apps no longer crash while loft is connected with split routing on. Big lists gave the VPN about 7,000 routes, and Android could not deliver a route table that large to apps watching the network. The route table now stays under 1,200 routes: lists that fit are unchanged, larger ones are merged into wider blocks at the edges. Blocked addresses are still checked exactly.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail ov...
Read more

loft 1.0.37

Choose a tag to compare

@github-actions github-actions released this 28 Oct 21:03

loft 1.0.37

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.37-macos-arm.dmg loft-1.0.37-macos-intel.dmg
macOS CLI loft-1.0.37-darwin-arm64.tar.gz loft-1.0.37-darwin-amd64.tar.gz
Linux CLI loft-1.0.37-linux-arm64.tar.gz loft-1.0.37-linux-amd64.tar.gz
Node loft-node-1.0.37-linux-arm64.tar.gz · loft-node_1.0.37_arm64.deb loft-node-1.0.37-linux-amd64.tar.gz · loft-node_1.0.37_amd64.deb
Panel loft-panel-1.0.37-linux-arm64.tar.gz · loft-panel_1.0.37_arm64.deb loft-panel-1.0.37-linux-amd64.tar.gz · loft-panel_1.0.37_amd64.deb
Android (sideload, GitHub channel) loft-1.0.37-android.apk · loft-1.0.37-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.37-windows-arm64.zip loft-1.0.37-windows-x86-64.zip · loft-1.0.37-windows-x86.zip
MikroTik container loft-mikrotik-1.0.37-arm64.tar · loft-mikrotik-1.0.37-armv7.tar loft-mikrotik-1.0.37-amd64.tar

Checksums: loft-clients-1.0.37-SHA256SUMS.txt, loft-node-1.0.37-SHA256SUMS.txt, loft-panel-1.0.37-SHA256SUMS.txt, loft-android-1.0.37-SHA256SUMS.txt, loft-windows-1.0.37-SHA256SUMS.txt, loft-mikrotik-1.0.37-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.37.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.37

Protocol stays loft/1.0.

Android:

  • The Settings footer links no longer bunch in the middle: Reset sits at the left, Log in the centre, About at the right, each taking an equal third of the width.

1.0.36

Protocol stays loft/1.0.

Android:

  • On Android 15 and later the app is drawn edge to edge. Some screens put their top row — a title, the Route lists button, the back arrow — under the status bar and the camera cutout, where it could not be tapped. Every screen now keeps its content below the system bars and above the navigation bar and the keyboard.

1.0.35

Protocol stays loft/1.0.

Android:

  • Apps no longer crash while loft is connected with split routing on. Big lists gave the VPN about 7,000 routes, and Android could not deliver a route table that large to apps watching the network. The route table now stays under 1,200 routes: lists that fit are unchanged, larger ones are merged into wider blocks at the edges. Blocked addresses are still checked exactly.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the ...
Read more

loft 1.0.36

Choose a tag to compare

@github-actions github-actions released this 28 Oct 20:40

loft 1.0.36

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.36-macos-arm.dmg loft-1.0.36-macos-intel.dmg
macOS CLI loft-1.0.36-darwin-arm64.tar.gz loft-1.0.36-darwin-amd64.tar.gz
Linux CLI loft-1.0.36-linux-arm64.tar.gz loft-1.0.36-linux-amd64.tar.gz
Node loft-node-1.0.36-linux-arm64.tar.gz · loft-node_1.0.36_arm64.deb loft-node-1.0.36-linux-amd64.tar.gz · loft-node_1.0.36_amd64.deb
Panel loft-panel-1.0.36-linux-arm64.tar.gz · loft-panel_1.0.36_arm64.deb loft-panel-1.0.36-linux-amd64.tar.gz · loft-panel_1.0.36_amd64.deb
Android (sideload, GitHub channel) loft-1.0.36-android.apk · loft-1.0.36-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.36-windows-arm64.zip loft-1.0.36-windows-x86-64.zip · loft-1.0.36-windows-x86.zip
MikroTik container loft-mikrotik-1.0.36-arm64.tar · loft-mikrotik-1.0.36-armv7.tar loft-mikrotik-1.0.36-amd64.tar

Checksums: loft-clients-1.0.36-SHA256SUMS.txt, loft-node-1.0.36-SHA256SUMS.txt, loft-panel-1.0.36-SHA256SUMS.txt, loft-android-1.0.36-SHA256SUMS.txt, loft-windows-1.0.36-SHA256SUMS.txt, loft-mikrotik-1.0.36-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.36.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.36

Protocol stays loft/1.0.

Android:

  • On Android 15 and later the app is drawn edge to edge. Some screens put their top row — a title, the Route lists button, the back arrow — under the status bar and the camera cutout, where it could not be tapped. Every screen now keeps its content below the system bars and above the navigation bar and the keyboard.

1.0.35

Protocol stays loft/1.0.

Android:

  • Apps no longer crash while loft is connected with split routing on. Big lists gave the VPN about 7,000 routes, and Android could not deliver a route table that large to apps watching the network. The route table now stays under 1,200 routes: lists that fit are unchanged, larger ones are merged into wider blocks at the edges. Blocked addresses are still checked exactly.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the new key.

1.0.29

Protocol stays loft/1.0.

Inner data cipher:

  • A direct front may confirm 0 (clear), 1 (ChaCha20-Poly1305), or 2 (AES-256-GCM) after Status. A missing byte is ChaCha. GET stays ChaCha. Node...
Read more

loft 1.0.35

Choose a tag to compare

@github-actions github-actions released this 28 Oct 14:50

loft 1.0.35

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.35-macos-arm.dmg loft-1.0.35-macos-intel.dmg
macOS CLI loft-1.0.35-darwin-arm64.tar.gz loft-1.0.35-darwin-amd64.tar.gz
Linux CLI loft-1.0.35-linux-arm64.tar.gz loft-1.0.35-linux-amd64.tar.gz
Node loft-node-1.0.35-linux-arm64.tar.gz · loft-node_1.0.35_arm64.deb loft-node-1.0.35-linux-amd64.tar.gz · loft-node_1.0.35_amd64.deb
Panel loft-panel-1.0.35-linux-arm64.tar.gz · loft-panel_1.0.35_arm64.deb loft-panel-1.0.35-linux-amd64.tar.gz · loft-panel_1.0.35_amd64.deb
Android (sideload, GitHub channel) loft-1.0.35-android.apk · loft-1.0.35-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.35-windows-arm64.zip loft-1.0.35-windows-x86-64.zip · loft-1.0.35-windows-x86.zip
MikroTik container loft-mikrotik-1.0.35-arm64.tar · loft-mikrotik-1.0.35-armv7.tar loft-mikrotik-1.0.35-amd64.tar

Checksums: loft-clients-1.0.35-SHA256SUMS.txt, loft-node-1.0.35-SHA256SUMS.txt, loft-panel-1.0.35-SHA256SUMS.txt, loft-android-1.0.35-SHA256SUMS.txt, loft-windows-1.0.35-SHA256SUMS.txt, loft-mikrotik-1.0.35-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.35.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.35

Protocol stays loft/1.0.

Android:

  • Apps no longer crash while loft is connected with split routing on. Big lists gave the VPN about 7,000 routes, and Android could not deliver a route table that large to apps watching the network. The route table now stays under 1,200 routes: lists that fit are unchanged, larger ones are merged into wider blocks at the edges. Blocked addresses are still checked exactly.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the new key.

1.0.29

Protocol stays loft/1.0.

Inner data cipher:

  • A direct front may confirm 0 (clear), 1 (ChaCha20-Poly1305), or 2 (AES-256-GCM) after Status. A missing byte is ChaCha. GET stays ChaCha. Node inner lists extra ids. ChaCha cannot be turned off.

Spec:

  • §13 registries for cap bits, mux commands, and status codes, with reserved and experimental ranges.
  • §11 Security Considerations. §12 Privacy.
  • RFC 10024 title is the PQ/T hybrid. Group X25519MLKEM768 is 4588 (0x11EC).
  • Handshake test vectors.

GET / transport:

  • Mux lanes attach on the live session,...
Read more

loft 1.0.34

Choose a tag to compare

@github-actions github-actions released this 28 Oct 14:00

loft 1.0.34

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.34-macos-arm.dmg loft-1.0.34-macos-intel.dmg
macOS CLI loft-1.0.34-darwin-arm64.tar.gz loft-1.0.34-darwin-amd64.tar.gz
Linux CLI loft-1.0.34-linux-arm64.tar.gz loft-1.0.34-linux-amd64.tar.gz
Node loft-node-1.0.34-linux-arm64.tar.gz · loft-node_1.0.34_arm64.deb loft-node-1.0.34-linux-amd64.tar.gz · loft-node_1.0.34_amd64.deb
Panel loft-panel-1.0.34-linux-arm64.tar.gz · loft-panel_1.0.34_arm64.deb loft-panel-1.0.34-linux-amd64.tar.gz · loft-panel_1.0.34_amd64.deb
Android (sideload, GitHub channel) loft-1.0.34-android.apk · loft-1.0.34-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.34-windows-arm64.zip loft-1.0.34-windows-x86-64.zip · loft-1.0.34-windows-x86.zip
MikroTik container loft-mikrotik-1.0.34-arm64.tar · loft-mikrotik-1.0.34-armv7.tar loft-mikrotik-1.0.34-amd64.tar

Checksums: loft-clients-1.0.34-SHA256SUMS.txt, loft-node-1.0.34-SHA256SUMS.txt, loft-panel-1.0.34-SHA256SUMS.txt, loft-android-1.0.34-SHA256SUMS.txt, loft-windows-1.0.34-SHA256SUMS.txt, loft-mikrotik-1.0.34-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.34.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.34

Protocol stays loft/1.0.

Android — smoothness and stability (UI hangs on Xiaomi HyperOS):

  • The VPN session runs on its own thread. The once-a-second poll no longer re-reads the route lists, re-saves the route profiles or rebuilds the notification on the UI thread.
  • Route lists and route profiles moved out of shared preferences into their own files, written atomically in the background. Settings changes no longer rewrite megabytes.
  • Settings changes are merged into one tunnel rebuild. Screens redraw only what changed, at most ten times a second.
  • The TUN reader no longer leaks a thread on every tunnel rebuild, allocates nothing per packet, and checks the block list by binary search.
  • Saved connections are written atomically. A keystore hiccup at start can no longer wipe them.
  • Apps, Lists, Scan, Share QR, TV and the self-updater do disk, network and system work in the background. On TV, D-pad focus no longer jumps every second.
  • Fixed: quick-settings tile on Android 14+, duplicate import after rotation, stop during the handshake, list download racing with edits.
  • Every Android source file is commented for newcomers.

Engine:

  • No more retrying interface lookups that Android 11+ denies once a second.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the new key.

1.0.29

Protocol stays loft/1.0.

Inner data cipher:

  • A direct front may confirm 0 (clear), 1 (ChaCha20-Poly1305), or 2 (AES-256-GCM) after Status. A missing byte is ChaCha. GET stays ChaCha. Node inner lists extra ids. ChaCha cannot be turned off.

Spec:

  • §13 registries for cap bits, mux commands, and status codes, with reserved and experimental ranges.
  • §11 Security Considerations. §12 Privacy.
  • RFC 10024 title is the PQ/T hybrid. Group X25519MLKEM768 is 4588 (0x11EC).
  • Handshake test vectors.

GET / transport:

  • Mux lanes attach on the live session, including after GET moves to another front.
  • A tight edge asks for four HTTP/2 connections and answers before the 5s origin cut. Status carries the edge byte.
  • Socket buffers stay on kernel autotune. The unsent cap is 16 KiB. A full stream parks 8 MiB before Reset.
  • WebSocket dial URLs are sanitized. A hold that already moved does not send Leave.

Share:

  • loft:// authority is the node. Optional edge is the absolu...
Read more

loft 1.0.33

Choose a tag to compare

@github-actions github-actions released this 28 Oct 08:27

loft 1.0.33

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.33-macos-arm.dmg loft-1.0.33-macos-intel.dmg
macOS CLI loft-1.0.33-darwin-arm64.tar.gz loft-1.0.33-darwin-amd64.tar.gz
Linux CLI loft-1.0.33-linux-arm64.tar.gz loft-1.0.33-linux-amd64.tar.gz
Node loft-node-1.0.33-linux-arm64.tar.gz · loft-node_1.0.33_arm64.deb loft-node-1.0.33-linux-amd64.tar.gz · loft-node_1.0.33_amd64.deb
Panel loft-panel-1.0.33-linux-arm64.tar.gz · loft-panel_1.0.33_arm64.deb loft-panel-1.0.33-linux-amd64.tar.gz · loft-panel_1.0.33_amd64.deb
Android (sideload, GitHub channel) loft-1.0.33-android.apk · loft-1.0.33-android-tv.apk same fat APKs
Windows portable (GitHub) loft-1.0.33-windows-arm64.zip loft-1.0.33-windows-x86-64.zip · loft-1.0.33-windows-x86.zip
MikroTik container loft-mikrotik-1.0.33-arm64.tar · loft-mikrotik-1.0.33-armv7.tar loft-mikrotik-1.0.33-amd64.tar

Checksums: loft-clients-1.0.33-SHA256SUMS.txt, loft-node-1.0.33-SHA256SUMS.txt, loft-panel-1.0.33-SHA256SUMS.txt, loft-android-1.0.33-SHA256SUMS.txt, loft-windows-1.0.33-SHA256SUMS.txt, loft-mikrotik-1.0.33-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench. Windows x86-64 and x86 are Win7 SP1+; arm64 is Win10/11 ARM. MikroTik image is also ghcr.io/a3app/loft-mikrotik:1.0.33.

Not in Dist: iOS / Sailfish / Keenetic clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client. x86-64 and x86: Windows 7 SP1 and later. arm64: Windows 10/11 ARM. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
  • MikroTik — RouterOS container. Upload a docker-save tarball, or pull ghcr.io/a3app/loft-mikrotik.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.33

Protocol stays loft/1.0.

Dist:

  • GUI assets: macos-arm / macos-intel DMG, windows-x86-64 / x86 / arm64 zip. CLI and Debian names stay Go/ISA. The updater still accepts the old suffixes.
  • MikroTik container tarballs (amd64, arm64, armv7) and ghcr.io/a3app/loft-mikrotik.

Android:

  • Scan paste is a textarea. The add-connection sheet is two floating cards, as in the mock.
  • Settings, About, and Scan reflow at a large system font.
  • The connections list no longer shows the SOCKS port.

MikroTik / LAN page:

  • SOCKS5 can be off. LAN gateway is nat (default) or route.

Node:

  • Overlay leases survive a restart. Linux TUN is configured over netlink.
  • Ping to a VLAN member's own gateway; member internet ping says when it cannot.

macOS:

  • Georgian UI language.

Panel:

  • HELO name and one-click Roundcube login.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the new key.

1.0.29

Protocol stays loft/1.0.

Inner data cipher:

  • A direct front may confirm 0 (clear), 1 (ChaCha20-Poly1305), or 2 (AES-256-GCM) after Status. A missing byte is ChaCha. GET stays ChaCha. Node inner lists extra ids. ChaCha cannot be turned off.

Spec:

  • §13 registries for cap bits, mux commands, and status codes, with reserved and experimental ranges.
  • §11 Security Considerations. §12 Privacy.
  • RFC 10024 title is the PQ/T hybrid. Group X25519MLKEM768 is 4588 (0x11EC).
  • Handshake test vectors.

GET / transport:

  • Mux lanes attach on the live session, including after GET moves to another front.
  • A tight edge asks for four HTTP/2 connections and answers before the 5s origin cut. Status carries the edge byte.
  • Socket buffers stay on kernel autotune. The unsent cap is 16 KiB. A full stream parks 8 MiB before Reset.
  • WebSocket dial URLs are sanitized. A hold that already moved does not send Leave.

Share:

  • loft:// authority is the node. Optional edge is the absolute URL of the first GET.

Panel / egress:

  • Segments open as tabs, with a per-segment IP. A VLAN has its own L3. VLAN ID is a property.
  • Ping check. Egress checks are ping, TLS, auto, and direct.

macOS / Android:

  • SOCKS leaves the 32-slot copy gate. The app learns mask_pub and does not put the edge host on 0/1.
  • Android splash uses the lockup. TV settings have language chips. loft-tv.app and loft-gtv.app pack beside loft.app.

1.0.28

Protocol stays loft/1.0.

Android:

  • Dist publishes signed GitHub-channel APKs: phone loft-1.0.28-android.apk (app.loft.android) and TV loft-1.0.28-android-tv.apk (app.loft.android.tv). Flavor github has the in-app updater; store compiles it out. Asset names include the version.

GET / fronts:

  • Extra mux fronts attach in the background so overlay STATUS is the GET session.
  • A CDN GET does not attach origin WS/H2/QUIC/H3.
  • Tune404 shares Calm: inflight drops after repeated 404.
  • loft-front -fronts offers Hello mux fronts on a single GET outbound.

macOS:

  • One GET outbound; Hello fronts from -fronts. A CDN host stays GET-only.
  • Per-front enable switches. Share sstp://.

Panel:

  • Internet: Adapters, External channels, Connection priorities.
  • Channel...
Read more

loft 1.0.32

Choose a tag to compare

@github-actions github-actions released this 27 Oct 14:33

loft 1.0.32

English · Русский · 中文

loft is an overlay that runs inside TLS 1.3. Apps talk to local SOCKS5 or TUN. Streams share one mux, sealed with ChaCha20-Poly1305, and ride ordinary HTTPS: GET, WebSocket, HTTP/2, QUIC, or HTTP/3. A CDN or reverse proxy can sit in front of the node. Protocol loft/1.0 (unchanged). Share URI loft://, YAML kind: loft.

Typical use is operator access: a lab LAN from outside, a server fleet, site-to-site.

In this Dist

Apple Silicon / arm64 Intel / amd64
macOS app (10.13+, ad-hoc signed) loft-1.0.32-macos-arm64.dmg loft-1.0.32-macos-x86_64.dmg
macOS CLI loft-1.0.32-darwin-arm64.tar.gz loft-1.0.32-darwin-amd64.tar.gz
Linux CLI loft-1.0.32-linux-arm64.tar.gz loft-1.0.32-linux-amd64.tar.gz
Node loft-node-1.0.32-linux-arm64.tar.gz · loft-node_1.0.32_arm64.deb loft-node-1.0.32-linux-amd64.tar.gz · loft-node_1.0.32_amd64.deb
Panel loft-panel-1.0.32-linux-arm64.tar.gz · loft-panel_1.0.32_arm64.deb loft-panel-1.0.32-linux-amd64.tar.gz · loft-panel_1.0.32_amd64.deb
Android (sideload, GitHub channel) loft-1.0.32-android.apk · loft-1.0.32-android-tv.apk same fat APKs
Windows portable (7 SP1+, GitHub) loft-1.0.32-windows-x64.zip loft-1.0.32-windows-x86.zip

Checksums: loft-clients-1.0.32-SHA256SUMS.txt, loft-node-1.0.32-SHA256SUMS.txt, loft-panel-1.0.32-SHA256SUMS.txt, loft-android-1.0.32-SHA256SUMS.txt, loft-windows-1.0.32-SHA256SUMS.txt.

CLI archives contain loft, loft-front, loft-probe, loft-bench.

Not in Dist: iOS / Sailfish / Keenetic / MikroTik clients (catalog and mocks).

What it does

  • macOS app — menu bar. Named connections, import loft:// or .loft, local SOCKS5 and TUN, split routes, reconnect, failover.
  • Android — phone VpnService and Leanback TV. Named connections, loft:// / .loft import, overlay as one system VPN. GitHub APKs self-update from Dist; Play builds compile the updater out.
  • Windows — tray client, Windows 7 SP1 and later. Unzip and run. The GitHub build replaces its own directory from the next release zip. The Store layout is not in this Dist.
Home Connections
loft Android home loft Android connections

loft on Android TV

  • loft / loft-front — CLI session. Same fronts as the app.
  • loft-node — controller or relay. Debian package or POSIX tarball. Decoy splice, borrowed-cert mask, signed roster and address lists, member keys.
  • loft-panel — web admin on the node: wizard, members, packages, domains, release updates.
  • loft-probe / loft-bench — overlay ICMP/TCP/HTTP checks and GET/WS throughput.

1.0.32

Protocol stays loft/1.0.

Panel:

  • Deleting a mail domain can also delete the DNS records the panel made for it (MX, mail A/AAAA, SPF, DKIM, DMARC); a box in the confirmation, on by default. Hand-made or hand-edited records stay. The mail. certificate goes with the domain.
  • Namecheap: record ids are HostIds, not positions in the zone. Saved ids no longer point at other records after a deletion (leftover ACME challenges, the address-change update). Old saved ids are repaired on the next read of the zone.

Node:

  • Built with Go 1.27+, the node turns on HTTP/2 extended CONNECT itself (re-exec once with GODEBUG=http2xconnect=1), so the h2 and l3 fronts keep working.

Dist:

  • SHA256SUMS of node, panel and CLI list bare file names, so sha256sum -c works in the download folder. CI checks it.

Android:

  • Redacted crash reports as GitHub issues. Chrome reflows at a large system font; launcher mark inside the safe zone; the catalog no longer opens blank.

1.0.31

Protocol stays loft/1.0.

Route profiles:

  • lists_inline is cap bit 30. Mux CmdLists is 13. The node signs the lists blob with a profile header. Kinds 4–6 are metadata (dir, label, dns). An empty-name set is the profile header.
  • Operator copy is read-only (src=op); Make a copy. Share URI loft://routes/. Panel editor on node lists. Android ProfileStore.

Android:

  • Block zone, Local DNS, and Apps around the tunnel.
  • Lists extras: swipe, select, undo, exclusions.

Congestion:

  • Hello asks, Status answers (off, bbr, fixed). QUIC fronts switch via the a3app/quic-go fork. TCP stays on the kernel default. The installer and .deb load tcp_bbr and allow it for user loft.

Windows:

  • Win32 tray client, Windows 7 SP1. GitHub portable zip replaces its own directory. App, .loft, installer, loft-svc and loft-front icons.

Mux / panel / macOS:

  • Data pushed while a stream dies no longer sends on its closed channel.
  • Panel: VLAN isolate, port sort, switch LEDs. MTProto TLS domain defaults to the node name.
  • macOS: leave the other session's default when one utun exits.

P2P / VLESS:

  • Sealed P2P handshake: no LFT preface, data under ChaCha20-Poly1305, replayed or stale hellos refused. Witness reports inside TLS.
  • VLESS ALPN from the share URL. XHTTP auto/stream-one on one h2 ClientConn.

1.0.30

Protocol stays loft/1.0.

VLESS client:

  • XHTTP stream-up is a GET for download and a POST for upload on one HTTP/2 connection. stream-one stays a single POST. packet-up is refused.
  • Vision writes the VLESS header and the empty UUID padding frame in one TLS record. Application data ends padding with command end. Command direct is not sent: Xray would read the TCP under REALITY and the site would see ciphertext. When the server sends direct, the client reads the raw socket.
  • Ordinary TLS uses the fingerprint from the share link. The macOS status line follows xhttp, reality, vision, or tcp, and the route pin is the host after @.

Fleet:

  • Draining or removing a relay closes its trunk. Clients on that relay fail over. A drained relay cannot open a trunk again.
  • Hello carries controller_pin, the controller key the client trusts. The node marks members current or old.
  • Takeover is the signed controller generation after a standby promotion.
  • The panel key roll shows how many connected devices already trust the new key.

1.0.29

Protocol stays loft/1.0.

Inner data cipher:

  • A direct front may confirm 0 (clear), 1 (ChaCha20-Poly1305), or 2 (AES-256-GCM) after Status. A missing byte is ChaCha. GET stays ChaCha. Node inner lists extra ids. ChaCha cannot be turned off.

Spec:

  • §13 registries for cap bits, mux commands, and status codes, with reserved and experimental ranges.
  • §11 Security Considerations. §12 Privacy.
  • RFC 10024 title is the PQ/T hybrid. Group X25519MLKEM768 is 4588 (0x11EC).
  • Handshake test vectors.

GET / transport:

  • Mux lanes attach on the live session, including after GET moves to another front.
  • A tight edge asks for four HTTP/2 connections and answers before the 5s origin cut. Status carries the edge byte.
  • Socket buffers stay on kernel autotune. The unsent cap is 16 KiB. A full stream parks 8 MiB before Reset.
  • WebSocket dial URLs are sanitized. A hold that already moved does not send Leave.

Share:

  • loft:// authority is the node. Optional edge is the absolute URL of the first GET.

Panel / egress:

  • Segments open as tabs, with a per-segment IP. A VLAN has its own L3. VLAN ID is a property.
  • Ping check. Egress checks are ping, TLS, auto, and direct.

macOS / Android:

  • SOCKS leaves the 32-slot copy gate. The app learns mask_pub and does not put the edge host on 0/1.
  • Android splash uses the lockup. TV settings have language chips. loft-tv.app and loft-gtv.app pack beside loft.app.

1.0.28

Protocol stays loft/1.0.

Android:

  • Dist publishes signed GitHub-channel APKs: phone loft-1.0.28-android.apk (app.loft.android) and TV loft-1.0.28-android-tv.apk (app.loft.android.tv). Flavor github has the in-app updater; store compiles it out. Asset names include the version.

GET / fronts:

  • Extra mux fronts attach in the background so overlay STATUS is the GET session.
  • A CDN GET does not attach origin WS/H2/QUIC/H3.
  • Tune404 shares Calm: inflight drops after repeated 404.
  • loft-front -fronts offers Hello mux fronts on a single GET outbound.

macOS:

  • One GET outbound; Hello fronts from -fronts. A CDN host stays GET-only.
  • Per-front enable switches. Share sstp://.

Panel:

  • Internet: Adapters, External channels, Connection priorities.
  • Channel snapshot cache. SSTP save does not wait on the host snapshot. Node reload retries the save.

Node:

  • Origin GET uses the node cdn: profile.
  • egress-status.json is written on load. SSTP starts as connecting.

1.0.27

Protocol stays loft/1.0.

Android:

  • Phone GUI is native Java Views matching the DESIGN mock (Home spark, connections, FAB sheets, split lists).
  • Flavor tv (app.loft.android.tv) is Leanback 10-foot UI. Same AAR and VpnService.
  • make release writes ad-hoc-signed sideload APKs. PLAN.md dropped.
  • Emulator loft.app pins loft, Browser, Apps (launcher drawer), and Settings.

GET / CI:

  • Origin 404 drops the GET sid. A radio gap replaces the GET pool. Pages deploys from Actions.

Panel:

  • Settings pick which parts go into the .loft outbound name: host, member, front (default member+front).

1.0.26

Protocol stays loft/1.0.

Android phone (GET overlay):

  • Overlay DNS on gateway:53 is answered off-TUN so the browser resolves while GET hold is 80ms. AAAA is NODATA until overlay IPv6 exists.
  • PreferGo resolver bypasses overlay/private nameservers on protected sockets.
  • RoutePlan omits ::/0 without overlay IPv6 (gVisor is IPv4-only).
  • instance_id persists across process kill. Path watch uses NOT_VPN. Protect before TUN is skipped. Fatal...
Read more