RELEASE
HISTORY

Every update, feature, and fix — documented.

// NEW_FEATURES
  • + Important for multi-Mac users - Update Wordy to 1.4.0 on every Mac before turning on iCloud sync on a Mac that has not synced before. Older versions may replace that Mac's local snippets with the version already stored in iCloud without asking first. Wordy 1.4.0 adds a new safety check that warns you before a large sync change is applied. Learn more →
  • + New sync safety guard - Wordy now pauses iCloud sync if an incoming update would remove a large number of snippets. You'll see a yellow warning in the menu bar with a clear "Sync paused" message, so you can review the change before anything is replaced.
  • + Review before applying - When sync is paused, you can apply the incoming iCloud version, reveal the saved copy in Finder, or cancel and keep your current snippets.
  • + Automatic local backups - Wordy now keeps recent local backups of your snippet data, giving you a recovery point if something unexpected happens.
  • + iCloud snapshots - Before Wordy uploads new sync data to iCloud, it now saves recent snapshots of the previous iCloud version.
  • + iCloud unreachable notification - If Wordy cannot reach iCloud for several minutes after launch, macOS will show a notification so you know sync is paused and can check your iCloud connection.
// IMPROVEMENTS
  • ~ Safer first-time sync - Wordy now does extra checks before treating a new install's sync data as safe to upload.
  • ~ Backwards-compatible sync data - Existing Wordy data files continue to load normally after updating.
// BUG_FIXES
  • * Fixed a rare first-sync data loss issue - A fresh Wordy install can no longer overwrite existing iCloud snippets with the starter default snippets.
Wordy snippet editor showing per-app scope rules and per-app replacement variants side by side
// NEW_FEATURES
  • + Per-app snippet variants — One trigger, different text per app. Type ;hi in Mail and get "Hey there, thank you for your email." Type the same ;hi in Slack and get "Hey Team." A new tab bar above the replacement editor shows a Default tab and a + button — click + to pick an app, tweak the text for that app, done. Apps without a variant fall back to the default. Learn more →
  • + Per-app snippet scope — Restrict a snippet to fire only in specific apps, or block it in specific apps. The new App Scope card in the editor has three modes: Everywhere, Only in these apps…, or Except in these apps…. Right-click any snippet in the list to quickly restrict, block, or reset it for the app you were just using. Learn more →
  • + App picker with search — Adding an app pulls up a searchable picker showing apps that are currently running, your 10 most recent picks, and a Browse… option to choose any app from your Applications folder. The search field is ready to type in the moment it opens.
  • + Variants and scope work together — You can limit where a snippet fires and customize its text per app at the same time. For example, allow ;sig only in Mail and Slack, with different signatures for each.
// IMPROVEMENTS
  • ~ Redesigned snippet list — A new Scope column sits between Trigger and Folder and shows where each snippet fires at a glance (e.g., "Mail only", "Except Terminal", "2 variants"). Hover to see the full app list. The combined Name/Abbreviation column is now two separate Name and Trigger columns, and the small "Plain text / Rich text / Regex" label under names has been removed for a cleaner look.
  • ~ Wordy won't trigger inside itself — Typing a trigger while editing a snippet in Wordy no longer fires that snippet. Edit freely without accidental expansions.
  • ~ Everything syncs — Variants and scope rules ride the existing iCloud sync, so configuring on one Mac propagates to all your devices. Variants for apps you don't have on a given Mac simply sit dormant.
  • ~ Full version history — Edits to any variant are captured in snippet version history, so you can always roll back to an earlier version of any app's text.
  • ~ Nothing to migrate — All existing snippets keep working exactly as before. Variants and scope are opt-in per snippet.
// BUG_FIXES
  • * Fixed an issue where tapping a snippet in the list didn't always select it on the first click.
// NEW_FEATURES
  • + Redesigned Settings — Settings is now organized into tabs (General, AI, License, Import/Export) instead of one long scrollable page. Each tab resizes the window to fit its content, keeping things clean and focused.
  • + Sidebar and snippet list animations — Folders, navigation items, and snippet rows now respond to hover, press, and selection with smooth transitions for a more polished feel.
  • + Button animations — Buttons throughout the app have a subtle weight-shift effect on hover and press, making interactions feel more tactile.
  • + Fill-in form animations — The fill-in popup now has entrance animations, a shake effect for validation errors, and smoother button transitions.
// IMPROVEMENTS
  • ~ Update screen now shows what's new — When a new version is available, the update dialog displays the changelog for that release so you can see exactly what's changed before updating.
// BUG_FIXES
  • * Fixed an issue where clicking a snippet in the list wouldn't always select it properly.
// BUG_FIXES
  • * Fixed multi-line snippet expansion in terminals — Expanding multi-line snippets (e.g., shell scripts with awk) in Terminal, iTerm, or other terminal emulators would type each line individually with Return keys between them, causing the shell to execute each line instead of pasting the block. Wordy now uses clipboard paste (Cmd+V with save/restore) for any expansion containing newlines or exceeding 100 characters, matching Espanso's proven approach. Short single-line expansions still use direct keystroke injection to avoid clipboard clobbering.
  • * Fixed fill-in form expansions silently failing in Chromium browsers — Fill-in form expansions (e.g., .sem → URL with email field) in Brave, Chrome, and Edge address bars would play the expansion sound but produce no output. Chromium's omnibox reports AX value as settable but silently ignores the write. Wordy now verifies the value was actually updated by reading it back, and falls back to clipboard paste when the write was ignored.
// NEW_FEATURES
  • + Inline AI rewrite — Select text in any app, press Ctrl+Shift+R, and rewrite it with Claude. A floating panel shows your original text, lets you type a custom instruction or pick from saved prompts, and displays the result. Click Replace to paste rewritten text back or Copy to clipboard. Learn more →
  • + Custom rewrite prompts — Save, edit, reorder, and delete your own rewrite prompts. Prompts sync across devices via iCloud alongside your snippets and folders. Six presets are included (Fix Grammar, Make Concise, Make Professional, Make Casual, Simplify, Summarize) and are fully editable.
  • + Iterative refinement — After a rewrite, click Refine to rewrite the result again with a new instruction. Chain multiple rewrites without starting over.
  • + Configurable rewrite hotkey — The rewrite shortcut (default Ctrl+Shift+R) can be rebound in Settings → Shortcuts, just like translation and quick search hotkeys.
// IMPROVEMENTS
  • ~ Target app name in fill-in popup — The fill-in form header now shows the destination app (e.g., "greeting → Google Chrome") so you know where the expanded text will go.
  • ~ Target app name in rewrite panel — The rewrite panel header shows the source app (e.g., "Rewrite → Safari") so you know where the rewritten text will go.
  • ~ Solid background for rewrite panel — The rewrite panel now uses a solid opaque background matching the fill-in form style, replacing the translucent vibrancy effect.
  • ~ Rewrite panel stays visible on focus loss — The panel no longer disappears when clicking on another app. Dismiss it with ESC or the close button.
  • ~ Readable keyboard shortcuts — Hotkeys now display as "Ctrl+Shift+R" instead of "⌃⇧R" throughout Settings and the app.
// BUG_FIXES
  • * Fixed inaccurate "All Time" average expansions per day after old events were pruned — the stat now uses the correct start date instead of producing inflated numbers.
  • * Fixed fill-in form expanding old clipboard content in web apps (Gmail, Zendesk, Electron) — a race condition caused the previous clipboard contents to be pasted instead of the expansion text.
  • * Fixed translation Replace pasting old clipboard content in web apps — the clipboard was being restored too quickly for slower web apps to read it.
  • * Fixed rewrite Replace pasting old clipboard content in web apps — same race condition as translation, now resolved.
// NEW_FEATURES
  • + Cross-app fill-in fields — When you trigger a snippet with fill-in fields in one app (say, Chrome) and happen to switch to a different app while filling in the form, Wordy now remembers where you started and puts the text in the right place. No more accidental expansions in the wrong window.
  • + The fill-in popup now shows the destination app in its title (e.g., "Fill In - greeting → Google Chrome") so you always know where your text will end up.
// IMPROVEMENTS
  • ~ Smarter text injection — Wordy now uses the best available method for each app automatically. Native macOS apps (TextEdit, Mail, Notes, etc.) get silent background injection, while web apps like Gmail and Zendesk get a targeted paste that works correctly with their input fields.
  • ~ Faster app switching — Instead of waiting a fixed amount of time before inserting text, Wordy now detects when the target app is ready and acts immediately. This makes expansions snappier, especially on slower machines.
// BUG_FIXES
  • * Fixed single-character expansions (like .ar → →) failing on the first try in Terminal — Wordy now gives the terminal enough time to process the change before sending the replacement character.
  • * Fixed clipboard contents being partially lost after an expansion. If you had rich content copied (e.g., formatted text or HTML), Wordy now preserves all of it when restoring your clipboard.
  • * Fixed rare crashes that could occur when Wordy was figuring out whether a text field belongs to a web app.
  • * Fixed garbled output when expanding snippets containing emoji or accented characters into native text fields.
  • * Fixed an edge case where text injection via paste could silently fail without falling back to the standard method.
  • * Removed harmless but noisy font warnings that appeared in the log on launch.
// BUG_FIXES
  • * Fixed a timing issue where Wordy could send text to the wrong app. Instead of guessing when an app is ready, Wordy now waits until it confirms the target app is actually in focus before inserting text — making expansions much more reliable.
  • * Fixed a bug where snippets with fill-in forms would play the confirmation sound but no text would appear. The form window was briefly stealing focus at exactly the wrong moment — this is now resolved.
  • * URLs inside snippets (using open:) no longer interfere with text insertion. They now open after the text has been placed, so the browser can't jump in and steal focus mid-expansion.
// NEW_FEATURES
  • + Smarter text replacement — Wordy now selects and replaces your trigger text in one step instead of deleting it character by character. It's faster, more reliable, and if anything goes wrong, your original text stays put so you can easily try again.
  • + Automatic app detection — Wordy now figures out the best way to expand text in each app on the fly. Standard macOS apps get the faster replacement method, while terminals, Electron apps, and remote desktop clients automatically use the classic approach. No setup or configuration needed.
// IMPROVEMENTS
  • ~ Noticeably faster expansions in apps that use the classic deletion method — up to 66% quicker than before.
// BUG_FIXES
  • * Fixed an issue where pressing Return or Tab wouldn't trigger regex-based snippets — only Space was working. All three keys now work as expected.
  • * Fixed a bug where snippets containing nested placeholders (like a note referencing a shell command) were incorrectly treated as slow expansions, causing unnecessary delays.
// BUG_FIXES
  • * Fixed a bug where snippets would stop inserting text after using one that opens URLs or browser tabs. You'd hear the expansion sound, but nothing would appear. This is now fully resolved — snippets expand reliably regardless of what previous snippets did.
// BUG_FIXES
  • * Fixed an issue where snippets with fill-in fields could stop expanding after using a snippet that opens a URL. The browser would sometimes steal focus at the wrong moment, causing the next snippet's text to end up in the wrong app.
// BUG_FIXES
  • * Fixed expansion system freezing after inject() early return — two early-return paths in TextInjector.inject() (no frontmost app, or frontmost app is Wordy itself) skipped calling onInjectionComplete, leaving isInjecting permanently true and causing all subsequent keystrokes to be silently dropped. Both paths now fire the completion callback.
// BUG_FIXES
  • * Fixed snippet expansion pasting clipboard content instead of snippet — removed the clipboard-based injection path which had a race condition during the paste window. All text is now injected via CGEvent Unicode events regardless of length or content.
  • * Fixed surrogate pair splitting at chunk boundaries — emoji and other non-BMP characters could be corrupted when a UTF-16 surrogate pair was split across two CGEvent chunks. Chunk boundaries now respect surrogate pairs.
// NEW_FEATURES
  • + Text injection now uses CGEvent key simulation for fast, clipboard-free expansion
  • + Automatically falls back to clipboard paste for long text (500+ chars) or emoji/supplementary Unicode characters
  • + European diacritics and accented characters use the fast CGEvent path
  • + {{shell:...}} and {{js:...}} placeholders now resolve asynchronously — no more UI freezes
  • + New folder creation shows a popover with name and color picker — choose from 8 preset colors or pick a custom color
// IMPROVEMENTS
  • ~ Held modifier keys (Shift, Cmd, etc.) are released before injection to prevent garbled output
  • ~ Keyboard monitoring pauses during injection to prevent re-triggering
  • ~ Cached regex compilation for named capture groups (avoids recompiling on every expansion)
  • ~ Nested snippet resolution captures the snippet array once instead of re-reading on each level
  • ~ Added unit test target with 51 tests covering the expansion pipeline, text injector, and slow placeholder detection
// BUG_FIXES
  • * Fixed thread-safety issue with keystroke buffer access in KeyboardMonitor
  • * Fixed fill-in panel stealing focus unnecessarily via NSApp.activate
// NEW_FEATURES
  • + New AI Translation — select text in any app and press Option+T to translate it using Claude AI
  • + Floating preview panel shows original text and translation side by side
  • + Choose from 28 target languages with a quick picker
  • + Replace pastes the translation over the original selection
  • + Copy copies the translation to clipboard
  • + Configurable hotkey in Settings → Global Hotkeys
  • + Requires an Anthropic API key (same key used for AI snippet generation)
// NEW_FEATURES
  • + New {{open:URL_OR_PATH}} placeholder that opens URLs, apps, or files after snippet expansion
  • + Opens in the default browser or app via macOS — works with https://, file paths, and .app bundles
  • + Supports dynamic URLs with nested placeholders: {{open:https://jira.com/browse/{{clipboard}}}}
  • + Resolves to empty string — combine with text insertion or use standalone
  • + Multiple {{open:...}} per snippet allowed
  • + Works with fill-in forms, quick search, and direct expansion
  • + Tilde paths (~/Documents/...) expanded automatically
  • + Available in the Insert Placeholder menu under Advanced > "Open URL / Path..."
  • + Syntax highlighted in brown in the snippet editor
// IMPROVEMENTS
  • ~ Snippet editor opens instantly — eliminated Keychain I/O that ran on every snippet selection (10–80 ms per click)
  • ~ Snippet list and editor views are now preserved instead of destroyed and recreated on each navigation, avoiding full NSTextView reconstruction
  • ~ Back button in the snippet editor has a larger click target for easier navigation
  • ~ Shell command blocklist now uses regex patterns, making it resistant to bypass tricks like variable expansion, absolute paths, and string concatenation
  • ~ Clipboard placeholder resolution uses a thread-safe container to prevent potential memory issues on timeout
  • ~ iCloud sync version counter uses timestamp-based versioning to prevent cross-device collisions
  • ~ Fill-in form window uses a proper state machine to prevent race conditions between submit and close
  • ~ Secure input app detection caches results for 2 seconds to reduce subprocess spawning
  • ~ LicenseStore gracefully handles missing Application Support directory instead of force-unwrapping
  • ~ Regex triggers that match empty strings are now rejected to prevent firing on every keystroke
// BUG_FIXES
  • * Fixed suggestion count mismatch — menu bar could show "Suggestions 1" while the suggestions sheet showed no results due to sub-phrase deduplication not being applied to the count
  • * Fixed sidebar click targets — clicking the gap between a folder name and its snippet count now correctly selects the folder
  • * Fixed version history losing intermediate edits during rapid saves
// NEW_FEATURES
  • + New {{datepicker:Name}} placeholder type for fill-in forms — shows a graphical calendar picker when the snippet expands
  • + Optional custom date format for date picker: {{datepicker:Name:yyyy-MM-dd}}
  • + Required flag support for date picker: {{datepicker:Name::required}}
  • + Date picker available in the Insert Placeholder menu under Date & Time
  • + Snippet version history — automatically saves a snapshot before each snippet edit, keeps the last 5 versions per snippet
  • + New History button in the snippet editor to browse and restore previous versions, persisted across app restarts
  • + Snippet suggestions — detects repeated multi-word phrases as you type and surfaces suggestions in the menu bar dropdown after 3+ repetitions
  • + Menu bar icon changes to a lightbulb when suggestions are available, with one-click "Create Snippet" to turn a suggestion into a snippet
  • + Deduplicates overlapping sub-phrases for cleaner suggestion results
  • + Toggle snippet suggestions on/off in Settings > General
  • + Fully isolated suggestion detection — no impact on typing performance
  • + New "Test" button in the snippet editor header to preview how a snippet expands — supports fill-in fields, regex snippets with placeholder capture group values, and includes a Copy button for the result
  • + Regex pattern field now highlights syntax with distinct colors — named capture groups, escape sequences, character classes, and quantifiers are color-coded
// IMPROVEMENTS
  • ~ Redesigned fill-in form to use a horizontal two-column layout — fields on the left, live preview on the right, replacing the previous stacked vertical layout
  • ~ Added draggable vertical divider between fields and preview columns with a grip handle and left-right resize cursor (default 45% fields / 55% preview, adjustable 25%-70%)
  • ~ Both columns scroll independently — fields scroll when there are many inputs, preview scrolls when snippet content is long
  • ~ Increased window size to accommodate side-by-side layout (860x500 default, 700x400 minimum)
  • ~ Removed horizontal resize divider between fields and preview that was used in the old vertical layout
// IMPROVEMENTS
  • ~ Fill-in form preview now displays actual clipboard content instead of [clipboard]. Falls back to [clipboard] when the clipboard is empty or contains non-text data.
// NEW_FEATURES
  • + New app logo
// NEW_FEATURES
  • + Complete UI Redesign — The entire app has been restyled with a bold, monospace-heavy developer-tool aesthetic. New centralized design system with dark/light mode support and yellow accent color.
  • + Custom Folder Colors — Folders can now have arbitrary custom colors beyond the 8 presets. Colored pill badges show folder names throughout the snippet list.
  • + Redesigned Fill-in Forms — Numbered fields, new "MEMORIZE" toggle for remembering values, inline placeholder preview with colored pills, and keyboard hints.
  • + Table-Style Snippet List — New three-column layout (Name, Abbreviation, Folder) with themed search and "NEW SNIPPET" button.
// IMPROVEMENTS
  • ~ Redesigned sidebar with numbered items, monospace uppercase typography, and tinted active selection with accent border.
  • ~ Themed Quick Search with monospace font and accent-colored result highlighting.
  • ~ Themed Statistics views with styled card backgrounds, mono values, and accent chart styling.
  • ~ All windows now use the new design system — Settings, Global Variables, License Activation, Import, and Permission Request.
  • ~ AI components restyled with subtle pill buttons and themed prompt/preview sheets.
  • ~ Editor improvements: themed text fields, placeholder highlighter with accent color, and new native dropdown component.
// NEW_FEATURES
  • + Notes in Fill-in Forms — Add reference information to your fill-in forms with {{note:...}}. Notes display in the form with an info icon but are stripped from the final output. Perfect for including email addresses, instructions, or context when filling out forms.
  • + Auto-Update Checking — Wordy now checks for updates automatically and notifies you when a new version is available. View release notes and install updates with one click. Configure in Settings → Updates or check manually from the menu bar.
// BUG_FIXES
  • * Fixed the way the app starts on system startup - making it more reliable.
// NEW_FEATURES
  • + AI Snippet Generation — Let Claude AI write your snippets for you. Describe what you need in plain English and Wordy generates the trigger, replacement text, and placeholders automatically.
  • + Create with AI — Click the sparkles button in the snippet editor to generate a new snippet from a natural language description. Claude builds it complete with the right placeholders, fill-in fields, and formatting.
  • + Improve with AI — Click the wand button to enhance an existing snippet. Ask Claude to add fill-in fields, use date math, shorten the trigger, make sections optional, or any other improvement.
  • + Preview & Refine — Review every AI suggestion before it touches your snippet. See the proposed title, trigger, replacement, and regex status. Apply, refine your prompt to iterate, or discard.
  • + Model Selection — Choose your preferred Claude model in Settings → AI: Sonnet 4.5 (default) for best quality or Haiku 4.5 for faster responses.
  • + Secure API Key Storage — Your Anthropic API key is stored in the macOS Keychain, never written to disk as plaintext. Remove it anytime to disable AI features entirely.
// IMPROVEMENTS
  • ~ Regex Triggers UI — When "Use as regular expression" is enabled, the editor now shows two separate fields: Trigger displays the human-readable format (e.g., ;jira<project>-<number>[space]) while Pattern shows the actual regex. This makes it clearer what you need to type versus the underlying pattern.
// NEW_FEATURES
  • + Refreshed Window Design — The main Manage Snippets window now features a modern translucent sidebar that blurs the content behind it, giving the app a more refined macOS-native feel. The detail panel appears as an elevated card with rounded corners and a subtle shadow, creating a clear visual hierarchy between navigation and content.
  • + Translucent sidebar with vibrancy effect
  • + Elevated detail panel with rounded corners
  • + Collapsible sidebar with toolbar toggle
  • + Unified transparent titlebar
// NEW_FEATURES
  • + Native macOS text expander living in your menu bar
  • + Create snippets with custom triggers that expand instantly
  • + Organize snippets into folders for easy management
  • + Regex-powered triggers for dynamic expansions
  • + Global variables for reusable content across snippets
  • + Fill-in fields for interactive snippet completion
  • + Light and dark mode support
// END_OF_LOG