Reading progress lives in localStorage so sorting is done client-side. On page load, JS reads the reading_progress map, moves any matching book cards into a 'Continue reading' grid above the main grid, and reveals an 'Available' heading for the remainder. Books with no saved progress are unaffected and no server changes are required.