Skip to content

Repository files navigation

Surf icon

Surf

Surf brings the modern web to older iPhones, iPod touches, and iPads.

Download Surf · Get started · Documentation

Websites run in Chromium on a Windows, macOS, or Linux computer and stream to your device. You browse through a native iOS app with touch, keyboard input, video, and audio, without being limited by the device's outdated web engine.

The iOS app has native tabs, an address bar, bookmarks, history, downloads, uploads, sharing, fullscreen media, and separate phone and tablet layouts.

See it in action

surf-demo.mp4

50 seconds. Unmute for audio. Download the video · About the recording and credits

Compatibility

The rootful iphoneos-arm package contains both client architectures.

Slice Minimum OS Hardware
armv7 iOS 6.0 32 bit iPhone, iPod touch, and iPad models
arm64 iOS 7.0 A7 and newer devices through iOS 14

The current target ends at iOS and iPadOS 14.8.1. A rootful jailbreak is required. iOS 15 and later, rootless packages, armv6 devices, iOS 5, and the original iPad are unsupported.

A5 or newer hardware is recommended. The 256 MB iPhone 3GS and iPod touch 4 can install the package but remain experimental.

The main hardware test device is an original iPad mini running iOS 6.1.3. Pairing, saved servers, touch and keyboard input, video, audio, rotation, and fullscreen are tested there. Build support for other devices does not yet mean each device and OS combination has been tested on hardware.

Device and OS details

32 bit devices

Models Surf compatible OS range Status
iPhone 3GS 6.0 to 6.1.6 Experimental
iPhone 4 6.0 to 7.1.2 Legacy candidate
iPhone 4s 6.0 to 9.3.6 Legacy candidate
iPhone 5 6.0 to 10.3.4 Good candidate
iPhone 5c 7.0 to 10.3.3 Good candidate
iPod touch 4 6.0 to 6.1.6 Experimental
iPod touch 5 6.0 to 9.3.5 Legacy candidate
iPad 2 and iPad 3 6.0 to 9.3.5, or 9.3.6 on cellular models Legacy candidates
iPad 4 6.0 to 10.3.3, or 10.3.4 on cellular models Good candidate
iPad mini 1 6.0 to 9.3.5, or 9.3.6 on cellular models Verified on iOS 6.1.3

64 bit devices

Models Surf compatible OS range
iPhone 5s 7.0 to 12.5.7
iPhone 6 and 6 Plus 8.0 to 12.5.7
iPad Air 1 and iPad mini 2 7.0 to 12.5.7
iPad mini 3 8.0 to 12.5.7
iPod touch 6 8.4 to 12.5.7
iPhone 6s through iPhone 12, including SE 1 and SE 2 Launch OS to 14.8.1
iPad Air 2 through 4, iPad mini 4 and 5, and iPad 5 through 8 Launch OS to 14.8.1
iPad Pro models released through 2020 Launch OS to 14.8.1
iPod touch 7 12.3 to 14.8.1

The host computer must run a 64 bit version of Windows, macOS 12 or later, or Linux. Both x86_64 and ARM Linux hosts are supported.

Quick start

Start the host

Download a host package from the latest release.

The desktop app includes settings, pairing, device management, logs, clipboard sync, and updates. A terminal or server installation runs in the foreground.

./surf serve

Useful commands from another terminal are:

surf status
surf pair
surf devices list
surf quit

Surf listens on port 18080 by default. Windows archives contain surf.exe.

To sign in or change settings in Surf's browser on the computer, choose Browser setup… in the tray/dashboard or run surf browser. Connected devices pause until you close the setup windows or choose to resume. See browser setup for standalone use, confirmations and what carries over.

Updates install over the existing copy. SURF_HOME contains the server identity, paired devices, and browser profile, so it should remain in place.

Install the iOS app

Add the Surf package repository to Cydia or Sileo on the jailbroken device.

https://seg6.space/surf/

The same page also offers the current .deb. A manual SSH installation uses:

scp space.seg6.surf_*.deb root@DEVICE_IP:/tmp/surf.deb
ssh root@DEVICE_IP 'dpkg -i /tmp/surf.deb'
ssh root@DEVICE_IP 'su mobile -c uicache || uicache || true'

Older jailbreaks may reject uicache when it runs as root. Run it as mobile, then respring if the icon is still missing.

Pair

Open Paired Devices on the host and choose Pair device. A headless host uses surf pair. Each invitation accepts one device.

Camera equipped devices can scan the QR code. Manual pairing uses the host address and six digit code, then compares the same six words on both ends.

192.168.1.50:18080

Use the host address and allow inbound TCP port 18080 through its firewall. The words confirm the server identity. Cancel pairing if they differ.

Surf handles TLS directly. A LAN or VPS setup needs one reachable Surf port. Set SURF_PUBLIC_ADDRESS=host:port when the address in pairing codes must differ from the listener address.

Cloudflare Tunnel can carry the pinned Surf connection for remote access.

SURF_PUBLIC_ADDRESS=surf-roam.example.net:443 \
SURF_TUNNEL_HOST=surf-roam.example.net \
./surf serve

The inner Surf connection remains encrypted between the device and host. Cloudflare can see connection metadata and encrypted traffic volume. A direct LAN endpoint gives lower local latency.

See Security for the trust model.

Browser support

Surf uses an installed Google Chrome, Microsoft Edge, or Chromium when one is compatible. Otherwise it installs a verified ungoogled Chromium build in SURF_HOME. Capture and content blocking extensions are loaded through the DevTools extension API.

Video and audio come from Chromium tab capture. FFmpeg, PulseAudio, virtual audio devices, and desktop capture are not required on the host.

The stream matches the page area left by the native controls. Rotation, Surf fullscreen, and page fullscreen update that area without reconnecting the browser session.

The optional adaptive video mode changes frame rate when an old device falls behind. It does not reduce the page viewport or render size.

Surf does not include Widevine. Protected sites can use a working Widevine CDM provided by the selected host browser, subject to the site's own rules.

Build

Build the backend and a package for the current host.

make surf-binary
make surf-dist

The release target builds the desktop archives. Linux AppImage builds need appimagetool, and Windows installer builds need makensis from NSIS.

APPIMAGETOOL=/path/to/appimagetool make surf-release-dist \
  CLIENT_DEB=path/to/space.seg6.surf_VERSION_iphoneos-arm.deb

macOS archives contain Intel or Apple Silicon Surf.app bundles. Their build does not require Xcode, an Apple SDK, signing, or a macOS host.

The universal iOS package uses a pinned Linux, WSL2, or Docker environment. See Native Build.

Run the normal test suite with make test. Backend download tests include a real Chromium round trip using a temporary profile and local HTTP fixtures. They discover an installed Chrome/Chromium automatically; SURF_TEST_BROWSER can select another executable. Without Chromium these tests explicitly skip locally and fail in CI. No separate download-test command or CI step is needed.

Documentation

Support

Donations are accepted on Ko-fi.

AI disclosure

Surf is an AI-assisted project. Its direction, device testing, deployment decisions, and release judgment are human-directed.

License

MIT

About

Bringing the modern web to legacy iPhones, iPod touches, and iPads

Topics

Resources

Security policy

Stars

133 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages