Releases: nissy/kipple
Releases · nissy/kipple
v2.1.5
v2.0.0
v2.0.0 Release Notes
- Actor-Based Clipboard Core
Introduced a modern clipboard service that runs inside an async actor, continuously polls the pasteboard with adaptive intervals, and persists only the deltas. The adapter layer keeps
the legacy ClipboardServiceProtocol intact, so UI components and tests continue to work with minimal change while benefiting from faster, more reliable history updates. - SwiftData Persistence by Default
macOS 14 and newer now store clipboard history using SwiftData models and a dedicated repository. The repository falls back to Core Data automatically if SwiftData initialization
fails, improving reliability across system versions while delivering noticeably quicker load times for large histories. - Simplified Global Hotkey Management
A new SimplifiedHotkeyManager manages the primary global shortcut with automatic input-monitoring checks, unified local/global listeners, and persistent user defaults. Service
providers resolve the correct manager for production and test contexts, making hotkey behavior both more robust and easier to verify. - UI & Category Enhancements
Main window notifications now use cancellable work items to avoid overlapping animations, and the pinned/cleanup actions surface clearer feedback. Category filters gained “All,”
“Numbers,” and “JSON,” plus aliases that preserve existing preferences, giving users more precise ways to sift through history. - ViewModel Refresh with Swift Macro Support
The main view model family adopts Swift 5.9’s @observable macro, reducing manual Combine boilerplate. Dependency providers supply clipboard, repository, and view-model instances,
which improves testability and keeps initialization logic centralized. - Expanded Test Coverage
Added comprehensive integration, performance, and persistence suites covering the new actor service, SwiftData repository, and simplified hotkey manager. These tests exercise real
save/restore flows, async shutdown flushing, and edge-case filtering, significantly lowering regression risk.
v1.1.1
🐛 Bug Fixes and Performance Improvements
Memory Leak Fixes
- Resolved retain cycles in timers: Used
[weak self]in all ClipboardService timers to prevent memory leaks - Properly released window resources: In WindowManager,
explicitly set delegate, contentView, and contentViewController to nil when closing windows to ensure references are released - Reliable observer removal: Ensure observers are removed in managers' deinit methods to prevent memory leaks
Core Data Optimization
- Improved WAL checkpointing: Implemented non-blocking locks using NSLock.try() to prevent contention
- Enhanced memory efficiency: Optimized memory usage during Core Data operations with explicit memory management via autoreleasepool
- SQLite optimization: Improved database performance using WAL mode (Write-Ahead Logging) and PRAGMA optimize
Stability improvements
- Improved long-term stability: Memory leak fixes prevent memory usage from increasing during prolonged application use
- Optimized background processing: Efficient timer management using DispatchSourceTimer
- Enhanced resource management: Explicit resource release prevents memory-related crashes
Test Coverage
- Added memory leak detection tests: Automated memory leak detection using XCTMemoryMetric
- Implemented performance monitoring tests: Continuous monitoring of memory efficiency during large data processing
📊 Improvement Effects
- Memory Usage: Eliminated memory increase during long-term use
- Performance: Improved responsiveness through optimized Core Data operations
- Stability: Significantly reduced risk of memory-related crashes
v1.1.0
Here’s a concise, release‑note–ready summary for v1.1.0.
Highlights
- Noticeably faster history saves and loads with large clip sets.
- More responsive UI while browsing and searching history.
- Safer Core Data deletes; views and caches stay in sync.
Performance
- Core Data: use batch deletes with object‑ID merging to avoid refetch storms and keep contexts/FRC in sync.
- Core Data: tuned fetches with sensible batch sizes for list views.
- Clipboard monitoring: dynamic polling (0.5–1.0s) and lightweight duplicate detection via recent‑content hashes.
- Debounced persistence: Combine pipeline coalesces rapid edits into single saves.
- Category classification: centralized service with NSCache, early‑exit heuristics (very long/very short text).
- UI lists: fixed row height + LazyVStack for smoother scrolling.
- Font metrics: line‑height caching to avoid repeated layout work.
Reliability
- After batch deletes, changes are merged into both background and view contexts to prevent stale items and crashes.
- Startup/shutdown flow waits for Core Data readiness; optional checkpointing is performed safely.
- Clipboard “internal copy” and “from editor” states are tracked to avoid self‑echoes and duplicate entries.
Logging
- True lazy log evaluation restored; disabled levels no longer build messages.
- Config read is cached and refreshable to reduce UserDefaults overhead.
Developer Notes
- Classification logic moved to CategoryClassifier (service layer) for maintainability and testability.
- SwiftLint runs without cache; unit tests target streamlined for consistent CI runs.
- Added and refined tests for logger lazy evaluation, classification, and Core Data operations.
If you want this in a shorter “What’s New” format for the App Store or website, I can condense it further.