Releases: macrosak/recallyx
Release list
Recallyx 0.85
Link the website from the README hero (#71)
Adds Website · Download links under the badges, pointing at recallyx.app
(live, HTTPS enforced).
Recallyx 0.84
Add a one-command TestFlight upload script (#70)
Wraps the verified manual flow into scripts/testflight.sh: stamp
CFBundleVersion from the commit count (App Store Connect rejects
duplicates; the plist is trap-restored so the tree stays clean),
xcodegen, archive, and upload with automatic signing. --archive-only
builds without uploading. Friendly preflight errors for missing
xcodegen/Local.xcconfig/Xcode, and the "Failed to Use Accounts" upload
failure prints the actual fix (sign into Xcode, restart it once).
Verified end-to-end with --archive-only (stamped build 81, Info.plist
byte-identical after); the upload path is the same one used for today's
real TestFlight push.
Recallyx 0.83
iOS app: browse, search, and copy your synced clipboard history (#64)
The actual iPhone UI on top of the empty target from #62: a searchable
list of the history synced from your Macs, pinned clips first, with a
detail view and one-tap Copy to the iOS pasteboard (haptic + toast).
Swipe left for Pin/Delete (both sync back), swipe right to copy from the
list. Image clips appear as placeholder rows since image payloads don't
sync yet. A settings sheet holds the iCloud sync toggle (on by default —
the app is a companion to the synced history), and a lightweight sync
monitor drives a "Syncing…" state on first launch so a cold start
doesn't look broken.
Needs attended device verification before merge (simulator can't do
CloudKit): clips from the Macs appearing, copy + haptic, pin/delete
propagating back without resurrection.
Recallyx 0.82
Prompt for Accessibility when a paste can't synthesize ⌘V (#69)
Symptom
Users reported paste silently failing after a re-sign or a fresh DMG
install: selecting a clip and hitting ↵ set the clipboard but nothing
pasted, with no feedback, and the app never re-added itself to the
Accessibility list.
Root cause
Paste works by synthesizing ⌘V via CGEvent.post, which requires
Accessibility permission. Only the ⌃⇧V "transform selection" path
checked/prompted for trust (accessibility.ensureTrustedOrPrompt()).
The three plain-paste paths never checked — so when the grant was absent
or stale (re-signing / a fresh ad-hoc DMG strips it), the clipboard was
still written but the synthesized ⌘V was dropped by the OS. Zero
feedback, no re-prompt.
Fix
Gate every synthesized-⌘V paste on Accessibility via a new
AppDelegate.ensurePasteTrusted():
- Trusted → proceed with the synth as before.
- Untrusted → prompt once/session (the existing modal) plus a
notification on every attempt (so repeated tries still surface), and
always leave the clip on the clipboard so a manual ⌘V is the working
fallback.
Wired into all three synth-⌘V sites:
paste(_:into:)(history-clip paste) — clipboard already set +
markSelfWrite()'d; gate right beforeactivateAndPaste.typeLines(_:into:)(paste-as-lines) — itsPaster.typeText
snapshots and restores the clipboard at the end, so a dropped synth
would leave nothing pasteable. When untrusted it degrades to a plain
clipboard set (+markSelfWrite) and prompts, so the whole clip stays
for a manual ⌘V.- Action-result paste — split
Paster.pasteTextinto
setClipboardText+ gate +activateAndPasteso the result lands on
the clipboard even when untrusted. NomarkSelfWritehere (action
results intentionally re-enter history as a fresh top clip).
Behavior-preserving vs.pasteTextwhen trusted.
Also broadened the Accessibility alert copy to lead with pasting clips
(⌘⇧V) rather than only ⌃⇧V.
Verification
./scripts/bundle.shbuilds clean../scripts/test.sh— all 353 tests pass. The paste paths are
AppKit/AX-bound and attended-verified per repo convention; no brittle
AXIsProcessTrustedtests added.
Recallyx 0.81
Show the current release version on the site instead of a hardcoded one (#68)
The hero note hardcoded 0.79, which goes stale on every release (version
= commit count). It now fetches releases/latest at page load and fills
the number in; if the API is unreachable the note reads fine without a
number — no placeholder, no layout shift.
Recallyx 0.80
Add Recallyx landing page + GitHub Pages deploy workflow (#67)
Recallyx 0.79
Apply remote CloudKit changes live and stop clobbering imported edits (#66)
Device testing of the iPhone app (#64) showed sync only half-working:
new clips, pins, and deletes from another device never appeared in a
running app, a pin made on the phone silently reverted, and remote
deletes could resurrect.
Two root causes, both fixed:
- The store loaded its in-memory list once at launch and never noticed
CloudKit imports. It now enables persistent-history tracking +
remote-change notifications and merges imported changes into the running
app (debounced, flushing pending local edits first). The Mac panel keeps
its snapshot-per-open behavior; the iOS list updates live. - Persist mirrored the whole in-memory array — upserting every item and
deleting every row it didn't know about — so any local edit re-exported
stale fields over freshly imported ones (that's the reverted pin) and
re-created remotely deleted clips. Persist is now scoped to a
dirty/deleted id set and touches nothing else.
Also: image-orphan file cleanup is skipped when sync is on — image
payloads don't sync, so clips from another device legitimately have no
local file there.
Needs a two-device re-check before #64 merges (pin/delete propagation +
live Mac→phone), which is the plan anyway.
Recallyx 0.78
Add an iOS companion app target and make the core build for iOS (#62)
First slice of the iPhone companion app: RecallyxCore now compiles for
iOS 26, and a new RecallyxiOS target builds an empty app bound to the
synced history store (builds on the sync groundwork from #61).
- Script steps are macOS-only, so ScriptRunner/ActionRunner are
platform-guarded; running a script action off macOS throws a clean "not
available" error. - The iOS store lives in an app-group container from day one so a future
Share Extension needs no store migration, and it never runs image-orphan
reconciliation (image files don't sync yet, so entities without a local
PNG are expected there, not orphans). - CI gains an unsigned iOS-simulator compile gate; the mac test job and
the ad-hoc release path are untouched.
One flag for later: AppleClient's availability check doesn't name iOS,
which would matter only when AI lands on the iOS app — left as-is here.
The real UI (list, search, detail, copy) comes in the next PR.
Recallyx 0.77
Stop unentitled builds from crashing when iCloud sync is enabled (#65)
The sync toggle ships in every build, but only the team-signed build
carries the iCloud entitlement — and it turns out an unentitled process
that loads a CloudKit-mirrored store doesn't stay inert as #61 claimed:
it hard-crashes (EXC_BREAKPOINT in CloudKit setup). Reproduced
deterministically with the ad-hoc bundle.sh build: sync on → SIGTRAP at
every launch, i.e. a DMG user who flips the toggle gets a crash loop.
This is live today for anyone whose settings already have sync enabled
and then runs an ad-hoc build.
The fix gates mirroring on the process actually holding the
com.apple.developer.icloud-services entitlement (checked once via the
Security framework). Unentitled builds now launch clean with sync
on-but-inactive plus a content-free log line, and their Settings toggle
is disabled with a caption explaining sync needs the team-signed build.
The entitled path is unchanged — verified the signed build still embeds
the entitlements and enables mirroring.
Re-verified empirically: the fixed ad-hoc build with sync enabled
launches clean where the unfixed one crashed.
Recallyx 0.76
Make the team-signed Xcode build the primary path, add install-dev.sh (#63)
iCloud sync (#61) only runs in a team-signed build, so this makes that
build the documented primary path and gives it day-to-day CLI tooling.
- New
scripts/install-dev.sh: xcodegen + signed Release xcodebuild
(-allowProvisioningUpdates, no Xcode UI needed) → installs to
~/Applications and relaunches.--build-onlyskips the install so
automation never kills a running instance. - README: build section rewritten — team-signed Xcode build first (with
the honest caveat that the CloudKit capability needs a paid Apple
Developer team), the ad-hoc CLT path kept as the zero-cost alternative
with its limitation stated plainly: the DMG andbundle.shbuilds can't
carry the entitlement, so sync stays inert there. - Fixes a latent project bug found on the way: no shared Xcode scheme
existed, soxcodebuild -scheme Recallyxbuilt the bare SPM executable
instead of the signed .app. A shared scheme in project.yml now makes it
build the real app bundle.
Verified: the script's signed build embeds the CloudKit entitlements
(checked via codesign), and the ad-hoc bundle.sh path is untouched.