Repository navigation
loft 1.0.32
loft 1.0.32
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
VpnServiceand Leanback TV. Named connections,loft:///.loftimport, 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 / 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 -cworks 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 URIloft://routes/. Panel editor on node lists. AndroidProfileStore.
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.debloadtcp_bbrand 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-upis a GET for download and a POST for upload on one HTTP/2 connection.stream-onestays a single POST.packet-upis 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, ortcp, 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
innerlists 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. Optionaledgeis 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_puband does not put the edge host on 0/1. - Android splash uses the lockup. TV settings have language chips.
loft-tv.appandloft-gtv.apppack besideloft.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 TVloft-1.0.28-android-tv.apk(app.loft.android.tv). Flavorgithubhas the in-app updater;storecompiles 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
-frontsoffers 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.jsonis 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 releasewrites ad-hoc-signed sideload APKs. PLAN.md dropped.- Emulator
loft.apppins 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
.loftoutbound 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
::/0without overlay IPv6 (gVisor is IPv4-only). instance_idpersists across process kill. Path watch uses NOT_VPN. Protect before TUN is skipped. Fatal auth is not retried.- systemExempted foreground service; emulator
loft.app.
Front / macOS:
- Overlay sockets pin to the physical uplink.
auth_bad_keysurfaces on the Home pill. - Through-loft no longer blackholes the default when tun-up misses.
Identity / panel:
- Old member tokens stay until network apply.
- Member and node edits apply without a Save button.
1.0.25
Protocol stays loft/1.0.
macOS:
- loft-front loads on 10.13. Go 1.22+ bound
SecTrustCopyCertificateChain(macOS 12); dyld aborted beforemain. A stdlib overlay usesSecTrustEvaluateso those 12.0 Security symbols are not in the binary. - Through-loft routes stay on utun when 0/1 owns default.
Fronts:
- Opt-in front
l3: HTTP/2 CONNECT carrying corked AEAD IP datagrams. Not in FrontOrder. GET stays the default. - A GET-only node no longer starts a UDP listen.
Panel:
- Overview, My account, zone page, search, help, and the system log are live.
- Connection priorities: multipath lists, per-channel speed limits, link checks.
- Node fronts list
l3.
1.0.24
Protocol stays loft/1.0.
Panel:
- Keep member keys is opt-in. The panel can store a copy of the issued secret so the operator can show the link, QR, or
.loftagain without reissuing. Default off. Turning it off wipes the panel copy;members.keyson the node stays. - Wizard step Domain and DNS: Cloudflare, DigitalOcean, Namecheap, or manual. Creates the provider, zone, A/AAAA, and CAA before names are saved.
- Domains page is live: zones, records, HTTP-01 and DNS-01.
1.0.23
Protocol stays loft/1.0. Auth is DH 0x02 only.
- Omitted
frontsis GET only. Empty GET path is/static/v3/build(DefaultGETPath). An explicit/static/jsis left as written. - GET rebinds after an egress change without Park.
- Mux ingest never blocks on one hog stream: datagrams drop, parked Data then RST.
- TUN keeps reading utun when mux or TUN write is congested.
- HMAC-only 0x02 and 0x03 tickets from 1.0.16 are gone. A 1.0.16 client cannot join.
- HTTP/2 and HTTP/3 CONNECT require Match on the tunnel path.
macOS:
-pathis GET only. A leftover GET cover is not sent as h2 CONNECT.- Boot reaps bundled
loft-frontvia libproc (nopspipe stall). --probewalks every saved profile and fails closed on an empty overlay.- GitHub
/releases/latest404 is “current”, not “no network”.
1.0.22
- Origin CONNECT is no longer an open TCP proxy. Cap
connectis off unlessfrontslistsconnect. - Hold resume parks the mux by the authenticated member plus
instance_id. rate_bpsis a per-session token bucket on bulk Data/Dgram. Node reloadsnetwork.confandmembers.keyson SIGHUP.- macOS split ignore entries; loft-priv asks for the admin password once.
- Panel first Dist packages: wizard, members, mail, MTProto (
mtg).
Русский
Оверлей внутри TLS 1.3. Приложения ходят в локальные SOCKS5 или TUN. Потоки в одном mux, ChaCha20-Poly1305, снаружи обычный HTTPS: GET, WebSocket, HTTP/2, QUIC или HTTP/3. Перед нодой может стоять CDN. Протокол loft/1.0. Ссылка loft://.
В Dist: приложение macOS (DMG arm64 и x86_64), CLI Linux/macOS (loft, loft-front, loft-probe, loft-bench), нода (tar.gz и .deb amd64/arm64), панель (tar.gz и .deb), Android sideload APK (телефон и TV), Windows portable (loft-1.0.32-windows-x64.zip и loft-1.0.32-windows-x86.zip). Сборка GitHub заменяет свой каталог из zip следующего релиза. iOS, Sailfish, Keenetic, MikroTik в этот Dist не входят.
1.0.32: панель — при удалении почтового домена можно удалить и его DNS-записи, созданные панелью (галочка, включена по умолчанию), сертификат mail.<домен> уходит вместе с доменом; Namecheap — id записей теперь HostId, а не позиция, старые id чинятся при чтении зоны; нода на Go 1.27+ сама включает расширенный CONNECT HTTP/2 (фронты h2 и l3); SHA256SUMS с голыми именами файлов; Android — отчёты о сбоях в GitHub, крупный системный шрифт, значок в безопасной зоне. Протокол loft/1.0.
1.0.31: профили маршрутов — cap 30 lists_inline, CmdLists 13, kinds 4–6, копия оператора, loft://routes; Android — зона Block, локальный DNS, приложения вокруг туннеля, свайп/выбор/отмена; QUIC — BBR или фиксированная скорость через форк a3app/quic-go, TCP остаётся на ядре; Windows — трей Win7 SP1; mux больше не пишет в закрытый канал; панель — изоляция VLAN, сортировка портов, светодиоды; P2P — запечатанное рукопожатие, witness внутри TLS. Протокол loft/1.0.
1.0.30: VLESS — XHTTP stream-up, кадр Vision с UUID в одной TLS-записи с заголовком, на application data command end, а не direct; macOS подписывает сессию xhttp, reality, vision или tcp. Слив или удаление релея закрывает его транк. Hello несёт controller_pin. Takeover — подписанное поколение контроллера после повышения standby. Панель при смене ключа показывает, сколько уже подключённых устройств ему доверяет. Протокол loft/1.0.
1.0.29: прямой фронт может подтвердить clear или AES-256-GCM после Status, GET остаётся ChaCha20-Poly1305; реестры номеров, вопросы безопасности и конфиденциальность; буферы сокета на autotune, unsent 16 КиБ, park потока 8 МиБ; линии mux на живой сессии; tight — четыре HTTP/2; в loft:// authority — нода, edge — URL первого GET; панель — сегменты вкладками, у VLAN свой L3, проверка ping. Протокол loft/1.0.
1.0.28: Dist публикует подписанные GitHub APK, имена файлов с версией; GET вешает лишние фронты в фоне и не цепляет их на CDN; macOS — один GET outbound и sstp://; панель — Адаптеры / Внешние каналы. Протокол loft/1.0.
中文
loft 是跑在 TLS 1.3 里面的覆盖网。应用走本机 SOCKS5 或 TUN。流复用,ChaCha20-Poly1305,外面是普通 HTTPS:GET、WebSocket、HTTP/2、QUIC、HTTP/3。节点前面可以接 CDN。协议 loft/1.0。分享 URI loft://。
本 Dist:macOS 应用(arm64 / x86_64 DMG)、Linux/macOS CLI(loft、loft-front、loft-probe、loft-bench)、节点(tar.gz 和 .deb)、面板(tar.gz 和 .deb)、Android 旁路 APK(手机和电视)、Windows portable(loft-1.0.32-windows-x64.zip 和 loft-1.0.32-windows-x86.zip)。GitHub 版本用下一份发布里的 zip 替换自己的目录。iOS / Sailfish / Keenetic / MikroTik 不在这次包里。
1.0.32:面板 — 删除邮件域名时可一并删除面板为其创建的 DNS 记录(确认框中的勾选,默认开启),mail.<域名> 证书随域名删除;Namecheap 记录 id 改用 HostId 而非位置,旧 id 在读取区域时修复;Go 1.27+ 构建的节点自行开启 HTTP/2 扩展 CONNECT(h2、l3 前端);SHA256SUMS 只写文件名;Android — 崩溃报告发到 GitHub、大号系统字体、图标在安全区内。协议仍是 loft/1.0。
1.0.31:路由配置 — cap 30 lists_inline、CmdLists 13、kinds 4–6、运营方副本、loft://routes;Android — Block 区、本机 DNS、隧道周边应用、滑动/多选/撤销;QUIC 经 a3app/quic-go 分叉切 BBR 或固定速率,TCP 仍走内核默认;Windows 托盘 Win7 SP1;mux 不再往已关闭通道写;面板 VLAN 隔离、端口排序、指示灯;P2P 密封握手,witness 走 TLS。协议仍是 loft/1.0。
1.0.30:VLESS 支持 XHTTP stream-up;Vision 的 UUID 填充帧与请求头在同一条 TLS 记录里,application data 用 command end 结束填充,不发 direct;macOS 状态行按 xhttp、reality、vision 或 tcp 标注。排空或删除中继会关掉它的 trunk。Hello 携带 controller_pin。Takeover 是 standby 提升后经过签名的控制器世代。面板换钥时显示已有多少在线设备信任新钥。协议仍是 loft/1.0。
1.0.29:直连前置可在 Status 之后确认 clear 或 AES-256-GCM,GET 仍是 ChaCha20-Poly1305;编号表、安全考虑与隐私;套接字缓冲交给内核 autotune,unsent 上限 16 KiB,流 park 8 MiB;mux 线路挂在活会话上;tight 要四条 HTTP/2;loft:// 的 authority 是节点,edge 只是第一次 GET 的 URL;面板里网段以标签打开,VLAN 自有 L3,有 ping 检查。协议仍是 loft/1.0。
1.0.28:Dist 发布已签名 GitHub APK,文件名带版本;GET 在后台挂额外前置、CDN 上不挂;macOS 单 GET outbound 和 sstp://;面板「适配器 / 外部通道」。协议仍是 loft/1.0。


