Releases: dragon-Elec/Imbric
v1.1.6 β Smarter Sorting & Faster Browsing
v1.1.6
This release brings a new sorting menu, faster scrolling in large folders, and smarter defaults for special locations like Recent Files and Trash.
β¨ What's New
- Sort By Menu β Right-click on empty space to sort by Name, Date, Size, or Type. Toggle ascending/descending order and Folders First.
- Smarter Defaults β Recent Files now sorts by date (newest first). Trash sorts by date trashed. Regular folders sort by name with folders on top.
- Faster Scrolling β Large folders now load rows as you scroll instead of building the entire view at once. Less waiting, less memory.
π Fixes
- Trash Monitoring β Fixed an issue where changes inside the Trash folder weren't being detected in real time.
- Menu Checkboxes β Fixed sorting options in the right-click menu not staying checked after selection.
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
v1.1.5
v1.1.5 β VFS Layer Migration
This release advances the VFS layer migration with threading improvements, performance optimizations, and strict scheme enforcement.
β‘ Performance
- Virtual Path Image Streaming β DimensionWorker now detects image dimensions for MTP/SFTP/GDrive by streaming only the first 64KB via GIO β QBuffer β QImageReader. No full file download needed.
- Local File Fast-Path β Local POSIX files bypass GIO overhead entirely, using direct QImageReader(path).
ποΈ Architecture
- FileMonitor GLib Thread β Refactored to use a dedicated _GLibThread singleton (QThread running GLib.MainLoop). GIO callbacks now marshal to Qt main thread via QTimer.singleShot(0). Removes incorrect AsyncWorkerPool dependency.
- Singleton Lifecycle β Added atexit cleanup for graceful GLib thread shutdown.
β¨ New Features
- Strict VFS Mode β BackendRegistry now supports set_strict_vfs(True) which raises RuntimeError on unknown schemes, forcing migration away from direct os/pathlib access.
- Scheme Introspection β New get_registered_schemes() method for debug tooling.
π Bug Fixes
- Missing Gio.FileMonitorEvent.MOVED handling added to FileMonitor switch
- DimensionWorker proper exception handling with fallback to (0,0)
- BackendRegistry metadata property now accessible
π§ͺ Testing
- New integration tests: batch partial failure, conflict resolution, critical paths, signal duplication
- New stress tests: worker pool under load (mock + real filesystem)
- New unit tests: batch throttling, file operations, metadata
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
v1.1.1
β¨ New Interfaces
- SearchBackend β contract for live file search with streaming results
- DeviceProvider β volume/MTP monitoring
- MonitorBackend β directory watching
- Metadata workers β ItemCountWorkerBackend, DimensionWorkerBackend
π IOBackend Improvements
- Feature detection via supports_feature() (symlink, trash, hardlink, permissions, search)
- Type-safe InversePayload TypedDict for reversible operations
- New methods: is_directory(), is_symlink(), is_regular_file(), get_local_path(), build_inverse_payload()
π Bug Fixes
- Validator now uses backend abstraction (works with non-GIO backends)
- SearchWorker graceful fallback for virtual filesystems
- Fixed inverse_payload access timing in FileOperations
- Resolved SearchBackend metaclass conflict (ABC + QObject)
β‘ Worker Pool
- New inject_progress parameter for mid-task progress callbacks
β οΈ Breaking
- Custom IOBackend implementations need new abstract methods
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
v1.0.0 β VFS Architecture
Imbric's core has been fully restructured. This release replaces the flat, monolithic module layout with a clean Backend-Provider architecture, enabling future multi-backend support (SMB, SFTP, etc.) without touching the UI layer.
ποΈ Architecture Overhaul
- Backend-Provider Pattern: All file I/O now routes through a
BackendRegistrythat dispatches by URI scheme. The GIO backend (core/backends/gio/) is the first concrete implementation. - Abstract Interfaces: New
core/interfaces/package defines contracts forIOBackend,ScannerBackend,MetadataProvider,ThumbnailProvider, andCacheProvider. - Decoupled Managers:
FileOperationscontroller rewritten to route through the registry β zero direct GIO imports in the UI or manager layer. - 18 Legacy Modules Removed:
file_workers,file_operations,file_monitor,gio_bridge/*,image_providers/*,metadata_utils,operation_validator,search,search_worker,sorter,trash_workers.
π Bug Fixes
- Critical Undo Guard: Undo operations now verify
op.status == COMPLETEDbefore inverting β previously could undo failed operations, risking data loss. - Job-ID Race Condition: Transaction manager pre-registers job IDs before async dispatch, eliminating fuzzy-match linkage errors.
- Missing Method Fix:
build_renamed_dest()extracted to shared utility, fixing a broken call path in conflict resolution.
β‘ Performance
- True Batch Transfers: Large paste/drag-drop operations now execute in a single background thread (
transfer_batch()) with throttled UI progress, replacing per-file thread pool submissions that caused signal storms and GIL contention.
π§ͺ Test Suite
- New integration tests: batch partial failure, conflict resolution, critical paths, signal duplication.
- New stress tests: worker pool under load (mock + real filesystem).
- New unit tests: batch throttling, file operations, metadata.
π§ Code Quality
- Python 3.11+ type hints throughout (
dict[],X | None). - Structural pattern matching (
match/case) replaces if/elif chains in transaction and undo managers. - Shared utilities extracted to
core/utils/path_ops.py.
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
Release 9.9 Alpha
Happy belated Holi! π¨β¨ Development on Imbric will be entering a slightly slower pace moving forward as I take some time to recharge. With this release, Imbric is almost a full-fledged file manager.
π Features & Aesthetics
- Breadcrumb CSD (NEW): Replaced the legacy Python
CustomHeaderandNavigationBarwith a unified QML top bar featuring interactiveBreadcrumbAddressBarandCrumbcomponents. - GNOME-Style Hover Scrollbars (Refined): Upgraded the existing scrollbars with a cooperative
HoverHandler(distance-filter >3px), removing bulky mouse areas and finally fixing Wayland z-order overlay bugs. - GTK-Style Sidebar Elements (Refined): The existing sidebar now inherently resolves and supplies native GNOME symbolic icons for connected devices and desktop paths.
β‘ Performance
- Asynchronous Sidebar Bridges: Devices, Bookmarks, and Quick Access resolution now entirely run through
GioWorkerPool, preventing the main UI thread from locking up on slow or disconnected MTP/SMB mounts. - Async File Monitoring & Renames: Offloaded
FileMonitor.watch()initialization and rename boundary parsing to background thread workers. - MTP Worker Guards: Disabled the
DimensionWorkerfor non-native mounts to prevent thousands ofQImageReaderthreads from aggressively collapsing the single-threaded MTP FUSE daemon.
π‘οΈ Architecture & Stability
- Pre-Flight Batch Assessment:
TransactionManagernow executes existence checks, auto-renames, and collision assessments asynchronously before triggering massive file transfers. - PaneContext Architecture: Fully replaced legacy
TabControllerfor the robustPaneContextmodel, decoupling data from the UI to cleanly support instant raw-path feedback followed by background GIO enrichment. - Shielded Attribute Access: Re-wrote global
get_file_infoprocedures to useinfo.get_attribute_*(), preventing deep C-levelGLib-GIO-CRITICALcrashes on virtualrecent://file queries. - Python Traceback Interceptor: Integrated
GLib.log_set_handlerto explicitly catch and trace undocumented GIO engine errors directly inside Python context.
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
v0.9.77-alpha
Release v0.9.77-alpha (Hotfix)
This update addresses critical thread-safety issues during thumbnail generation and improves the robustness of virtual URI resolution and remote mount scanning.
π οΈ Stability & Fixes
- Segfault Prevention: Implemented
QMutexlocking for the shared Thumbnail Factory to prevent race conditions during concurrent generation. - Virtual URI Resolution: Fixed thumbnail and metadata mapping for
recent://andtrash://items by correctly resolving physicaltarget_uriorigins. - Remote Mount Optimization: Implemented optimistic MIME detection for non-native mounts (MTP, SMB, etc.) to prevent blocking network-stalling C-calls.
- Metadata Reliability: Updated dimension workers to resolve physical targets before header reading to prevent hangs on network files.
ποΈ Core Refactors
- Unified MIME Data: Centralized GNOME-specific clipboard and Drag-and-Drop payload generation into a shared factory.
- Engine Rename: Renamed
DirectoryReadertoFileScannerto more accurately reflect its role in the architecture.
π¨ UI & Layout Refinement
- Vertical Space Recovery: Removed
QToolBarheight constraints and thinnedNavigationBarpadding to maximize image viewport. - Compact Tab Bar: Reduced
GtkTabBarheight to 25px with refined hover/active transition logic.
v0.9.75-alpha
π¨ v0.9.75-alpha β Adwaita-Mimic & Core Decoupling
β¨ Aesthetic & UI Refinement
- π High-Fidelity Gtk Menus: Pure QML implementation of context menus mimicking the Adwaita aesthetic with 6.5+ GPU shadows.
- πΌοΈ Symbolic Icon Migration: Full migration to action icons for a cleaner, high-contrast native Linux appearance.
- ποΈ View Integration: JustifiedView is now integrated with the new model-driven menu system and manual context key binds.
ποΈ Architectural Hardening
- π§© ViewModel Extraction: Decoupled UI presentation from core bridge logic via ContextMenuViewModel, removing blocking blocking bridge dependencies.
- π§Ή Memory Hygiene: QML menus now explicitly destroy dynamic objects to prevent memory leaks during view transitions.
- π‘οΈ Source Widget Discovery: DragHelper now dynamically resolves the most appropriate source widget for more robust DnD starts.
π GIO & GNOME Integration
- π€ Nautilus Compatibility: Added support for x-special/gnome-copied-files MIME payloads in both clipboard and Drag-and-Drop operations.
- π Robust URI Translation: Centralized string-to-GIO-URI canonicalization using ensure_uri for stable MTP and Network mount support.
π Stability & Compatibility Notes
This is a Pre-release (Alpha) build. We are pushing toward v1.0, but this update includes significant architectural shifts (decoupling) and experimental GPU-backed QML effects.
Stability Status: Unstable. This version is intended for development and testing of the new GIO-based UI interaction model.
v0.9.7-alpha
Imbric v0.9.7-alpha β Granular Sidebar Updates & GIO Parity
This release focuses on structural stability and fixing critical IO logic flaws. The primary highlight is the transition to a nested model system for the sidebar, eliminating visual flickering during hardware changes.
β¨ UI/UX & Interaction
- Flicker-Free Sidebar: Migrated to a nested
QAbstractListModelsystem. Mounting or unmounting a drive now performs a granular section update. This fixes the bug where the entire sidebar would refresh, forcing grids to rearrange and items to jump. - Smart Drag-and-Drop:
- Unified default action to Move for a more intuitive desktop feel.
- Added Ctrl+Drag support to explicitly trigger Copies across the file view and folder delegates.
- Layout Persistence: Added automatic saving/restoration for the sidebar width across sessions.
π‘οΈ GIO & Core Stability
- Universal URI Parity: System-wide adoption of
new_for_commandline_arg, fixing core path resolution flaws fortrash:///,recent:///, and remote URIs. - Session Cross-talk Prevention: Implemented UUID-based scan sessions in
DirectoryReaderto prevent async results from previous folders from leaking into the current view. - Bulk IO Resilience: Background workers now skip corrupted or inaccessible files during bulk trash operations (Empty/List) instead of aborting the entire job.
- Native Path Resolution: Replaced manual string-splitting with GIO's native
get_basenamesystem for 100% accurate identification across all protocol types.
ποΈ Architecture
- Modern Data Binding: Re-architected Sidebar data delivery for PySide 6.8+ compatibility using a nested model system.
- Worker Consolidation: Simplified GIO bridge infrastructure by merging standalone metadata workers into a unified, maintainable module.
π Requirements: Linux (GIO), Python 3.11+, PySide 6.8+
v0.9.5-alpha
ποΈ v0.9.5-alpha β Architecture Cleanup & Batch Transfers
Structural housekeeping and core hardening. The UI layer has been reorganized into clear namespaces, remaining os module calls stripped from workers, and batch file operations now run entirely in the backend.
β¨ What's New
𧬠Batch Transfer Pipeline
β’ TransactionManager.batchTransfer replaces the per-file loop that lived in FileManager β all multi-item copy/move/drop operations are now orchestrated by the core
β’ FileManager reduced to a thin clipboard coordinator β zero direct filesystem I/O
β’ Drag-and-drop transfers use the same pipeline with conflict resolution callback
π‘οΈ Operation Validator
β’ New async post-condition checker verifies filesystem state after every successful job (e.g. confirming source is gone after a move)
β’ Pure Gio implementation β works across local, SMB, FTP, and MTP mounts
β’ Wired to MainWindow for future toast notifications on validation failures
π§ Core Cleanup
β’ Remaining os.path usage in workers replaced with _make_gfile / _gfile_path helpers
β’ ThumbnailProvider simplified β replaced os.access and os.path checks with Gio queries
β’ Scanner renamed FileScanner β DirectoryReader, added safe MIME fallback for FTP servers
β’ ThemeImageProvider now receives raw MIME types for dynamic icon resolution
β’ Added createFile and createSymlink to FileOperations
π UI Reorganization
Directory restructuring for separation of concerns β no logic changes in moved files:
β’ ui/components/ β ui/widgets/ (NavigationBar, StatusBar, ProgressOverlay, CustomHeader)
β’ ui/managers/row_builder.py β ui/services/row_builder.py
β’ ui/models/app_bridge.py β ui/bridges/app_bridge.py
β’ ui/dialogs/conflicts.py β conflict resolution logic extracted to ui/services/conflict_resolver.py
β’ ui/dialogs/properties.py β logic moved to ui/services/properties_logic.py
β’ TabController extracted from tab_model.py into its own file
π¬ Misc
β’ Startup diagnostics β boot time and module count printed on launch
β’ NavigationBar.go_up now uses Gio.File.get_parent() instead of os.path.dirname
β’ MainWindow.navigate_to no longer blocks on os.path.exists
β’ Added tests/dev_transaction_playground.py for transaction system smoke testing
π Requirements: Linux (GNOME recommended), Python 3.11+, PySide6
v0.9.4-alpha
ποΈ v0.9.4-alpha β Unified Shell & Surgical Updates
The app architecture gets a significant consolidation. The UI is now driven by a single QML engine, file operations give instant visual feedback, and diagnostics tooling has been rewritten.
β¨ What's New
𧬠Unified Shell Architecture
- Sidebar + TabManager merged into a single ShellManager β one QML engine, cleaner internals
- CSD support behind IMBRIC_CSD=1 flag β frameless window with custom header
- NavigationBar refactored for CSD compatibility
β‘ Surgical File Updates
- File create/delete/rename now update the view instantly β no full directory rescan
- FileMonitor events flow directly to RowBuilder for per-item insert/remove
- Thumbnail URLs pre-computed at load time β zero blocking Python calls during scroll
π§ Transaction Commit Semantics
- Transactions now require explicit commit β prevents premature completion signals
- Generic error dialog for failed file operations (replaces silent failures)
- Proper error propagation in rename, restore, and empty-trash workers
π¨ QML Improvements
Sidebar β Data-driven sections model, collapsible headers, selection by path
GtkScrollBar β Self-contained physics engine, optional track pillar, rubber-banding
View β ListView margins, fixed marquee math, background message placeholder
RenameField β TextField with commit-on-focus-loss, Escape to cancel
π¬ Diagnostics Overhaul
- Unified diagnostics.py replaces monitor_resources.py
- Resize-aware TUI with side-by-side layout, GPU/FD/proc detection
- Live monitoring via PersistentMonitor (launch with main.py -m)
π Requirements: Linux (GNOME recommended), Python 3.11+, PySide6