feat: v4.1.0 — auto-exclusion, import stats period, code quality refactor, and reliability improvements
Full v4.1.0 release build. Combines all nightly work.
User-facing:
- Auto-exclusion — titles auto-excluded after N searches with no
confirmed import; configurable per app; amber badge in Exclusions;
unexclude timer returns titles to eligibility; mobile fully supported
- Import stats period toggle — Lifetime / Last 30 Days / Last 7 Days
on the Imports tab stats card; Lifetime survives Clear Stats
- What's New modal updated — three cards, disabled-by-default note,
expanded Under the Hood
Code quality refactor:
- ui.html split from 1,481 lines to 61-line shell + 13 template partials
- JS files split into focused single-responsibility files (8 new files)
- sweep.py consolidated — two per-instance functions merged into one
- Dead code removed across Python and JS
- Inline styles replaced with named CSS classes
- Contributor commenting pass across all new and split files
- tests/test_frontend_structure.py added — 110-test pytest suite
Reliability:
- Pagination cap removed — full library always in scope for all modes
- threading.Event replaces stop_flag dict — graceful SIGTERM shutdown
- Waitress production WSGI server replaces Flask dev server
- Cache-busting on all static file URLs via url_for v=VERSION
- CI element ID check updated for template partial structure
- Bug fix: prune endpoint TypeError in routes/state.py
Docs:
- CHANGELOG, CONTRIBUTING, README, wiki all updated
- Wiki: Settings Reference corrected, Sweep tab fully documented,
How Nudgarr Works sweep lifecycle updated, Setup docker-compose fixed
validate.py 295/295. Tests 110/110. Flake8 clean.