Added
- 95 missing translation keys added to all 27 non-English language files
- Proper translations for de, es, fr, it, pt, ja, ko, zh, ru, pl, nl, sv, tr, uk, th, vi, cs, hu
- Restored 5 accidentally deleted language files (de_de, cs_cz, el_cy, en_gb, en_pt)
Fixed
- All remaining hardcoded English strings now use translation keys (stats, natures, tooltips, label badges, moves prefix, hidden ability tag)
- Nature table columns now auto-size to fit translated text instead of using fixed pixel positions
- Stat bar labels dynamically measure translated text width so bars don't overlap labels in verbose languages
- Tooltip summary counts ("spawns", "evos", "drops", "obtainment") now translatable
- BST/EV yield text now translatable
- Moves page indicator uses existing translation key instead of hardcoded format
- Label badges (Legendary, Mythical, Ultra Beast, Paradox) now translatable
Added
- 63 new translation keys: stat abbreviations, stat full names, 25 nature names, nature table headers, tooltip counts, BST/EV, hidden ability tag, moves level prefix, label badges
Added
- TM moves now shown in the Moves section with full type/category/power/accuracy details
Changed
- Moves section reworked: each move now shows type-colored indicator, damage category icon (⚔/◆/✦), power, and accuracy
- Egg and tutor moves display as individual rows with full metadata instead of comma-separated text
- Moves panel height increased from 220px to 240px to accommodate richer layout
Added
- Item → Pokémon reverse lookup for drops: clicking an item in REI now shows which Pokémon drop it
Changed
- Unified recipe viewer integration: all 10 categories now share a single DexCategory abstraction
- REI plugin reduced from 21 files to 1 generic adapter
- JEI plugin reduced from 21 files to 1 generic adapter
- EMI plugin reduced from 11 files to 1 generic adapter
- Total viewer code reduced from 61 files (~2,700 lines) to 3 files (~450 lines)
Removed
- 50+ per-category duplicate files across REI/JEI/EMI (replaced by DexCategory.kt)
Fixed
- Mod now gracefully does nothing if accidentally placed on a dedicated server instead of crashing
- Translation system falls back to raw keys if client I18n is unavailable
- NeoForge init wrapped in safety catch for unexpected server-side class loading
Changed
- Mod is now explicitly client-only in both Fabric and NeoForge metadata
- Fabric environment set to "client" (was "*"), preventing server-side loading
- NeoForge dependencies set to side="CLIENT" (was "BOTH")
- NeoForge init() now only runs on client dist
- Translations use I18n directly instead of server-safe reflection wrapper
Removed
- Fabric server entrypoint (CobbleDexFabric.kt) — init moved to client entrypoint
- ServerSafeI18n translation wrapper with server fallback (dead code for client-only mod)
- DataSource enum (vestigial from removed server sync, only had NONE/LOCAL)
Removed
- Dead
getClientDatapacksDir()function (never called after runtime API switch) - Dead
localDatapackScanconfig field (always true, conditional never triggered) - Dead
CONFIG_VERSIONconstant (defined but never checked) - Dead
SpeciesNameNormalizer.matches()function (zero call sites) - Dead
extraDatapacksDirparameter from ObtainmentDataLoader (always null) - Old config filename migration code (all users migrated long ago)
- Stale
bin/directories containing old server sync compiled artifacts
Fixed
- Misleading "server sync" text in retry log message
Changed
- Spawn data now reads directly from Cobblemon's runtime spawn pool instead of scanning mod JAR filesystems
- Fossil data now reads from Cobblemon's runtime Fossils registry instead of parsing JSON files
- Both loaders automatically include all datapacks and server modifications without manual scanning
Removed
- JSON file scanning for spawn data (preset loading, ZIP datapack scanning, filesystem traversal)
- JSON file scanning for fossil data
- Leftover server/network source files from v1.24.5

