Apple Notes Observability
Monitoring Script
#!/bin/bash
# scripts/notes-health-check.sh — Run via cron or launchd
LOG_FILE="/tmp/notes-health.log"
timestamp=$(date -Iseconds)
notes_running=$(pgrep -x Notes > /dev/null && echo "true" || echo "false")
note_count=$(osascript -l JavaScript -e "Application(\"Notes\").defaultAccount.notes.length" 2>/dev/null || echo "0")
folder_count=$(osascript -l JavaScript -e "Application(\"Notes\").defaultAccount.folders.length" 2>/dev/null || echo "0")
echo "{\"timestamp\":\"$timestamp\",\"running\":$notes_running,\"notes\":$note_count,\"folders\":$folder_count}" >> "$LOG_FILE"
# Alert if Notes not running
if [ "$notes_running" = "false" ]; then
osascript -e "display notification \"Notes.app is not running\" with title \"Notes Health Alert\""
fi
Metrics Collection
// src/observability/metrics.ts
interface NotesMetrics {
timestamp: string;
noteCount: number;
folderCount: number;
accountCount: number;
latencyMs: number;
healthy: boolean;
}
function collectMetrics(): NotesMetrics {
const start = Date.now();
try {
const output = execSync("osascript -l JavaScript -e \"JSON.stringify({notes: Application(\\\"Notes\\\").defaultAccount.notes.length, folders: Application(\\\"Notes\\\").defaultAccount.folders.length, accounts: Application(\\\"Notes\\\").accounts().length})\"", { encoding: "utf8" });
const data = JSON.parse(output);
return { timestamp: new Date().toISOString(), noteCount: data.notes, folderCount: data.folders, accountCount: data.accounts, latencyMs: Date.now() - start, healthy: true };
} catch {
return { timestamp: new Date().toISOString(), noteCount: 0, folderCount: 0, accountCount: 0, latencyMs: Date.now() - start, healthy: false };
}
}
Resources
1---2name: apple-notes-observability3description: |4 Monitor Apple Notes automation health and performance metrics.5 Trigger: "apple notes monitoring".6allowed-tools: Read, Write, Edit, Bash(osascript:*), Grep7version: 1.0.08license: MIT9author: Jeremy Longshore <jeremy@intentsolutions.io>10tags: [saas, macos, apple-notes, automation]11compatible-with: claude-code12---1314# Apple Notes Observability1516## Monitoring Script17```bash18#!/bin/bash19# scripts/notes-health-check.sh — Run via cron or launchd2021LOG_FILE="/tmp/notes-health.log"2223timestamp=$(date -Iseconds)24notes_running=$(pgrep -x Notes > /dev/null && echo "true" || echo "false")25note_count=$(osascript -l JavaScript -e "Application(\"Notes\").defaultAccount.notes.length" 2>/dev/null || echo "0")26folder_count=$(osascript -l JavaScript -e "Application(\"Notes\").defaultAccount.folders.length" 2>/dev/null || echo "0")2728echo "{\"timestamp\":\"$timestamp\",\"running\":$notes_running,\"notes\":$note_count,\"folders\":$folder_count}" >> "$LOG_FILE"2930# Alert if Notes not running31if [ "$notes_running" = "false" ]; then32 osascript -e "display notification \"Notes.app is not running\" with title \"Notes Health Alert\""33fi34```3536## Metrics Collection37```typescript38// src/observability/metrics.ts39interface NotesMetrics {40 timestamp: string;41 noteCount: number;42 folderCount: number;43 accountCount: number;44 latencyMs: number;45 healthy: boolean;46}4748function collectMetrics(): NotesMetrics {49 const start = Date.now();50 try {51 const output = execSync("osascript -l JavaScript -e \"JSON.stringify({notes: Application(\\\"Notes\\\").defaultAccount.notes.length, folders: Application(\\\"Notes\\\").defaultAccount.folders.length, accounts: Application(\\\"Notes\\\").accounts().length})\"", { encoding: "utf8" });52 const data = JSON.parse(output);53 return { timestamp: new Date().toISOString(), noteCount: data.notes, folderCount: data.folders, accountCount: data.accounts, latencyMs: Date.now() - start, healthy: true };54 } catch {55 return { timestamp: new Date().toISOString(), noteCount: 0, folderCount: 0, accountCount: 0, latencyMs: Date.now() - start, healthy: false };56 }57}58```5960## Resources6162- [Mac Automation Scripting Guide](https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/)63- [JXA Examples](https://jxa-examples.akjems.com/)64