Skip to content

Releases: pavunato/carsurf

CarSurf 0.2.9-1

Choose a tag to compare

@pavunato pavunato released this 11 Sep 11:15

Fixed carlaunch targeting the wrong screen when an instrument cluster is connected.

Full changelog: https://repopo.pages.dev/changelogs/carsurf-0.2.9.html

CarSurf 0.2.9

Choose a tag to compare

@pavunato pavunato released this 07 Sep 11:13

Fullscreen exit no longer leaves the page half-built. Leaving a video's fullscreen player could bring the page back with the picture filling the width and running off the bottom, and the title and view count missing for a beat. A phone leaves fullscreen by rotating, and the size change that comes with it is what makes an app lay itself out again — the CarPlay window never changes size, so that signal never arrived and apps kept the geometry they cached while fullscreen. CarSurf now delivers that size change itself, costing no screen space. Separately, the parts of the page a fullscreen player displaces are put back as the player starts closing rather than after it has finished.

Settings can forget a car again. Tapping "Forget This Car" closed Settings instead. The iPad idiom override applied to the whole app process, so with Settings on the allowlist the phone's own Settings UI was told it was an iPad and crashed building that confirmation. It is now scoped to an actual car session.

Display scale goes down to 0.1, from 0.5 — a compact head unit needs far more shrinking than the old floor allowed.

0.2.8

Choose a tag to compare

@pavunato pavunato released this 07 Sep 02:00

Covers two releases folded together (0.2.7 and 0.2.8 — no tag had been cut
for 0.2.7):

0.2.8 — drive display links from the head unit's screen
A CADisplayLink created the ordinary way binds to the main display, which
is asleep for the whole drive (measured: main=0, car=60 ticks/s). Everything
a bridged app animates per frame — synced lyrics, scrubbers, custom
animations — was frozen, while timer-driven UI kept working, which made the
damage look app-specific. CSDisplayLink.m redirects
+[CADisplayLink displayLinkWithTarget:selector:] and
-[UIScreen displayLinkWithTarget:selector:] onto the car screen, with a
standby link on the original screen that takes over if the primary goes
quiet for ~6 frames so unplugging the car cannot strand the app on a dead
screen. Installed at car-scene connect, not from the dylib constructor,
since reaching UIScreen that early deadlocks in
-[_UIApplicationConfigurationLoader _loadInitializationContext].

0.2.7 — restore views a fullscreen modal displaces on the car window
Entering a fullscreen modal (e.g. YouTube's fullscreen player) and coming
back left views the app itself detaches during that transition — normally
restored once its own rotation-based geometry change fires — stranded,
because the car window is a fixed landscape canvas that never rotates.
CSMirror.m now records the attachment (superview, subview index, frame) of
every loaded child controller before the outermost presentation and puts
back anything still detached ~0.35s after dismissal settles, the app's own
restore going first.

Built with make package FINALPACKAGE=1.

0.2.6

Choose a tag to compare

@pavunato pavunato released this 06 Sep 15:28

Replaces the YouTube-only fullscreen/video-layout hack (CSFullscreen.m) with
generic transplant-compatibility shims in CSMirror.m:

  • -[UIWindow rootViewController] aliases reads through the emptied source
    window to the transplanted root, so compatibility-mode apps that re-read
    delegate.window.rootViewController keep seeing their real UI.
  • applicationDelegate.window is reassigned to the car window for the
    duration of the transplant (restored on disconnect), so new controllers
    built off .window.windowScene / .window.traitCollection pick up the
    car scene.
  • viewDidAppear:/viewDidDisappear:/present/dismiss are swizzled for
    diagnostic logging only — no behavior change.

Known gap: the old auto-horizontal-on-video-playback geometry (YouTube watch/
fullscreen only) has no general replacement yet — see docs/TODO.md.

CarSurf 0.2.1

Choose a tag to compare

@pavunato pavunato released this 18 Aug 05:47

Packaging only — no behaviour change from 0.2.0.

The download is smaller. Four diagnostic tools that nothing in CarSurf ever runs are no longer installed: they were only ever used during development. carsurf-audit, carsurf-classes and carsurf-logs stay, since CarSurf points you at those when something needs checking.

Installed size 2.0 MB → 1.5 MB.

CarSurf 0.2.0

Choose a tag to compare

@pavunato pavunato released this 18 Aug 05:36

Your apps are never modified any more. CarSurf used to re-sign an app to get it onto the CarPlay screen. Now nothing is written to the app at all — so an App Store update can't break it, and there is nothing to repair afterwards.

What you'll notice

  • Turning an app on or off updates the CarPlay screen straight away — no respring, no unplugging, and the other icons stay where they were.
  • Patch Now, patch status and the patch log are gone. Nothing gets patched, so there is nothing to check.
  • Built-in Apple apps can be turned on too.

Fixed

  • Turning an app off and back on, then opening it, could crash the CarPlay screen.
  • A re-enabled app's icon flickered for about a minute.

Tested on iOS 18.5 (iPhone 11).

CarSurf 0.1.4-1

Choose a tag to compare

@pavunato pavunato released this 13 Aug 06:36

Packaging fix on top of 0.1.4 — no behaviour change.

  • ldid and uikittools are now declared dependencies. CarSurf's helper shells out to both on every patch, so the package manager should be guaranteeing them.
  • If one of them is missing anyway, Settings now names the package to install instead of reporting a generic "patch attempt failed". jbctl, which comes from the jailbreak itself rather than a repo, gets its own message.

See CarSurf 0.1.4 for what actually changed.

CarSurf 0.1.4

Choose a tag to compare

@pavunato pavunato released this 13 Aug 06:10

New: apps that already support CarPlay now show their real interface

An app shipping its own CarPlay support used to be left on it — the template UI its developers built for CarPlay, which is almost always a cut-down version of the app. CarSurf now puts the full phone app on the head unit for these too:

  • Vietmap — the real map and every feature, instead of the CarPlay template.
  • YouTube Music — the app itself, instead of Apple's Now Playing template.
  • Zalo — the app, instead of a Siri prompt asking what to send.

Their binaries are still never touched. CarPlay is simply told the app has no template capability, so it hands over a plain window scene and CarSurf bridges it exactly like any other app.

This also removes a crash. Rewriting a template scene after CarPlay had built one threw inside +[UIScene _sceneForFBSScene:create:withSession:connectionOptions:] and killed the app on every launch — the failure that stopped Waze being bridged. If a template scene arrives anyway, CarSurf now declines the rewrite and the app keeps its own UI for that launch instead of dying.

Fixed: patched apps dying at launch with "Library not loaded"

A patched app could be killed by dyld before any of its code ran:

Library not loaded: @rpath/Flutter.framework/Flutter
  code signature ... not valid for use in process:
  mapping process is a platform binary, but mapped file is not

The framework's cdhash was in the trustcache, and it still failed. The kernel attaches a code-signature blob to a file the first time it is mapped and keeps reusing it, so trusting a framework afterwards does not re-classify one the device has already loaded. Every embedded framework is now replaced with a byte-identical copy of itself after being trusted, which gives it a new inode and a fresh evaluation. Same bytes, same cdhash, and the trust actually takes.

Settings

  • Orientation, Layout and Scale, renamed from Layout / Interface Idiom / Render Scale, and the scale value no longer clips mid-digit.
  • CarPlay Interface is gone. Showing the phone screen is simply what CarSurf does now, for every app.
  • Use CarPlay Screen Size is gone. The viewport is measured from the head unit itself, which made the override redundant.
  • An app that already supports CarPlay no longer shows a qualification status, a Patch Now button or a patch log — nothing on it is ever patched, so the section only ever said "nothing to do".

Also fixed

  • A write race on the app-readable preferences copy: SpringBoard and carsurf-helperd both wrote it through a shared temporary name, and the loser left it one edit stale, so apps read preferences you had already changed.
  • SpringBoard and CarPlay.app could not write the shared log at all — it is created by a root daemon — so the entire CarPlay half of the tweak left no diagnostics anywhere.

Measured on iOS 18.5 (iPhone 11, rootless) and iOS 16.7.12 (iPhone X, RootHide).

CarSurf 0.1.3

Choose a tag to compare

@pavunato pavunato released this 12 Aug 18:53

Fixed: apps now reach CarPlay on RootHide / iOS 16 — with no changes to the app at all

The 0.1.2 known issue is resolved. On iOS 16/17 CarSurf now qualifies an app at runtime, leaving its App Store signature completely untouched.

This was necessary rather than merely nicer: on RootHide the on-disk route is impossible. jbctl trustcache add silently refuses every path under /var/containers/Bundle/Application, so a re-signed app binary is untrusted and killed at launch with no crash report. Patching the Info.plist instead fails too — it is hashed into the code signature.

What this means in practice

  • The app keeps its original Apple signature; DRM and app integrity checks are unaffected.
  • An App Store update no longer strips the patch. Reinstalling an app just works — nothing on disk to wipe.
  • Nothing to back up, revert, or repair.

Also in this release

  • Fixed a blank CarPlay screen: the app-readable config was never written on RootHide, so every app tweak decided it was disabled. carsurf-helperd now publishes it.
  • carsurf-helperd no longer patches or reverts below iOS 16/17, where doing so is destructive. It runs relay-only and registers no patch handlers.
  • Settings hides the qualification status, Patch Now, and patch log where patching does not apply.
  • Fixed a crash that could put SpringBoard into safe mode on iOS 16.

iOS 18 is unchanged. CarKit there does not consult LaunchServices, so the runtime path is version-gated off and iOS 18 keeps the on-disk patch it already used. Verified on iOS 18.5.

Tested on iPhone X / iOS 16.7.12 / RootHide and iPhone 11 / iOS 18.5 / Dopamine.

CarSurf 0.1.2

Choose a tag to compare

@pavunato pavunato released this 12 Aug 15:20

What’s new

  • Adds a live patch log in CarSurf Settings with Clear Log, Patch Again, and Share Log actions.
  • Patch Again now targets only the selected app and reports protected-app refusals immediately.
  • Fixes the Settings share sheet becoming unresponsive when sharing patch diagnostics.
  • Adds RootHide-compatible entitlement scratch files under /var/jb/Library/CarSurf.
  • Improves patch diagnostics, UTF-8 log output, native CarPlay app safety, and embedded-framework trust handling.

Known issue

  • A successfully patched YouTube app may still not appear in CarPlay on RootHide with iOS 16.7.12. Investigation continues; the new live log makes device reports directly shareable.

SHA-256: 977043e5ecb136e60afcacb3aaed8cfb3d0b71bc9d9658a8aa55a3d701ba082a