Skip to content

Releases: macrosak/recallyx

Recallyx 0.85

Choose a tag to compare

@github-actions github-actions released this 04 Jul 13:23
f5fe566

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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 13:21
198ba0e

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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 13:20
eccdb30

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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 13:18
7cb77db

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 before activateAndPaste.
  • typeLines(_:into:) (paste-as-lines) — its Paster.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.pasteText into
    setClipboardText + gate + activateAndPaste so the result lands on
    the clipboard even when untrusted. No markSelfWrite here (action
    results intentionally re-enter history as a fresh top clip).
    Behavior-preserving vs. pasteText when trusted.

Also broadened the Accessibility alert copy to lead with pasting clips
(⌘⇧V) rather than only ⌃⇧V.

Verification

  • ./scripts/bundle.sh builds clean.
  • ./scripts/test.sh — all 353 tests pass. The paste paths are
    AppKit/AX-bound and attended-verified per repo convention; no brittle
    AXIsProcessTrusted tests added.

Recallyx 0.81

Choose a tag to compare

@github-actions github-actions released this 04 Jul 12:40
4d59209

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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 12:29
70bdd53

Add Recallyx landing page + GitHub Pages deploy workflow (#67)

Recallyx 0.79

Choose a tag to compare

@github-actions github-actions released this 03 Jul 14:13
f0b72db

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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 14:36
3b44c2b

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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 14:16
e447082

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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 13:01
22073df

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-only skips 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 and bundle.sh builds can't
    carry the entitlement, so sync stays inert there.
  • Fixes a latent project bug found on the way: no shared Xcode scheme
    existed, so xcodebuild -scheme Recallyx built 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.