The lid angle sensor is read in the background, so it no longer competes with the keyboard for the internal sensor connection
The live "Current" reading in rule settings refreshes only while its window is visible, instead of continuously even when the window is closed or hidden
rm -rf of many files would only fire once,
batch downloads would lose entries, multiple notifications/messages
within the same window were dropped); the throttle is now keyed by event
identity so different paths, processes, messages, and devices fire
independentlyfileEvent
template variable holding the resolved kindisFile and isDir
template variables alongside the existing file name and pathEvents 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 reliablyDownload Crank 1.0.0 → Initial release