Skip to content

Releases: ElliotDrel/Universal-Spell-Check

Universal Spell Check v0.4.0

03 Jun 18:55

Choose a tag to compare

docs: align overlay docs with per-phase status and Done-before-restore

The loading overlay docs still described the old SetBusy(bool)
contract. Updated for the SetPhase pipeline shipped in 9f95eb1 and
1f125ea:

1. architecture.md — pipeline steps now show the three SetPhase
   milestones (Copying at run start, Sending before the request,
   Receiving after the response) and that Done fires in RunAsync
   before the clipboard restore; the overlay section documents the
   per-phase text, the sized-to-widest-string/no-wrap layout, and
   the OverlayHost STA thread (which the section had never caught
   up with).
2. watchlist.md — Loading overlay marshalling entry rewritten for
   OverlayHost BeginInvoke queueing, plus the phase-to-visibility
   contract and a warning that hiding after the clipboard restore
   re-introduces the stuck-overlay-after-failure bug.
3. conventions.md, NATIVE_APP_FUTURE_TODO.md — SetBusy references
   renamed; the stuck-overlay troubleshooting note now points at
   Done-before-restore.
4. src/CLAUDE.md — manual check 5 verifies all three phase texts
   and that the label is always a single line.
5. overview.md — file-map line mentions the per-phase status text.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Universal Spell Check v0.3.1

31 May 02:34

Choose a tag to compare

fix: prevent replacements from cascading onto their own output

"Burton Morgan Comp" was a case-sensitive prefix of its own canonical
"Burton Morgan Competition", causing it to fire on already-correct text
and produce "Competitionetition". Two fixes:

1. Remove "Burton Morgan Comp" from variants — it was the unsafe entry.
2. Rewrite ApplyReplacements to use a left-to-right positional scan that
   advances past the consumed variant, making cascading fires impossible.
3. Add load-time validation that detects and skips any variant that is a
   substring of its own canonical, logging replacements_variant_unsafe.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Universal Spell Check v0.3.0

30 May 15:51

Choose a tag to compare

docs: add clipboard-history exclusion step to pipeline description

architecture.md's pipeline list omitted the new post-capture step and didn't
note that the corrected paste write is left untagged so it stays in Win+V
history. Bring it in line with the shipped flow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Universal Spell Check v0.2.0

28 May 01:35

Choose a tag to compare

docs: align activity feed docs with shipped UI

Update design and architecture docs to match the flat Activity feed, all-time
stats bar, inline diff interactions, and paginated infinite scroll behavior.
Also refresh UI runbook guidance and remaining native-path references.

Co-authored-by: Cursor <cursoragent@cursor.com>

Universal Spell Check v0.1.7

27 May 21:17

Choose a tag to compare

fix: harden clipboard operations against transient lock contention

Recent prod failures in Slack, Codex, and Chrome all collapsed to the same root cause: the clipboard path assumed every Clipboard.* call would succeed immediately. Under transient Windows clipboard contention that turned a recoverable lock into a hard capture or paste failure.\n\nThis change adds bounded retry around the clipboard operations that matter on the hot path: backup, sentinel write, capture polling reads, corrected-text publish, and restore. The behavior stays clipboard-first with the same Ctrl+V replacement model, but transient ExternalException cases now wait briefly and succeed instead of aborting the run.\n\nDocs were updated to match the actual dev app version stamping behavior in logs so channel and build attribution stays clear during prod/dev verification.

Universal Spell Check v0.1.6

26 May 12:47

Choose a tag to compare

fix: correct MSBuild target hook so Dev version actually embeds

SetDevVersionFromGit was running BeforeTargets="GenerateAssemblyInfo",
which fires after GetAssemblyAttributes has already created the
AssemblyAttribute items from InformationalVersion. The property was
being set correctly but the items were stale, so GenerateAssemblyInfo
wrote the old 1.0.0+{hash} value.

Fix: run AfterTargets="AddSourceRevisionToInformationalVersion"
BeforeTargets="GetAssemblyAttributes" so the override lands before
the items are created.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Universal Spell Check v0.1.4

13 May 15:56

Choose a tag to compare

Universal Spell Check v0.1.4

Universal Spell Check v0.1.3

29 Apr 14:31

Choose a tag to compare

v0.1.3 - hot-path speed optimization

Universal Spell Check v0.1.2

29 Apr 12:38

Choose a tag to compare

docs: add MIT license

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Universal Spell Check v0.1.1

29 Apr 03:04

Choose a tag to compare

feat: launch on Windows startup by default, toggleable in Settings

Velopack does not register a login auto-start hook and our code
didn't either, so v0.1.0 only ran when launched manually. The app
is meant to be ambient — you press Ctrl+Alt+U and it Just Works —
which only holds if it's already running. Default to enabled, but
let users opt out from the dashboard.

New StartupRegistration writes HKCU\...\Run\<MutexName> pointing at
the running exe (the channel-specific mutex name keeps Prod and Dev
from clobbering each other). On first launch after install,
SpellCheckAppContext calls EnsureFirstRunRegistered which registers
the entry and drops a startup.initialized flag in the per-channel
AppData folder. The flag is what stops us from re-enabling the
entry on every launch after a user has explicitly disabled it.

The Settings page already had a Startup card with a disabled
checkbox. Wire it up: the checkbox now reflects IsRegistered() on
load and toggling it calls Register/Unregister. In Dev the checkbox
is disabled with a tooltip explaining that dev builds are launched
manually via dotnet run, since the dev exe path moves with each
publish anyway.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>