%global debug_package %{nil} Name: apple-extras Version: 0.11.1 Release: 1%{?dist} Summary: Userspace for Apple features on Asahi Linux License: MIT Source0: apple-extras-%{version}.tar.gz BuildRequires: cargo-rpm-macros >= 26 BuildRequires: gcc BuildRequires: pkgconfig(dbus-1) BuildRequires: systemd-rpm-macros %description Rust tools for Apple features on Asahi Linux. Each tool ships as its own subpackage; this package itself installs nothing. Every crate in the workspace is built and its tests run in %%check, but a crate only gets a subpackage once the tool it replaces has been verified on hardware: publishing one earlier would let a routine upgrade swap a working tool for an untested one. airdrop-rs (awdld, opendrop, airdrop-contacts) is waiting on that. %package -n instant-hotspot Summary: Apple Instant Hotspot client: start and join a same-account iPhone's hotspot Requires: bluez Requires: NetworkManager Requires: polkit %description -n instant-hotspot Asks a nearby iPhone on the same Apple account to turn on Personal Hotspot over Rapport (BLE L2CAP), using the Rapport identity of an Apple device on that account, then joins the network with NetworkManager. The phone needs no interaction. The user unit watches NetworkManager and joins whenever the machine is offline, idling on D-Bus signals rather than polling. Credentials go in ~/.config/instant-hotspot/ (rapport_selfidentity.bin, rapport_selfidentity_gena.bin). %package -n universal-clipboard Summary: Apple Universal Clipboard on Linux: paste what a nearby iPhone or Mac copied Requires: bluez Requires: avahi Requires: wl-clipboard %description -n universal-clipboard Watches for the Bluetooth LE Handoff advert a device on the same Apple account sends when its clipboard changes, then fetches the clipboard over Apple's Rapport companion link and puts it on the Wayland clipboard. Clipboards over about 10 KB arrive on a TLS stream the sender publishes as _continuity._tcp. Text and images go on the clipboard; a copied photo or file is fetched over the stream's second coder and saved to ~/Downloads, with a single image put on the clipboard as an image and anything else as its path. Receive only. Needs the Rapport identity of an Apple device on the account in ~/.config/universal-clipboard/ (or the copy instant-hotspot already has) and, for large clipboards, the Apple ID certificate in ~/.local/share/opendrop/keys/. %package -n findmy-beacon Summary: Find My offline-finding beacon for Linux Requires: bluez # findmy-locate stays a python client on the PyPI findmy package Requires: python3 Requires: python3-findmy %description -n findmy-beacon Advertises a rotating Find My key over Bluetooth so Apple devices nearby relay this machine's location, and findmy-locate queries those reports. %package -n darkwake Summary: Connected sleep with scheduled dark wakes Requires: iw Requires: polkit Requires: util-linux %description -n darkwake Keeps an Apple Silicon laptop in s2idle while waking it on a schedule to sync, then goes back to sleep. Needs the kernel s2idle wake timer. %package -n apple-powerd Summary: macOS-style power, idle and brightness management Requires: systemd Requires: upower %description -n apple-powerd One user service for the power behaviour of an M-series MacBook Pro: auto-brightness that learns from adjustments, a dim stage before display off, slight dimming on battery, a low-light keyboard backlight that is never lit with the displays off, separate battery and adapter timings, lock before every sleep, lid sleep unless docked, audio keeping the machine awake, a low battery notification and sleep, and a per-sleep battery drain log. Uses only logind, UPower, ext-idle-notify and wlr-output-power-management (niri IPC as a fallback), so it runs on any Wayland laptop. %prep %autosetup -n apple-extras-%{version} %cargo_prep -N # build online: the crates are not packaged for Fedora sed -i 's/^offline = true$//' .cargo/config.toml %build %cargo_build %install install -Dpsm0755 target/rpm/instant-hotspot %{buildroot}%{_bindir}/instant-hotspot install -Dm644 crates/instant-hotspot/instant-hotspot.service %{buildroot}%{_userunitdir}/instant-hotspot.service install -Dm644 crates/instant-hotspot/49-instant-hotspot.rules %{buildroot}%{_datadir}/polkit-1/rules.d/49-instant-hotspot.rules install -Dpsm0755 target/rpm/universal-clipboard %{buildroot}%{_bindir}/universal-clipboard install -Dm644 crates/universal-clipboard/universal-clipboard.service %{buildroot}%{_userunitdir}/universal-clipboard.service install -Dpsm0755 target/rpm/findmy-beacon %{buildroot}%{_bindir}/findmy-beacon install -Dm755 crates/findmy-beacon/findmy-locate %{buildroot}%{_bindir}/findmy-locate install -Dm644 crates/findmy-beacon/findmy-beacon.service %{buildroot}%{_unitdir}/findmy-beacon.service install -Dpsm0755 target/rpm/darkwake %{buildroot}%{_bindir}/darkwake install -Dm644 crates/darkwake/darkwake.service %{buildroot}%{_unitdir}/darkwake.service install -Dm644 crates/darkwake/darkwake-sync.target %{buildroot}%{_unitdir}/darkwake-sync.target install -Dm644 crates/darkwake/50-darkwake.rules %{buildroot}%{_datadir}/polkit-1/rules.d/50-darkwake.rules install -Dm644 crates/darkwake/darkwake.conf %{buildroot}%{_sysconfdir}/darkwake.conf install -Dpsm0755 target/rpm/apple-powerd %{buildroot}%{_bindir}/apple-powerd install -Dm644 crates/apple-powerd/apple-powerd.service %{buildroot}%{_userunitdir}/apple-powerd.service %check %cargo_test %post -n instant-hotspot %systemd_user_post instant-hotspot.service %preun -n instant-hotspot %systemd_user_preun instant-hotspot.service %postun -n instant-hotspot %systemd_user_postun_with_restart instant-hotspot.service %files -n instant-hotspot %license LICENSE %doc crates/instant-hotspot/README.md %{_bindir}/instant-hotspot %{_userunitdir}/instant-hotspot.service %{_datadir}/polkit-1/rules.d/49-instant-hotspot.rules %post -n universal-clipboard %systemd_user_post universal-clipboard.service %preun -n universal-clipboard %systemd_user_preun universal-clipboard.service %postun -n universal-clipboard %systemd_user_postun_with_restart universal-clipboard.service %files -n universal-clipboard %license LICENSE %doc crates/universal-clipboard/README.md %{_bindir}/universal-clipboard %{_userunitdir}/universal-clipboard.service %post -n findmy-beacon %systemd_post findmy-beacon.service %preun -n findmy-beacon %systemd_preun findmy-beacon.service %postun -n findmy-beacon %systemd_postun_with_restart findmy-beacon.service %files -n findmy-beacon %license LICENSE %doc crates/findmy-beacon/README.md %{_bindir}/findmy-beacon %{_bindir}/findmy-locate %{_unitdir}/findmy-beacon.service %post -n apple-powerd %systemd_user_post apple-powerd.service %preun -n apple-powerd %systemd_user_preun apple-powerd.service %postun -n apple-powerd %systemd_user_postun_with_restart apple-powerd.service %files -n apple-powerd %license LICENSE %doc crates/apple-powerd/README.md crates/apple-powerd/config.toml %{_bindir}/apple-powerd %{_userunitdir}/apple-powerd.service %files -n darkwake %license LICENSE %doc crates/darkwake/README.md %{_bindir}/darkwake %{_unitdir}/darkwake.service %{_unitdir}/darkwake-sync.target %{_datadir}/polkit-1/rules.d/50-darkwake.rules %config(noreplace) %{_sysconfdir}/darkwake.conf %changelog * Sat Oct 31 2026 Lachlan Marie - 0.11.1-1 - apple-powerd: status command - Light the display on lid open and wake - Charger, lid and wake count as activity - Audio hold no longer delays lid sleep * Sat Oct 31 2026 Lachlan Marie - 0.11.0-1 - apple-powerd: macOS-style power, idle and brightness service - Auto-brightness learning from adjustments - Low-light keyboard backlight, off with the displays - Lid, low-battery and idle sleep; lock before sleep - Audio keeps awake; sleep drain log * Sat Oct 31 2026 Lachlan Marie - 0.10.6-1 - instant-hotspot: pick the loudest hotspot phone, not the first - instant-hotspot: shorter per-phone timeout, try up to 5 - instant-hotspot: wait while NetworkManager is still asleep - universal-clipboard: send subcommand (experimental) * Fri Oct 30 2026 Lachlan Marie - 0.10.5-1 - universal-clipboard: keep a pasted image alive across a restart * Fri Oct 30 2026 Lachlan Marie - 0.10.4-1 - universal-clipboard: receive copied files and photos, not just their names - A single photo lands on the clipboard as a pasteable image - Cap a stalled transfer instead of wedging on heartbeats * Fri Oct 30 2026 Lachlan Marie - 0.10.3-1 - universal-clipboard: stop dropping adverts BlueZ reports without a signal - Retry a peer that answered after 15s - Name what the sender pointed at instead of saving a stub file * Fri Oct 30 2026 Lachlan Marie - 0.10.2-1 - universal-clipboard: images on the clipboard - Save photos, documents and multiple items to ~/Downloads as pasteable files - Honour the sender's preferred representation * Fri Oct 30 2026 Lachlan Marie - 0.10.1-1 - universal-clipboard: do not re-paste an unchanged clipboard * Fri Oct 30 2026 Lachlan Marie - 0.10.0-1 - universal-clipboard: paste what a nearby iPhone or Mac copied - Large clipboards over the _continuity._tcp TLS stream - Shared Rapport companion-link crate * Fri Oct 30 2026 Lachlan Marie - 0.9.0-1 - findmy-beacon: Rust rewrite; key, address and advert bytes verified against the python implementation and FindMy.py - findmy-locate stays the python client, shipped alongside as before * Fri Oct 30 2026 Lachlan Marie - 0.8.0-1 - darkwake: Rust rewrite, no dependencies beyond the standard library - findmy-beacon and airdrop-contacts crates land here too, built and tested but not yet packaged, pending hardware verification * Fri Oct 30 2026 Lachlan Marie - 0.7.2-1 - instant-hotspot: keep the hotspot profile metered and below real Wi-Fi, so NetworkManager never prefers cellular data on its own * Fri Oct 30 2026 Lachlan Marie - 0.7.1-1 - instant-hotspot: wait for the profile, not the ActiveConnection object NetworkManager discards, which read as a failed join - instant-hotspot: retry the association; the phone drops the first attempt - instant-hotspot: only act after 8s offline, so a reconnect does not trigger it * Thu Oct 29 2026 Lachlan Marie - 0.7.0-1 - Monorepo for the Apple userspace tools, one subpackage each - instant-hotspot: Rust rewrite, ~4 MB resident and no CPU while idle - Version starts above every package it replaces so upgrades are clean