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
Removed
- Server-to-client data sync system (all spawn, evolution, and species data now loads locally)
- Server-side networking (ServerDataManager, payload classes, packet handlers)
- DataSource.SERVER state and fingerprint comparison logic
Changed
- Mod is now fully client-side — no server component runs at all
- Evolution and spawn data sourced from Cobblemon's client-synced registry and local mod JARs/datapacks
Fixed
- Evolutions and species data now properly sync to clients in multiplayer
- Evolution loader no longer fails entirely when a single species access throws
- Client stays receptive to server data when local evolution data is empty
- LAN players now receive server data sync (previously only dedicated servers synced)
- Packet drops are now logged for easier debugging

