Audit date: 2026-10-13. Target: elementary OS 9 Early Access on MacBookPro18,3 (M1 Pro). The installed desktop boots with kernel 7.1.13-1-2-fairydust-usb4-ARCH. The separate mkosi factory ISO built successfully in run 38396499561 but has not been hardware-booted. See FIRST-ISO-BUILD.md. A working transformed installation is not evidence that the factory image works.
| ID | Finding | Change |
|---|---|---|
| DOC-01 | The README and public status page said no M-series desktop had booted, while the M-series setup guide recorded a working M1 Pro desktop. | Clarified the distinction between the installed desktop and the unverified factory ISO. |
| CI-01 | The M-series validation workflow omitted transform scripts, the root mkosi configuration, repositories, and the arm64 package manifest from its change filters. A change in those paths could skip the workflow. | Added those paths to the pull-request trigger. |
| CI-02 | The fork scheduled a daily release workflow that required elementary's signing and R2 credentials. | Replaced it with a manual arm64 build that retains logs and experimental installer artifacts without those credentials. First arm64 image build succeeded on October 13. |
| IMG-01 | The hardware overlay prunes package payloads, but its arm64 consumers did not explicitly install all of its runtime dependencies. ExtraTrees does not resolve apt dependencies. | Added runtime packages to liveiso and sysupdate arm64 configs, with a regression test for both consumers. |
| IMG-02 | Overlay finalization deleted the brightness helper and its autostart entry before they could reach the final images. | Retained both paths and added a temporary-image regression test that runs the real cleanup script. |
| IMG-03 | ISO assembly hardcoded the APT disc metadata directory to binary-amd64 even for arm64 builds. | Select the Debian architecture from the actual target; arm64 images use binary-arm64. Pending rebuilt-image verification. |
| IMG-04 | xorriso warned that the image volume ID did not comply with ISO 9660. | Normalize the label to uppercase ASCII/digits/underscores, capped at 32 characters. Pending rebuilt-image verification. |
| IMG-05 | Post-build inspection found that liveiso omitted the Apple overlay: mkosi.profiles/aarch64 was not selected by ordinary daily builds. | Moved wiring to an automatic arm64 drop-in, added explicit overlay dependencies and effective-config/built-payload checks. Local config verification passed; rebuilt image pending. |
| UP-01 | Current elementary OS 9 upstream includes systemd-coredump, but the original M-Series base did not. | The current branch now includes the upstream merge at 7024fd04646a6a8565bf6805989b59fd72de928c. |
| SRC-01 | The port map still presented omarchy-mac/quattro as the current Apple hardware source. Package development moved to omacom/omarchy-mac-pkgs. | Recorded the current package repository and audited revision; retained the old pin as history. |
| DOC-02 | The public feature table described an untested generic kernel plan as if it were the status of the running M1 Pro, and the CodexBar description no longer matched its compact quota rows. | Rewrote the support page around observed host evidence and corrected the desktop notes. |
| DOC-03 | An older optimization audit said ambient keyboard lighting was missing, although the Pantheon helper is implemented and was measured on the M1 Pro. | Corrected the audit: ALS-to-UPower automation works at 141 lux; only interactive lock/lid and suspend qualification remains. |
| DOC-04 | The arm64 package notes said the Asahi speaker packages had no Ubuntu source, but resolute/universe provides the installed versions. | Updated the manifest and build notes; the factory image still needs to package the tested audio setup. |
These source and image changes at commit 401dad7 passed a factory-image build; hardware qualification remains pending.
- Dell WD22TB4 dock on kernel 7.1.13-1-2-fairydust-usb4: USB4 link, hub, mouse and wired Ethernet (r8152, DHCP) work. Displays still absent (no DP tunnel).
- Undocked lid close, s2idle suspend (14m44s) and lid-open resume work; Wi-Fi reconnected.
mseries-docked-lidlogged "dock attached: holding the lid-switch inhibitor". Suspend with the dock attached was not retried.
- Launcher text: the search box text, caret, selection and placeholder now have explicit colors, a visible field, and larger type. Offscreen render before and after compared; installed to
~/.local/bin/mseries-launcher. - Window buttons: layout is now
close,minimize,maximize:(all on the left); applied to the running session and set inapply-desktop-settings.py. - Dock Ethernet: the cause was a temporary "Wired connection 1" profile that NetworkManager deletes when the dock unplugs, so every replug made a new one. A permanent profile ("Dock Ethernet", bound to the adapter's hardware address) now exists, and
linux-firmware-realteksupplies the missingrtl8153b-2.fw. Not retested with the dock because it was unplugged; check the panel icon on the next replug. Installing the package ran the initramfs-tools trigger; nothing under/bootchanged (timestamps unchanged).
- Every undocked lid close and open in the journal (2026-10-13 06:58 and 2026-10-14 07:09) resumed within the same second, started the greeter and was logged in 3 to 5 seconds later with no power-key event. The plain suspend path looks healthy.
- The power-key presses in the journal (2026-10-14 06:09 and 07:20) come with the display switching off and a greeter session starting, so the power key currently acts as "turn the screen off and lock", and a second press wakes it. The 07:20 press followed the dock being unplugged; no lid event was logged in that window.
- Docked lid mode (
mseries/docked-lid/mseries-docked-lid) locks the session and sets the backlight to 0 on lid close, then restores the saved brightness on lid open through the user's session. After the lock, the active session is the greeter, so that restore may not take effect, leaving a dark panel until the power key wakes the display. It has never logged a real lid close, so this is a hypothesis, not a finding. mseries/lid-trace/mseries-lid-trace(system service, installed on the M1 Pro) now logs backlight, DRM state, the active session and lock hints at 0, 2, 5 and 12 seconds after every lid close and open. Read withjournalctl -t mseries-lid-trace -b. One docked and one undocked lid cycle will show which path leaves the screen dark.
Undocked close, suspend and open worked: suspend at 11:06:12, wake and display back at 11:06:17, login screen within about 2 seconds, back in the session by 11:06:20, backlight at 500/500 throughout and no power-key event. The owner confirmed the lid path is acceptable and that the remaining wish is Touch ID for login (see the Touch ID entry). The docked case (mseries-docked-lid restoring the panel) is still untested because the dock was unplugged; mseries-lid-trace stays installed and will log it the next time the lid closes while docked. Remove it with sudo systemctl disable --now mseries-lid-trace once that is checked.
Added mseries/screenshot-shelf/ and install-screenshot-shelf.sh: a thumbnail after every screenshot (drag to use without keeping, hold Alt to also keep, click for Markup, ignore to keep), plus mseries-markup backed by Swappy (installed from the Ubuntu archive) for images and Papers for PDFs. Verified: watcher, expiry keeps the file, card renders, Swappy starts. Not verified: dragging into real apps, Alt detection during a drag, on-screen position. PDF signing is not covered; Xournal++ (in the archive) is the next candidate if Papers is not enough.
Update 2026-10-21 — superseded by working code. Aurora's SEP driver (omacom/linux-aurora, Rust, apple_sep) enables Touch ID on M1 Pro/Max, M2 and M3-era Macs; its reports show Touch ID passing on several Macs, including a J314S on pre-guard builds. On this Mac the driver attaches, the sensor binds, and an enrolment completes in the enclave and survives a reboot, but the xART guard (on by default since 2026-10-18) refuses the save, so fprintd stores no print and matching is blocked. See aurora-sep/XART-GUARD.md and aurora-sep/UPSTREAM-MAP.md. The bullets below are the original 2026-10-14 findings, kept as history.
- A compatible public Touch ID implementation has not been obtained or verified by this project. The search of GitHub, Asahi documentation and the Linux tree is evidence of an unresolved source gap, not proof that no code exists.
- Omarchy's September announcement claims a Secure Enclave breakthrough and lists Touch ID as a first-release target, but provides no implementation link. The package status page (
mac-manual/content/14-status.md, omarchy-mac-pkgs 222f7a8) lists Touch ID under "Not in the first release". Track the implementation and its model coverage separately from announcement and packaging status; seeOMARCHY-M-ROADMAP.md. - Asahi's SEP page is research notes only: the Secure Enclave runs Apple's own firmware, which Linux cannot replace, so a driver must speak its mailbox protocol; the biometric endpoint (SBIO) is mapped but not verified; nothing is implemented. Asahi's M1 feature matrix says TouchID is TBA for every M1 variant.
- What was added:
mseries/local-ai/touchid-watch.pyplus a verify checkupstream-touchid-watch. It watches the three places above (Omarchy status page, Asahi matrix, fairydust commits mentioning the Secure Enclave or Touch ID) and turns the check green when any changes. Today it reports no new signs. - Interim options (not installed): a hardware security key with
pam_u2f(touch the key instead of typing the password) works on Linux today and could cover login, lock screen and sudo; a short-lived trusted-device unlock is not available. Neither is Touch ID. - If a driver appears: test in this order: the Secure Enclave device exists, enrolment works, PAM unlock for login, lock screen and sudo, with the password always kept as a fallback.
- What OpenBubbles is: an Apache-2.0 Flutter app plus the
rustpushRust library, which re-implements Apple's iMessage protocols. It "talks directly to Apple" with no server in between and impersonates a Mac, so it needs that Mac's hardware identifiers (serial number, board ID, model), obtained once from a real Mac through a helper app or in-app settings. After activation the Mac can be switched off. One Mac can serve up to 20 users. - Linux on this Mac: the only published Linux build (v1.15.0+205, 2026-01-04) is
x86_64. The source has a Linux target, a Flatpak definition and a build script that already handlesaarch64, so an arm64 build is plausible, but it has not been attempted. Upstream's default branch (rustpush) builds against a sibling checkout ofOpenBubbles/rustpushand needs the Flutter SDK (3.24 or newer) plus development packages that are not installed here (libsecret, ayatana-appindicator, webkit2gtk, jsoncpp). The older local clone in~/Documents/openbubbles-app(detached at the January commit) pointsrustpushat the author's home directory, so it cannot build as is. Rust 1.93 and clang, cmake and ninja are present. - Licensing (matters for the image):
rustpushis under the Server Side Public License, with special exceptions granted to OpenBubbles only. We can build and run it for ourselves, but we must not bundle or redistribute it in the ElementaryOS image or this repository. Keep it a personal, user-run install, and record the source revision. The app repository itself is Apache-2.0. - Apple account risk (from OpenBubbles' own FAQ): accounts or devices are rarely blocked for a day or two, and in rare cases permanently (a call to Apple support usually lifts it); reusing someone's hardware identifiers for spam gets that Mac blocked; running it in a virtual machine is strongly discouraged; Advanced Data Protection and Contact Key Verification must be turned off for messaging to work; messages sent from it may not show on your other Apple devices for up to 24 hours; contacts may show as green (non-iMessage) for days if Apple throttles you. A phone number needs an always-online iPhone running their relay app.
- Decisions only the owner can make (an AI assistant must not enter Apple credentials): (1) accept the account risk above, (2) turn off Advanced Data Protection and Contact Key Verification on the Apple ID, (3) pick which Mac supplies the hardware identifiers (a different Mac than this M1 Pro is safer, since this one would then appear twice;
techmore-2was online on the tailnet), and (4) type the Apple ID password and 2FA code into the app yourself. - Plan, after the reinstall: install the build dependencies and Flutter, clone
OpenBubbles/openbubbles-app(branchrustpush) next toOpenBubbles/rustpush, runlinux/build.sh, launch the result, then do the activation steps above. Test send, receive, attachments and notifications. Signal stays the fallback. - Not done: no build, no install, no sign-in.
Other iMessage projects (added 2026-10-14, after the owner pointed out there are more than OpenBubbles)
| Project | How it works | Fit for this Mac | Risk and limits |
|---|---|---|---|
| BlueBubbles (app, server) | A server runs on a real Mac that is signed in to Messages; the Linux app connects to it over the network (the tailnet works). | The app publishes a Linux aarch64 build (bluebubbles-linux-aarch64.tar.gz, 24 MB, v2.1.3, Apache-2.0). The server needs macOS: csp-bfs-mini is a Mac on the tailnet; techmore-2 was online earlier. |
Uses a genuine Mac and Apple ID session, so no impersonation and the lowest account risk of the Apple-protocol options. The Mac must stay on and signed in. Optional extras (reactions, typing) use a Private API that needs macOS protections relaxed. |
Tether (repo, already scoped in this repo: mseries/TETHER-CONTINUITY.md, installer mseries/install-tether.sh) |
Talks to a paired iPhone: SMS and iMessage over Bluetooth, plus clipboard, file and one-time-code (OTP) handoff over Wi-Fi; a browser extension offers codes from iPhone messages to a matching sign-in (Chromium and Firefox; Brave is Chromium-based but not listed). No Mac relay. | MIT, pinned v0.2.37 ARM64 .deb, with a removable installer and Brave extension helper already in main. |
Needs BlueZ 5.86 or newer for Bluetooth messages; this Mac has 5.85, so messaging is blocked until the OS provides it (clipboard, file and OTP flows run over Wi-Fi). The extension asks for all-website access. Needs the iOS app and the phone nearby. Never installed or paired here. |
| BlueFerry (repo) | Talks to a paired iPhone over Bluetooth: no Apple login, no Mac, no cloud. | .deb packages (blueferry-backend, blueferry-gtk, architecture-independent, about 1.8 MB), GPL-2.0-or-later, supports Ubuntu 26.04 and a GTK client. Bluetooth is on here. This Mac has BlueZ 5.85; BlueFerry's iPhone-notification mirroring wants 5.86, but messages and contacts work without it. |
Experimental: tested on iPhone 16 and 17 with iOS 26.5 and 27 beta (this owner has an iPhone 14 Pro). Copies one-time verification codes (2FA/OTP) from new texts and iMessages to the clipboard (opt-in: set BLUEFERRY_OTP_AUTOCOPY=true, optionally clear the clipboard after N seconds; it only treats a number as a code when it sits next to a code word, and blueferry otp-check shows what a message would copy). No attachments, reactions or typing indicators; only sees messages while connected; the iPhone must be nearby. Untested with this Mac's Broadcom Bluetooth. |
| Bubbles (repo) | A native GTK4 and libadwaita client on rustpush (same engine as OpenBubbles, same activation). |
Pantheon-friendly toolkit; v0.2.0, Flatpak manifest, no arm64 release. | SSPL-licensed rustpush; the same Apple-ID and hardware-identifier risks as OpenBubbles; a personal project. |
| LiteBubbles (repo) | GNOME client on pinned rustpush. |
Early stage. | Same as Bubbles. |
| OpenBubbles | Flutter app on rustpush; see the evaluation above. |
No arm64 release. | SSPL core, account risk. |
| pypush, mautrix-imessage | Libraries and a Matrix bridge, not desktop clients. | Not a fit. |
Owner update (2026-10-14): Tether "sounded cool"; it is now the preferred option. It is blocked on BlueZ 5.86 for messaging (this Mac has 5.85), so the plan is: look for a supported BlueZ 5.86 source for the OS, install Tether with mseries/install-tether.sh after the reinstall, pair the iPhone, and test OTP handoff to Brave first (that part runs over Wi-Fi). BlueFerry stays the option that works with 5.85 today.
Earlier decision (2026-10-14): document only for now. The owner likes BlueFerry (no Apple login, one-time-code copy) and has not asked for anything to be installed. Install it after the reinstall: sudo apt install ./blueferry-backend_0.8.1-1_all.deb ./blueferry-gtk_0.8.1-1_all.deb (from the release page, check the version then), pair the iPhone, and enable one-time-code copy if wanted. BlueBubbles stays the fallback if attachments and reactions matter.
Tether may be the project the owner remembered (texts plus copying codes, already scoped on a branch that was merged 2026-10-14). BlueFerry and Tether overlap; Tether is blocked on BlueZ 5.86 for messaging on this OS, while BlueFerry's messaging works with 5.85 (only its notification mirroring wants 5.86).
Recommendation: try BlueBubbles first (full features, official arm64 client, genuine Mac, lowest account risk) if a Mac can stay on; use BlueFerry as the no-Apple-account option for basic texting when the iPhone is nearby. Keep OpenBubbles and its relatives as a last resort. Nothing was installed or downloaded for this comparison.
Apple publishes no Linux client for iCloud Keychain or the Passwords app. Its own browser extension exists for Windows only. Every Linux option below is an unofficial reverse-engineered project that signs in to your Apple ID, all are new (weeks to months old) and declare no license (fine for personal use, not for shipping in our image). Metadata checked on GitHub 2026-10-14; none was installed or run.
| Option | Direction | Notes |
|---|---|---|
| cameroncooper/keychain | Read only | Rust CLI written for Linux on Apple silicon: sync, search, passwords, TOTP codes, synced passkeys, optional Chromium extension. Validated by its author against a live account (including Advanced Data Protection). Its join step changes your Apple trust settings and escrow recovery has a server-enforced attempt limit, so read the warning first. Needs an anisette helper you supply. |
| Sank6/iCloud-Keychain-for-Linux ("icp", 59 stars) | Read only | Python CLI and browser extension; passwords, TOTP, Hide My Email; local encrypted store; registers your computer as an Apple device. Needs an anisette server. |
| dragosol/icloud-keychain-linux | Read only | Terminal viewer and Firefox-family autofill, passphrase-encrypted on disk; the browser only ever sees the 6-digit code, never the TOTP secret. |
| alex-mextner/passwords-app | Two-way | GNOME Keyring plus a GTK app, changes flow back to Apple devices. Created 2026-10-10: too new to trust. |
| bendews/apw (257 stars) | Read only | CLI daemon for Apple Passwords. No Linux-specific guidance found. |
| deej1721/icloud-passwords-linux | Read only | Runs Apple's real Windows helper in a Windows VM and bridges it to Chrome. Heavy. |
Risks common to all: they sign in with your Apple ID and read or alter your keychain; anisette data comes from a helper or server you must trust; Apple can break any of them at any time; a mistake in a trust-changing step can affect other devices. Use a separate Apple ID to try one first if possible.
Safer paths today:
- One-way export. On a Mac, export from the Passwords app to a file, import it into KeePassXC or Bitwarden on Linux, then delete the export (it is plain text while it exists). New passwords then live in the cross-platform manager, which syncs everywhere. No Apple sign-in on Linux.
- Read-only unofficial client (
keychain,icpor dragosol's) if you want to keep using iCloud as the source. Review its code, use an anisette helper you built yourself, and keep trust-changing steps off. - Avoid two-way sync until a tool has history.
Owner lean (2026-10-14): a Brave browser extension. Native Brave (1.97.56) is already installed on the M1 Pro. Two routes fit:
- icp's extension (iCloud, read only). Its README explicitly supports Brave: turn on Developer mode at
brave://extensions, Load unpacked the project'sextension/folder, copy the extension ID, then runhost/install.sh <EXTENSION_ID>to connect it to theicphelper. It fills passwords, one-time codes and Hide My Email from a local encrypted copy of your iCloud Keychain. It needs an anisette helper and an Apple ID sign-in done by the owner. - Brave's own sync (no iCloud). Brave Sync can keep passwords and bookmarks in step between Brave on the Mac, Linux and phone. It is a separate store from iCloud Keychain, so it avoids Apple sign-in on Linux but does not read Safari's saved passwords. It could be paired with the one-way export above to seed it.
- Also Chromium-capable:
keychain(passkeys only) andpasswords-app(Chrome autofill, two-way, too new). Nothing was installed or signed in. Decide between icp-in-Brave and Brave Sync (or both) after the reinstall.
Owner decision needed: which path, and whether to try a read-only client at all. As with iMessage, an AI assistant must not enter Apple credentials; the owner signs in. Nothing is installed.
The owner kept getting a password dialog for no visible reason. The journal showed the Pantheon polkit agent starting authentication helpers at 11:52, 12:02 and 12:12 (about every ten minutes, two at a time, each failing because nobody typed). A capture of the system bus at the next request showed the action org.freedesktop.timedate1.set-timezone, sent by gsd-datetime (the GNOME settings daemon's date and time plugin). org.gnome.desktop.datetime automatic-timezone was true: it asks the location service (geoclue) for a timezone and, when that differs from the current one, asks the system to change it, which needs authentication. The system timezone was already correct (America/New_York). Fix: automatic-timezone set to false on the M1 Pro and in mseries/apply-desktop-settings.py. To confirm: no authentication dialog for 30 minutes. If you travel, set the timezone by hand in Settings, Date & Time, or turn the setting back on.
Ranked by how often the owner hits it, how small the fix is, and what it depends on. The P1/P2/P3 labels in the table below are older; this order replaces them for planning.
| Rank | Item | Why here | Kind |
|---|---|---|---|
| 1 | Launcher typed text is unreadable | Hit on every launch; a few lines of CSS | Quick win |
| 2 | Window buttons on the left (Mac style) | One setting in apply-desktop-settings.py; visible all day |
Quick win |
| 3 | Dock Ethernet icon dies / rtl8153b-2.fw missing |
Likely a firmware file and one pinned profile; needs root | Quick win |
| 4 | Lid-open login needs the power button | Undocked path traced and fine; closed unless docked reproduces it | Closed |
| 5 | Screenshot thumbnail (drag to use, hold Alt to also save) | Daily convenience; Gala patch or small helper | Medium |
| 6 | Preview-style image and PDF markup | Pairs with 5; mostly choosing and packaging a tool | Medium |
| 7 | Gaps left from the Omarchy parity audit | Audio watchdog and the two WirePlumber rules are installed on the M1 Pro (2026-10-14); function-key mode awaits an owner choice; mic mapper not ported | Mostly done |
| 8 | Touch ID (the main login goal) | Aurora SEP driver attaches and the sensor works here; enrolment completes in the enclave but the xART guard refuses the save, so Touch ID cannot match yet (aurora-sep/XART-GUARD.md). Settings → Personal → Touch ID is installed. A security key with pam_u2f remains a possible interim |
Blocked on an owner decision about the xART guard; upstream report drafted, not posted |
| 9 | iMessage | Documented. Owner prefers Tether (blocked on BlueZ 5.86); BlueFerry works with 5.85; install after the reinstall | Documented, install later |
| 10 | iCloud password sync | Options documented; the owner leans to a Brave extension (icp supports Brave; Brave Sync is the no-Apple-login alternative); decide after the reinstall | Documented, leaning Brave |
| 11 | Small checks: brightness keys, keyboard light on lock and lid, Wi-Fi resume, Gala OSK guard, file the Wingpanel report | Cheap to verify, low daily impact | Housekeeping |
| 12 | Factory ISO hardware boot and image packaging (audio chain, firmware) | Release blocker for the image, not for this desktop | After the reinstall decision |
| 13 | Dock display, ACIO suspend handshake, USB-C resume power management | Kernel work; blocked upstream or large | Blocked / long |
| 14 | ArtCraft apps as Adobe and Office replacements | Large evaluation; start after the basics work | Last |
| Priority | Finding | Concrete next step | State |
|---|---|---|---|
| P1 | The built-in display keeps dimming unexpectedly (owner report, 2026-10-14). The trigger and whether brightness changes or the display powers off are unknown. | The default brightness-bridge installer now snapshots and disables GNOME ambient screen adjustment and idle dimming, while leaving blanking and suspend enabled. Confirm the user's manual brightness stays stable on AC/battery and through suspend/resume; capture backlight and power-service logs if it still changes. | Mitigation implemented in install-brightness-bridge.sh; cause still unconfirmed; owner verification pending |
| P1 | Candidate Gala failure: an IBus input-purpose change may arrive while its on-screen keyboard is disabled, when the GTK4 helper's model manager is null. | Reproduce with the OSK disabled and a focused text field. If confirmed, add a null guard through a package-safe build and verify recovery across package upgrades. | Guard installed (install-gala-osk-fix.sh). 2026-10-13: with the keyboard disabled, SetInputPurpose called over D-Bus twice and gala-daemon stayed up with no log errors. The unpatched crash was never reproduced, so this shows the guard is harmless, not that it fixed a confirmed crash. |
| P1 | A Dell WD19S display connected through the Apple USB4 dock path still has no DisplayPort tunnel. The experimental kernel now brings up the hub and downstream input, but the display connector is absent. | Continue the kernel and device-tree work; verify one external display on the M1 Pro and record hot-plug/reboot behavior before claiming support. | Known kernel limitation |
| P1 | Suspending with a USB4 dock attached is blocked by the ACIO driver; the machine stays awake with its display off. | Implement and qualify the ACIO sleep/wake handshake, or provide a safe docked-lid mode that locks without suspend retries. | Reproduced; tracked in ROADMAP.md |
| P1 | Non-USB4 USB-C devices can disappear after suspend because the Apple Type-C PHY and DWC3 drivers lack system-sleep power management. | Add kernel resume handling and verify dock/adapter recovery through repeated suspend cycles. | Kernel bug |
| P1 | Not reproduced 2026-10-14; closed unless a docked lid cycle shows it. After lid-open resume the login screen needs a power-button press (reported 2026-10-14). Log evidence: logind sees "Lid opened", PM: suspend exit and the DCP powers on in the same second, and a greeter session starts; no power-key event is logged. |
Capture display state on one resume (DCP power, apple-panel-bl brightness, greeter/Gala logs), find why the panel is not shown or input is not accepted, fix the wake path. |
Reported; needs trace |
| P2 | Fixed 2026-10-14, verify on the next dock replug. Dock Ethernet icon in the panel dies and a new connection appears (reported 2026-10-14). The RTL8153B registers as eth0, is renamed enx605b3042c174, NetworkManager creates a fresh "Wired connection 1", and rtl_nic/rtl8153b-2.fw fails to load (-2). Cause unconfirmed. |
Install the Realtek firmware, pin one persistent profile for the adapter, replug and suspend repeatedly while watching the indicator and NetworkManager log. | Reported; investigating |
| P2 | Fixed 2026-10-14, owner to confirm. Reported 2026-10-14: the Command+Space launcher (mseries/mseries-launcher.py, merged to main and installed) is hard to read. Narrowed the same day: the text being typed in the search box is the hard-to-read part. The CSS colors the entry box (color: #f2f2f5 on a 7% white fill) but not its inner text node, caret, selection or placeholder, so a GTK4 SearchEntry can still draw the theme's own text color there (dark on the dark card), and the fill is nearly the card color. Fix to try first: set color on .mseries-card entry text, entry placeholder and entry selection, set caret-color, and raise the entry fill so the field is visible. The code sets a dark card (#1c1c20) with light text (#f2f2f5), which should read well, so the cause is not confirmed. Suspects: text inside rows and the search field taking colors from the active GTK theme instead of the card (the selected row and the placeholder text are the likeliest), the pastel theme overrides in mseries/theme/gtk-4.0.css, the card being semi-transparent over a busy background, or small text on the 3024x1964 display. |
Reproduce with a screenshot in the light and dark themes and with the selected row, the placeholder and the app names visible. Set explicit colors for every text element (including row:selected label, entry placeholder, entry text), make the card opaque, raise the font size, and check contrast (aim for 4.5:1 or better) against both themes and the accent colour. |
Fixed 2026-10-14; owner to confirm |
| P2 | Built 2026-10-14; owner to try (see screenshot-shelf/README.md). Requested 2026-10-14: after a screenshot, show its thumbnail in the bottom-right corner for a few seconds, like macOS, so it can be dragged straight into an app, clicked to mark up, or swiped away. Today the shortcuts (Ctrl+Shift+3 for the screen, Ctrl+Shift+4 for an area, set in mseries/apply-desktop-settings.py) use Gala's built-in screenshot and the file silently lands in ~/Downloads/Screenshots. Gala hardcodes Pictures/Screenshots, so the script redirects that folder with a symlink. |
Decide between patching Gala's screenshot flow (like the existing Gala patches) or adding a small custom helper that watches the screenshot folder, shows a draggable thumbnail with a timeout, and offers Markup. Check drag-and-drop into Pantheon apps first (Files, Photos, Mail, Code, Terminal), then the other apps used every day, stacking of several shots, dismiss and auto-save timing, and the dark and light themes. Link it to the Preview-style markup request so a click opens the editor. Save rule (added 2026-10-14): a screenshot that is only dragged into an app is used, not saved: it lives in a temporary folder and is deleted after the thumbnail expires or the drag ends. Holding a modifier while dragging (Alt, the Option equivalent, is the first proposal; the owner can change it) also saves a copy to ~/Downloads/Screenshots. While the modifier is held, show on-screen text that confirms a copy is being saved and names the key, for example "Saving a copy (Alt)". Leaving the thumbnail alone or clicking Save should keep the file as well, so nothing is lost by accident. Check that Alt does not clash with window-move or compositor bindings. |
Requested; not started |
| P2 | Built 2026-10-14 as Markup (Swappy for images, Papers for PDFs); owner to try. Requested 2026-10-14: a Preview-style app for images (and PDFs) with Markup, like macOS: open a file from the file manager, draw, add text, arrows, shapes and highlights, crop, sign and save or share, without opening a heavy editor. Installed today: Pantheon Photos (io.elementary.photos, viewing and light edits) and the Papers PDF viewer (Flatpak). No markup tool is installed. |
Shortlist and test lightweight annotators for Pantheon on arm64 (for example Drawing, Swappy or Satty for images; Xournal++ or Papers annotations for PDFs; also check elementary's AppCenter). Judge them on startup time, behavior inside Pantheon (Gala), Quick Look-style open from Files (spacebar), PDF signing and form fill, and keyboard shortcuts. Then either package the best one with a Preview-like default association, or note a gap that a small custom app would fill. | Requested; not started |
| P2 | Updated 2026-10-21: driver found and running; blocked by the xART guard (see "Touch ID research" update and aurora-sep/XART-GUARD.md). Reported 2026-10-14 (owner: "really annoying"): Touch ID did not work, so the password is typed for login, unlock and sudo. The Asahi M1 feature matrix still lists Touch ID as TBA, but Aurora's SEP driver provides /dev/sep-bio on the 7.2.10 wip2 trial kernel and an enrolment completes in the enclave. Linux refuses to save it under the default guard. |
Source and kernel found (Aurora). Next: the owner decides whether to run with xart_guard=0 (upstream's own M1 Pro does; macOS Touch ID then unverified), then enrol, verify, and wire PAM (sudo, polkit; lock screen still unidentified) with the password kept as a fallback. Meanwhile, shorten the annoyance: make lid-open show the login screen without the power button (separate entry above) and check a faster password prompt flow. |
Reported; blocked on owner decision |
| P2 | Reported 2026-10-14: no iCloud password syncing. Passwords saved on the owner's other Apple devices are not available on the M1 Pro desktop, and new ones saved here do not reach them. No official iCloud Passwords client exists for Linux. | Research what is possible without weakening security: an unofficial iCloud Passwords client, a shared password manager that imports Apple's export (one-way, manual), or passkey and browser-extension routes. Record the trust and account-risk of each before installing anything that handles the Apple ID. | Reported; not started |
| P2 | Evaluated 2026-10-14: feasible as a personal build, not shippable in our image; needs owner decisions (see "iMessage evaluation"). Reported 2026-10-14: no iMessage. Messages from iPhone and Mac contacts cannot be read or sent from this desktop. | Evaluate OpenBubbles (a local clone from January 2026 is in ~/Documents/openbubbles-app; upstream was updated in July 2026, has Linux and Flatpak code, and ships a LICENSE file). Check that it builds on aarch64, how it registers with Apple, and the Apple ID and terms-of-service risk, then test send, receive, attachments and notifications through Pantheon. Signal already works as a fallback. |
Reported; not started |
| P3 | Requested 2026-10-14: evaluate porting the ArtCraft (storytold) apps to elementary OS on the M1 Pro, as native replacements for Adobe and Microsoft Office tools, with good performance. Candidates, all written in Rust: PhotoCraft and LightCraft (photo), VectorCraft, DesignCraft (layout), PdfCraft, EffectCraft and FilmCraft (video and motion), and WordCraft, GridCraft and DeckCraft (Word, Excel and PowerPoint style). ArtCraft itself is an AI image and video tool built on cloud model providers. Licensing looks permissive (Apache-2.0 or MIT files and a NOTICE in each repo; confirm per repo before redistributing, per AGENTS.md). The latest ArtCraft release lists macOS and Windows builds only; the Craft Launcher advertises Linux (deb, rpm, Flatpak, AppImage) but arm64 is unverified. | For each app: confirm the license files and clean-room claims, build from source on aarch64, check that its GPU path runs on the Honeykrisp Vulkan driver, open real Office and Adobe files, and benchmark startup time, memory and responsiveness against LibreOffice, GIMP, Krita and Inkscape with mseries/benchmarks/. Record which ones are usable before packaging any. |
Requested; not started |
| P3 | Fixed 2026-10-14 (setting applied), owner to confirm. Requested 2026-10-14: window buttons should sit together on the left, Mac style (close, minimize, maximize). Today only Close is on the left; minimize and maximize are on the right (org.gnome.desktop.wm.preferences button-layout is close:minimize,maximize, set in mseries/apply-desktop-settings.py). |
Change the layout to close,minimize,maximize: in apply-desktop-settings.py, apply it to the running session, then check Pantheon title bars in Gala and the elementary apps (Files, Photos, Mail, Code, Terminal) and the dark and light themes. Confirm the order and spacing on the M1 Pro. |
Fixed 2026-10-14; owner to confirm |
| P1 | Fixed live 2026-10-14; owner to confirm. Reported 2026-10-14: the screen keeps dimming. Cause: ambient-enabled was true, so the light sensor kept adjusting the backlight; idle-dim was already off. |
ambient-enabled and idle-dim set to false live and in apply-desktop-settings.py. If it dims again, check /sys/class/backlight/apple-panel-bl/brightness over time and the 15-minute idle-delay blank. |
Fixed; confirm |
| P2 | Fixed and confirmed 2026-10-15 (check at 14:46:11: no helper entries since 14:25, across the 14:33 and 14:43 marks). Authentication helper started about every ten minutes. Cause (captured with dbus-monitor at 14:23:17): netusage.py ran resolvectl show-cache, which asks polkit for org.freedesktop.resolve1.dump-cache with user interaction allowed; the rule from 2026-10-14 only covered subscribe-query-results. |
Added --no-ask-password to that call and dump-cache (read-only) to 49-mseries-netusage.rules; both installed with netspeed/netusage/install.sh and the cache read now works without a prompt. Check journalctl -b -t polkit-agent-helper-1 --since '30 min ago' stays empty past 14:33 and 14:43. |
Fixed and confirmed 2026-10-15 (owner's journal check: no helper entries since 14:25) |
| P3 | user@109 (greeter) stop timeout: the greeter panel D-Bus-activates obexd, which hangs at logout waiting on Evolution services (journal 15:47 and 16:33). |
mseries/install-greeter-obex-fix.sh installs /etc/systemd/user/obex.service.d/10-mseries-greeter.conf (TimeoutStopSec=2s); tested in a temporary root. |
Fix written, not installed (needs sudo); confirm no user@109 failure after the next login |
| P2 | Requested 2026-10-14: a Siri-like, Whisper-like speech-to-text that works universally across the system. | (1) Confirm the built-in mic captures usable audio (port the Asahi mic mapping, see ROADMAP parity item 3). (2) Benchmark whisper.cpp (and a distilled/small model) on this M1 Pro: CPU vs Vulkan on Honeykrisp, latency per second of speech, memory next to the local LLM service. (3) Prototype a push-to-talk hotkey that records, transcribes locally and inserts text into the focused field via an IBus engine; test GTK4/GTK3, Qt, Electron/Chromium (Brave), Terminal and Pantheon apps, on Wayland and X11. (4) Add a visible recording indicator and a hard off switch; no audio stored by default. (5) Later: wake word and voice commands using the existing local-AI stack. Record each model's license before packaging. | Requested; not started |
| P2 | Reported 2026-10-14: phone tether internet bug (details not yet given). Observed: the iPhone/phone USB tether (cdc_ncm, MAC f8:e4:3b:0f:f5:0e, enxf8e43b0ff50e) was the internet link from 15:47 while Wi-Fi was down. At 17:39:26 the kernel logged usb 2-1: USB disconnect and NetworkManager marked the device unmanaged, then logged a cancelled DHCP transaction and "no lease". The interface was named eth0 then renamed at each plug. Wi-Fi (Verizon_9R3BH7) is now the route; ping to 1.1.1.1 averaged 289 ms (max 745 ms), which is jittery. |
Get the owner's exact symptom (no connection, drops, slow, no auto-reconnect, tether never appears). Reproduce with replug and with the phone locked; check whether NetworkManager keeps one persistent profile bound to the adapter's MAC (as for Dock Ethernet), whether USB autosuspend or the Type-C port power cycles it, and whether Wi-Fi and tether fail over cleanly. Test with mseries/test-wifi-resume.py-style mocks for any policy added. |
Reported; needs details |
| P2 | Requested 2026-10-14: the lowest brightness should be virtually off. Investigated 2026-10-16: the floor was Mutter's MAX(1, max/100) = 5 of 500 nits, not hardware; the DCP driver treats 0-2 nits as the same lowest DAC setting (2 nits), and a 5% key step was 25 nits. Omarchy Mac/omarchy-mx-mac use brightnessctl with the same 1% floor and have no sub-floor code. |
Implemented in the repo, not yet installed or looked at on the panel: mseries-brightness writes apple-panel-bl through logind SetBrightness (floor 2 nits), keys walk a 25-value perceptual ladder (2, 3, 4, 5, 7, 10, 13 ...) and, with the patched Gala, four software steps below 2 nits (patches/gala-screen-dim.patch), and the Quick Settings slider uses the same curve (ScreenBrightness.vala, typechecked with valac only). Next: owner installs, looks at 2-3 nits in a dark room. If still too bright, a Gala dim layer or gamma LUT below 2 nits; watch Asahi #499 (stuck brightness states) and iDAC out of range DCP logs. |
Implemented; patched Gala + slider installed, load at next login; needs owner look. Full investigation, test protocol and roadmap BR-01..BR-21: BRIGHTNESS.md |
| P3 | Requested 2026-10-14: a True Tone-like experience, where the display white point follows ambient light so paper-white content looks neutral in warm or cool rooms. | Check whether the ambient light sensor exposes colour channels (today: lux only, in_illuminance_input; the aop-sensors-las device is separate). If not, prototype a lux-and-time-of-day colour-temperature curve applied through GNOME's colour plugin / Mutter night light with slow easing (no flicker on lid or screen changes), a Quick Settings toggle, and a hard off. Measure colour accuracy with a colorimeter if available, check the Display P3 ICC profile interaction, and keep it independent of brightness automation (ambient auto-brightness is deliberately off). Record sensor limits honestly; do not call lux-based tinting True Tone. |
Requested; not started |
| P2 | Wingpanel can crash in PanelWindow.on_realize and Gala respawns it. | Capture the exact upstream version and logs, then report or patch the upstream Wingpanel failure. | Known upstream issue |
| P1 | The factory arm64 ISO built successfully but has not been booted on hardware. | Independently verify the installer checksum, qualify the kernel and boot path, and complete hardware post-boot checks before a stable release. | Validation blocker |
| P2 | The installed desktop guide has not yet confirmed physical display-brightness key presses and persistence after a fresh login, although the Mutter backlight and OSD calls succeed. | Verify both keys and the selected level after logout/login; record the exact result. | Needs owner check |
| P2 | Ambient keyboard lighting has a successful sensor/API check, but lock/lid transitions and suspend/resume are not qualified. | Verify that the helper leaves the light alone while locked or closed, then resumes safely after unlock/open and suspend. | Needs interactive check |
| P2 | The transformed desktop can play through the Apple speaker safety/DSP chain using packages already available in Ubuntu resolute, but the factory image does not install them or the matching PipeWire LV2 plugin. Correction 2026-10-13: Ubuntu does ship that plugin, in libspa-0.2-modules-extra, so it can be installed rather than built; untested with the Asahi chain. AVD firmware and its VA-API bridge are also absent. |
Package the tested audio chain into the Ubuntu image without bypassing speakersafetyd; separately identify compatible AVD kernel, firmware, userspace sources, and licensing. | Image packaging gap |
| P2 | Wi-Fi firmware provisioning and resume recovery are present in the image layer but lack a fresh end-to-end test on an M1 Pro booted from that image. | Confirm firmware source, connect, suspend/resume repeatedly, and capture service/kernel logs from the factory image. | Needs image test |
| P2 | App corners do not yet match the MacBook Pro's built-in panel curve. The user-session override had a 20 logical px display mask and a 12 logical px Gala window clip, while the GTK CSD theme used 20 px. On 2026-10-22 the Gala clip override was changed to 20 px and the systemd user manager was reloaded; it applies next Gala session. The source now uses a continuous n=4 superellipse approximation for the screen mask and Gala window clip. The physical panel and curve have not been visually checked. | Compare a clean full-screen capture against the panel edge and calibrate one logical-pixel radius and continuous curve for the built-in display, GTK CSD, and Gala clipping. Qualify native GTK, libadwaita, third-party windows, maximized/fullscreen windows, dialogs, popovers, shadows and external monitors. Keep the desktop usable at the panel edge and leave external displays square. Apple HIG does not prescribe one numeric radius for every app window and distinguishes continuous from circular corner styles: Windows, UICornerCurve.continuous. | Shared continuous curve approximation added; hardware qualification open. 2026-10-27: the Rust compositor now clips every window to the display curve (rebased PR #555: window clip shader, hug-the-display rule, popups, panels, external outputs square) and draws the screen mask from the same tokens, replacing the provisional mask; one radius (corners.screen, now 20 like the earlier session overrides) drives both, PANTHEON_SCREEN_CORNER_RADIUS still overrides it. Not installed; needs visual calibration on the built-in display |
| P2 | The blue and red palette still feels harsh in use, especially for accents and error/destructive states, despite the existing softened GTK overrides. Current overrides do not necessarily reach every app or toolkit. | Review the reds and blues on the M1 Pro display and move them toward a calmer pastel treatment where appropriate. Apply through shared theme/system settings so native and installed apps follow when supported; check text and icon contrast, selection/focus visibility, and error/warning/success distinction. Record toolkit-specific exceptions rather than assuming one GTK stylesheet covers every app. | New; needs palette review |
| P2 | The network usage/speed readouts in the network menu and panel do not always recover correctly when Ethernet is present across suspend/resume or reboot. | Reproduce separately for suspend/resume and reboot with Ethernet connected. Compare the network indicator and panel readout with interface counters before sleep, immediately after wake/startup, and after the interface settles; inspect sampling timer/baseline resets and interface re-enumeration. Verify both displayed rates and the history graph recover without stale spikes or a panel restart. | New; needs reproduction |
| P2 | The network speed readout gives no visual cue when traffic is approaching a saturated link. The owner wants a muted pastel red-orange hue at that point. Current counters aggregate physical-interface throughput but do not determine link capacity or upstream service congestion. | Define “saturated” in measurable terms (for example, sustained utilization near the negotiated interface rate, with a short hold and hysteresis to prevent flicker). Decide whether the cue applies per-interface or to the aggregate readout, then test on Wi-Fi and Ethernet. Use a soft red-orange that remains legible and distinguishable from error states; document that interface utilization cannot by itself prove an ISP/WAN bottleneck. | New; needs saturation definition |
| P2 | The signal strength dropdown does not look native to the elementary desktop and feels too limited in its current form. | Review the existing dropdown against elementary's native panel/menu patterns, then expand the information and actions it offers while retaining the system's visual hierarchy and accessibility. Capture a screenshot and interaction notes before changing it. | Owner reported; needs design/reproduction |
| P2 | The owner reports a bug in the Tasks app; the affected behavior and reproduction steps have not yet been specified. | Capture the failing task flow, expected result, actual result, app/package version, and a reproducible sequence before selecting a fix. | Owner reported; needs details |
| P2 | The owner reports a bug in Energy Monitor; the affected behavior and reproduction steps have not yet been specified. | Capture the failing energy-monitor flow, expected result, actual result, app/package version, and a reproducible sequence before selecting a fix. | Owner reported; needs details |
| P2 | Touch ID on the M1 Pro is not verified for passkey/WebAuthn user verification in this elementary Linux install. Touch ID should be treated as local user verification for a passkey flow, not assumed to be the passkey authenticator itself. | Track the required SEP/Touch ID driver and supported Linux authentication/browser integration. When available, verify passkey creation and sign-in on M1 Pro and retain password/recovery fallback. | Owner requested; hardware support unverified |
| P2 | Successful authentication is not remembered for a configurable period, causing repeated prompts. The duration and reauthentication policy are not yet defined. | Specify the remembered-auth scope and allowed duration, plus expiry behavior after idle, lock, suspend, and sensitive actions. Verify that expiry requires fresh verification and that no passkey secret or signature check is bypassed. | Owner requested; policy to define |
The current Apple Silicon behavior reference is omacom/omarchy-mac-pkgs, audited at main commit 222f7a8599bbdd287ac6a95362cd51c5b024baae. Its packages target Arch Linux. This project should translate relevant behavior into Ubuntu, mkosi, systemd, and Pantheon/Gala; it must not import Arch package scripts or hooks. Apple-specific changes to those packages remain in that repository, general Omarchy changes go upstream, and one-shot installation belongs in the Omarchy Mac installer.