Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.prism.byescaleira.com/llms.txt

Use this file to discover all available pages before exploring further.

Platform Services

PrismCapabilities wraps Apple’s platform frameworks into type-safe, Sendable APIs. Manage in-app purchases, sync data to iCloud, build widgets, schedule notifications, and integrate with Siri Shortcuts.

StoreKit — In-App Purchases

PrismStoreKit wraps StoreKit 2 for managing products, purchases, and subscriptions:
Fetch Products
import PrismCapabilities

let store = PrismStoreKit()

let products = try await store.fetchProducts(
    ids: ["com.app.premium", "com.app.credits.100"]
)

for product in products {
    print("\(product.displayName)\(product.price)")
    print("Type: \(product.type)")  // .nonConsumable, .autoRenewable, etc.
}

Purchase Flow

Purchase a Product
let transaction = try await store.purchase(productID: "com.app.premium")

print("Transaction ID: \(transaction.id)")
print("Purchased: \(transaction.productID)")
print("Date: \(transaction.purchaseDate)")

if let expiration = transaction.expirationDate {
    print("Expires: \(expiration)")
}

Product Types

TypeDescription
.consumableCan be purchased multiple times (credits, coins)
.nonConsumableOne-time purchase (remove ads, unlock feature)
.autoRenewableSubscription that renews automatically
.nonRenewableSubscription that does not auto-renew

Transaction Monitoring

Listen for Transactions
for await transaction in store.transactionUpdates {
    if transaction.revocationDate != nil {
        print("Purchase revoked: \(transaction.productID)")
    }
}

CloudKit

PrismCloudKit provides CRUD operations on CloudKit records:
CloudKit CRUD
let cloud = PrismCloudKit()

// Check account status
let status = try await cloud.accountStatus()
// .available, .noAccount, .restricted, .couldNotDetermine, .temporarilyUnavailable

// Save a record
let record = PrismCloudRecord(
    id: UUID().uuidString,
    recordType: "Note",
    fields: [
        "title": .string("Meeting Notes"),
        "content": .string("Discuss Q3 roadmap"),
        "priority": .int(1),
        "createdAt": .date(.now)
    ]
)

try await cloud.save(record, database: .privateDB)

Cloud Value Types

TypeSwift Mapping
.string(String)Text fields
.int(Int)Integer fields
.double(Double)Decimal fields
.data(Data)Binary data
.date(Date)Timestamps
.reference(String)Record references
.stringArray([String])List of strings

Query Records

Query CloudKit
let notes = try await cloud.query(
    recordType: "Note",
    predicate: "priority > 0",
    database: .privateDB
)

for note in notes {
    if case .string(let title) = note.fields["title"] {
        print(title)
    }
}

Databases

DatabaseDescription
.publicDBShared across all users
.privateDBPrivate to the signed-in iCloud user
.sharedDBShared via CloudKit Sharing

WidgetKit

PrismWidgetKit manages widget timeline reloads and configuration:
Reload Widgets
let widgets = PrismWidgetKit()

// Reload all timelines
await widgets.reloadAllTimelines()

// Reload a specific widget kind
await widgets.reloadTimelines(ofKind: "StatsWidget")

Widget Families

FamilyDescription
.systemSmallSmall home screen widget
.systemMediumMedium home screen widget
.systemLargeLarge home screen widget
.systemExtraLargeExtra large (iPad)
.accessoryCircularLock screen circular
.accessoryRectangularLock screen rectangular
.accessoryInlineLock screen inline text

Timeline Entries

Widget Timeline Entry
let entry = PrismWidgetEntry(
    date: .now,
    relevance: 0.8,
    displayName: "Daily Summary"
)

Reload Policies

PolicyBehavior
.atEndReload after the last entry
.afterMinutes(Int)Reload after N minutes
.neverManual reload only

Push Notifications

PrismPushNotifications manages notification permissions, scheduling, and content:
Request Notification Permission
let notifications = PrismPushNotifications()

let granted = try await notifications.requestAuthorization(
    options: [.alert, .badge, .sound]
)

Schedule a Local Notification

Schedule Notification
let content = PrismNotificationContent(
    title: "Reminder",
    body: "Don't forget to check your tasks!",
    subtitle: "Task Manager",
    badge: 1,
    sound: .default_,
    categoryIdentifier: "REMINDER",
    userInfo: ["screen": "tasks"]
)

try await notifications.schedule(
    content: content,
    trigger: .timeInterval(seconds: 3600, repeats: false)
)

Permission Status

StatusDescription
.notDeterminedUser hasn’t been asked yet
.deniedUser denied notifications
.authorizedFull notification access
.provisionalQuiet notifications (no prompt)
.ephemeralApp Clip temporary access

Sounds

SoundUsage
.default_System default notification sound
.named(String)Custom sound file from bundle
.criticalCritical alert (bypasses Do Not Disturb)

App Intents

PrismAppIntentClient integrates with App Intents for Siri Shortcuts and the Shortcuts app:
App Intent
let intents = PrismAppIntentClient()

// Register a custom intent
intents.register(
    title: "Check Balance",
    description: "Shows your current account balance"
) { parameters in
    let balance = await fetchBalance()
    return "Your balance is $\(balance)"
}

App Clips

PrismAppClip handles App Clip lifecycle and invocation:
App Clip
let clip = PrismAppClip()

// Get the invocation URL
if let url = clip.invocationURL {
    print("Launched from: \(url)")
}

// Check if running as App Clip
if clip.isAppClip {
    // Show streamlined experience
}
App Clips must be under 15 MB. Use PrismAppClip to detect the App Clip context and show a focused UI.