Events that have an inverse (monitor connected/disconnected, app launched/quit) can now be configured with actions for both states in the same rule.

The debounce/throttle mechanism now also takes the inverse into account, and only fires the action when the event settles on one of the states.

{recordingApp}, {recordingApps},
{recordingAppBundleID},
{recordingAppBundleIDs}, and {isInUse} for use
in scripts, notifications, and URLs{messageReceiver} variable. "Message Sent" matches against
the receiver by default.{connectionState} variable
("connected" or "disconnected") so you can handle both in one rule.Resource usage triggers: 6 new trigger types for
monitoring system resources using native macOS APIs (Mach kernel, IOKit,
proc_pidinfo)
Spotlight trigger: monitor files system-wide using live Spotlight queries — all matching runs in the Spotlight daemon, not in Crank
App not responding detection: two new sub-events for the Application trigger
Audio trigger: react to audio device changes using CoreAudio property listeners (no polling)
{deviceName} so actions can match or reference
the specific deviceApp Windows trigger: monitor window lifecycle events across all apps using the Accessibility API
{windowTitle}, {appName},
{bundleID}, {windowBoundsX},
{windowBoundsY}, {windowBoundsWidth},
{windowBoundsHeight}Webhook trigger: subscribe to ntfy.sh topics and fire when a message arrives
{ntfyMessage}, {ntfyTitle},
{ntfyTopic}, {ntfyPriority},
{ntfyTags}Privacy trigger: detect when macOS privacy indicators are active by reading the Control Center menu bar icon's accessibility label (replaces the old Camera trigger)
{privacyIndicator} with the indicator name
(Camera, Microphone, Screen Recording, or Location)LAN trigger: detect Ethernet cable
connect/disconnect using SCDynamicStore link state
monitoring
{interface} with the BSD interface name (e.g.
en0)Visual Change trigger: fire when a Pipiri PiP window detects that the captured content has changed or gone idle
{bundleID}, {windowID}, and
{windowTitle} template variablesProcess trigger: watch any process, not just
.app bundles
coreaudiod,
Dock, mds_stores) using the standard text
condition{processName}, {processPath}, and
{pid} template variablesproc_listallpids/proc_pidpathNotifications trigger (macOS 15+): fires on any incoming notification
{appName}, {bundleID},
{notificationTitle}, {notificationSubtitle},
{notificationBody}Messages trigger: iMessage and SMS, incoming and outgoing
{messageSender}, {messageText},
{messageService}, {isFromMe},
{messageAttachments}Mail trigger: fires when Apple Mail receives an email
{mailSubject},
{mailSenderAddress}, {mailSenderName},
{mailBody}, {mailToAddress},
{mailAttachments}Volume trigger: fires when an external drive or disk image is mounted or unmounted
NSWorkspace.didMountNotification /
didUnmountNotification, no polling{volumeName} and {volumePath}
template variablesPeriodic task trigger: fire on a cron schedule using standard 5-field expressions (minute, hour, day-of-month, month, day-of-week)
*, */N steps, N-M
ranges, and N,M lists{hour} and {minute}Boot trigger: fires once after system boot if Crank launches within 5 minutes of startup
ProcessInfo.systemUptime on startRule profiles: organize rules into named profiles (e.g. "Work", "Home") and switch between them from the toolbar or menu bar
Gemini API key stored in Keychain: the API key is now saved in the macOS Keychain instead of UserDefaults; existing keys are migrated automatically on launch
{isDarkMode} and {appearanceName}
template variables for actions0 triggers the event, non-zero skips itkey=value lines are parsed into template
variables available in actionsx secondshttps://crank.lowtechguys.com/rule/… URLs that redirect to
the crank:// scheme, making them shareable on platforms
that don't allow custom URL schemes/opt/homebrew/bin, ~/.local/bin,
~/.cargo/bin, etc.) so tools installed via Homebrew or
Cargo are found reliablyInitial release