iOS Shortcuts
Capture events from your iPhone by POSTing JSON to Trove's HTTP ingest module. Shortcuts are a client of the generic ingest endpoint — not a Trove module.
Prerequisites
- Build Trove and configure
[modules].paths— see Quick Start. - HTTP gateway listening on
[http].listen(default:8080in coretrove.toml). Ingest routes are declared in the http-ingest module manifest. - Your phone can reach the ingest URL (local network, Tailscale, or HTTPS on the public internet).
Import a Shortcut
Signed .shortcut files live in
examples/ios-shortcuts/signed/.
A maintainer signs them on a Mac with iCloud signed in and commits them to the
repo (hosted CI cannot sign).
| Shortcut | Use |
|---|---|
| Trove Share Sheet | Share URLs, text, or images from any app |
| Trove Quick Note | Dictate or type a quick note |
| Trove URL Bookmark | Save a URL from Safari |
| Trove Location Check-in | Log current location with optional label |
If a link 404s, signed files have not been committed yet. Use the unsigned shortcuts in
unsigned/(regenerated bypython3 examples/ios-shortcuts/generate_unsigned.py) or follow the manual recipes below. Unsigned files are the canonical path for development and CI; signed imports require a maintainer Mac with iCloud.
To import:
- Open a
.shortcutfile on your iPhone (AirDrop, Files, or Safari). - Tap Add Shortcut.
- Enter your Trove ingest URL when prompted, e.g.
https://trove.example.com/ingest/shortcuts(full path, HTTPS on cellular). - Run the Shortcut once to verify, then enable Share Sheet or other triggers.
Endpoint contract
POST https://<host>/ingest/shortcuts
Content-Type: application/json
{ ... }
- The
:sourcepath segment (shortcuts) becomes the eventsourcefield. - Body must be valid JSON (object, array, or primitive).
- Optional top-level fields peeled into event metadata:
type,time(RFC3339),blob_ref. Everything else stays inpayload. - Default event
typeif omitted:trove://type/http/ingest/received/1. - Success:
204 No Content.
Network and auth
By default HTTP ingest has no authentication. When [http.auth].validator is
set (e.g. module.http-gateway.bearer), add an Authorization header with
Bearer <token> to ingest and blob requests. See
network auth planning. For a home server, common setups are:
- Local network —
http://192.168.x.x:8080/ingest/shortcuts(Wi‑Fi only; Shortcuts may block plain HTTP on cellular). - Tailscale — HTTPS via your tailnet hostname (recommended for phone capture).
- Public HTTPS — reverse proxy with TLS in front of
:8080.
See network auth planning for auth options once exposing beyond a trusted tailnet.
Photo attachments
For images and other binary content from the share sheet:
PUT https://<host>/blobswith raw image bytes → receive{ "blob_ref": "sha256-..." }POST https://<host>/ingest/shortcutswith JSON includingblob_refand metadata (type,title,content_type, etc.)
Binary content must not be inlined in the ingest JSON body.
Share Sheet with photo
- Trigger: Share Sheet (enable URLs, text, images).
- If Shortcut Input is an image:
- Get Contents of URL — Method PUT, URL
https://YOUR_HOST/blobs, Request Body: Shortcut Input. - Get Dictionary from Input (from response JSON) →
blob_ref.
- Get Contents of URL — Method PUT, URL
- Dictionary —
type:trove://type/shortcuts/share/saved/1, plusblob_ref(if image),text,url,title,content_typeas available. - Get Contents of URL — Method POST, URL
https://YOUR_HOST/ingest/shortcuts, HeadersContent-Type: application/json, Request Body: Dictionary.
Text-only and URL-only share captures skip step 2 and POST JSON directly (see below).
Event type conventions
Use explicit type values so MCP search can find captures later:
| Shortcut use | Suggested type |
Payload fields |
|---|---|---|
| Share sheet capture | trove://type/shortcuts/share/saved/1 |
title, url, text, content_type |
| Quick note / dictation | trove://type/shortcuts/note/created/1 |
text, optional tags[] |
| URL bookmark | trove://type/shortcuts/url/saved/1 |
url, title |
| Location check-in | trove://type/shortcuts/location/checked/1 |
latitude, longitude, label |
| Clipboard save | trove://type/shortcuts/clipboard/saved/1 |
text |
| Quick capture (classify later) | (via capture-classifier) | POST https://<host>/capture/shortcuts with arbitrary JSON body |
Example payloads: examples/ios-shortcuts/payloads/.
Quick capture (classify later)
Use the capture-classifier module when you want to store data before choosing a semantic type:
- Trigger: App icon or Siri.
- Ask for Input — multiline text.
- Dictionary —
text: Provided Input. - Get Contents of URL — Method POST, URL
https://YOUR_HOST/capture/shortcuts, HeadersContent-Type: application/json, Request Body: Dictionary.
Classify later via MCP classify_event or POST /classify.
Manual recipes
Build your own Shortcut if you prefer full control.
Share Sheet → Trove (text or URL)
- Trigger: Share Sheet (enable URLs, text, images).
- Dictionary —
type:trove://type/shortcuts/share/saved/1,text: Shortcut Input. - Get Contents of URL — Method POST, URL
https://YOUR_HOST/ingest/shortcuts, HeadersContent-Type: application/json, Request Body: Dictionary.
For images, use the photo flow above.
Quick Note
- Trigger: App icon or Siri.
- Ask for Input — multiline text.
- Dictionary —
type:trove://type/shortcuts/note/created/1,text: Provided Input. - Get Contents of URL — POST JSON body (Dictionary).
URL Bookmark
- Trigger: Share Sheet (Safari).
- Dictionary —
type:trove://type/shortcuts/url/saved/1,url: Shortcut Input. - Get Contents of URL — POST JSON body.
Location Check-in
- Trigger: App icon.
- Get Current Location.
- Ask for Input — optional label.
- Dictionary —
type:trove://type/shortcuts/location/checked/1, location fields. - Get Contents of URL — POST JSON body.
Limitations
- No authentication by default — enable
[http.auth].validatoror use localhost / a trusted tailnet. See network auth. - 10 MiB request body limit (
max_body_bytesin HTTP ingest manifest). - Photos in Share Sheet — use the photo flow; the importable Shortcut captures text/URL metadata by default.
Verify capture
curl -sS -o /dev/null -w "%{http_code}\n" \
-X POST "http://localhost:8080/ingest/shortcuts" \
-H "Content-Type: application/json" \
-d '{"type":"trove://type/shortcuts/note/created/1","text":"hello from curl"}'
# expect 204
Once MCP is connected, use search_events to find captured notes. The MCP query
server is Supported — see MCP query planning.
Next steps
- Quick Start — run
trovelocally - HTTP ingest planning — endpoint details
- examples/ios-shortcuts/ — payloads and maintainer docs