Platform support

macOS on Apple silicon, and nothing else, for now.

PlatformSupportedWhat happens
macOS 14 or later, Apple siliconYesEverything works.
An older macOS, Apple siliconWithout calendar changesThe 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) shellNosetup.sh stops before installing anything.
Linux, Windows (WSL)Nosetup.sh stops on anything but macOS.
DockerNoThe 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 the bash tool 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:

  1. A sandbox for the bash tool first (bubblewrap or firejail), rendered from the same rails table as the macOS profile and failing closed in the same way.
  2. 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.