05-Feb-2026 — CLI migration tool and album-index performance optimizations (ref: #153, #154)
Release Notes
- Site Migration Tool: New CLI command to migrate content from legacy websites to NGX Ramblers
- Scrapes old sites using jsdom/Turndown for HTML-to-markdown conversion
- Reconciles pages and detects content gaps between old and new sites
- Creates pages with text, events, and action-buttons rows
- Interactive checkbox selection of changes to apply
- Faster Photo Galleries: Album index pages load significantly faster
- Single prefetch query replaces multiple individual API calls
- Preview images found efficiently through depth-limited recursive search
- Image Depth Control: New "Max Depth" setting in album indexes limits nested content levels
- Draggable Image Height: Text row images can be resized by dragging in the editor
- Image Overflow Fix: External images no longer overflow their card containers
Technical Changes
- Create shared CMS client (
server/lib/shared/cms-client.ts) for reuse across release-notes and migration
- Add checkbox prompt to cli-prompt for multi-select operations
- Implement migrate command with full apply logic and berkshire subcommand
- Update NgxWalk model with groupEvent properties for walk data access
- Add
maxPathSegments field to ContentPathMatch interface for path depth filtering
- Add
imageHeight field to PageContentColumn interface and mongoose schema
- Add Max Depth UI control in album-index site-edit component
- Prefetch all descendant pages in single query at depth 0
- Pass prefetched pages to recursive calls to eliminate N+1 query pattern
- Enable 2-level preview image search depth for nested album structures
- Filter pages by maxPathSegments after initial query
- Skip site-edit component initialization when not in edit mode (prevents 50+ API calls)
- Store pending pageContent for deferred initialization on edit mode activation
- Add HeightResizer component to text row image editing
- Add max-width: 100% to .card-img-top to constrain external image dimensions
- Remove site-specific migration code to keep codebase generic