Skills Productivity Apple Notes Workflow Automation Toolkit

Apple Notes Workflow Automation Toolkit

v20260423
apple-notes-core-workflow-a
This comprehensive toolkit automates core workflows within Apple Notes using JXA and Bash scripting. It allows users to batch-import content from Markdown files, generate structured notes using customizable templates (e.g., meeting minutes, daily logs), and automatically organize notes into designated folder hierarchies based on naming conventions. Ideal for knowledge workers managing large volumes of notes and content from diverse sources.
Get Skill
175 downloads
Overview

Apple Notes Core Workflow A — Note Management Automation

Overview

Primary workflow: automate Apple Notes management with batch creation, template-based note generation, folder organization, and content sync from external sources (Markdown files, RSS, calendar events).

Instructions

Step 1: Batch Note Creator from Markdown Files

#!/bin/bash
# scripts/markdown-to-notes.sh — Import Markdown files as Apple Notes

FOLDER_NAME="${1:-Imported}"

for md_file in *.md; do
  [ -f "$md_file" ] || continue
  title=$(head -1 "$md_file" | sed 's/^#\s*//')
  # Convert Markdown to basic HTML
  body=$(cat "$md_file" | sed 's/^# /<h1>/;s/$/<\/h1>/' | sed 's/^## /<h2>/;s/$/<\/h2>/' | sed 's/^- /<li>/;s/$/<\/li>/' | sed 's/^$/<br>/')

  osascript -l JavaScript -e "
    const Notes = Application('Notes');
    const account = Notes.defaultAccount;
    let folder = account.folders().find(f => f.name() === '$FOLDER_NAME');
    if (!folder) {
      folder = Notes.Folder({ name: '$FOLDER_NAME' });
      account.folders.push(folder);
    }
    const note = Notes.Note({ name: '$title', body: \`$body\` });
    folder.notes.push(note);
    'Created: $title';
  "
  echo "Imported: $md_file → $title"
done

Step 2: Note Template Engine (JXA)

// scripts/note-template.js — Run with: osascript -l JavaScript scripts/note-template.js
const Notes = Application('Notes');

const TEMPLATES = {
  meeting: (data) => `
    <h1>${data.title || 'Meeting Notes'}</h1>
    <p><strong>Date:</strong> ${new Date().toLocaleDateString()}</p>
    <p><strong>Attendees:</strong> ${data.attendees || 'TBD'}</p>
    <h2>Agenda</h2><ul><li></li></ul>
    <h2>Action Items</h2><ul><li></li></ul>
    <h2>Notes</h2><p></p>
  `,
  daily: (data) => `
    <h1>Daily Log — ${new Date().toLocaleDateString()}</h1>
    <h2>Tasks</h2><ul><li></li></ul>
    <h2>Accomplishments</h2><ul><li></li></ul>
    <h2>Blockers</h2><ul><li></li></ul>
  `,
  project: (data) => `
    <h1>${data.title || 'Project'}</h1>
    <p><strong>Status:</strong> ${data.status || 'Active'}</p>
    <h2>Overview</h2><p></p>
    <h2>Requirements</h2><ul><li></li></ul>
    <h2>Timeline</h2><ul><li></li></ul>
  `,
};

function createFromTemplate(templateName, data, folderName) {
  const template = TEMPLATES[templateName];
  if (!template) throw new Error(`Unknown template: ${templateName}`);

  const account = Notes.defaultAccount;
  let folder = account.folders().find(f => f.name() === folderName);
  if (!folder) {
    folder = Notes.Folder({ name: folderName });
    account.folders.push(folder);
  }

  const body = template(data);
  const note = Notes.Note({ name: data.title || templateName, body });
  folder.notes.push(note);
  return note.id();
}

// Usage: create meeting notes
createFromTemplate('meeting', {
  title: 'Sprint Planning',
  attendees: 'Team Alpha',
}, 'Meetings');

Step 3: Folder Organization Script

# Organize notes into folders based on naming conventions
osascript -l JavaScript -e '
  const Notes = Application("Notes");
  const account = Notes.defaultAccount;
  const allNotes = account.notes();

  const rules = [
    { pattern: /^Meeting:/i, folder: "Meetings" },
    { pattern: /^Project:/i, folder: "Projects" },
    { pattern: /^Daily/i, folder: "Daily Logs" },
    { pattern: /^TODO/i, folder: "Tasks" },
  ];

  let moved = 0;
  for (const note of allNotes) {
    const name = note.name();
    for (const rule of rules) {
      if (rule.pattern.test(name)) {
        let folder = account.folders().find(f => f.name() === rule.folder);
        if (!folder) {
          folder = Notes.Folder({ name: rule.folder });
          account.folders.push(folder);
        }
        Notes.move(note, { to: folder });
        moved++;
        break;
      }
    }
  }
  `Organized ${moved} notes into folders`;
'

Output

  • Batch Markdown file → Apple Notes importer
  • Template engine with meeting/daily/project templates
  • Rule-based folder organization
  • Folder creation on-demand

Error Handling

Error Cause Solution
Can't move note Note is locked Unlock note in Notes.app first
HTML rendering issues Invalid HTML tags Use basic tags: h1, h2, p, ul, li, strong
Slow batch import iCloud sync throttling Add 1s delay between note creates
Duplicate notes Script run twice Check for existing note by name before creating

Resources

Next Steps

For exporting and converting notes, see apple-notes-core-workflow-b.

Info
Category Productivity
Name apple-notes-core-workflow-a
Version v20260423
Size 5.17KB
Updated At 2026-04-28
Language