Performance (ported from Linearr):
- rapidfuzz C extension for Levenshtein (20-50x faster when available)
- Pure Python early termination fallback via threshold parameter
- Normalization cache: precompute_normalizations() avoids redundant normalize_name() calls
- fuzzy_match() and find_best_match() use cached results
- ETA updated from 7.73s to 0.1s per item
UI simplification:
- Profile Name: free text → dynamic dropdown from database
- Match Sensitivity: number 0-100 → named presets (Relaxed/Normal/Strict/Exact)
- Tag Handling: 4 booleans → single dropdown (Strip All/Keep Regional/Keep All)
- Channel Database: per-country booleans → single dropdown
- All changes backward compatible with legacy field IDs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>