- fix: dedupe URL balloon preview duplicates in watch stream without cross-chat/schema regressions (#64, thanks @lesaai)
- fix: remove non-functional
typingcommand and related RPC methods - fix: remove unsupported standalone IMCore typing path and stale error branch
- test: drop typing-specific unit/integration tests with command/RPC surface removal
- feat: add typing indicator command + RPC methods with stricter validation (#41, thanks @kohoj)
- feat:
--reactionsflag forwatchcommand to include tapback events in stream (#26) - feat:
imsg reactcommand to send tapback reactions via UI automation (#24) - feat: reaction events include
is_reaction,reaction_type,reaction_emoji,is_reaction_add,reacted_to_guidfields - feat: add
include_reactionstoggle towatch.subscribeRPC and extend RPC reaction metadata fields - feat: include
thread_originator_guidin message output (#39, thanks @ruthmade) - feat: expose
destination_caller_idin message output (#29, thanks @commander-alexander) - fix: apply history filters before limit (#20, thanks @tommybananas)
- fix: flush watch output immediately when stdout is buffered (#43, thanks @ccaum)
- fix: prefer handle sends when chat identifier is a direct handle
- fix: detect groups from
;+;prefix in guid/identifier for RPC payloads (#42, thanks @shivshil) - fix: harden
reactAppleScript execution and tighten group-handle detection paths - refactor: consolidate schema detection, stdout writing, and message/RPC payload mapping paths
- test: split command test suites by domain and align group-handle expectations
- docs: update changelog entries as typing/reaction work landed
- chore: bump version marker to
0.5.0
- feat: surface audio message transcriptions (thanks @antons)
- fix: stage message attachments in Messages attachments directory (thanks @antons)
- fix: prefer chat GUID for
chat_idsends to avoid 1:1 AppleScript errors (thanks @mshuffett) - fix: detect python3 in patch-deps script (thanks @visionik)
- build: add universal binary build helper
- ci: switch to make-based lint/test/build
- docs: update build/test/release instructions
- chore: replace pnpm scripts with make targets
- refactor: split message-store query paths for clearer message retrieval internals
- test: keep attachment tests isolated from user attachment directories
- fix: address attachment upload error handling regressions
- docs: refine changelog ordering/notes for patch-deps and 0.4.0 prep
- chore: version housekeeping for the 0.3.1 -> 0.4.0 release transition
- feat: JSON-RPC server over stdin/stdout (
imsg rpc) with chats, history, watch, and send - feat: group chat metadata in JSON/RPC output (participants, chat identifiers, is_group)
- feat: tapback + emoji reaction support in JSON output (#8) — thanks @tylerwince
- enhancement: custom emoji reactions and tapback removal handling
- feat: include
guidandreply_to_guidmetadata in JSON output - fix: hide reaction rows from history/watch output and improve reaction matching
- fix: fill missing sender handles from
destination_caller_idfor outgoing/group messages - fix: harden reaction detection
- docs: add RPC + group chat notes
- test: expand RPC/command coverage, add reaction fixtures, drop unused stdout helper
- test: add coverage for sender fallback
- feat: add IMCore send mode and IMCore-based reaction send path
- fix: stabilize IMCore send and sender fallback behavior
- change: remove private API send mode in favor of IMCore path
- build: add/harden notarized release script checks
- chore: update copyright year to 2026
- test: split message-store fixtures for more isolated reaction/sender coverage
- docs: maintain unreleased/release changelog staging for 0.2.2/0.3.0
- chore: release/prepare metadata updates for 0.3.0 and 0.3.1
- fix: avoid crash parsing long attributed bodies (>256 bytes) (thanks @tommybananas)
- docs: prepare/backfill changelog notes for 0.2.1
- chore: bump release version metadata to 0.2.1
- feat: Swift 6 rewrite with reusable IMsgCore library target
- feat: Commander-based CLI with SwiftPM build/test workflow
- feat: event-driven watch using filesystem events (no polling)
- feat: SQLite.swift + PhoneNumberKit + NSAppleScript integration
- fix: ship PhoneNumberKit resource bundle for CLI installs
- fix: patch/avoid PhoneNumberKit bundle lookup crashes across install layouts
- fix: embed Info.plist + AppleEvents entitlement for automation prompts
- fix: fall back to osascript when AppleEvents permission is missing
- fix: retry osascript on transient unknown AppleScript errors
- fix: decode length-prefixed attributed bodies for sent messages
- fix: resolve CLI version detection for symlinked/bundle installs
- chore: SwiftLint + swift-format linting
- change: JSON attachment keys now snake_case
- deprecation note:
--intervalreplaced by--debounce(no compatibility) - docs: add release process documentation
- ci: publish release notes from changelog and harden extraction
- chore: reset release versioning during Swift rewrite stabilization
- chore: version.env + generated version source for
--version
- feat:
imsg chats --json - fix: drop sqlite
immutableflag so new messages/replies show up (thanks @zleman1593) - test: add/stabilize live update regression coverage
- docs: add unreleased entry and backfill/prepare changelog history
- chore: update go dependencies
- feat:
imsg chatslist recent conversations - feat:
imsg historywith filters (--participants,--start,--end) +--json - feat:
imsg watchpolling stream (--interval,--since-rowid) + filters +--json - feat:
imsg sendtext and/or one attachment (--service imessage|sms|auto,--region) - feat: attachment metadata output (
--attachments) incl. resolved path + missing flag - fix: clearer Full Disk Access error for
~/Library/Messages/chat.db - fix: coerce attachment aliasing in message parsing
- build: add GoReleaser workflow and tag backfill support
- ci: harden Go/lint environment setup and align toolchain/linter installation
- docs: add repository guidelines/package docs and initial README polish
- chore: bootstrap initial project/release scaffolding and dependency baseline