# Changelog All notable changes to this project will be documented in this file. ## [Unreleased] ### Added - QDN filesystem backups now include both the filesystem snapshot and the private resource index so another node can restore the same local state. - Startup now compares the local filesystem state against the published QDN backup and prompts to load the QDN version when they differ. - Out-of-date QDN publish state now appears as a small notification badge instead of opening the publish diff immediately. - Manual publish/import actions now clear stale publish notifications and keep the sync baseline aligned with the current filesystem state. ### Changed - The `Sync filesystem backup` toggle now controls publish reminders, not startup restore checks. - Auto-sync no longer interrupts the user as soon as a mismatch is detected; the diff is now opened from the notification badge. - Private file display labels are kept separate from filesystem identity so private entries do not turn into phantom tree items. - Filesystem size summaries continue to report the summed sizes of represented files, which can look large even though the QDN backup payload is metadata-only. - Group mode now prefers the embedded/current group hint when Q-Manager loads inside Q-Chat, and the group picker shows per-group file counts sorted by the most-populated group first. ### Fixed - Deleted private files no longer reappear in sync prompts because publish baselines are normalized from the current filesystem tree plus private index. - Restore and publish diffs now compare the filesystem snapshot and private resource index together, which keeps backup decisions accurate. - Startup restore prompting now works consistently even when auto-sync is disabled. - Large private media previews remain separate from the backup snapshot flow, so preview cost is not the same thing as backup publish size. - Successful private previews now refresh the cached thumbnail in the private index, so a better preview can replace a stale image thumbnail. - Group publish actions now normalize group IDs before encryption and publish, which avoids string/number mismatches when selecting a group. - Public group publishes now stay unencrypted, while private groups use `ENCRYPT_QORTAL_GROUP_DATA` and write matching entries into the private resource index. - Public group files are no longer treated like private resources just because they belong to a group, so previews, thumbnails, and deletes follow the correct path. - Group embed links and published identifiers now follow the Q-Chat-compatible `grp-q-manager_0_group_...` / `grp-q-manager_1_group_...` convention, which keeps private group embeds decryptable and public group files unencrypted. - Group embed links now also carry the selected `groupId` as a compatibility hint, since the current Q-Chat image embed path decrypts against the active group context. - Delete-from-QDN now batches multiple selected files through the multi-publish request instead of republishing tombstones one at a time. - Discovery/import now prefers the group ID encoded in the identifier when reconstructing previously published group files, so they land in the correct group bucket instead of the first selected group. - Private embed creation now prefers the file node's stored sharing key before querying resource properties, which keeps freshly published private image embeds consistent with the key used to encrypt them. - Private and private-group publishes now encrypt the raw file bytes once and publish them as externally encrypted data, while file metadata continues to live in the private resource index. - Right-click file menus now include a `copy embed link` action that uses the file's default name and the same embed-link logic as the file details dialog. - The app shell now keeps its dark background filled in embedded Q-Chat layouts so the lower page area does not flash white while scrolling. - Multi-file publish now updates the live filesystem tree incrementally, so all files in a batch stay visible after group/private publishes. - The bulk-move modal now tolerates the group-map fallback state and always renders the active group's folder tree instead of assuming the tree is already an array. ### Notes - The QDN backup is still an encrypted metadata snapshot, not the raw contents of every file in the filesystem. - Legacy QDN backups remain readable. ## [0.2.0] - 2026-02-28 ### Added - Filesystem persistence now supports IndexedDB with localStorage backup/fallback behavior. - Versioned/timestamped storage records for safer persistence reconciliation. - QDN filesystem structure sync actions. - Option to publish filesystem structure to QDN. - Option to import filesystem structure from QDN. - Option to discover previously published Q-Manager resources and import them into the UI. - Automatic import destination folder: `Recovered Imports`. - Multi-select file workflow with per-item checkboxes in the grid. - Bulk selected-file action mode in bottom controls: `Move`, `Remove`, `Delete from QDN`. - Bulk move modal for selected files with target folder selection. - QDN tombstone delete flow by republishing each selected file identifier with `data64` for `"d"`. - File preview support from the main grid. - Right-click context menu action: `preview`. - Double-click file behavior to open preview. - Optional `Show thumbnails` checkbox above the main action controls. - Image thumbnails in file tiles when thumbnail mode is enabled. - File `displayName` support for UI labels (separate from published `name` / `identifier`). - Right-click context menu action: `More info` modal with full known file metadata dump. - Optional live metadata fetch from QDN resource properties (`GET_QDN_RESOURCE_PROPERTIES`) from the `More info` modal. - Automatic metadata hydration back into file nodes from fetched properties (size, mime, display filename when appropriate). - Selected-files footer now shows aggregated file size with unknown-count fallback. - Per-file size display in selected file details dialog. - File pinning support (`pin file` / `unpin file`) persisted in filesystem data. - Visual pin badge on pinned file tiles. - Extension-based preview inference and text preview mode (`.txt`, `.md`, `.json`, etc.). ### Changed - IndexedDB is treated as the primary storage source, with localStorage retained as backup. - Storage load flow now heals missing/failed IndexedDB state from localStorage fallback data when needed. - Storage save flow now writes through a combined helper to reduce drift between stores. - Folder/file tile visuals were refreshed for stronger readability and hierarchy. - File rename behavior now updates `displayName` for files (folder rename behavior remains structural). - Selection is cleared when switching top-level mode tabs (`public` / `private` / `groups`) or selected group. - Missing/discovered file imports now attempt property hydration and use resolved filename for display labels. - `remove directory` context action now uses a delete icon (pin icon reserved for pinning behavior). ### Fixed - `utils.ts` TypeScript typing issues and Promise/file handling edge cases. - Publish service default selection precedence bug in single publish flow. - Publish service dropdown menu rendering/opacity issues in modal context. - Better error fallback behavior for preview/thumbnails when media cannot be loaded. - Custom button component now honors the `disabled` prop. - Discovery/import now ignores tombstoned QDN resources by filtering very small (delete marker) resource sizes. - Preview fallback now handles text-like resources better when MIME metadata is missing by deriving from filename extension. ### Notes - QDN publish/import works with the in-memory filesystem state, not direct storage backend snapshots.