iOS 27 brings persistent Storage to Shortcuts (letting values survive between runs and sync across devices), three new automation triggers (screenshot, keyboard, notification), and an improved Use Model action with transcript inspection for debugging LLM outputs.
β’ New Storage feature persists values between shortcut runs and syncs across devices, supporting all Shortcuts types including App Entities
β’ Three new automation triggers added: screenshot saved, external keyboard connected/disconnected, and notification received from a specific app
β’ Use Model action gains access to newer, more capable Apple Intelligence models with optional web access
β’ Use Model output now exposes a Transcript property for debugging exactly what data was passed to the model
β’ Storage lets shortcuts persist and accumulate data (counters, history, entity lists) across runs and sync via iCloud β unlocking stateful automations without a companion app
β’ The notification automation trigger lets users build powerful automations from your app's push notifications, so well-crafted notification copy directly enables user automation
β’ Use Model transcript inspection means developers can debug exactly what App Entity properties the LLM saw, making it easy to iterate on entity property exposure for better AI-driven shortcut actions
Demonstrates how to expose an App Entity with stable cross-device identifiers and rich properties (including ingredients) so Shortcuts Storage and the Use Model action can persist and reason about it correctly across devices.
import AppIntents
// MARK: - Stable, cross-device Soup entity
struct SoupEntity: AppEntity {
// Use the server's database row ID so the same soup is
// recognized identically on iPhone, iPad, and Mac.
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Soup")
static var defaultQuery = SoupQuery()
var id: String // e.g. "soup-db-00142"
var name: String
var isAvailableToday: Bool
var ingredients: [String] // e.g. ["chili pepper β 8g", "lemongrass β 4g"]
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(
title: "\(name)",
subtitle: isAvailableToday ? "Available today" : "Not available"
)
}
}
// MARK: - Query backed by the online database
struct SoupQuery: EntityQuery {
func entities(for identifiers: [String]) async throws -> [SoupEntity] {
// Fetch by stable DB row IDs β same result on every device
return try await SoupDatabase.shared.fetchSoups(ids: identifiers)
}
func suggestedEntities() async throws -> [SoupEntity] {
return try await SoupDatabase.shared.fetchTodaysSoups()
}
}
// MARK: - Find Soups action (feeds Use Model action)
struct FindSoupsIntent: AppIntent {
static var title: LocalizedStringResource = "Find Soups"
static var description = IntentDescription("Returns soups available in Soup Chef.")
@Parameter(title: "Available Today Only", default: true)
var availableTodayOnly: Bool
func perform() async throws -> some ReturnsValue<[SoupEntity]> {
let soups = try await SoupDatabase.shared.fetchTodaysSoups()
let filtered = availableTodayOnly ? soups.filter { $0.isAvailableToday } : soups
return .result(value: filtered)
}
}
// MARK: - Order Soup action
struct OrderSoupIntent: AppIntent {
static var title: LocalizedStringResource = "Order Soup"
@Parameter(title: "Soup")
var soup: SoupEntity
static var parameterSummary: some ParameterSummary {
Summary("Order \(\.$soup)")
}
func perform() async throws -> some ProvidesDialog {
try await SoupDatabase.shared.placeOrder(soupId: soup.id)
return .result(dialog: "Your \(soup.name) is on its way!")
}
}
// MARK: - Minimal stub so the file compiles
final class SoupDatabase {
static let shared = SoupDatabase()
func fetchSoups(ids: [String]) async throws -> [SoupEntity] { [] }
func fetchTodaysSoups() async throws -> [SoupEntity] { [] }
func placeOrder(soupId: String) async throws {}
}Stored App Entities must use stable, cross-device identifiers (e.g. a server database row ID) β not ephemeral local identifiers that differ per device. The Use Model action is designed to be deterministic by default; use Storage to feed previous outputs back in if you want varied results. Transcript inspection requires adding a Show Content action temporarily during development.
Use Model action with web access and more capable models requires Apple Intelligence-capable devices
More iOS 27 APIs land every week.
Get notified when new capabilities are published β no noise, just signal.