Shortcuts Integration

Build Apple Shortcuts actions that interact with Elysium. Query schedules, create items, and automate workflows across apps.

Overview

Elysium exposes its functionality to Apple Shortcuts through App Intents. Users can build automations that span multiple apps—trigger Elysium actions from other apps, or use Elysium data in complex workflows.

As a plugin developer, you can extend Elysium's Shortcuts capabilities by registering your own intents that appear alongside the built-in actions.

Built-in Shortcuts Actions

Elysium includes these actions out of the box:

Get Schedule Items

Query items by type, date range, tags, or status

Create Item

Add new tasks, events, habits, or other item types

Update Item

Modify existing items—change status, dates, or properties

Get Today's Schedule

Retrieve all items scheduled for today

Complete Task

Mark a task as done with optional completion time

Log Habit

Record a habit completion for today

Creating Custom Shortcuts Actions

Plugins can register App Intents that appear in the Shortcuts app alongside Elysium's built-in actions.

import AppIntents
import ElysiumPluginKit

struct SyncToExternalServiceIntent: AppIntent {
    static var title: LocalizedStringResource = "Sync to External Service"
    static var description = IntentDescription("Syncs selected items to your external service")

    @Parameter(title: "Items")
    var items: [ScheduleItemEntity]

    func perform() async throws -> some IntentResult {
        for item in items {
            try await ExternalService.sync(item)
        }
        return .result(value: "Synced \(items.count) items")
    }
}

// Register in your plugin's onLoad()
func onLoad() {
    registerShortcutsIntent(SyncToExternalServiceIntent.self)
}

Intent Parameters

Elysium provides entity types you can use as parameters in your intents:

ScheduleItemEntity

Represents any schedule item (task, goal, event, etc.)

@Parameter(title: "Item")
var item: ScheduleItemEntity

// Access properties
let title = item.title
let type = item.type
let status = item.status

ItemTypeEntity

Represents an item type (task, goal, habit, etc.)

@Parameter(title: "Type")
var itemType: ItemTypeEntity

// Filter by type
let items = schedule.items(ofType: itemType.value)

TagEntity

Represents a tag used for filtering items

@Parameter(title: "Tag")
var tag: TagEntity

// Filter by tag
let items = schedule.items.filter { $0.tags.contains(tag.name) }

Returning Results

Your intents can return values that subsequent Shortcuts actions can use:

// Return a string
func perform() async throws -> some IntentResult {
    return .result(value: "Operation completed")
}

// Return schedule items (can be used in other Elysium actions)
func perform() async throws -> some IntentResult & ReturnsValue<[ScheduleItemEntity]> {
    let items = await fetchItems()
    return .result(value: items.map { ScheduleItemEntity($0) })
}

// Return with dialog
func perform() async throws -> some IntentResult & ProvidesDialog {
    return .result(
        value: "Synced",
        dialog: "Successfully synced 12 items to your service"
    )
}

Example Shortcuts

Here are some example Shortcuts users can build with Elysium:

Morning Briefing

Get today's schedule → Filter to tasks and appointments → Have Siri read them aloud

Quick Capture

Ask for input → Create task in Elysium → Show confirmation

Focus Mode Setup

Get current event → If type is “Deep Work” → Enable Focus Mode → Start Pomodoro timer

End of Day Review

Get today's completed tasks → Count them → Log to Health app → Show summary

Best Practices

Use Clear Names

Intent titles should be action-oriented and describe what happens: “Sync Items to Notion” not “Notion Sync”.

Provide Descriptions

Always include an IntentDescription so users understand what the action does before adding it.

Handle Errors Gracefully

Throw descriptive errors that help users understand what went wrong and how to fix it.

Support Siri

Add @Parameter(title:) with natural language titles so intents work well with voice.