Source Code
Last updated: October 28, 2026
Skyladder's connection engine is Xray-core, open-source software licensed under the Mozilla Public License 2.0 (MPL-2.0). This page says where its source code is, including the files Skyladder changes.
Xray-core
The app is built from Xray-core v26.7.28, commit
5ca6f4b,
and runs it on the phone through libXray
(MIT license). Apart from the changes below, Xray-core's files are exactly as
published there.
The files Skyladder changes
transport/internet/hysteria/dialer.go, line 95. Skyladder always sends
the QUIC transport parameter max_datagram_frame_size to Hysteria2 servers:
without it, a Hysteria2 server run by sing-box relays no UDP traffic, and DNS through
the VPN fails.
-OmitMaxDatagramFrameSize: time.Now().After(time.Date(2026, 9, 1, 0, 0, 0, 0, time.UTC)),
+OmitMaxDatagramFrameSize: false, // Skyladder: always send it; sing-box servers relay no UDP without it
Download the changed file. Like the rest of Xray-core, it is licensed under the MPL-2.0.
features/dns/localdns/client.go, lines 5 and 36. Where the app sets up a
resolver of its own, the engine's own DNS lookups use it, and it asks the phone's network
for the answer; without it they found no DNS server, and servers given by name connected
slowly or not at all:
+stdnet "net"
-if len(internet.Controllers) > 0 {
+if len(internet.Controllers) > 0 && stdnet.DefaultResolver.Dial == nil { // Skyladder: a resolver the app installed (libXray SetDNS) is used
Download the changed file. Like the rest of Xray-core, it is licensed under the MPL-2.0.
proxy/tun/tun_darwin.go, lines 67–81 and 148–150. Each time the engine
starts, it reads the VPN's network interface through a copy of the descriptor of its own,
and closes that copy when it stops. Before, an engine restarted for a new server shared
the descriptor with the one before it: the old one's reader stayed behind, and the
descriptor could be closed while the new engine was using it:
+fd, err = unix.Dup(fd)
…
-if t.ownsFd {
- return xerrors.Combine(routeErr, t.tunFile.Close())
-}
-// iOS: don't close the fd, it's owned by NetworkExtension
-return routeErr
+return xerrors.Combine(routeErr, t.tunFile.Close())
Download the changed file. Like the rest of Xray-core, it is licensed under the MPL-2.0.
go.mod and go.sum. Skyladder adds
amneziawg-go (MIT license),
which its AmneziaWG connections use, to Xray-core's dependencies; adding it also moved
one library Xray-core uses indirectly to a newer version. Two libraries that only the
old Shadowsocks 2022 code used (below) are gone:
+ github.com/amnezia-vpn/amneziawg-go/v3 v3.1.20260828
- github.com/google/btree v1.1.2 // indirect
+ github.com/google/btree v1.1.3 // indirect
- github.com/sagernet/sing v0.5.1
- github.com/sagernet/sing-shadowsocks v0.2.7
Download the changed go.mod and go.sum. Like the rest of Xray-core, they are licensed under the MPL-2.0.
Shadowsocks 2022. Skyladder runs it on the code Xray-core itself has used since
v26.9.30 (commits
65e853e
and
0086362)
instead of the code in v26.7.28: the files in proxy/shadowsocks_2022/ are
replaced, along with their tests, common/singbridge/ is removed, and
infra/conf/shadowsocks.go changes to match. One line is Skyladder's own, in
proxy/shadowsocks_2022/stream.go: the app waits for the whole of the server's
first reply, which the network may deliver in pieces (upstream's line, then ours):
-n, err := r.Read(headerSlice)
+n, err := io.ReadFull(r, headerSlice)
Download the changed files:
infra/conf/shadowsocks.goproxy/shadowsocks_2022/: cipher.go, config.go, inbound.go, inbound_multi.go, inbound_relay.go, kdf.go, outbound.go, packet.go, replay.go, shadowsocks_2022.go, stream.go, and the tests relay_test.go and shadowsocks_2022_test.gotesting/scenarios/shadowsocks_2022_test.go
Like the rest of Xray-core, they are licensed under the MPL-2.0.
Questions
Email support@sky-ladder.com.