<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://macbound.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://macbound.com/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-08-29T15:38:30+00:00</updated><id>https://macbound.com/feed.xml</id><title type="html">MacBound</title><subtitle>A Mac content hub: AppleScript automation with Scriptly, a full Windows-to-Mac switching guide, and screenshot &amp; markup tips with SnipClip.</subtitle><author><name>Luke Welch</name></author><entry><title type="html">Archive Old Files Automatically on Mac (AppleScript Guide)</title><link href="https://macbound.com/scriptly/archive-old-files-automatically/" rel="alternate" type="text/html" title="Archive Old Files Automatically on Mac (AppleScript Guide)" /><published>2026-08-25T00:00:00+00:00</published><updated>2026-08-25T00:00:00+00:00</updated><id>https://macbound.com/scriptly/archive-old-files-automatically</id><content type="html" xml:base="https://macbound.com/scriptly/archive-old-files-automatically/"><![CDATA[<h1 id="archive-old-files-automatically-on-mac">Archive Old Files Automatically on Mac</h1>

<p>Old downloads, old project files, and old screenshots pile up quietly. Instead of manually hunting for what’s safe to move, this script does it by date — automatically, and safely (nothing gets deleted, just moved).</p>

<h2 id="the-script">The Script</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Choose a folder to archive old files from:"</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">daysOld</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="mi">90</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">cutoffDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">current date</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="nv">daysOld</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nb">days</span><span class="p">)</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="p">(</span><span class="nb">exists</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Archive"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">make</span><span class="w"> </span><span class="nb">new</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="nb">at</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">properties</span><span class="w"> </span><span class="p">{</span><span class="na">name</span><span class="p">:</span><span class="s2">"Archive"</span><span class="p">}</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">archiveFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Archive"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="p">(</span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w">
        </span><span class="k">if</span><span class="w"> </span><span class="nv">modification</span><span class="w"> </span><span class="nv">date</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nv">cutoffDate</span><span class="w"> </span><span class="k">then</span><span class="w">
            </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">archiveFolder</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="how-it-works">How It Works</h2>

<ol>
  <li><strong>You choose a folder</strong> — this can be Downloads, Desktop, a project folder, anywhere</li>
  <li><strong>Sets a cutoff</strong> — <code class="language-plaintext highlighter-rouge">daysOld</code> is 90 by default (files older than 90 days get archived)</li>
  <li><strong>Creates an “Archive” subfolder</strong> if one doesn’t already exist</li>
  <li><strong>Checks every file’s modification date</strong> and moves anything older than the cutoff into Archive</li>
</ol>

<p>Nothing is deleted — files just move into a subfolder, so it’s easy to check or undo.</p>

<h2 id="changing-the-time-window">Changing the Time Window</h2>

<p>Want 30 days instead of 90? Just change one line:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">daysOld</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="mi">30</span><span class="w">
</span></code></pre></div></div>

<h2 id="archiving-by-creation-date-instead">Archiving by Creation Date Instead</h2>

<p><code class="language-plaintext highlighter-rouge">modification date</code> catches files that were edited recently even if created long ago. If you’d rather archive based on when a file was first created:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span><span class="w"> </span><span class="nv">creation</span><span class="w"> </span><span class="nv">date</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nv">cutoffDate</span><span class="w"> </span><span class="k">then</span><span class="w">
    </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">archiveFolder</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span></code></pre></div></div>

<h2 id="only-archiving-certain-file-types">Only Archiving Certain File Types</h2>

<p>To only archive, say, PDFs and images and leave everything else alone:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Choose a folder to archive old files from:"</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">daysOld</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="mi">90</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">cutoffDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">current date</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="nv">daysOld</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nb">days</span><span class="p">)</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">archiveTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"pdf"</span><span class="p">,</span><span class="w"> </span><span class="s2">"png"</span><span class="p">,</span><span class="w"> </span><span class="s2">"jpg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"jpeg"</span><span class="p">}</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="p">(</span><span class="nb">exists</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Archive"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">make</span><span class="w"> </span><span class="nb">new</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="nb">at</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">properties</span><span class="w"> </span><span class="p">{</span><span class="na">name</span><span class="p">:</span><span class="s2">"Archive"</span><span class="p">}</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">archiveFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Archive"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="p">(</span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w">
        </span><span class="k">try</span><span class="w">
            </span><span class="k">set</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="nv">extension</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nv">modification</span><span class="w"> </span><span class="nv">date</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nv">cutoffDate</span><span class="p">)</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">archiveTypes</span><span class="p">)</span><span class="w"> </span><span class="k">then</span><span class="w">
                </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">archiveFolder</span><span class="w">
            </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">try</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="running-it-automatically-every-week">Running It Automatically Every Week</h2>

<ol>
  <li>Export from Script Editor: <strong>File → Export</strong>, Format: <strong>Application</strong></li>
  <li>Open <strong>Automator → File → New → Calendar Alarm</strong></li>
  <li>Add the <strong>“Run AppleScript”</strong> action, paste in the script</li>
  <li>Save, then edit the Calendar event it creates to repeat <strong>weekly</strong></li>
</ol>

<p>Your folder now self-cleans on a schedule, no manual runs needed.</p>

<h2 id="a-note-on-choose-folder">A Note on <code class="language-plaintext highlighter-rouge">choose folder</code></h2>

<p>Because this script uses <code class="language-plaintext highlighter-rouge">choose folder</code>, it can’t run fully unattended without modification — the picker needs a click. For a scheduled version, hardcode the path instead:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nv">POSIX</span><span class="w"> </span><span class="nv">file</span><span class="w"> </span><span class="s2">"/Users/yourname/Downloads"</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nv">alias</span><span class="w">
</span></code></pre></div></div>

<p>Replace the path and username with your own. Find your exact path by right-clicking a folder in Finder while holding <strong>Option</strong>, then choosing <strong>Copy “FolderName” as Pathname</strong>.</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<p><strong>“Finder got an error: Can’t get folder Archive”</strong>
This shouldn’t happen since the script checks <code class="language-plaintext highlighter-rouge">exists</code> first — but if it does, the folder name may have trailing spaces or hidden characters. Delete it and let the script recreate it.</p>

<p><strong>Files aren’t being archived that should be</strong>
Check <code class="language-plaintext highlighter-rouge">daysOld</code> — and remember <code class="language-plaintext highlighter-rouge">modification date</code> updates every time a file is opened and re-saved, so a file you think is “old” might have been touched more recently than expected.</p>

<h2 id="prefer-a-ready-made-version">Prefer a Ready-Made Version?</h2>

<p><a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> includes this as a built-in template — no setup required, plus AI generation if you want custom archiving rules described in plain English.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/auto-organize-downloads/">Organize Your Downloads Folder Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/automate-email-organization/">How to Automate Email Organization on Mac</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="files" /><category term="automation" /><category term="AppleScript" /><category term="Finder" /><category term="archiving" /><category term="storage" /><summary type="html"><![CDATA[Free up clutter by automatically moving files older than a set number of days into an Archive folder — one script, run any time.]]></summary></entry><entry><title type="html">Fix Common AppleScript Errors (With Real Explanations, Not Just Fixes)</title><link href="https://macbound.com/scriptly/fix-common-applescript-errors/" rel="alternate" type="text/html" title="Fix Common AppleScript Errors (With Real Explanations, Not Just Fixes)" /><published>2026-08-24T00:00:00+00:00</published><updated>2026-08-24T00:00:00+00:00</updated><id>https://macbound.com/scriptly/fix-common-applescript-errors</id><content type="html" xml:base="https://macbound.com/scriptly/fix-common-applescript-errors/"><![CDATA[<h1 id="fix-common-applescript-errors">Fix Common AppleScript Errors</h1>

<p>Every AppleScript beginner hits the same handful of errors. Here’s what each one actually means and how to fix it — not just the workaround, but the reason it happens.</p>

<h2 id="not-authorized-to-send-apple-events-to-app">“Not authorized to send Apple events to [App]”</h2>

<p><strong>What it means:</strong> macOS requires explicit permission before one app (like Script Editor) can control another (like Mail or Finder). This is a privacy protection, not a bug.</p>

<p><strong>Fix:</strong></p>
<ol>
  <li>Go to <strong>System Settings → Privacy &amp; Security → Automation</strong></li>
  <li>Find <strong>Script Editor</strong> (or whatever app is running your script)</li>
  <li>Enable the checkbox next to the app your script is trying to control</li>
</ol>

<p>If you exported your script as a standalone app, look for <em>that</em> app’s name in the Automation list instead.</p>

<h2 id="cant-get-file-x-of-folder-y">“Can’t get file [X] of folder [Y]”</h2>

<p><strong>What it means:</strong> The script is trying to reference a file or folder that doesn’t exist — either it was moved, renamed, or the path/name in your script has a typo.</p>

<p><strong>Fix:</strong> Double-check spelling and capitalization exactly. AppleScript is picky about exact names. Consider wrapping risky operations in a check:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nb">exists</span><span class="w"> </span><span class="nv">file</span><span class="w"> </span><span class="s2">"report.pdf"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">desktop</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="c1">-- safe to proceed</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"File not found."</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="syntax-error-expected-end-of-line-etc-but-found">Syntax Error: “Expected end of line, etc. but found…”</h2>

<p><strong>What it means:</strong> This is AppleScript’s version of a typo error — a missing <code class="language-plaintext highlighter-rouge">end tell</code>, a stray character, or mismatched quotes.</p>

<p><strong>Fix:</strong> Check that every <code class="language-plaintext highlighter-rouge">tell</code>, <code class="language-plaintext highlighter-rouge">if</code>, and <code class="language-plaintext highlighter-rouge">repeat</code> has its matching <code class="language-plaintext highlighter-rouge">end tell</code>, <code class="language-plaintext highlighter-rouge">end if</code>, or <code class="language-plaintext highlighter-rouge">end repeat</code>. Script Editor’s syntax highlighting helps — unmatched blocks often show up in a different color or with obvious indentation breaks.</p>

<p>Common culprit — smart quotes. If you copy code from a website or Word doc, curly quotes (<code class="language-plaintext highlighter-rouge">" "</code>) can sneak in instead of straight quotes (<code class="language-plaintext highlighter-rouge">"</code>), and AppleScript won’t recognize them:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Broken (smart quotes):</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="err">“</span><span class="nv">Hello</span><span class="err">”</span><span class="w">

</span><span class="c1">-- Fixed (straight quotes):</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"Hello"</span><span class="w">
</span></code></pre></div></div>

<h2 id="application-isnt-running--connection-is-invalid">“Application isn’t running” / “Connection is invalid”</h2>

<p><strong>What it means:</strong> Your script is trying to control an app that isn’t currently open.</p>

<p><strong>Fix:</strong> Add <code class="language-plaintext highlighter-rouge">activate</code> before your commands, or check <code class="language-plaintext highlighter-rouge">is running</code> first:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">running</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">activate</span><span class="w">
        </span><span class="nb">delay</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1">-- give it a moment to launch</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="c1">-- your commands here</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="cant-set-property-of-object">“Can’t set [property] of [object]”</h2>

<p><strong>What it means:</strong> You’re trying to change something that’s either read-only, or the object reference is wrong.</p>

<p><strong>Fix:</strong> Common cause is naming collisions — trying to rename a file to a name that already exists in that folder:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="p">(</span><span class="nb">exists</span><span class="w"> </span><span class="nv">file</span><span class="w"> </span><span class="s2">"newname.txt"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s2">"newname.txt"</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"A file with that name already exists."</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="script-runs-but-nothing-happens">Script Runs But Nothing Happens</h2>

<p><strong>What it means:</strong> Usually your filtering condition (an <code class="language-plaintext highlighter-rouge">if</code>, or a <code class="language-plaintext highlighter-rouge">whose</code> clause) didn’t match anything — not an error, just zero results.</p>

<p><strong>Fix:</strong> Add a quick debug line to check what’s actually being found:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">matchingItems</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">every</span><span class="w"> </span><span class="nv">file</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s2">"invoice"</span><span class="p">)</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"Found: "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">(</span><span class="nb">count</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">matchingItems</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>If the count is 0, your search text or condition needs adjusting.</p>

<h2 id="timeout-or-script-hangs-forever">“Timeout” or Script Hangs Forever</h2>

<p><strong>What it means:</strong> The app you’re controlling is waiting on something — often a dialog box hidden behind another window, or a slow operation (like a large <code class="language-plaintext highlighter-rouge">do shell script</code> command).</p>

<p><strong>Fix:</strong> Add an explicit timeout around the risky section:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">with timeout of</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="nv">seconds</span><span class="w">
    </span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
        </span><span class="c1">-- slow operation here</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="nv">timeout</span><span class="w">
</span></code></pre></div></div>

<h2 id="still-stuck">Still Stuck?</h2>

<p>Post the exact error message on <a href="https://reddit.com/r/applescript">r/applescript</a> — the community is fast and genuinely helpful with beginner questions.</p>

<p>Or skip the debugging entirely: <a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> generates tested, working AppleScript from a plain-English description, so you’re starting from working code instead of fixing broken code.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/applescript-for-beginners/">AppleScript for Complete Beginners</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="troubleshooting" /><category term="applescript" /><category term="reference" /><category term="AppleScript" /><category term="errors" /><category term="debugging" /><category term="permissions" /><summary type="html"><![CDATA[The most common AppleScript errors, why they actually happen, and exactly how to fix each one.]]></summary></entry><entry><title type="html">Why AppleScript Still Matters in 2026</title><link href="https://macbound.com/scriptly/why-applescript-matters-2026/" rel="alternate" type="text/html" title="Why AppleScript Still Matters in 2026" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://macbound.com/scriptly/why-applescript-matters-2026</id><content type="html" xml:base="https://macbound.com/scriptly/why-applescript-matters-2026/"><![CDATA[<h1 id="why-applescript-still-matters-in-2026">Why AppleScript Still Matters in 2026</h1>

<p>AppleScript is old. It first shipped in 1993. Apple’s marketing energy has gone almost entirely into Shortcuts for over half a decade. And yet — professionals doing real automation work on Mac still reach for it constantly. Here’s why.</p>

<h2 id="it-controls-apps-that-shortcuts-cant-touch">It Controls Apps That Shortcuts Can’t Touch</h2>

<p>Shortcuts is great for iOS-style automations: toggling settings, quick text transforms, simple app actions. But most professional Mac software — Adobe Creative Suite, Microsoft Excel, FileMaker, DEVONthink, BBEdit, and dozens of others — exposes deep automation through <strong>Apple Events</strong>, which is what AppleScript talks to directly.</p>

<p>If you need to loop through 400 InDesign pages, batch-process Excel spreadsheets, or script Finder operations with real conditional logic, AppleScript (or its JavaScript cousin, JXA) is usually still the only option.</p>

<h2 id="its-remarkably-stable">It’s Remarkably Stable</h2>

<p>A widely upvoted post on r/applescript put it well: AppleScript “remains remarkably stable over the years.” Scripts written a decade ago still run today with little to no modification. For production workflows — the kind studios and agencies depend on daily — that stability is worth more than new features.</p>

<h2 id="its-not-actually-going-away">It’s Not Actually Going Away</h2>

<p>There’s periodic anxiety in the community about AppleScript’s long-term future, but Apple has kept it alive as the underlying automation layer for macOS for over 30 years, through OS 9, Mac OS X, and Apple Silicon. Even Shortcuts on Mac runs many of its actions through the same Apple Events system AppleScript uses.</p>

<h2 id="the-actual-barrier-was-never-the-language--it-was-the-syntax">The Actual Barrier Was Never the Language — It Was the Syntax</h2>

<p>AppleScript’s English-like syntax is approachable in theory (“tell application… to…”), but in practice, remembering exact command names, correct capitalization, and app-specific dictionaries is where beginners get stuck. That’s a real, valid criticism — but it’s a tooling problem, not a reason the language itself is obsolete.</p>

<p>This is exactly the gap apps like <a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> exist to close: describe a task in plain English, get working AppleScript back, powered by on-device AI so nothing leaves your Mac. You get AppleScript’s real power over apps, without needing to memorize its dictionaries.</p>

<h2 id="when-to-use-shortcuts-instead">When to Use Shortcuts Instead</h2>

<p>To be fair, Shortcuts is genuinely better for:</p>
<ul>
  <li>Quick, simple automations (toggle Wi-Fi, resize an image, share to an app)</li>
  <li>Anything you want to trigger from iPhone or Apple Watch</li>
  <li>Automations that don’t need deep control over third-party Mac apps</li>
</ul>

<p>For anything involving Mail, Finder batch operations, or professional creative/office apps at scale, AppleScript still wins.</p>

<h2 id="the-bottom-line">The Bottom Line</h2>

<p>AppleScript isn’t legacy cruft — it’s infrastructure. It’s the layer that lets Mac apps talk to each other, and there’s no real replacement for the depth of control it offers on macOS. The barrier has always been syntax, not usefulness, and that barrier is finally coming down.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/applescript-for-beginners/">AppleScript for Complete Beginners</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
  <li><a href="/scriptly-blog/scriptly/fix-common-applescript-errors/">Fix Common AppleScript Errors</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="applescript" /><category term="opinion" /><category term="AppleScript" /><category term="Shortcuts" /><category term="JXA" /><category term="automation" /><summary type="html"><![CDATA[Apple hasn't meaningfully updated AppleScript in years, and Shortcuts gets all the marketing attention. Here's why it's still the right tool for real work.]]></summary></entry><entry><title type="html">10 AppleScript Templates You Can Copy-Paste Right Now</title><link href="https://macbound.com/scriptly/applescript-templates/" rel="alternate" type="text/html" title="10 AppleScript Templates You Can Copy-Paste Right Now" /><published>2026-08-22T00:00:00+00:00</published><updated>2026-08-22T00:00:00+00:00</updated><id>https://macbound.com/scriptly/applescript-templates</id><content type="html" xml:base="https://macbound.com/scriptly/applescript-templates/"><![CDATA[<h1 id="10-applescript-templates-you-can-copy-paste">10 AppleScript Templates You Can Copy-Paste</h1>

<p>No theory, no setup — just ten working scripts. Paste any of these into <strong>Script Editor</strong> (Applications → Utilities) and click Run.</p>

<h2 id="1-empty-the-trash">1. Empty the Trash</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="nv">empty</span><span class="w"> </span><span class="nv">trash</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="2-show-a-desktop-notification">2. Show a Desktop Notification</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">display</span><span class="w"> </span><span class="nv">notification</span><span class="w"> </span><span class="s2">"Backup finished!"</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">title</span><span class="w"> </span><span class="s2">"Scriptly"</span><span class="w"> </span><span class="na">sound</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="s2">"Glass"</span><span class="w">
</span></code></pre></div></div>

<p>Useful at the end of longer scripts so you know when they’re done.</p>

<h2 id="3-get-the-frontmost-apps-name">3. Get the Frontmost App’s Name</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"System Events"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">frontApp</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">first</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="nv">process</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="na">frontmost</span><span class="w"> </span><span class="ow">is</span><span class="w"> </span><span class="nb">true</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"You're using: "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">frontApp</span><span class="w">
</span></code></pre></div></div>

<h2 id="4-count-files-in-a-folder">4. Count Files in a Folder</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w">
</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">fileCount</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">count</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="p">(</span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"That folder has "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">fileCount</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">" files."</span><span class="w">
</span></code></pre></div></div>

<h2 id="5-quit-all-apps-except-a-few">5. Quit All Apps Except a Few</h2>

<p>Handy before a screen recording or presentation:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">keepOpen</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"Finder"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Script Editor"</span><span class="p">}</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"System Events"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">runningApps</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">every</span><span class="w"> </span><span class="nv">process</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="nv">background</span><span class="w"> </span><span class="nv">only</span><span class="w"> </span><span class="ow">is</span><span class="w"> </span><span class="nb">false</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">appName</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">runningApps</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nv">appName</span><span class="w"> </span><span class="ow">is not</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">keepOpen</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="k">try</span><span class="w">
            </span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="nv">appName</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">quit</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">try</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span></code></pre></div></div>

<h2 id="6-backup-a-folder-to-an-external-drive">6. Backup a Folder to an External Drive</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">sourceFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Folder to back up:"</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">destFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Where to back it up:"</span><span class="w">

</span><span class="k">set</span><span class="w"> </span><span class="nv">sourcePath</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">POSIX</span><span class="w"> </span><span class="na">path</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">sourceFolder</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">destPath</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">POSIX</span><span class="w"> </span><span class="na">path</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">destFolder</span><span class="w">

</span><span class="nb">do shell script</span><span class="w"> </span><span class="s2">"rsync -av "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nb">quoted form</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">sourcePath</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">" "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nb">quoted form</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">destPath</span><span class="w">

</span><span class="nb">display</span><span class="w"> </span><span class="nv">notification</span><span class="w"> </span><span class="s2">"Backup complete"</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">title</span><span class="w"> </span><span class="s2">"Scriptly"</span><span class="w">
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">rsync</code> only copies what’s changed, so re-running this is fast after the first backup.</p>

<h2 id="7-convert-selected-finder-text-file-to-uppercase-content">7. Convert Selected Finder Text File to Uppercase Content</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose file</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Pick a text file:"</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">fileContent</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">read</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="k">as</span><span class="w"> </span>«<span class="nb">class utf8</span>»<span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">upperContent</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">do shell script</span><span class="w"> </span><span class="s2">"echo "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nb">quoted form</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileContent</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">" | tr '[:lower:]' '[:upper:]'"</span><span class="w">

</span><span class="k">set</span><span class="w"> </span><span class="nv">theResult</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">open for access</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nb">write</span><span class="w"> </span><span class="nv">permission</span><span class="w">
</span><span class="nb">set eof</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">theResult</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span><span class="nb">write</span><span class="w"> </span><span class="nv">upperContent</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">theResult</span><span class="w">
</span><span class="nb">close access</span><span class="w"> </span><span class="nv">theResult</span><span class="w">
</span></code></pre></div></div>

<h2 id="8-toggle-dark-mode">8. Toggle Dark Mode</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"System Events"</span><span class="w">
    </span><span class="k">tell</span><span class="w"> </span><span class="nv">appearance</span><span class="w"> </span><span class="nv">preferences</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">dark</span><span class="w"> </span><span class="nv">mode</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">dark</span><span class="w"> </span><span class="nv">mode</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="9-eject-all-mounted-volumes">9. Eject All Mounted Volumes</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="nv">eject</span><span class="w"> </span><span class="p">(</span><span class="nb">every</span><span class="w"> </span><span class="nv">disk</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="nv">ejectable</span><span class="w"> </span><span class="ow">is</span><span class="w"> </span><span class="nb">true</span><span class="p">)</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<p>Great as the last step before shutting down for the day.</p>

<h2 id="10-create-a-timestamped-folder-on-the-desktop">10. Create a Timestamped Folder on the Desktop</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">todayDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">current date</span><span class="p">)</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">dateString</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">year</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">todayDate</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">month</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">todayDate</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nv">integer</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">day</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">todayDate</span><span class="p">)</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="nb">make</span><span class="w"> </span><span class="nb">new</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="nb">at</span><span class="w"> </span><span class="nv">desktop</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">properties</span><span class="w"> </span><span class="p">{</span><span class="na">name</span><span class="p">:</span><span class="s2">"Notes-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">dateString</span><span class="p">}</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="k">on</span> <span class="nv">padded</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="s2">"0"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">n</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="nv">padded</span><span class="w">
</span></code></pre></div></div>

<p>Good for daily journaling folders, scanned receipts, or a “today’s downloads” staging area.</p>

<h2 id="using-these-templates">Using These Templates</h2>

<p>For any script above:</p>
<ol>
  <li>Open Script Editor</li>
  <li>Paste the code</li>
  <li>Click <strong>Run</strong> (▶)</li>
  <li>Approve any permission prompts (this is normal — macOS confirming the script can control an app)</li>
</ol>

<h2 id="want-100-more-organized-by-category">Want 100+ More, Organized by Category?</h2>

<p>These ten cover the basics. <a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> has 100+ ready-made templates across email, files, calendar, Slack, and GitHub — plus AI generation for anything not already covered.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/auto-organize-downloads/">Organize Your Downloads Folder Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/automate-email-organization/">How to Automate Email Organization on Mac</a></li>
  <li><a href="/scriptly-blog/scriptly/fix-common-applescript-errors/">Fix Common AppleScript Errors</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="templates" /><category term="reference" /><category term="applescript" /><category term="AppleScript" /><category term="templates" /><category term="copy-paste" /><category term="Finder" /><category term="Mail" /><summary type="html"><![CDATA[Ten small, genuinely useful AppleScript snippets — file organization, notifications, backups, and more — ready to paste into Script Editor.]]></summary></entry><entry><title type="html">Organize Your Downloads Folder Automatically (AppleScript That Actually Works)</title><link href="https://macbound.com/scriptly/auto-organize-downloads/" rel="alternate" type="text/html" title="Organize Your Downloads Folder Automatically (AppleScript That Actually Works)" /><published>2026-08-21T00:00:00+00:00</published><updated>2026-08-21T00:00:00+00:00</updated><id>https://macbound.com/scriptly/auto-organize-downloads</id><content type="html" xml:base="https://macbound.com/scriptly/auto-organize-downloads/"><![CDATA[<h1 id="organize-your-downloads-folder-automatically">Organize Your Downloads Folder Automatically</h1>

<p>Everyone’s Downloads folder looks the same: a graveyard of PDFs, screenshots, installers, and random zip files. Here’s a script that sorts it into subfolders by file type — safely, and re-runnable any time.</p>

<h2 id="the-script">The Script</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">path to</span><span class="w"> </span><span class="nv">downloads</span><span class="w"> </span><span class="nv">folder</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nv">alias</span><span class="w">

    </span><span class="k">set</span><span class="w"> </span><span class="nv">folderNames</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"Images"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Documents"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Videos"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Archives"</span><span class="p">}</span><span class="w">
    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aName</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">folderNames</span><span class="w">
        </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="p">(</span><span class="nb">exists</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="nv">aName</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="p">)</span><span class="w"> </span><span class="k">then</span><span class="w">
            </span><span class="nb">make</span><span class="w"> </span><span class="nb">new</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="nb">at</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">properties</span><span class="w"> </span><span class="p">{</span><span class="na">name</span><span class="p">:</span><span class="nv">aName</span><span class="p">}</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">

    </span><span class="k">set</span><span class="w"> </span><span class="nv">imageTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"png"</span><span class="p">,</span><span class="w"> </span><span class="s2">"jpg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"jpeg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"gif"</span><span class="p">,</span><span class="w"> </span><span class="s2">"heic"</span><span class="p">}</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">docTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"pdf"</span><span class="p">,</span><span class="w"> </span><span class="s2">"doc"</span><span class="p">,</span><span class="w"> </span><span class="s2">"docx"</span><span class="p">,</span><span class="w"> </span><span class="s2">"txt"</span><span class="p">,</span><span class="w"> </span><span class="s2">"xlsx"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pages"</span><span class="p">}</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">videoTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"mp4"</span><span class="p">,</span><span class="w"> </span><span class="s2">"mov"</span><span class="p">,</span><span class="w"> </span><span class="s2">"mkv"</span><span class="p">}</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">archiveTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"zip"</span><span class="p">,</span><span class="w"> </span><span class="s2">"dmg"</span><span class="p">}</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="p">(</span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="p">)</span><span class="w">
        </span><span class="k">try</span><span class="w">
            </span><span class="k">set</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="nv">extension</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
            </span><span class="k">if</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">imageTypes</span><span class="w"> </span><span class="k">then</span><span class="w">
                </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Images"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w">
            </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">docTypes</span><span class="w"> </span><span class="k">then</span><span class="w">
                </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Documents"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w">
            </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">videoTypes</span><span class="w"> </span><span class="k">then</span><span class="w">
                </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Videos"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w">
            </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">archiveTypes</span><span class="w"> </span><span class="k">then</span><span class="w">
                </span><span class="nv">move</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Archives"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">downloadsFolder</span><span class="w">
            </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">try</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="what-this-actually-does-step-by-step">What This Actually Does, Step by Step</h2>

<ol>
  <li><strong>Finds your Downloads folder</strong> automatically — no need to type a path</li>
  <li><strong>Creates four subfolders</strong> (Images, Documents, Videos, Archives) if they don’t already exist — safe to run repeatedly, it won’t duplicate them</li>
  <li><strong>Loops through every file</strong> sitting directly in Downloads</li>
  <li><strong>Checks the file extension</strong> and moves it into the matching subfolder</li>
  <li><strong>Wraps each move in <code class="language-plaintext highlighter-rouge">try</code></strong> so one problem file (like something with no extension) doesn’t stop the whole script</li>
</ol>

<h2 id="how-to-run-it">How to Run It</h2>

<ol>
  <li>Open <strong>Script Editor</strong> (Applications → Utilities)</li>
  <li>Paste the script</li>
  <li>Click <strong>Run</strong> (▶)</li>
  <li>Grant Finder access if prompted</li>
  <li>Check your Downloads folder — it’s now organized</li>
</ol>

<h2 id="customizing-it">Customizing It</h2>

<p><strong>Add more categories</strong> — for example, app installers:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">folderNames</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"Images"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Documents"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Videos"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Archives"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Installers"</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>…and add a matching type list plus <code class="language-plaintext highlighter-rouge">else if</code> branch:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">installerTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"dmg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pkg"</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>(Note: if you add “dmg” here, remove it from <code class="language-plaintext highlighter-rouge">archiveTypes</code> so it doesn’t get checked twice.)</p>

<p><strong>Skip files still downloading</strong> — Safari names in-progress downloads <code class="language-plaintext highlighter-rouge">something.download</code>. This script already ignores them since <code class="language-plaintext highlighter-rouge">.download</code> isn’t in any of the type lists.</p>

<h2 id="automating-it-to-run-daily">Automating It to Run Daily</h2>

<p>Rather than remembering to run this manually:</p>

<ol>
  <li>Export the script from Script Editor as an Application (<strong>File → Export</strong>, Format: Application)</li>
  <li>Open <strong>Automator → File → New → Calendar Alarm</strong></li>
  <li>Add a <strong>“Run AppleScript”</strong> action and paste the script</li>
  <li>Save, then set the Calendar event it creates to repeat daily</li>
</ol>

<p>Now your Downloads folder tidies itself every night.</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<p><strong>“Finder got an error: doesn’t understand the ‘move’ message”</strong>
This usually means the file was already moved or renamed by something else mid-script (like Spotlight temporarily locking a file). Just run the script again.</p>

<p><strong>Files aren’t moving</strong>
Check the extension actually matches what’s in your list — extensions are case-sensitive in some checks; consider lowercasing with <code class="language-plaintext highlighter-rouge">fileExtension as lowercase</code> for stricter matching, though <code class="language-plaintext highlighter-rouge">name extension</code> already normalizes case in most cases.</p>

<p><strong>A folder named “Images” already exists with different contents</strong>
The script checks with <code class="language-plaintext highlighter-rouge">exists folder... of downloadsFolder</code> and won’t overwrite it — it’ll just use the existing folder as the destination.</p>

<h2 id="prefer-not-to-write-this-yourself">Prefer Not to Write This Yourself?</h2>

<p><a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> has this exact template built in, ready to run, plus 100+ others for files, email, and calendars.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/batch-rename-photos-mac/">Batch Rename Photos on Mac Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/archive-old-files-automatically/">Archive Old Files Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="files" /><category term="automation" /><category term="beginner-friendly" /><category term="AppleScript" /><category term="Finder" /><category term="Downloads" /><category term="file organization" /><summary type="html"><![CDATA[Turn a chaotic Downloads folder into neatly sorted Images, Documents, Videos, and Archives folders — automatically, every time.]]></summary></entry><entry><title type="html">Batch Rename Photos on Mac Automatically (With AppleScript)</title><link href="https://macbound.com/scriptly/batch-rename-photos-mac/" rel="alternate" type="text/html" title="Batch Rename Photos on Mac Automatically (With AppleScript)" /><published>2026-08-20T00:00:00+00:00</published><updated>2026-08-20T00:00:00+00:00</updated><id>https://macbound.com/scriptly/batch-rename-photos-mac</id><content type="html" xml:base="https://macbound.com/scriptly/batch-rename-photos-mac/"><![CDATA[<h1 id="batch-rename-photos-on-mac-automatically">Batch Rename Photos on Mac Automatically</h1>

<p>Camera exports named <code class="language-plaintext highlighter-rouge">IMG_4821.jpg</code>, <code class="language-plaintext highlighter-rouge">IMG_4822.jpg</code>… are useless for finding anything later. Here are two AppleScript approaches to fix that — no third-party app needed.</p>

<h2 id="option-1-sequential-renaming-vacation-01jpg-vacation-02jpg">Option 1: Sequential Renaming (“Vacation-01.jpg”, “Vacation-02.jpg”…)</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Select folder of photos to rename:"</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">fileList</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">sort</span><span class="w"> </span><span class="p">(</span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="p">)</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="na">name</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="k">set</span><span class="w"> </span><span class="nv">counter</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">fileList</span><span class="w">
    </span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="nv">extension</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">newName</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s2">"Vacation-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">zeroPad</span><span class="p">(</span><span class="nv">counter</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"."</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">newName</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">counter</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">counter</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">

</span><span class="k">on</span> <span class="nv">zeroPad</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="s2">"0"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">n</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="nv">zeroPad</span><span class="w">
</span></code></pre></div></div>

<p><strong>What it does:</strong> Asks you to pick a folder, sorts the files by their current name, then renames each one to <code class="language-plaintext highlighter-rouge">Vacation-01.jpg</code>, <code class="language-plaintext highlighter-rouge">Vacation-02.jpg</code>, and so on.</p>

<p><strong>To customize:</strong> Change <code class="language-plaintext highlighter-rouge">"Vacation-"</code> to whatever prefix you want (e.g. <code class="language-plaintext highlighter-rouge">"Wedding-"</code>, <code class="language-plaintext highlighter-rouge">"Trip2026-"</code>).</p>

<h2 id="option-2-rename-by-date-taken-using-photo-metadata">Option 2: Rename by Date Taken (Using Photo Metadata)</h2>

<p>This is more useful for actually organizing a photo library — it renames files using the date the photo was modified/created, so they sort chronologically.</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Select folder of photos to rename:"</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">fileList</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w">
    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">fileList</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="nv">extension</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">creation</span><span class="w"> </span><span class="nv">date</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">dateString</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">year</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">month</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nv">integer</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">day</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="p">)</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">baseName</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">dateString</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">(</span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="p">)</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">baseName</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="k">on</span> <span class="nv">padded</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="s2">"0"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">n</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="nv">padded</span><span class="w">
</span></code></pre></div></div>

<p><strong>What it does:</strong> Prefixes each filename with its creation date, e.g. <code class="language-plaintext highlighter-rouge">IMG_4821.jpg</code> becomes <code class="language-plaintext highlighter-rouge">2026-08-20-IMG_4821.jpg</code>. This keeps the original name (so nothing is lost) while making files sort by date in Finder.</p>

<h2 id="how-to-run-either-script">How to Run Either Script</h2>

<ol>
  <li>Open <strong>Script Editor</strong> (Applications → Utilities)</li>
  <li>Paste the script</li>
  <li>Click <strong>Run</strong> (▶)</li>
  <li>Select your photo folder when prompted</li>
  <li>Done — check the folder in Finder</li>
</ol>

<p><strong>Tip:</strong> Always test on a copy of your photos first. Renaming is easy to do but tedious to undo by hand.</p>

<h2 id="common-issues">Common Issues</h2>

<p><strong>“Finder got an error: Can’t set name of file to…“</strong>
Usually means a file with that new name already exists in the folder — two photos with the same creation date and original name will collide. Add a counter suffix if this happens often.</p>

<p><strong>Script skips some files</strong>
Non-image files in the folder (like <code class="language-plaintext highlighter-rouge">.DS_Store</code>) will still get renamed by these scripts since they operate on <em>every</em> file. Add a check like <code class="language-plaintext highlighter-rouge">if fileExtension is in {"jpg", "jpeg", "png", "heic"} then</code> around the rename logic to only touch photos.</p>

<p>Updated version with that filter:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose folder</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Select folder of photos to rename:"</span><span class="w">
</span><span class="k">set</span><span class="w"> </span><span class="nv">photoTypes</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">{</span><span class="s2">"jpg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"jpeg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"png"</span><span class="p">,</span><span class="w"> </span><span class="s2">"heic"</span><span class="p">}</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">fileList</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="nv">files</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">targetFolder</span><span class="w">
    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">fileList</span><span class="w">
        </span><span class="k">set</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="nv">extension</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
        </span><span class="k">if</span><span class="w"> </span><span class="nv">fileExtension</span><span class="w"> </span><span class="ow">is in</span><span class="w"> </span><span class="nv">photoTypes</span><span class="w"> </span><span class="k">then</span><span class="w">
            </span><span class="k">set</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">creation</span><span class="w"> </span><span class="nv">date</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w">
            </span><span class="k">set</span><span class="w"> </span><span class="nv">dateString</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">year</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">month</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nv">integer</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">padded</span><span class="p">(</span><span class="nb">day</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">fileDate</span><span class="p">)</span><span class="w">
            </span><span class="k">set</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nv">dateString</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">"-"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">(</span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">aFile</span><span class="p">))</span><span class="w">
        </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="k">on</span> <span class="nv">padded</span><span class="p">(</span><span class="nv">n</span><span class="p">)</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">then</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="s2">"0"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">n</span><span class="w">
    </span><span class="k">else</span><span class="w">
        </span><span class="nb">return</span><span class="w"> </span><span class="p">(</span><span class="nv">n</span><span class="w"> </span><span class="k">as </span><span class="nc">string</span><span class="p">)</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="nv">padded</span><span class="w">
</span></code></pre></div></div>

<h2 id="skip-writing-this-yourself">Skip Writing This Yourself</h2>

<p><a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> has a ready-made photo batch-rename template, plus AI generation if you want a custom naming pattern — just describe it in plain English.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/auto-organize-downloads/">Organize Your Downloads Folder Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="photos" /><category term="files" /><category term="automation" /><category term="AppleScript" /><category term="photos" /><category term="Finder" /><category term="batch rename" /><summary type="html"><![CDATA[Rename hundreds of photos in seconds instead of one by one. Two working scripts: sequential naming and date-based naming.]]></summary></entry><entry><title type="html">How to Automate Email Organization on Mac (Zero Coding Required)</title><link href="https://macbound.com/scriptly/automate-email-organization/" rel="alternate" type="text/html" title="How to Automate Email Organization on Mac (Zero Coding Required)" /><published>2026-08-19T00:00:00+00:00</published><updated>2026-08-19T00:00:00+00:00</updated><id>https://macbound.com/scriptly/automate-email-organization</id><content type="html" xml:base="https://macbound.com/scriptly/automate-email-organization/"><![CDATA[<h1 id="how-to-automate-email-organization-on-mac">How to Automate Email Organization on Mac</h1>

<p><strong>The problem:</strong> Invoices, newsletters, and work emails all land in one inbox. Sorting them manually eats up real time every week.</p>

<p><strong>The fix:</strong> A short AppleScript that automatically moves emails into folders based on who sent them — running in seconds instead of minutes.</p>

<h2 id="before-you-start">Before You Start</h2>

<p>This works with <strong>Apple Mail</strong> (not Gmail’s web interface, though Mail can connect to Gmail accounts). You’ll need:</p>

<ol>
  <li>Mail.app set up with your account</li>
  <li>A destination folder (mailbox) already created — e.g. “Billing”</li>
</ol>

<p>To create a mailbox: open Mail → <strong>Mailbox</strong> menu → <strong>New Mailbox</strong> → name it (e.g. “Billing”) → choose “On My Mac” or your account.</p>

<h2 id="the-script">The Script</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">sourceMailbox</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">inbox</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">mailbox</span><span class="w"> </span><span class="s2">"Billing"</span><span class="w">

    </span><span class="k">set</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">every</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">sourceMailbox</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="nv">sender</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s2">"stripe.com"</span><span class="p">)</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w">
        </span><span class="nv">move</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<p><strong>What this does:</strong> Looks at every message in your inbox, finds ones where the sender’s address contains “stripe.com”, and moves each one into your “Billing” mailbox.</p>

<h2 id="how-to-use-it">How to Use It</h2>

<ol>
  <li>Open <strong>Script Editor</strong> (Applications → Utilities)</li>
  <li>Paste the script above</li>
  <li>Change <code class="language-plaintext highlighter-rouge">"Billing"</code> to your actual mailbox name</li>
  <li>Change <code class="language-plaintext highlighter-rouge">"stripe.com"</code> to the sender you want to filter (a company domain, or a full email address)</li>
  <li>Click <strong>Run</strong> (▶)</li>
  <li>macOS will ask for permission to control Mail — click <strong>OK</strong></li>
</ol>

<p>Your matching emails move instantly.</p>

<h2 id="filtering-by-multiple-senders">Filtering by Multiple Senders</h2>

<p>Want to catch several senders at once? Use <code class="language-plaintext highlighter-rouge">or</code>:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">mailbox</span><span class="w"> </span><span class="s2">"Billing"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">every</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">inbox</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="nv">sender</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s2">"stripe.com"</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="nv">sender</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s2">"paypal.com"</span><span class="p">)</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w">
        </span><span class="nv">move</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="filtering-by-subject-instead-of-sender">Filtering by Subject Instead of Sender</h2>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">mailbox</span><span class="w"> </span><span class="s2">"Receipts"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">(</span><span class="nb">every</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">inbox</span><span class="w"> </span><span class="nb">whose</span><span class="w"> </span><span class="nv">subject</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s2">"Receipt"</span><span class="p">)</span><span class="w">

    </span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">matchingMessages</span><span class="w">
        </span><span class="nv">move</span><span class="w"> </span><span class="nv">aMessage</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">targetMailbox</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h2 id="running-it-automatically-no-manual-clicking">Running It Automatically (No Manual Clicking)</h2>

<p>To run this every morning without opening Script Editor:</p>

<ol>
  <li>In Script Editor: <strong>File → Export</strong></li>
  <li><strong>File Format:</strong> Application</li>
  <li>Save as <code class="language-plaintext highlighter-rouge">EmailOrganizer.app</code></li>
  <li>Open <strong>Automator</strong> → <strong>File → New → Calendar Alarm</strong></li>
  <li>Search for and add the <strong>“Run AppleScript”</strong> action, paste your script in</li>
  <li>Save — this creates a Calendar event that triggers the script</li>
  <li>Set the event to repeat daily at your preferred time</li>
</ol>

<p>Now your inbox files itself before you’ve had coffee.</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<p><strong>“Mail got an error: Can’t get mailbox ‘Billing’“</strong>
The mailbox doesn’t exist yet, or the name doesn’t match exactly (check capitalization). Create it via Mail → Mailbox → New Mailbox first.</p>

<p><strong>Nothing happens, no error</strong>
Your filter condition didn’t match anything — double check the sender/subject text is exactly right (it’s case-sensitive for exact matches, though <code class="language-plaintext highlighter-rouge">contains</code> is fairly forgiving with partial text).</p>

<p><strong>“Not authorized to send Apple events to Mail”</strong>
Go to <strong>System Settings → Privacy &amp; Security → Automation</strong>, find Script Editor (or your exported app), and enable Mail.</p>

<h2 id="want-more-filters-without-writing-them-yourself">Want More Filters Without Writing Them Yourself?</h2>

<p><a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> includes ready-made email templates (auto-archive, flag, forward, and more) — or describe your rule in plain English and it writes the script for you.</p>

<h2 id="related-guides">Related Guides</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/archive-old-files-automatically/">Archive Old Emails and Files Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
  <li><a href="/scriptly-blog/scriptly/fix-common-applescript-errors/">Fix Common AppleScript Errors</a></li>
</ul>]]></content><author><name>Luke Welch</name></author><category term="email" /><category term="automation" /><category term="beginner-friendly" /><category term="AppleScript" /><category term="email" /><category term="Mail.app" /><category term="templates" /><summary type="html"><![CDATA[Stop spending 30 minutes a week filing emails by hand. Automatically sort messages into folders based on sender — works with Apple Mail.]]></summary></entry><entry><title type="html">AppleScript for Complete Beginners: What It Is and How to Write Your First Script</title><link href="https://macbound.com/scriptly/applescript-for-beginners/" rel="alternate" type="text/html" title="AppleScript for Complete Beginners: What It Is and How to Write Your First Script" /><published>2026-08-18T00:00:00+00:00</published><updated>2026-08-18T00:00:00+00:00</updated><id>https://macbound.com/scriptly/applescript-for-beginners</id><content type="html" xml:base="https://macbound.com/scriptly/applescript-for-beginners/"><![CDATA[<h1 id="applescript-for-complete-beginners">AppleScript for Complete Beginners</h1>

<p>If the word “AppleScript” makes you think of dense code and hours of frustration, this post is for you. AppleScript is actually one of the friendliest programming languages ever made — it reads almost like plain English on purpose.</p>

<p>By the end of this post you’ll understand what AppleScript is, how it works, and you’ll have written a real script yourself.</p>

<h2 id="what-is-applescript-actually">What Is AppleScript, Actually?</h2>

<p>AppleScript is a scripting language built into every Mac. It lets you <strong>tell apps what to do</strong> — move files, send emails, resize windows, rename photos — without clicking through menus manually.</p>

<p>Instead of writing:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>function moveFile(file, folder) { ... }
</code></pre></div></div>

<p>AppleScript reads like this:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="nv">move</span><span class="w"> </span><span class="nv">file</span><span class="w"> </span><span class="s2">"report.pdf"</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">folder</span><span class="w"> </span><span class="s2">"Documents"</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<p>That’s it. That’s a real, working line of AppleScript. <code class="language-plaintext highlighter-rouge">tell application "X"</code> is how almost every script starts — you’re telling an app what you want it to do.</p>

<h2 id="the-two-things-you-need-to-know">The Two Things You Need to Know</h2>

<h3 id="1-tell-blocks">1. <code class="language-plaintext highlighter-rouge">tell</code> blocks</h3>

<p>Everything happens inside a <code class="language-plaintext highlighter-rouge">tell</code> block, which targets one app at a time:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="c1">-- commands for Finder go here</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>

<h3 id="2-variables">2. Variables</h3>

<p>Variables store information you want to reuse, using <code class="language-plaintext highlighter-rouge">set</code>:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">myName</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s2">"Luke"</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"Hello, "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">myName</span><span class="w">
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">&amp;</code> joins text together. That’s basically the whole language — apps, commands, and variables.</p>

<h2 id="where-you-write-and-run-scripts">Where You Write and Run Scripts</h2>

<p>Every Mac has <strong>Script Editor</strong> built in (Applications → Utilities → Script Editor). It’s where you write, test, and run AppleScript.</p>

<ol>
  <li>Open Script Editor</li>
  <li>Paste in a script</li>
  <li>Click the <strong>Run</strong> (▶) button</li>
  <li>macOS may ask for permission to control an app — click <strong>OK</strong> or <strong>Always Allow</strong></li>
</ol>

<p>That permission prompt is normal — macOS wants to confirm you trust the script to control apps like Finder or Mail.</p>

<h2 id="your-first-real-script">Your First Real Script</h2>

<p>Let’s write something actually useful: a script that shows a popup with today’s date.</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">todayDate</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">current date</span><span class="w">
</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"Today is "</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">todayDate</span><span class="w"> </span><span class="nb">buttons</span><span class="w"> </span><span class="p">{</span><span class="s2">"OK"</span><span class="p">}</span><span class="w"> </span><span class="nv">default</span><span class="w"> </span><span class="nb">button</span><span class="w"> </span><span class="s2">"OK"</span><span class="w">
</span></code></pre></div></div>

<p>Paste that into Script Editor and hit Run. You should see a popup with today’s date. Congratulations — you just wrote and ran AppleScript.</p>

<h2 id="a-slightly-more-useful-example">A Slightly More Useful Example</h2>

<p>Here’s a script that renames a file you choose:</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">choose file</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="na">prompt</span><span class="w"> </span><span class="s2">"Pick a file to rename:"</span><span class="w">

</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Finder"</span><span class="w">
    </span><span class="k">set</span><span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">theFile</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s2">"renamed-file.txt"</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">

</span><span class="nb">display dialog</span><span class="w"> </span><span class="s2">"Done! File renamed."</span><span class="w">
</span></code></pre></div></div>

<p>Notice the pattern:</p>
<ol>
  <li>Ask for input (<code class="language-plaintext highlighter-rouge">choose file</code>)</li>
  <li>Tell an app to do something with it</li>
  <li>Confirm it worked</li>
</ol>

<p>Almost every useful AppleScript follows this same three-step shape.</p>

<h2 id="common-beginner-mistakes">Common Beginner Mistakes</h2>

<p><strong>Forgetting <code class="language-plaintext highlighter-rouge">end tell</code></strong> — every <code class="language-plaintext highlighter-rouge">tell application</code> needs a matching <code class="language-plaintext highlighter-rouge">end tell</code>, or you’ll get a syntax error.</p>

<p><strong>Typos in app names</strong> — <code class="language-plaintext highlighter-rouge">tell application "finder"</code> (lowercase) will fail. App names are case-sensitive: <code class="language-plaintext highlighter-rouge">"Finder"</code>, <code class="language-plaintext highlighter-rouge">"Mail"</code>, <code class="language-plaintext highlighter-rouge">"Photos"</code>.</p>

<p><strong>Running a script that needs a file/folder that doesn’t exist</strong> — if your script references a folder called “Archive” that you haven’t created yet, it’ll error out. Create it first, or add a check (we cover this in <a href="/scriptly-blog/scriptly/fix-common-applescript-errors/">Fix Common AppleScript Errors</a>).</p>

<h2 id="you-dont-have-to-write-these-from-scratch">You Don’t Have to Write These From Scratch</h2>

<p>Honestly, this is the part most beginners get stuck on — remembering exact syntax, app-specific commands, and correct capitalization. That’s exactly the problem <a href="https://apps.apple.com/us/app/scriptly-script-automations/id6788839033?mt=12">Scriptly</a> solves: describe what you want in plain English, and it generates working AppleScript for you, or pick from 100+ ready-made templates.</p>

<p>But understanding the basics above means you can actually read what Scriptly generates, tweak it, and troubleshoot it yourself — which is a genuinely useful skill.</p>

<h2 id="next-steps">Next Steps</h2>

<ul>
  <li><a href="/scriptly-blog/scriptly/applescript-templates/">10 AppleScript Templates You Can Copy-Paste</a></li>
  <li><a href="/scriptly-blog/scriptly/auto-organize-downloads/">Organize Your Downloads Folder Automatically</a></li>
  <li><a href="/scriptly-blog/scriptly/fix-common-applescript-errors/">Fix Common AppleScript Errors</a></li>
</ul>

<p>Questions? The <a href="https://reddit.com/r/applescript">r/applescript</a> community is active and helpful for beginners.</p>]]></content><author><name>Luke Welch</name></author><category term="beginner-friendly" /><category term="applescript" /><category term="AppleScript" /><category term="Script Editor" /><category term="beginner" /><category term="tutorial" /><summary type="html"><![CDATA[Never written a line of code? Here's everything you need to understand AppleScript and write your first working script in 10 minutes.]]></summary></entry></feed>