CF Group Builder redesign, startup-pull bug fix, and a responsive topnav from the community. Collapsing what was going to ship as v2.1.2 into v2.2.0 since the builder reorganization outgrew the patch-release scope.
Fixed
- Settings → TRaSH Guides → Pull interval "Disabled" is now honored on container startup. The scheduled-pull loop already respected the Disabled setting, but the startup-trash-pull goroutine called
CloneOrPullunconditionally — so every container restart still did a fullgit fetch. Startup now checkscfg.PullInterval == "0"and, if the repo is already cloned, loads the existing on-disk data via a newTrashStore.LoadFromDisk()method without any git ops. First-run (no.gitdir) still clones. TrashStore.loadAndSwapnow recordspullErroron failure. Pre-existing issue: whenparseAllor commit-hash lookup errored, the store returned the error to its caller for logging but never updatedpullError, so the Status panel kept showing a clean state on top of a stale/corrupted snapshot. Both error paths now callSetPullError.- Row layouts no longer collapse when Alpine
:styleis used with a string. Two separate rows in the Builder (Card A selected-highlight + Saved cf-groups last-row border) used the string form of:style, which replaces the entire static style attribute instead of merging. The result wasdisplay:flexbeing wiped — checkboxes wrapping above CF names and Edit/Delete buttons dropping to a third line on the only saved group. Both switched to the object form.
Added
- CF Group Builder — Selected CFs card (live group preview). Full-width card at the top of the builder showing every CF currently in the group being built. Reorder via drag-and-drop in manual mode, set required / default per CF, or remove with the × — all without scrolling back to the Custom Formats list.
- CF Group Builder — hash lock toggle in the edit banner. When editing or copying a group, a visible lock (🔒 Hash locked / 🔓 Hash tracks name) replaces the earlier save-time "keep vs regenerate" modal. Locked (default for any edit) means typo fixes and minor rewording don't invalidate the
trash_id— existing profile includes, prior exports, and synced Arr profiles stay valid. User's explicit unlock choice is preserved across save. - CF Group Builder — copy an upstream TRaSH cf-group into the local builder. A collapsed "TRaSH {app} cf-groups" section above the builder form lists every upstream group with an
Editbutton that seeds the form and saves as a NEW local cf-group under/config/custom/json/{app}/cf-groups/. TRaSH repo clone is never written to. - Manual-order CF reorder via drag-and-drop. Replaces the earlier ▲/▼ arrows. Drop on another row to move, with visual feedback (40% opacity on source, blue top-shadow on target).
Changed
- CF Group Builder is now three cards — Selected CFs (full-width, live preview) + Custom Formats (browse + add) + Quality Profiles (include). Sort-mode toggle + required/default migrate to Selected CFs where order lives.
- Custom Formats list packs into columns on wide viewports via
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)). Short CF names pack tightly; long names truncate with…. - Selected CFs rows use a fixed-column grid — drag-handle / # / name / required+default / ×. Consistent alignment across rows.
- Responsive topnav + icon relocation. Tabs wrap on narrow viewports, Changelog dropdown scales / full-width on mobile. Credit @ColeSpringer via #26.
Internal
- Refactor:
TrashStore.loadAndSwapextracted fromCloneOrPull. The "get commit hash + parseAll + atomic snapshot swap" portion became a private helper reused by bothCloneOrPull(after git ops) and the new publicLoadFromDisk(no git ops). - Shared
confirmModalsupports a secondary action button (reusable extension point, currently unused).