Automations β make it autonomous without a custom app
Everything below drives one endpoint. iOS cannot read iMessage in the background (no API), so the autonomy ceiling differs by platform:
| Front-end | Autonomy | Source | Notes |
|---|---|---|---|
Mac collector (AGENT_MODE/AUTONOMOUS) |
Fully hands-off | iMessage | Needs an always-on Mac |
| iOS Shortcut | One gesture (you trigger it) | anything you share | No background reading possible |
| Android Tasker/MacroDroid | Hands-off | SMS/RCS/notifications | Not iMessage |
The /agent contract (what they all call)
POST {SPACE_URL}/agent with Authorization: Bearer <INGEST_TOKEN>:
// request β `thread` OR `messages` required; rest optional
{
"thread": "Room parent: picture day Thursday 9am\nMe: thanks",
"messages": [{"sender": "Room parent", "text": "picture day Thursday 9am"}],
"images": ["data:image/png;base64,..."], // a screenshot
"existing_ics": "<base64 .ics>", // optional, enables conflict checks
"now": "2026-06-05T10:00:00",
"push_gcal": false,
"return_ics": true
}
// response
{
"plan": { "events": [{"title":"Picture day","start":"2026-06-11T09:00:00", ...}],
"conflicts": [], "proposed_times": [], "reply_draft": "...", "needs_clarification": null },
"ics_base64": "<...>",
"gcal_links": []
}
(A) Mac collector β fully autonomous (iMessage)
Two equivalent ways; prefer the server-side switch so logic lives in one place:
- Server-side: run the Space with
AUTONOMOUS=1./ingestthen assembles a per-chat rolling thread, runs the agent, dedupes, and (if Google is configured) pushes events automatically. - Collector-side: run the collector with
AGENT_MODE=1β it POSTs/agent(withpush_gcal) instead of/ingest. Seecollector/collector.py.
# collector-side
cd collector && AGENT_MODE=1 python collector.py
(B) iOS Shortcut β one tap, no .ics import
- New Shortcut β accept Share Sheet input (Text and Images).
- Text β set variable
Thread. - Get Contents of URL β
https://<your-space>/agent, Method POST, HeaderAuthorization: Bearer <INGEST_TOKEN>, Request Body JSON:{ "thread": Thread, "now": <Current Date, ISO 8601> }(To send a screenshot instead: Base64-encode the shared image intoimages.) - Get Dictionary Value
plan.eventsfrom the response. - Repeat with Each β Add New Event (Calendar): Title =
title, Start =start, End =end, Location =location, Notes =notes.
Now sharing a thread/screenshot to the Shortcut adds the events to Apple Calendar in one tap β no
file download, no import. (Optional: read back plan.conflicts and show an alert.)
(C) Android β Tasker / MacroDroid (SMS/RCS)
- Trigger: Event β Received Text (SMS), or a Notification trigger for your messaging app.
- Action: HTTP Request β POST
https://<your-space>/agent, headerAuthorization: Bearer <INGEST_TOKEN>, body{ "thread": "%astext", "now": "%DATE..." }. - Parse
plan.events(JSON Read) β for each, Insert Calendar Event (Tasker writes viaCalendarContract).
Because Android can read SMS/RCS and run in the background, this path is genuinely autonomous.
Roadmap β a native app
- Android: a real app using a Notification Listener /
READ_SMS, on-device Gemma E4B via llama.cpp/MLC (see on-device.md), writing events through the Calendar provider β the same/agentcontract or fully local. Feasible and fully autonomous. - iOS: no background message or LLM-server access β the Shortcut above is the ceiling. An autonomous iOS iMessage app is not possible; we won't promise one.