Skip to content

Releases: rgdevment/CopyPaste

v2.5.0

02 May 02:37
v2.5.0
ecd4d56

Choose a tag to compare

Multi-monitor positioning, window position persistence, and clipboard
robustness improvements.

  • Windows: fix multi-monitor positioning. The window now opens on the
    monitor where the cursor lives, regardless of per-monitor DPI mix
    (e.g. 4K@150% + 1080p@100%). Two underlying issues are addressed:
    (a) bypass window_manager plugin's double-DPR scaling in setPosition
    via direct Win32 SetWindowPos/FindWindowW/GetWindowRect,
    (b) fix latent FFI typedef bug for MonitorFromPoint whose POINT
    argument was being passed as two Int32s, breaking the x64 ABI and
    silently making cursor monitor detection always fall back to the
    primary work area.
  • Window position persistence: new "Remember window position" toggle in
    Settings → Behavior (default OFF). When enabled, the window reopens at
    the last position used, including across hide/show, settings entry/exit,
    and gate mode. Saved coordinates are validated against current visible
    monitors before restoration; out-of-range or off-screen values fall back
    to cursor positioning. macOS/Linux include a 50ms post-set verification
    with auto-recovery.
  • Clipboard image handling: BITMAPV5 support added so wider/taller images
    copied from modern apps are no longer dropped or corrupted (#43).
  • Concurrency: config writes are now serialized through a single chained
    future, eliminating last-writer-wins races between window-position
    persistence and other settings (e.g. onboarding flags, accessibility).
  • Robustness: race fix in hide() (visibility flag flipped before async
    position read), FindWindowW scoped to the Flutter window class to
    avoid matching foreign processes named "CopyPaste", sane-range guard
    on saved coordinates rejects NaN, infinities and Windows minimized
    sentinels (-32000), and "Reset to Defaults" now clears the persisted
    coordinates.
  • Build: drop sqlite3 and sqlite3_flutter_libs (#45) and prune them
    from iOS Podfile.lock; lower image build footprint and dependency
    surface on macOS/iOS.
  • Tests: 16 new cases covering the three new AppConfig fields
    (defaults, JSON round-trip, copyWith sentinel for nullable, save/load),
    plus 12 new cases for cross-platform sane-range validation.

Severity: recommended
Min-Supported: 2.3.0

What's Changed

  • fix: enhance image processing for clipboard handling with BITMAPV5 su… by @rgdevment in #43
  • chore: update dependencies and remove sqlite3_flutter_libs plugin by @rgdevment in #45
  • feat: add window position persistence feature with settings toggle by @rgdevment in #46

Full Changelog: v2.4.1...v2.5.0

v2.4.1

27 Apr 15:46
v2.4.1
e8c20a1

Choose a tag to compare

What's Changed

  • chore: add msix_config for startup_task and improve error logging in … by @rgdevment in #42

Full Changelog: v2.4.0...v2.4.1

v2.4.0

25 Apr 05:04
d197ca6

Choose a tag to compare

Primary focus of this release is Linux: new native distribution channels,
deeper platform integration, and onboarding parity with Windows/macOS.
Windows and macOS are unchanged at runtime.

Linux distribution

  • Native apt/dnf/zypper repositories via the openSUSE Build Service
    (Debian 12/13, Ubuntu 22.04/24.04, Fedora 40/41, openSUSE Tumbleweed).
  • Self-updating AppImage via AppImageUpdate: each release now embeds a
    .zsync URL and ships the companion .zsync file.
  • New portable tarball artifact (CopyPaste--linux-x64.tar.gz)
    used by OBS and available for manual installs.

Linux platform integration

  • Native thumbnail provider and desktop notifier.
  • Refactored X11 clipboard activation and pasting.
  • Linux cursor monitoring and input focus retrieval.
  • Enhanced tray functionality with capability warnings.
  • Detailed error handling on global hotkey registration.
  • Clipboard change handling simplified (debounce removed on Linux).
  • Refactored Linux session detection with broader test coverage.

Linux onboarding & UX

  • Dedicated desktop onboarding screen.
  • Updated hotkey label handling.
  • Default shortcut fix for Linux/X11.

Release pipeline

  • Release manifest is now driven by the tag message (Severity,
    Min-Supported, Blocked trailers). See RELEASING.md for the full flow.
  • GitHub Release now publishes AppImage+zsync, .deb, .rpm, portable
    tarball and SHA256SUMS in one shot.
  • OBS publish job wired into the pipeline (tag-driven rebuild).

Documentation

  • README: reorganized Linux install section (OBS → Homebrew →
    self-updating AppImage → manual) with no hype icons, plus updated
    download table and platform matrix.
  • SECURITY.md: documents the OBS-signed repositories and the AppImage
    delta-update trust chain.
  • New RELEASING.md: single source of truth for how releases are cut.

Severity: recommended
Min-Supported: 2.3.0

What's Changed

Full Changelog: v2.3.0...v2.4.0

v2.3.0

24 Apr 13:22

Choose a tag to compare

  • Native thumbnail provider for macOS and Windows (WIC-based on Windows,
    NSImage-based on macOS) integrated into ClipboardService

  • Asynchronous image processing queue (ImageProcessingQueue) with async
    disposal and retry logic for clipboard capture

  • ThumbnailQueue: stale-item handling, logging, and new isIdle property
    for accurate queue-state inspection

  • New DB fields: thumbPath and sourceModifiedAt on ClipboardItem with
    automatic schema migration

  • WebP encoding support added and then removed in favour of native
    platform codecs; BMP retained as universal fallback for unsupported formats

  • Improved orphan-image cleanup and safety checks for file deletion in
    ClipboardService

  • CleanupService: image quota enforcement (imagesQuotaMB) to cap disk
    usage by stored images

  • CleanupService: tracking of broken external references across service
    restarts; thumbnails are preserved during cleanup passes

  • Paste-preset options and reset-filters-on-show toggle in Settings

  • Multimedia and cleanup settings exposed in onboarding and Settings screens

  • Simplified onboarding: removed personalisation step to reduce friction

  • AppConfig extended with keepBrokenItemsDays, resetFiltersOnShow and
    imagesQuotaMB fields

  • Release manifest service with Ed25519 signature verification

  • Blocked-version detection with InstallChannelDetector and UrlHelper
    platform overrides; blocked-version screen with per-channel upgrade URLs

  • Update-available store messages clarified in English and Spanish

  • release-manifest.json: latest=2.3.0, minimumSupported=2.3.0,
    blockedVersions=["2.2.6"], severity=critical

  • Fix async disposal order in service teardown to avoid race conditions

  • Fix safety checks preventing accidental deletion of unrelated files

  • Fix BMP fallback path when clipboard image format is unsupported

  • Codecov: PR comments enabled with diff-per-file and per-flag breakdown;
    require_changes=true to avoid noise on doc-only PRs

  • GitHub Actions: pull-requests: write permission added for bot comments

  • Removed auto_updater_macos / Sparkle dependency from Podfile.lock

  • New/extended tests: ImageProcessingQueue, ThumbnailQueue, MacOS/Windows
    native thumbnail providers, SQLite migration, thumb path retrieval,
    ClipboardService reclassification, SettingsScreen smoke tests,
    AppConfig (keepBrokenItemsDays, resetFiltersOnShow, imagesQuotaMB),
    BlockedVersionScreen with channel URL resolution

What's Changed

  • fix: retain BMP fallback for unsupported image formats in clipboard p… by @rgdevment in #40

Full Changelog: v2.2.6...v2.3.0

v2.3.0-beta.1

24 Apr 12:04
acfd484

Choose a tag to compare

v2.3.0-beta.1 Pre-release
Pre-release
  • Native thumbnail provider for macOS and Windows

  • Background thumbnail queue with stale-detection and manual refresh

  • Tracks thumbPath and sourceModifiedAt on clipboard items

  • Async image processing queue with configurable max-bytes gate

  • Retain BMP fallback for unsupported formats (SVG, PDF, etc.)

  • Enhanced safety checks for file deletion (out-of-scope path guard)

  • Image quota enforcement: purge oldest images when storage exceeds limit

  • Track broken external references (brokenSince) and auto-purge after configurable days

  • New updateKeepBrokenCallback and updateImagesQuotaCallback hooks

  • Release manifest service with signature verification

  • InstallChannelDetector and UrlHelper with platform overrides

  • Blocked-version screen improvements

  • Paste preset options and reset-filters-on-show setting

  • Multimedia and cleanup settings in onboarding

  • isIdle property on ThumbnailQueue for UI state

  • Remove onboarding personalization options

  • Remove WebP encoding (reverted)

  • Improved code formatting and readability across services

Full Changelog: v2.2.6...v2.3.0-beta.1

v2.2.6

23 Apr 19:47
c380163

Choose a tag to compare

Standalone:

  • Skip registry write if exe does not exist on disk
  • Skip registry write when running from a Flutter build folder (\build\windows)
  • Auto-remove stale HKCU...\Run entry in both cases

MSIX:

  • Remove any leftover HKCU...\Run entry from previous standalone installs on launch
  • Replace openWindowsStartupSettings workaround with real WinRT StartupTask API
  • Add C++ MethodChannel (copypaste/startup_task) via cppwinrt for getState / enable / disable
  • Handle DisabledByUser state by surfacing ms-settings:startupapps as fallback

Tests:

  • MsixStartupTask: state parsing, method dispatch, taskId forwarding, PlatformException handling
  • StartupHelper: isDevBuildPath edge cases, MSIX channel interaction

Full Changelog: v2.2.5...v2.2.6

v2.2.5

23 Apr 17:12
13912d4

Choose a tag to compare

  • Replaced the fragile compile-time STORE_BUILD flag with a runtime FFI call to
    GetCurrentPackageFullName (kernel32). The app now detects at startup whether it
    is running as an MSIX (Microsoft Store) package or a standalone installer.

  • Bootstrap log now includes the install type, full package name, resolved data path
    and acrylic status: msix=true|false, package=..., base=..., acrylicInit=...

  • Added WinKnownFolders.localAppData() - resolves %LOCALAPPDATA% via
    SHGetKnownFolderPath (shell32) instead of reading the environment variable.
    Works correctly in edge cases where the env var is absent (services, scheduled tasks).

  • StorageConfig.create() now accepts a windowsLocalAppDataResolver parameter so
    the resolution strategy is fully injectable and testable.

  • Removed the PowerShell-based StartupTask registration (~1.5 s overhead, AV friction).

  • MSIX builds now declare the startup task in the manifest (Enabled="true") and, when
    the user toggles the setting in-app, open ms-settings:startupapps via
    explorer.exe so Windows handles enablement - consistent with Microsoft's 2026
    Store guidelines.

  • Fixed a critical issue where new installs on Windows started with the main window
    hidden. Users who installed via the Microsoft Store and clicked the app icon saw
    nothing because the window remained hidden during the entire initialisation sequence.

  • showOnStart now includes Windows for first-run and onboarding scenarios.

  • Gate-mode window (enterGateMode) now sets skipTaskbar=false so the onboarding
    window is always reachable via the taskbar and Alt+Tab even if tray init fails.

  • New CrashLogger service writes a persistent crash.log to the app data folder
    on every unhandled error or startup failure, even before AppLogger is ready.

  • Log entries include: UTC timestamp, OS name/version, Dart version, context label,
    error message and stack trace.

  • Automatic PII redaction at write time: USERPROFILE/HOME path, username
    segments (\Users<user>, /Users/, /home/) and email addresses
    are replaced with , and before anything is written.

  • File is capped at 512 KB; older content is cleared automatically when the limit
    is reached.

  • main() is now wrapped in runZonedGuarded + FlutterError.onError +
    PlatformDispatcher.onError, all routing to CrashLogger.report.

  • A 10-second watchdog timer in _initShell() calls _forceVisibleFallback() if
    shell initialisation hangs, making the app window visible as a recovery path.

  • exportLogs now bundles crash.log (if present) inside the exported zip.

  • All log and crash file content is passed through CrashLogger.redact before being
    added to the archive - submitted reports contain no usernames, home paths or emails.

  • PRIVACY.md updated: new Crash Log section, crash.log added to all per-platform
    storage tables, export section reflects redaction, "Does NOT do" list updated.

  • README.md updated: export description and bug-reporting guide mention crash.log
    and automatic PII redaction.

  • New crash_logger_test.dart - 35 tests covering initialize, report, file rotation,
    overridePath, redaction (HOME, username, email, no false-positives).

  • support_service_test.dart - 7 new tests: crash.log included/excluded in zip,
    count excludes crash.log, redaction applied to logs and crash.log, non-sensitive
    content preserved.

  • storage_config_test.dart - 2 new tests: resolver used on Windows, ignored on
    other platforms.

  • Additional tests for search functionality and backup restoration callbacks.

Full Changelog: v2.2.4...v2.2.5

v2.2.4

20 Apr 02:08
0bc19b7

Choose a tag to compare

  • Fix invisible window on Windows 10 / Intel GPU: added timeout + fallback to
    waitUntilReadyToShow, Window.initialize(), and Window.setEffect() so the app
    always shows even when Impeller stalls or Mica is unavailable

  • Windows update badge: GitHub Releases check now runs on all platforms
    (previously skipped on Windows standalone — badge never appeared)

  • Windows startup: MSIX build now uses the native Windows StartupTask API
    instead of the registry, no admin rights required; standalone installer
    unchanged

  • Diagnostic logs added throughout the window init pipeline (platform, version,
    acrylic init status, each init step) to simplify future bug reports

  • Linux package smoke test: skip libdartjni.so (Android JNI bridge pulled
    transitively — not loaded on Linux, was causing false failures)

  • Markdown linting: scope changed to project-owned files only, ignoring
    build artifacts and third-party plugin changelogs

  • README: added download badges for Windows, macOS and Linux; SEO and
    formatting improvements; new 'Other Tools' section linking to LinkUnbound

  • PRIVACY.md / SECURITY.md: fixed table formatting

  • CODE_OF_CONDUCT.md: fixed heading punctuation

What's Changed

  • feat: Implement MSIX startup task for Windows and update installer co… by @rgdevment in #38
  • refactor: Enhance window initialization and logging in AppWindow class by @rgdevment in #39

Full Changelog: v2.2.3...v2.2.4

v2.2.3

30 Mar 09:00
1475e02

Choose a tag to compare

  • Fix Windows single-instance enforcement: second instances no longer spawn duplicate windows

    • Replace unreliable GetLastError() with WaitForSingleObject() for mutex ownership detection
    • Change mutex name from Global\ to Local\ for compatibility with MSIX (Microsoft Store) packaging
    • Add native C++ guard in main.cpp using OpenMutexW before Flutter window creation, so no window flash occurs on duplicate launch
  • Windows: re-launching the app while already running now shows the onboarding screen (centered, focused) instead of a small popup near the cursor, making it impossible for basic users to miss

  • Wayland: improve unsupported session messages and dark mode detection on Linux

  • Linux: improve window focus handling and Wayland session detection

  • Remove unused setting

  • Reorganize FFI typedefs in single_instance.dart; remove dead getLastError binding from _Win32 singleton

  • Expand test coverage: AutoUpdateService, WindowFocusManager, Linux session, focus manager, single-instance mutex

  • Refactor Wayland session and startup helper tests for clarity

What's Changed

Full Changelog: v2.2.2...v2.2.3

v2.2.2

29 Mar 04:31
6951e3d

Choose a tag to compare

  • fix: tray icon setting is now Windows-only — on macOS and Linux the tray icon always shows and the toggle no longer appears in Settings

  • fix: default showTrayIcon=true ensures all users (including those upgrading from older versions without this config) always start with tray mode

  • fix(ci): update script paths for linux-package-smoke.sh (moved to resources/scripts/)

  • chore: update README screenshots with v2 assets

Full Changelog: v2.2.1...v2.2.2