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.statusItemTypeEntity
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.