Releases: rgdevment/CopyPaste
v2.5.0
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) bypasswindow_managerplugin's double-DPR scaling in setPosition
via direct Win32SetWindowPos/FindWindowW/GetWindowRect,
(b) fix latent FFI typedef bug forMonitorFromPointwhosePOINT
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),FindWindowWscoped 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
sqlite3andsqlite3_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
AppConfigfields
(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
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
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
- Feat linux improvments by @rgdevment in #41
Full Changelog: v2.3.0...v2.4.0
v2.3.0
-
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
-
Native thumbnail provider for macOS and Windows
-
Background thumbnail queue with stale-detection and manual refresh
-
Tracks
thumbPathandsourceModifiedAton 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
updateKeepBrokenCallbackandupdateImagesQuotaCallbackhooks -
Release manifest service with signature verification
-
InstallChannelDetectorandUrlHelperwith platform overrides -
Blocked-version screen improvements
-
Paste preset options and reset-filters-on-show setting
-
Multimedia and cleanup settings in onboarding
-
isIdleproperty onThumbnailQueuefor 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
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
-
Replaced the fragile compile-time
STORE_BUILDflag 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 awindowsLocalAppDataResolverparameter 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, openms-settings:startupappsvia
explorer.exeso 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. -
showOnStartnow includes Windows for first-run and onboarding scenarios. -
Gate-mode window (
enterGateMode) now setsskipTaskbar=falseso the onboarding
window is always reachable via the taskbar and Alt+Tab even if tray init fails. -
New
CrashLoggerservice writes a persistentcrash.logto the app data folder
on every unhandled error or startup failure, even beforeAppLoggeris 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
-
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
-
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
- feat: Update Wayland unsupported messages by @rgdevment in #37
Full Changelog: v2.2.2...v2.2.3
v2.2.2
-
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