Platform support
macOS on Apple silicon, and nothing else, for now.
| Platform | Supported | What happens |
|---|---|---|
| macOS 14 or later, Apple silicon | Yes | Everything works. |
| An older macOS, Apple silicon | Without calendar changes | The EventKit helper needs macOS 14, so setup.sh warns and Edward runs without it: he can read Calendar and Reminders but not change them. |
| Intel Macs, or a Rosetta (x86_64) shell | No | setup.sh stops before installing anything. |
| Linux, Windows (WSL) | No | setup.sh stops on anything but macOS. |
| Docker | No | The backend runs natively on macOS, never in a container. |
The March 2026 release described Linux and WSL as mostly working. This release does not: Edward’s own computer, his listeners and his follow-through all lean on macOS now.
Why Apple silicon
Edward’s memory search uses a small local embedding model through sentence-transformers, which pulls in PyTorch. The pinned PyTorch (in backend/constraints.txt) publishes no x86_64 macOS wheel, so setup.sh stops on an Intel Mac, in a Rosetta shell, or with an x86_64 Python. That pin, not the Swift helpers, is what an Intel port would have to change.
Why macOS
- His shell is sandboxed by Seatbelt (
sandbox-exec). Without it thebashtool fails closed rather than running unsandboxed. - He reads Apple’s own databases: Messages’
chat.db, Mail’s Envelope Index, the Calendar and Reminders stores, Contacts. He sends iMessages through AppleScript and changes your calendar through EventKit. - launchd keeps him running, and the macOS privacy grants (Full Disk Access, Automation, Calendars) decide what he may read.
- His media handling uses macOS tools (
sips,afconvert,avconvert) and a Swift helper, not ffmpeg.
What a port would take
A port is a project, not a setting. The macOS seams are marked ADAPT: in the code and collected in Adapting to your Mac, which has prompts for an AI assistant for the two pieces a Linux port would start with:
- A sandbox for the
bashtool first (bubblewrap or firejail), rendered from the same rails table as the macOS profile and failing closed in the same way. - systemd units in place of the LaunchAgents, with the same options as
scripts/install-launchagents.sh.
Everything that reads an Apple app (iMessage, Mail, Calendar, Reminders, Contacts, the screen) already degrades with an honest error when it can’t, so a port could leave those off.
Where the other pieces run
- Your phone: the app is a PWA, so any modern phone browser works, over HTTPS (see Quick start).
- The household hub: any browser in kiosk mode on
/hub; the reference install used a Raspberry Pi with a 7″ touchscreen (pi-hub-setup.md). - The iPhone widget: the Scriptable app.
- Hands in your browser: Google Chrome with the unpacked Edward extension, on the same Mac.