diff --git a/.gitignore b/.gitignore index 81914c3..c717f2d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,7 @@ pnpm-debug.log* # 压缩包等导出文件 *.zip *.tar.gz -*.rar \ No newline at end of file +*.rar + +# Output +media \ No newline at end of file diff --git a/all_asset_infos.json b/all_asset_infos.json new file mode 100644 index 0000000..bdfff9b --- /dev/null +++ b/all_asset_infos.json @@ -0,0 +1 @@ +[{'name': 'Mobile Controls', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/mobile-controls'}, {'name': 'City Kit (Industrial)', 'category': '3D', 'series': 'City', 'page_link': 'https://www.kenney.nl/assets/city-kit-industrial'}, {'name': 'New Platformer Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/new-platformer-pack'}, {'name': 'Coaster Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/coaster-kit'}, {'name': 'Minimap Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/minimap-pack'}, {'name': 'Mini Market', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-market'}, {'name': 'Toy Car Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/toy-car-kit'}, {'name': 'UI Pack - Pixel Adventure', 'category': '2D', 'series': 'UI Pack', 'page_link': 'https://www.kenney.nl/assets/ui-pack-pixel-adventure'}, {'name': 'Prototype Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/prototype-kit'}, {'name': 'UI Pack - Adventure', 'category': '2D', 'series': 'UI Pack', 'page_link': 'https://www.kenney.nl/assets/ui-pack-adventure'}, {'name': 'Pico-8 Platformer', 'category': '2D', 'series': 'Pico-8', 'page_link': 'https://www.kenney.nl/assets/pico-8-platformer'}, {'name': 'Train Kit', 'category': '3D', 'series': 'Transport', 'page_link': 'https://www.kenney.nl/assets/train-kit'}, {'name': 'Mini Characters 1', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-characters-1'}, {'name': 'Cursor Pixel Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/cursor-pixel-pack'}, {'name': 'Mini Arcade', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-arcade'}, {'name': 'Building Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/building-kit'}, {'name': 'Brick Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/brick-kit'}, {'name': 'Cursor Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/cursor-pack'}, {'name': 'Space Station Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/space-station-kit'}, {'name': 'Googly Eyes', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/googly-eyes'}, {'name': 'Yellow Paint Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/yellow-paint-pack'}, {'name': 'Input Prompts', 'category': '2D', 'series': 'Input Prompts', 'page_link': 'https://www.kenney.nl/assets/input-prompts'}, {'name': 'Mini Arena', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-arena'}, {'name': 'Fantasy UI Borders', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/fantasy-ui-borders'}, {'name': 'Monochrome Pirates', 'category': '2D', 'series': 'Monochrome', 'page_link': 'https://www.kenney.nl/assets/monochrome-pirates'}, {'name': 'Shape Characters', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/shape-characters'}, {'name': 'Pixel Platformer Food Expansion', 'category': '2D', 'series': 'Pixel Platformer', 'page_link': 'https://www.kenney.nl/assets/pixel-platformer-food-expansion'}, {'name': 'Pico-8 City', 'category': '2D', 'series': 'Pico-8', 'page_link': 'https://www.kenney.nl/assets/pico-8-city'}, {'name': 'Mini Skate', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-skate'}, {'name': 'Tiny Battle', 'category': '2D', 'series': 'Tiny', 'page_link': 'https://www.kenney.nl/assets/tiny-battle'}, {'name': 'Isometric Miniature Bases', 'category': '2D', 'series': 'Isometric Miniature', 'page_link': 'https://www.kenney.nl/assets/isometric-miniature-bases'}, {'name': 'Mini Dungeon', 'category': '3D', 'series': 'Mini', 'page_link': 'https://www.kenney.nl/assets/mini-dungeon'}, {'name': 'Tiny Ski', 'category': '2D', 'series': 'Tiny', 'page_link': 'https://www.kenney.nl/assets/tiny-ski'}, {'name': 'Conveyor Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/conveyor-kit'}, {'name': 'Tiny Town', 'category': '2D', 'series': 'Tiny', 'page_link': 'https://www.kenney.nl/assets/tiny-town'}, {'name': 'Platformer Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/platformer-kit'}, {'name': 'Minigolf Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/minigolf-kit'}, {'name': 'Pattern Pack Pixel', 'category': 'Textures', 'series': 'Patterns', 'page_link': 'https://www.kenney.nl/assets/pattern-pack-pixel'}, {'name': 'Pixel Platformer Industrial Expansion', 'category': '2D', 'series': 'Pixel Platformer', 'page_link': 'https://www.kenney.nl/assets/pixel-platformer-industrial-expansion'}, {'name': 'Pattern Pack 2', 'category': 'Textures', 'series': 'Patterns', 'page_link': 'https://www.kenney.nl/assets/pattern-pack-2'}, {'name': 'Pixel Platformer Farm Expansion', 'category': '2D', 'series': 'Pixel Platformer', 'page_link': 'https://www.kenney.nl/assets/pixel-platformer-farm-expansion'}, {'name': 'Animated Characters 3', 'category': '3D', 'series': 'Animated Characters', 'page_link': 'https://www.kenney.nl/assets/animated-characters-3'}, {'name': 'Sketch Desert', 'category': '2D', 'series': 'Sketch', 'page_link': 'https://www.kenney.nl/assets/sketch-desert'}, {'name': '1-Bit Input Prompts Pixel 16×', 'category': '2D', 'series': 'Input Prompts', 'page_link': 'https://www.kenney.nl/assets/1-bit-input-prompts-pixel-16'}, {'name': 'Marble Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/marble-kit'}, {'name': 'Planets', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/planets'}, {'name': 'Car Kit', 'category': '3D', 'series': 'Transport', 'page_link': 'https://www.kenney.nl/assets/car-kit'}, {'name': 'Block Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/block-pack'}, {'name': 'Tiny Dungeon', 'category': '2D', 'series': 'Tiny', 'page_link': 'https://www.kenney.nl/assets/tiny-dungeon'}, {'name': 'Graveyard Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/graveyard-kit'}, {'name': 'Fantasy Town Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/fantasy-town-kit'}, {'name': 'Food Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/food-kit'}, {'name': 'Blaster Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/blaster-kit'}, {'name': 'Survival Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/survival-kit'}, {'name': 'Sketch Town Expansion', 'category': '2D', 'series': 'Sketch', 'page_link': 'https://www.kenney.nl/assets/sketch-town-expansion'}, {'name': 'Splat Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/splat-pack'}, {'name': 'Scribble Dungeons', 'category': '2D', 'series': 'Scribble', 'page_link': 'https://www.kenney.nl/assets/scribble-dungeons'}, {'name': 'Board Game Info', 'category': '2D', 'series': 'Board Games', 'page_link': 'https://www.kenney.nl/assets/board-game-info'}, {'name': 'Monster Builder Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/monster-builder-pack'}, {'name': 'Board Game Icons', 'category': '2D', 'series': 'Board Games', 'page_link': 'https://www.kenney.nl/assets/board-game-icons'}, {'name': 'Pixel Platformer Blocks', 'category': '2D', 'series': 'Pixel Platformer', 'page_link': 'https://www.kenney.nl/assets/pixel-platformer-blocks'}, {'name': '1-Bit Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/1-bit-pack'}, {'name': '1-Bit Platformer Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/1-bit-platformer-pack'}, {'name': 'Micro Roguelike', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/micro-roguelike'}, {'name': 'Monochrome RPG', 'category': '2D', 'series': 'Monochrome', 'page_link': 'https://www.kenney.nl/assets/monochrome-rpg'}, {'name': 'Pixel Shmup', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pixel-shmup'}, {'name': 'Pattern Pack', 'category': 'Textures', 'series': 'Patterns', 'page_link': 'https://www.kenney.nl/assets/pattern-pack'}, {'name': 'City Kit (Roads)', 'category': '3D', 'series': 'City', 'page_link': 'https://www.kenney.nl/assets/city-kit-roads'}, {'name': 'City Kit (Commercial)', 'category': '3D', 'series': 'City', 'page_link': 'https://www.kenney.nl/assets/city-kit-commercial'}, {'name': 'Input Prompts Pixel 16×', 'category': '2D', 'series': 'Input Prompts', 'page_link': 'https://www.kenney.nl/assets/input-prompts-pixel-16'}, {'name': 'Pixel Line Platformer', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pixel-line-platformer'}, {'name': 'Retro Medieval Kit', 'category': '3D', 'series': 'Retro', 'page_link': 'https://www.kenney.nl/assets/retro-medieval-kit'}, {'name': 'Pixel Platformer', 'category': '2D', 'series': 'Pixel Platformer', 'page_link': 'https://www.kenney.nl/assets/pixel-platformer'}, {'name': 'Sketch Town', 'category': '2D', 'series': 'Sketch', 'page_link': 'https://www.kenney.nl/assets/sketch-town'}, {'name': 'Retro Urban Kit', 'category': '3D', 'series': 'Retro', 'page_link': 'https://www.kenney.nl/assets/retro-urban-kit'}, {'name': 'Simple Space', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/simple-space'}, {'name': 'Rolling Ball Assets', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/rolling-ball-assets'}, {'name': 'City Kit (Suburban)', 'category': '3D', 'series': 'City', 'page_link': 'https://www.kenney.nl/assets/city-kit-suburban'}, {'name': 'Playing Cards Pack', 'category': '2D', 'series': 'Board Games', 'page_link': 'https://www.kenney.nl/assets/playing-cards-pack'}, {'name': 'Sci-fi Sounds', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/sci-fi-sounds'}, {'name': 'Holiday Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/holiday-kit'}, {'name': 'Space Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/space-kit'}, {'name': 'Cartography Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/cartography-pack'}, {'name': 'Hexagon Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/hexagon-kit'}, {'name': 'Nature Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/nature-kit'}, {'name': 'Prototype Textures', 'category': 'Textures', 'series': '', 'page_link': 'https://www.kenney.nl/assets/prototype-textures'}, {'name': 'Scribble Platformer', 'category': '2D', 'series': 'Scribble', 'page_link': 'https://www.kenney.nl/assets/scribble-platformer'}, {'name': 'Interface Sounds', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/interface-sounds'}, {'name': 'Foliage Sprites', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/foliage-sprites'}, {'name': 'Animated Characters 2', 'category': '3D', 'series': 'Animated Characters', 'page_link': 'https://www.kenney.nl/assets/animated-characters-2'}, {'name': 'Impact Sounds', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/impact-sounds'}, {'name': 'Road Textures', 'category': 'Textures', 'series': '', 'page_link': 'https://www.kenney.nl/assets/road-textures'}, {'name': 'Animated Characters 1', 'category': '3D', 'series': 'Animated Characters', 'page_link': 'https://www.kenney.nl/assets/animated-characters-1'}, {'name': 'Toon Characters 1', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/toon-characters-1'}, {'name': 'Tower Defense Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/tower-defense-kit'}, {'name': 'Pixel Vehicle Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pixel-vehicle-pack'}, {'name': 'Background Elements Redux', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/background-elements-redux'}, {'name': 'Isometric Miniature Farm', 'category': '2D', 'series': 'Isometric Miniature', 'page_link': 'https://www.kenney.nl/assets/isometric-miniature-farm'}, {'name': 'Isometric Miniature Dungeon', 'category': '2D', 'series': 'Isometric Miniature', 'page_link': 'https://www.kenney.nl/assets/isometric-miniature-dungeon'}, {'name': 'Isometric Miniature Library', 'category': '2D', 'series': 'Isometric Miniature', 'page_link': 'https://www.kenney.nl/assets/isometric-miniature-library'}, {'name': 'Isometric Miniature Prototype', 'category': '2D', 'series': 'Isometric Miniature', 'page_link': 'https://www.kenney.nl/assets/isometric-miniature-prototype'}, {'name': 'RPG Urban Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/rpg-urban-pack'}, {'name': 'Racing Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/racing-kit'}, {'name': 'Furniture Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/furniture-kit'}, {'name': 'Pirate Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pirate-kit'}, {'name': 'Emotes Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/emotes-pack'}, {'name': 'Particle Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/particle-pack'}, {'name': 'Simplified Platformer Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/simplified-platformer-pack'}, {'name': 'Ranks Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/ranks-pack'}, {'name': 'Crosshair Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/crosshair-pack'}, {'name': 'Animal Pack Redux', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/animal-pack-redux'}, {'name': 'Fish Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/fish-pack'}, {'name': 'Top-down Tanks Redux', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/top-down-tanks-redux'}, {'name': 'Voiceover Pack (Fighter)', 'category': 'Audio', 'series': 'Voiceover', 'page_link': 'https://www.kenney.nl/assets/voiceover-pack-fighter'}, {'name': 'Platformer Pack Industrial', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-pack-industrial'}, {'name': 'Castle Kit', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/castle-kit'}, {'name': 'Sports Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/sports-pack'}, {'name': 'Sokoban', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/sokoban'}, {'name': 'Pirate Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pirate-pack'}, {'name': 'Tanks', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/tanks'}, {'name': 'Platformer Characters', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/platformer-characters'}, {'name': 'Holiday Pack 2016', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/holiday-pack-2016'}, {'name': 'Sci-Fi RTS', 'category': '2D', 'series': 'RTS', 'page_link': 'https://www.kenney.nl/assets/sci-fi-rts'}, {'name': 'Foliage Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/foliage-pack'}, {'name': 'Space Shooter Extension', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/space-shooter-extension'}, {'name': 'Medieval RTS', 'category': '2D', 'series': 'RTS', 'page_link': 'https://www.kenney.nl/assets/medieval-rts'}, {'name': 'Platformer Pack Medieval', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-pack-medieval'}, {'name': 'Tower Defense (Top-Down)', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/tower-defense-top-down'}, {'name': 'Generic Items', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/generic-items'}, {'name': 'Map Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/map-pack'}, {'name': 'Watercraft Kit', 'category': '3D', 'series': 'Transport', 'page_link': 'https://www.kenney.nl/assets/watercraft-kit'}, {'name': 'Modular Buildings', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/modular-buildings'}, {'name': 'Rune Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/rune-pack'}, {'name': 'Blocky Characters', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/blocky-characters'}, {'name': 'Abstract Platformer', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/abstract-platformer'}, {'name': 'Isometric Blocks', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-blocks'}, {'name': 'Top-down Shooter', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/top-down-shooter'}, {'name': 'Hexagon Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/hexagon-pack'}, {'name': 'Roguelike Modern City', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/roguelike-modern-city'}, {'name': '3D Road Tiles', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/3d-road-tiles'}, {'name': 'Voiceover Pack', 'category': 'Audio', 'series': 'Voiceover', 'page_link': 'https://www.kenney.nl/assets/voiceover-pack'}, {'name': 'Jumper Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/jumper-pack'}, {'name': 'Shooting Gallery', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/shooting-gallery'}, {'name': 'Racing Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/racing-pack'}, {'name': 'Voxel Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/voxel-pack'}, {'name': 'Roguelike Caves & Dungeons', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/roguelike-caves-dungeons'}, {'name': 'Roguelike Indoors', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/roguelike-indoors'}, {'name': 'Roguelike Characters', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/roguelike-characters'}, {'name': 'Brick Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/brick-pack'}, {'name': 'Alien UFO Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/alien-ufo-pack'}, {'name': 'Puzzle Pack 2', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/puzzle-pack-2'}, {'name': 'Robot Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/robot-pack'}, {'name': 'Pixel UI Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/pixel-ui-pack'}, {'name': 'Platformer Pack Redux', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-pack-redux'}, {'name': 'Roguelike/RPG pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/roguelike-rpg-pack'}, {'name': 'Animal Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/animal-pack'}, {'name': 'Background Elements', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/background-elements'}, {'name': 'Letter Tiles', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/letter-tiles'}, {'name': 'Tower Defense', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/tower-defense'}, {'name': 'Isometric Vehicles #1', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-vehicles-1'}, {'name': 'Isometric Buildings #1', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-buildings-1'}, {'name': 'Isometric City', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-city'}, {'name': 'Isometric Landscape', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-landscape'}, {'name': 'Game Icons (Expansion)', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/game-icons-expansion'}, {'name': 'Game Icons', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/game-icons'}, {'name': 'Top-Down Tanks', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/top-down-tanks'}, {'name': 'Modular Characters', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/modular-characters'}, {'name': 'Smoke Particles', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/smoke-particles'}, {'name': 'Physics Assets', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/physics-assets'}, {'name': 'UI Pack - Sci-Fi', 'category': '2D', 'series': 'UI Pack', 'page_link': 'https://www.kenney.nl/assets/ui-pack-sci-fi'}, {'name': 'Construct Game Sources', 'category': 'Other', 'series': '', 'page_link': 'https://www.kenney.nl/assets/construct-game-sources'}, {'name': 'Board Game Pack', 'category': '2D', 'series': 'Board Games', 'page_link': 'https://www.kenney.nl/assets/boardgame-pack'}, {'name': 'Kenney Fonts', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/kenney-fonts'}, {'name': 'RPG Base', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/rpg-base'}, {'name': 'Medieval Town (Base)', 'category': '3D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/medieval-town-base'}, {'name': 'UI Pack (RPG Expansion)', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/ui-pack-rpg-expansion'}, {'name': 'Platformer Art Extended Tileset', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-extended-tileset'}, {'name': 'Music Jingles', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/music-jingles'}, {'name': 'RPG Audio', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/rpg-audio'}, {'name': 'UI Pack', 'category': '2D', 'series': 'UI Pack', 'page_link': 'https://www.kenney.nl/assets/ui-pack'}, {'name': 'Tappy Plane', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/tappy-plane'}, {'name': 'Space Shooter Redux', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/space-shooter-redux'}, {'name': 'Platformer Art Pixel Redux', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-pixel-redux'}, {'name': 'Hexagon Buildings', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/hexagon-buildings'}, {'name': 'Platformer Art Deluxe', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-deluxe'}, {'name': 'Platformer Art Extended Enemies', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-extended-enemies'}, {'name': 'Hexagon Tiles', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/hexagon-tiles'}, {'name': 'Platformer Art Requests', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-requests'}, {'name': 'Platformer Art Buildings', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-buildings'}, {'name': 'Platformer Art Candy', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-candy'}, {'name': 'Platformer Art Winter', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-winter'}, {'name': 'Platformer Bricks', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/platformer-bricks'}, {'name': 'Platformer Art Mushrooms', 'category': '2D', 'series': 'Platformer Pack', 'page_link': 'https://www.kenney.nl/assets/platformer-art-mushrooms'}, {'name': 'Medals', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/medals'}, {'name': 'Isometric Roads Water', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-roads-water'}, {'name': 'Isometric Roads', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/isometric-roads'}, {'name': 'Puzzle Pack', 'category': '2D', 'series': '', 'page_link': 'https://www.kenney.nl/assets/puzzle-pack'}, {'name': 'Casino Audio', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/casino-audio'}, {'name': 'Digital Audio', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/digital-audio'}, {'name': 'UI Audio', 'category': 'Audio', 'series': '', 'page_link': 'https://www.kenney.nl/assets/ui-audio'}] \ No newline at end of file diff --git a/all_asset_infos_detailed.json b/all_asset_infos_detailed.json new file mode 100644 index 0000000..eb6c2d8 --- /dev/null +++ b/all_asset_infos_detailed.json @@ -0,0 +1 @@ +[{"name": "UI Audio", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/ui-audio", "tags": ["button", "switch", "click"], "changelog": [{"date": "2012-10-07", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-audio/6ecc8f60b2-1677590494/kenney_ui-audio.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-audio/081b576bd8-1677590482/preview-6.png"], "released_at": "2012-10-07", "updated_at": "2012-10-07"}, {"name": "Digital Audio", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/digital-audio", "tags": ["space", "laser"], "changelog": [{"date": "2012-10-09", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/digital-audio/cd01f555fb-1677590265/kenney_digital-audio.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/digital-audio/a58a69061d-1677590256/preview-3.png"], "released_at": "2012-10-09", "updated_at": "2012-10-09"}, {"name": "Casino Audio", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/casino-audio", "tags": ["foley", "casino", "card", "dice", "chip"], "changelog": [{"date": "2012-10-28", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-22", "version": "1.1", "description": "Small fixes", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/casino-audio/7e8ec3128f-1721639069/kenney_casino-audio.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/casino-audio/9eef61db47-1677590184/preview-2.png"], "released_at": "2012-10-28", "updated_at": "2024-07-22"}, {"name": "Puzzle Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/puzzle-pack", "tags": ["puzzle", "paddle", "brick"], "changelog": [{"date": "2012-11-08", "version": "1.0", "description": "", "files": 75, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/puzzle-pack/9c3fc8655f-1677669232/kenney_puzzle-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/puzzle-pack/a865a43474-1677669223/preview.jpg", "https://www.kenney.nl/media/pages/assets/puzzle-pack/8664949dc7-1677669227/sample.jpg"], "released_at": "2012-11-08", "updated_at": "2012-11-08"}, {"name": "Isometric Roads", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-roads", "tags": ["isometric", "road", "landscape"], "changelog": [{"date": "2012-11-29", "version": "1.0", "description": "", "files": 95, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-roads/7ac49dfe36-1677695247/kenney_isometric-roads.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-roads/8776123635-1677695242/preview.jpg"], "released_at": "2012-11-29", "updated_at": "2012-11-29"}, {"name": "Isometric Roads Water", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-roads-water", "tags": ["isometric", "landscape", "water"], "changelog": [{"date": "2012-12-04", "version": "1.0", "description": "", "files": 40, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-roads-water/bc9905d27b-1677668457/kenney_isometric-roads-water.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-roads-water/2a90eebb2e-1677668451/preview.jpg"], "released_at": "2012-12-04", "updated_at": "2012-12-04"}, {"name": "Medals", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/medals", "tags": ["medal", "award", "ribbon", "interface"], "changelog": [{"date": "2013-05-19", "version": "1.0", "description": "", "files": 27, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/medals/68269b9e9e-1677668150/kenneymedals.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/medals/b4dec3c0d8-1677699967/preview.png"], "released_at": "2013-05-19", "updated_at": "2013-05-19"}, {"name": "Platformer Art Mushrooms", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-mushrooms", "tags": ["platformer", "tile", "mushroom"], "changelog": [{"date": "2013-08-09", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-mushrooms/5c17fa2aa0-1677696675/kenney_platformer-art-mushrooms.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-mushrooms/ff9520c04e-1677696669/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-mushrooms/8deed2cd4b-1677696671/sample.png"], "released_at": "2013-08-09", "updated_at": "2013-08-09"}, {"name": "Platformer Bricks", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/platformer-bricks", "tags": ["platformer", "brick", "landscape"], "changelog": [{"date": "2013-12-01", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-bricks/00cda7228f-1677668020/kenney_platformer-bricks.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-bricks/66e31e29d9-1677668011/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-bricks/3ad296a23d-1677668014/sample.png"], "released_at": "2013-12-01", "updated_at": "2013-12-01"}, {"name": "Platformer Art Winter", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-winter", "tags": ["platformer", "tile", "winter"], "changelog": [{"date": "2013-12-05", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-winter/b797394cdd-1677696902/kenney_platformer-art-winter.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-winter/18673a19a8-1677696895/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-winter/bb4f6412d5-1677696897/sample.png"], "released_at": "2013-12-05", "updated_at": "2013-12-05"}, {"name": "Platformer Art Candy", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-candy", "tags": ["platformer", "tile", "candy"], "changelog": [{"date": "2013-12-06", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-candy/4bee5382c2-1677696339/kenney_platformer-art-candy.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-candy/734098e2ef-1677696332/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-candy/68f080938f-1677696334/sample.png"], "released_at": "2013-12-06", "updated_at": "2013-12-06"}, {"name": "Platformer Art Buildings", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-buildings", "tags": ["platformer", "tile", "building"], "changelog": [{"date": "2013-12-07", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-buildings/44731a9ebf-1677696287/kenney_platformer-art-buildings.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-buildings/1a96ebe142-1677696281/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-buildings/7984add4b5-1677696283/sample.png"], "released_at": "2013-12-07", "updated_at": "2013-12-07"}, {"name": "Platformer Art Requests", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-requests", "tags": ["platformer", "tile", "weapon"], "changelog": [{"date": "2014-01-02", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-requests/5eb4a13cea-1677696809/kenney_platformer-art-requests.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-requests/10fa7a879a-1677696801/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-requests/39c647f8dd-1677696804/sample.png"], "released_at": "2014-01-02", "updated_at": "2014-01-02"}, {"name": "Hexagon Tiles", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/hexagon-tiles", "tags": ["tile", "landscape", "hexagon", "character", "oopi"], "changelog": [{"date": "2014-01-05", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/hexagon-tiles/f367e781ec-1677669510/kenney_hexagon-tiles.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/hexagon-tiles/c3800735a9-1677669503/preview.png", "https://www.kenney.nl/media/pages/assets/hexagon-tiles/d7eb0c4dc8-1677669506/sample.png"], "released_at": "2014-01-05", "updated_at": "2014-01-05"}, {"name": "Platformer Art Extended Enemies", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-extended-enemies", "tags": ["platformer", "tile", "character", "enemy", "oopi"], "changelog": [{"date": "2014-01-06", "version": "1.0", "description": "", "files": 165, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-extended-enemies/5039bba866-1677696504/kenney_platformer-art-extended-enemies.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-extended-enemies/f56dfc8e66-1677696509/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-extended-enemies/338f298abf-1677696515/sample.png"], "released_at": "2014-01-06", "updated_at": "2014-01-06"}, {"name": "Platformer Art Deluxe", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-deluxe", "tags": ["platformer", "tile", "oopi"], "changelog": [{"date": "2014-01-11", "version": "1.0", "description": "", "files": 930, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-deluxe/f51505b77c-1677696393/kenney_platformer-art-deluxe.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-deluxe/27868306eb-1677696385/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-deluxe/ae79d9b62d-1677696387/sample.png"], "released_at": "2014-01-11", "updated_at": "2014-01-11"}, {"name": "Hexagon Buildings", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/hexagon-buildings", "tags": ["hexagon", "tile", "building"], "changelog": [{"date": "2014-01-13", "version": "1.0", "description": "", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/hexagon-buildings/e3b2b49c1e-1677669588/kenney_hexagon-buildings.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/hexagon-buildings/7212d8d7d9-1677669575/preview.png", "https://www.kenney.nl/media/pages/assets/hexagon-buildings/1d410187fa-1677669578/sample.png"], "released_at": "2014-01-13", "updated_at": "2014-01-13"}, {"name": "Platformer Art Pixel Redux", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-pixel-redux", "tags": ["platformer", "tile", "pixel", "oopi"], "changelog": [{"date": "2014-01-16", "version": "1.0", "description": "", "files": 900, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-pixel-redux/dce56322cf-1677696736/kenney_platformer-art-pixel-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-pixel-redux/1fd19ec576-1677696728/preview-platformerpixel.png", "https://www.kenney.nl/media/pages/assets/platformer-art-pixel-redux/c16b00c73e-1677696731/sample.png"], "released_at": "2014-01-16", "updated_at": "2014-01-16"}, {"name": "Space Shooter Redux", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/space-shooter-redux", "tags": ["vehicle", "space", "weapon", "laser"], "changelog": [{"date": "2014-01-29", "version": "1.0", "description": "", "files": 295, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/space-shooter-redux/ea9a7effda-1677669442/kenney_space-shooter-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/space-shooter-redux/ae33998df1-1677669432/preview.png", "https://www.kenney.nl/media/pages/assets/space-shooter-redux/6bc829bae1-1677669436/sample.png"], "released_at": "2014-01-29", "updated_at": "2014-01-29"}, {"name": "Tappy Plane", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/tappy-plane", "tags": ["landscape", "plane", "flight", "side"], "changelog": [{"date": "2014-02-14", "version": "1.0", "description": "", "files": 75, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tappy-plane/cd5a0665b5-1677667872/tappyplane.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tappy-plane/b5ef2c6492-1677700404/preview.png", "https://www.kenney.nl/media/pages/assets/tappy-plane/0384b34d42-1677700398/sample.png"], "released_at": "2014-02-14", "updated_at": "2014-02-14"}, {"name": "UI Pack", "category": "2D", "series": "UI Pack", "page_link": "https://www.kenney.nl/assets/ui-pack", "tags": ["button", "panel", "slider", "interface"], "changelog": [{"date": "2014-02-24", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-06-12", "version": "2.0", "description": "Completely remade", "files": 430, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-pack/008d5df50e-1718203990/kenney_ui-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-pack/de4cf9e95e-1718203978/preview.png", "https://www.kenney.nl/media/pages/assets/ui-pack/3fbe1ed354-1718203984/sample.png"], "released_at": "2014-02-24", "updated_at": "2024-06-12"}, {"name": "RPG Audio", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/rpg-audio", "tags": ["foley", "rpg", "footstep", "weapon"], "changelog": [{"date": "2014-03-17", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/rpg-audio/20c02ef17c-1677590336/kenney_rpg-audio.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/rpg-audio/eac78b3013-1677590326/preview-4.png"], "released_at": "2014-03-17", "updated_at": "2014-03-17"}, {"name": "Music Jingles", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/music-jingles", "tags": ["music", "jingle"], "changelog": [{"date": "2014-03-17", "version": "1.0", "description": "", "files": 85, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/music-jingles/acd2ca8b8f-1677590399/kenney_music-jingles.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/music-jingles/3541652d6a-1677590390/preview-5.png"], "released_at": "2014-03-17", "updated_at": "2014-03-17"}, {"name": "Platformer Art Extended Tileset", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-art-extended-tileset", "tags": ["platformer", "tile"], "changelog": [{"date": "2014-04-12", "version": "1.0", "description": "", "files": 360, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-art-extended-tileset/cd5c6657be-1677696610/kenney_platformer-art-extended-tileset.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-art-extended-tileset/8bbaa070bd-1677696601/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-art-extended-tileset/c5182f054e-1677696604/sample.png"], "released_at": "2014-04-12", "updated_at": "2014-04-12"}, {"name": "UI Pack (RPG Expansion)", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/ui-pack-rpg-expansion", "tags": ["button", "panel", "slider", "rpg", "interface"], "changelog": [{"date": "2014-04-20", "version": "1.0", "description": "", "files": 85, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-pack-rpg-expansion/885ad5ccc0-1677661824/kenney_ui-pack-rpg-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-pack-rpg-expansion/a06d97b657-1677661818/preview.png", "https://www.kenney.nl/media/pages/assets/ui-pack-rpg-expansion/667db63132-1677661820/sample.png"], "released_at": "2014-04-20", "updated_at": "2014-04-20"}, {"name": "Medieval Town (Base)", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/medieval-town-base", "tags": ["medieval", "building", "town", "wall"], "changelog": [{"date": "2014-04-20", "version": "1.0", "description": "", "files": 65, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/medieval-town-base/a2d28f6a08-1677581331/kenney_medieval-town-base.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/medieval-town-base/6481a4ab4c-1677581323/preview.png", "https://www.kenney.nl/media/pages/assets/medieval-town-base/a486e136e7-1677581327/sample.png"], "released_at": "2014-04-20", "updated_at": "2014-04-20"}, {"name": "RPG Base", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/rpg-base", "tags": ["rpg", "tile"], "changelog": [{"date": "2014-05-08", "version": "1.0", "description": "", "files": 230, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/rpg-base/e6936d41cd-1677669634/kenney_rpg-base.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/rpg-base/fb775c731a-1677669625/preview.png", "https://www.kenney.nl/media/pages/assets/rpg-base/6a3c93c0ce-1677669628/sample.png"], "released_at": "2014-05-08", "updated_at": "2014-05-08"}, {"name": "Kenney Fonts", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/kenney-fonts", "tags": ["font", "letter", "pixel"], "changelog": [{"date": "2014-05-20", "version": "1.0", "description": "", "files": 11, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/kenney-fonts/1876150b34-1677661710/kenney_kenney-fonts.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/kenney-fonts/cc36a08359-1677661704/preview.png"], "released_at": "2014-05-20", "updated_at": "2014-05-20"}, {"name": "Board Game Pack", "category": "2D", "series": "Board Games", "page_link": "https://www.kenney.nl/assets/boardgame-pack", "tags": ["boardgame", "dice", "cards"], "changelog": [{"date": "2014-05-22", "version": "1.0", "description": "", "files": 490, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/boardgame-pack/75886a27b8-1677667644/kenney_boardgame-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/boardgame-pack/c6b4aa9859-1677667634/preview.png", "https://www.kenney.nl/media/pages/assets/boardgame-pack/7393bcb034-1677667639/sample.png"], "released_at": "2014-05-22", "updated_at": "2014-05-22"}, {"name": "Construct Game Sources", "category": "Other", "series": null, "page_link": "https://www.kenney.nl/assets/construct-game-sources", "tags": ["platformer", "physics", "space", "cards", "source"], "changelog": [{"date": "2014-06-02", "version": "1.0", "description": "", "files": 6, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/construct-game-sources/64ed4c2be1-1677697212/kenney_construct-game-sources.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/construct-game-sources/174c0bb3b4-1677697208/preview.png"], "released_at": "2014-06-02", "updated_at": "2014-06-02"}, {"name": "UI Pack - Sci-Fi", "category": "2D", "series": "UI Pack", "page_link": "https://www.kenney.nl/assets/ui-pack-sci-fi", "tags": ["button", "panel", "slider", "space", "sci-fi", "interface"], "changelog": [{"date": "2014-06-13", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-08-20", "version": "2.0", "description": "Completely remade", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-pack-sci-fi/5160a5941c-1724181109/kenney_ui-pack-space-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-pack-sci-fi/fcbf838510-1724181098/preview.png", "https://www.kenney.nl/media/pages/assets/ui-pack-sci-fi/0dcd574cda-1724181103/sample.png"], "released_at": "2014-06-13", "updated_at": "2024-08-20"}, {"name": "Physics Assets", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/physics-assets", "tags": ["physics", "block", "shape", "oopi"], "changelog": [{"date": "2014-08-06", "version": "1.0", "description": "", "files": 215, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/physics-assets/e39018a741-1677667214/kenney_physics-assets.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/physics-assets/01501ddf56-1677667196/preview.png", "https://www.kenney.nl/media/pages/assets/physics-assets/03dc1c85a9-1677667199/sample.png", "https://www.kenney.nl/media/pages/assets/physics-assets/1433a3ee2f-1677667206/update.png"], "released_at": "2014-08-06", "updated_at": "2014-08-06"}, {"name": "Smoke Particles", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/smoke-particles", "tags": ["particle", "smoke", "explosion", "vfx"], "changelog": [{"date": "2014-08-23", "version": "1.0", "description": "", "files": 70, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/smoke-particles/adfa60d27d-1677695171/kenney_smoke-particles.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/smoke-particles/4bb6b6957a-1677695164/preview.png", "https://www.kenney.nl/media/pages/assets/smoke-particles/42a57dc6c1-1677695166/sample.png"], "released_at": "2014-08-23", "updated_at": "2014-08-23"}, {"name": "Modular Characters", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/modular-characters", "tags": ["character"], "changelog": [{"date": "2014-10-13", "version": "1.0", "description": "", "files": 425, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/modular-characters/aabec8e41f-1677670340/kenney_modular-characters.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/modular-characters/2217f6cefe-1677670330/preview.png", "https://www.kenney.nl/media/pages/assets/modular-characters/5b6476f59a-1677670334/sample.png"], "released_at": "2014-10-13", "updated_at": "2014-10-13"}, {"name": "Top-Down Tanks", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/top-down-tanks", "tags": ["top-down", "tank", "vehicle", "tile"], "changelog": [{"date": "2014-10-27", "version": "1.0", "description": "", "files": 85, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/top-down-tanks/94b48cfb4f-1677699019/kenney_top-down-tanks.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/top-down-tanks/692ef10684-1677699014/preview.png", "https://www.kenney.nl/media/pages/assets/top-down-tanks/acbd7152e5-1677699016/sample.png"], "released_at": "2014-10-27", "updated_at": "2014-10-27"}, {"name": "Game Icons", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/game-icons", "tags": ["icon", "gamepad", "joystick", "prompt", "interface"], "changelog": [{"date": "2014-11-03", "version": "1.0", "description": "", "files": 105, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/game-icons/d2ba302b55-1677661579/kenney_game-icons.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/game-icons/38f1a6cc50-1677661575/preview.png"], "released_at": "2014-11-03", "updated_at": "2014-11-03"}, {"name": "Game Icons (Expansion)", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/game-icons-expansion", "tags": ["icon", "prompt", "gamepad", "joystick", "interface"], "changelog": [{"date": "2014-11-18", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/game-icons-expansion/97c1e769ff-1677661643/kenney_game-icons-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/game-icons-expansion/b2b07409b2-1677661639/preview.png"], "released_at": "2014-11-18", "updated_at": "2014-11-18"}, {"name": "Isometric Landscape", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-landscape", "tags": ["isometric", "nature", "landscape"], "changelog": [{"date": "2014-12-04", "version": "1.0", "description": "", "files": 128, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-landscape/a696a45a90-1677695072/kenney_isometric-landscape.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-landscape/4c8d39137c-1677695068/preview.png"], "released_at": "2014-12-04", "updated_at": "2014-12-04"}, {"name": "Isometric City", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-city", "tags": ["isometric", "building", "town", "city"], "changelog": [{"date": "2014-12-05", "version": "1.0", "description": "", "files": 128, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-city/1687413a54-1677695025/kenney_isometric-city.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-city/e1ca219c85-1677695022/preview.png"], "released_at": "2014-12-05", "updated_at": "2014-12-05"}, {"name": "Isometric Buildings #1", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-buildings-1", "tags": ["isometric", "building", "town", "city"], "changelog": [{"date": "2014-12-10", "version": "1.0", "description": "", "files": 128, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-buildings-1/3b988ef3c6-1677694983/kenney_isometric-buildings-1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-buildings-1/89ca88cefe-1677694977/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-buildings-1/31f6e13903-1677694980/sample.png"], "released_at": "2014-12-10", "updated_at": "2014-12-10"}, {"name": "Isometric Vehicles #1", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-vehicles-1", "tags": ["isometric", "vehicle"], "changelog": [{"date": "2014-12-20", "version": "1.0", "description": "", "files": 540, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-vehicles-1/3c1daf8dae-1677695121/kenney_isometric-vehicles-1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-vehicles-1/d78aba2a76-1677695114/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-vehicles-1/52b5f8dafe-1677695116/sample.png"], "released_at": "2014-12-20", "updated_at": "2014-12-20"}, {"name": "Tower Defense", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/tower-defense", "tags": ["isometric", "landscape", "defense"], "changelog": [{"date": "2015-01-09", "version": "1.0", "description": "", "files": 230, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tower-defense/fff9e4007a-1677699069/kenney_tower-defense.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tower-defense/ebe0500c17-1677699063/preview.png", "https://www.kenney.nl/media/pages/assets/tower-defense/3df5dd4e4e-1677699065/sample.png"], "released_at": "2015-01-09", "updated_at": "2015-01-09"}, {"name": "Letter Tiles", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/letter-tiles", "tags": ["puzzle", "letter", "tile"], "changelog": [{"date": "2015-01-21", "version": "1.0", "description": "", "files": 215, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/letter-tiles/59c91377a1-1677670676/kenney_letter-tiles.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/letter-tiles/673f456701-1677670597/preview.png", "https://www.kenney.nl/media/pages/assets/letter-tiles/b74a0cec52-1677670600/sample.png"], "released_at": "2015-01-21", "updated_at": "2015-01-21"}, {"name": "Background Elements", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/background-elements", "tags": ["background"], "changelog": [{"date": "2015-02-04", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/background-elements/292696910a-1677670395/kenney_background-elements.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/background-elements/9db3c134f9-1677670386/preview.png", "https://www.kenney.nl/media/pages/assets/background-elements/b67fbe361a-1677670389/sample.png"], "released_at": "2015-02-04", "updated_at": "2015-02-04"}, {"name": "Animal Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/animal-pack", "tags": ["puzzle", "character"], "changelog": [{"date": "2015-03-18", "version": "1.0", "description": "", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/animal-pack/fe9bf1190c-1677669996/kenney_animal-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/animal-pack/33c3ce97b4-1677669990/preview.png"], "released_at": "2015-03-18", "updated_at": "2015-03-18"}, {"name": "Roguelike/RPG pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/roguelike-rpg-pack", "tags": ["rpg", "tile", "town", "furniture", "button", "panel", "roguelike", "pixel"], "changelog": [{"date": "2015-03-20", "version": "1.0", "description": "", "files": 1700, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/roguelike-rpg-pack/7220e5bef8-1677697420/kenney_roguelike-rpg-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/roguelike-rpg-pack/c6b0f51836-1677697409/preview.png", "https://www.kenney.nl/media/pages/assets/roguelike-rpg-pack/258c7e6060-1677697411/sample1.png", "https://www.kenney.nl/media/pages/assets/roguelike-rpg-pack/ba66bd6bfb-1677697413/sample2.png"], "released_at": "2015-03-20", "updated_at": "2015-03-20"}, {"name": "Platformer Pack Redux", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-pack-redux", "tags": ["platformer", "tile", "character", "oopi"], "changelog": [{"date": "2015-03-23", "version": "1.0", "description": "", "files": 360, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-pack-redux/e4b307bd49-1677696200/kenney_platformer-pack-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-pack-redux/87f65617c8-1677696187/preview1.png", "https://www.kenney.nl/media/pages/assets/platformer-pack-redux/ac6f4320eb-1677696190/preview2.png", "https://www.kenney.nl/media/pages/assets/platformer-pack-redux/cb089d0c11-1677696192/sample1.png", "https://www.kenney.nl/media/pages/assets/platformer-pack-redux/a92d521db4-1677696194/sample2.png"], "released_at": "2015-03-23", "updated_at": "2015-03-23"}, {"name": "Pixel UI Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/pixel-ui-pack", "tags": ["pixel", "panel", "button"], "changelog": [{"date": "2015-03-26", "version": "1.0", "description": "", "files": 750, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-ui-pack/6f86b2fd9c-1677661508/kenney_pixel-ui-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-ui-pack/c11c48627a-1677661504/preview.png"], "released_at": "2015-03-26", "updated_at": "2015-03-26"}, {"name": "Robot Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/robot-pack", "tags": ["robot", "character"], "changelog": [{"date": "2015-04-06", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/robot-pack/18c4f18f46-1677670212/kenney_robot-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/robot-pack/40d7c9350e-1677670203/preview.png", "https://www.kenney.nl/media/pages/assets/robot-pack/094555d022-1677670207/sample.png"], "released_at": "2015-04-06", "updated_at": "2015-04-06"}, {"name": "Puzzle Pack 2", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/puzzle-pack-2", "tags": ["puzzle", "paddle", "brick", "pipe", "coin", "particle"], "changelog": [{"date": "2015-04-14", "version": "1.0", "description": "", "files": 795, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/puzzle-pack-2/f5b624a257-1677667476/kenney_puzzle-pack-2.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/puzzle-pack-2/e4599dfc88-1677667463/preview.png", "https://www.kenney.nl/media/pages/assets/puzzle-pack-2/6e0f0543b2-1677667469/sample1.png", "https://www.kenney.nl/media/pages/assets/puzzle-pack-2/1c742dda74-1677667469/sample2.png", "https://www.kenney.nl/media/pages/assets/puzzle-pack-2/6c0429757b-1677667470/sample4.png", "https://www.kenney.nl/media/pages/assets/puzzle-pack-2/06d0d78118-1677667470/sample3.png"], "released_at": "2015-04-14", "updated_at": "2015-04-14"}, {"name": "Alien UFO Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/alien-ufo-pack", "tags": ["alien", "ufo", "character", "vehicle", "oopi"], "changelog": [{"date": "2015-05-03", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/alien-ufo-pack/416e13b7e0-1677667399/kenney_alien-ufo-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/alien-ufo-pack/50fb7f17f6-1677667391/preview.png", "https://www.kenney.nl/media/pages/assets/alien-ufo-pack/f5b1642448-1677667394/sample.png"], "released_at": "2015-05-03", "updated_at": "2015-05-03"}, {"name": "Brick Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/brick-pack", "tags": ["platformer", "brick", "building", "oopi"], "changelog": [{"date": "2015-05-17", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-24", "version": "2.0", "description": "Completely remade", "files": 106, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/brick-pack/2d10e3b804-1721806579/kenney_toy-brick-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/brick-pack/3000ad3a75-1721806556/preview.png", "https://www.kenney.nl/media/pages/assets/brick-pack/19b365367e-1721806549/sample.png"], "released_at": "2015-05-17", "updated_at": "2024-07-24"}, {"name": "Roguelike Characters", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/roguelike-characters", "tags": ["rpg", "character", "roguelike", "pixel"], "changelog": [{"date": "2015-05-19", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-10-17", "version": "2.0", "description": "Fixed spritesheet issue", "files": 450, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/roguelike-characters/dbeea49dc8-1729196490/kenney_roguelike-characters.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/roguelike-characters/b4e5ac56f1-1677694929/preview.png", "https://www.kenney.nl/media/pages/assets/roguelike-characters/336f3bf1e6-1677694932/sample.png"], "released_at": "2015-05-19", "updated_at": "2024-10-17"}, {"name": "Roguelike Indoors", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/roguelike-indoors", "tags": ["rpg", "building", "roguelike", "pixel"], "changelog": [{"date": "2015-06-04", "version": "1.0", "description": "", "files": 480, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/roguelike-indoors/8e8b9ed008-1702169567/kenney_roguelike-indoors.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/roguelike-indoors/1ef3fe2a34-1702169574/preview.png", "https://www.kenney.nl/media/pages/assets/roguelike-indoors/1232a00cad-1677694884/sample.png"], "released_at": "2015-06-04", "updated_at": "2015-06-04"}, {"name": "Roguelike Caves & Dungeons", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/roguelike-caves-dungeons", "tags": ["roguelike", "rpg", "tile", "dungeon", "cave", "mine", "pixel"], "changelog": [{"date": "2015-06-23", "version": "1.0", "description": "", "files": 520, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/roguelike-caves-dungeons/09c1724f18-1677694831/kenney_roguelike-caves-dungeons.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/roguelike-caves-dungeons/f61b2d7372-1677694824/preview.png", "https://www.kenney.nl/media/pages/assets/roguelike-caves-dungeons/1d1ee9c19b-1677694827/sample.png"], "released_at": "2015-06-23", "updated_at": "2015-06-23"}, {"name": "Voxel Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/voxel-pack", "tags": ["voxel", "tile", "items", "character"], "changelog": [{"date": "2015-07-06", "version": "1.0", "description": "", "files": 190, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/voxel-pack/f69052d1c9-1677662501/kenney_voxel-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/voxel-pack/b2df616820-1677662492/preview.png", "https://www.kenney.nl/media/pages/assets/voxel-pack/17694bc7ab-1677662495/sample_2d.png", "https://www.kenney.nl/media/pages/assets/voxel-pack/cf08263a35-1677662498/sample_3d.png"], "released_at": "2015-07-06", "updated_at": "2015-07-06"}, {"name": "Racing Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/racing-pack", "tags": ["tile", "top-down", "vehicle", "car", "racing"], "changelog": [{"date": "2015-07-08", "version": "1.0", "description": "", "files": 420, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/racing-pack/b373415adc-1677662443/kenney_racing-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/racing-pack/22cb6215e0-1677662437/preview.png", "https://www.kenney.nl/media/pages/assets/racing-pack/716c7d9df2-1677662439/sample.png"], "released_at": "2015-07-08", "updated_at": "2015-07-08"}, {"name": "Shooting Gallery", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/shooting-gallery", "tags": ["hud", "background", "shoot"], "changelog": [{"date": "2015-07-10", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/shooting-gallery/95461d90b4-1677662387/kenney_shooting-gallery.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/shooting-gallery/0ed1bbca4b-1677662381/preview.png", "https://www.kenney.nl/media/pages/assets/shooting-gallery/6f631ccd58-1677662383/sample.png"], "released_at": "2015-07-10", "updated_at": "2015-07-10"}, {"name": "Jumper Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/jumper-pack", "tags": ["platformer", "character"], "changelog": [{"date": "2015-08-03", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/jumper-pack/5eccd78596-1677666699/kenney_jumper-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/jumper-pack/24be192ad4-1677666689/preview.png", "https://www.kenney.nl/media/pages/assets/jumper-pack/b490d91293-1677666692/sample.png"], "released_at": "2015-08-03", "updated_at": "2015-08-03"}, {"name": "Voiceover Pack", "category": "Audio", "series": "Voiceover", "page_link": "https://www.kenney.nl/assets/voiceover-pack", "tags": ["voice", "female", "male"], "changelog": [{"date": "2015-08-07", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/voiceover-pack/73832acf09-1677589897/kenney_voiceover-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/voiceover-pack/af16787279-1677589880/preview-1.png"], "released_at": "2015-08-07", "updated_at": "2015-08-07"}, {"name": "3D Road Tiles", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/3d-road-tiles", "tags": ["road", "tile"], "changelog": [{"date": "2015-09-25", "version": "1.0", "description": "", "files": 300, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/3d-road-tiles/cc89145087-1677581262/kenney_3d-road-tiles.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/3d-road-tiles/2f2fc85658-1677581256/preview.png", "https://www.kenney.nl/media/pages/assets/3d-road-tiles/a7b39654f5-1677581258/sample.png"], "released_at": "2015-09-25", "updated_at": "2015-09-25"}, {"name": "Roguelike Modern City", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/roguelike-modern-city", "tags": ["roguelike", "tile", "city", "urban", "pixel"], "changelog": [{"date": "2015-10-07", "version": "1.0", "description": "", "files": 1036, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/roguelike-modern-city/2cc2d6baa4-1677694743/kenney_roguelike-modern-city.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/roguelike-modern-city/f5fb34505e-1677694736/preview.png", "https://www.kenney.nl/media/pages/assets/roguelike-modern-city/72b08e18e0-1677694738/sample.png"], "released_at": "2015-10-07", "updated_at": "2015-10-07"}, {"name": "Hexagon Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/hexagon-pack", "tags": ["tile", "hexagon", "nature", "building"], "changelog": [{"date": "2015-10-28", "version": "1.0", "description": "", "files": 310, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/hexagon-pack/cdaf0fba32-1677662331/kenney_hexagon-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/hexagon-pack/76878d1845-1677662323/preview.png", "https://www.kenney.nl/media/pages/assets/hexagon-pack/5daade8b1f-1677662327/sample.png"], "released_at": "2015-10-28", "updated_at": "2015-10-28"}, {"name": "Top-down Shooter", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/top-down-shooter", "tags": ["top-down", "tile", "furniture", "zombie"], "changelog": [{"date": "2016-01-28", "version": "1.0", "description": "", "files": 580, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/top-down-shooter/bdd295dffd-1677694684/kenney_top-down-shooter.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/top-down-shooter/f40f77b413-1677694677/preview.png", "https://www.kenney.nl/media/pages/assets/top-down-shooter/e03b4da6aa-1677694680/sample.png"], "released_at": "2016-01-28", "updated_at": "2016-01-28"}, {"name": "Isometric Blocks", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/isometric-blocks", "tags": ["isometric", "block"], "changelog": [{"date": "2016-02-17", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-blocks/94657b8934-1677662261/kenney_isometric-blocks.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-blocks/0636e08e53-1677662253/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-blocks/97af13d8c2-1677662255/sample.png"], "released_at": "2016-02-17", "updated_at": "2016-02-17"}, {"name": "Abstract Platformer", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/abstract-platformer", "tags": ["platformer", "tile", "character", "enemy"], "changelog": [{"date": "2016-04-05", "version": "1.0", "description": "", "files": 370, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/abstract-platformer/0cf66346e3-1677579172/kenney_abstract-platformer.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/abstract-platformer/dc81048f2b-1677579166/preview.png", "https://www.kenney.nl/media/pages/assets/abstract-platformer/8605d0d9fe-1677579168/sample.png"], "released_at": "2016-04-05", "updated_at": "2016-04-05"}, {"name": "Blocky Characters", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/blocky-characters", "tags": ["character"], "changelog": [{"date": "2016-05-05", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-06-10", "version": "2.0", "description": "Completely remade", "files": 20, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/blocky-characters/72bdc6be4c-1749547469/kenney_blocky-characters_20.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/blocky-characters/8bfd3edf90-1749547441/preview.png"], "released_at": "2016-05-05", "updated_at": "2025-06-10"}, {"name": "Rune Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/rune-pack", "tags": ["rune", "stone", "tile", "puzzle"], "changelog": [{"date": "2016-05-31", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-12-09", "version": "1.1", "description": "Fixed vector files", "files": 640, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/rune-pack/b7cd8b29eb-1702144010/kenney_rune-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/rune-pack/47ee996cf3-1702144003/preview.png"], "released_at": "2016-05-31", "updated_at": "2023-12-09"}, {"name": "Modular Buildings", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/modular-buildings", "tags": ["city", "building", "town", "house"], "changelog": [{"date": "2016-06-03", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-02-08", "version": "2.1", "description": "Complete remake", "files": 100, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/modular-buildings/b7b9013fa2-1707397411/kenney_modular-buildings.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/modular-buildings/4931745b3c-1707397420/preview.png", "https://www.kenney.nl/media/pages/assets/modular-buildings/28fdb5761d-1707397432/preview-variation-b.png", "https://www.kenney.nl/media/pages/assets/modular-buildings/2cace4702e-1707397433/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/modular-buildings/c3dc169249-1707397438/sample.png"], "released_at": "2016-06-03", "updated_at": "2024-02-08"}, {"name": "Watercraft Kit", "category": "3D", "series": "Transport", "page_link": "https://www.kenney.nl/assets/watercraft-kit", "tags": ["boat", "ship", "watercraft", "vehicle"], "changelog": [{"date": "2016-06-07", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-04-17", "version": "2.0", "description": "Completely remade", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-04-19", "version": "2.1", "description": "Separated sails and flags", "files": 45, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/watercraft-kit/da473dc0d9-1713519620/kenney_watercraft-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/watercraft-kit/c5e15c6259-1713354133/preview.png"], "released_at": "2016-06-07", "updated_at": "2024-04-19"}, {"name": "Map Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/map-pack", "tags": ["tile", "map", "world", "overworld", "oopi"], "changelog": [{"date": "2016-06-15", "version": "1.0", "description": "", "files": 180, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/map-pack/4443814e0c-1677662163/kenney_map-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/map-pack/da868dcf7c-1677662157/preview.png", "https://www.kenney.nl/media/pages/assets/map-pack/810ff777b4-1677662159/sample.png"], "released_at": "2016-06-15", "updated_at": "2016-06-15"}, {"name": "Generic Items", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/generic-items", "tags": ["items", "tools", "household"], "changelog": [{"date": "2016-07-18", "version": "1.0", "description": "", "files": 160, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/generic-items/0ed56c7503-1677667000/kenney_generic-items.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/generic-items/57a3df38d5-1677666995/preview.png"], "released_at": "2016-07-18", "updated_at": "2016-07-18"}, {"name": "Tower Defense (Top-Down)", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/tower-defense-top-down", "tags": ["top-down", "defense", "tower", "weapon"], "changelog": [{"date": "2016-07-29", "version": "1.0", "description": "", "files": 300, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tower-defense-top-down/2d594ff61b-1677693738/kenney_tower-defense-top-down.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tower-defense-top-down/d255887c5b-1677693729/preview.png", "https://www.kenney.nl/media/pages/assets/tower-defense-top-down/a3fcacfe45-1677693731/sample.png"], "released_at": "2016-07-29", "updated_at": "2016-07-29"}, {"name": "Platformer Pack Medieval", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-pack-medieval", "tags": ["platformer", "tile", "medieval", "castle"], "changelog": [{"date": "2016-08-04", "version": "1.0", "description": "", "files": 270, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-pack-medieval/c579b5c189-1677696130/kenney_platformer-pack-medieval.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-pack-medieval/da96d8f88c-1677696124/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-pack-medieval/5731de1dbb-1677696126/sample.png"], "released_at": "2016-08-04", "updated_at": "2016-08-04"}, {"name": "Medieval RTS", "category": "2D", "series": "RTS", "page_link": "https://www.kenney.nl/assets/medieval-rts", "tags": ["medieval", "tile", "map", "building", "rts"], "changelog": [{"date": "2016-08-10", "version": "1.0", "description": "", "files": 120, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/medieval-rts/2a05da77e9-1677693589/kenney_medieval-rts.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/medieval-rts/87b6cfb921-1677693582/preview.png", "https://www.kenney.nl/media/pages/assets/medieval-rts/216f47e757-1677693585/sample.png"], "released_at": "2016-08-10", "updated_at": "2016-08-10"}, {"name": "Space Shooter Extension", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/space-shooter-extension", "tags": ["space", "ship"], "changelog": [{"date": "2016-08-19", "version": "1.0", "description": "", "files": 270, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/space-shooter-extension/57049efd94-1677693518/kenney_space-shooter-extension.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/space-shooter-extension/0c1f6fe4d4-1677693511/preview.png", "https://www.kenney.nl/media/pages/assets/space-shooter-extension/ee3bf3142f-1677693514/sample.png"], "released_at": "2016-08-19", "updated_at": "2016-08-19"}, {"name": "Foliage Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/foliage-pack", "tags": ["nature", "tree"], "changelog": [{"date": "2016-11-04", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/foliage-pack/e99bcd8016-1677693473/kenney_foliage-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/foliage-pack/2b63f5c17c-1677693467/preview.png", "https://www.kenney.nl/media/pages/assets/foliage-pack/fd97416d6f-1677693469/sample.png"], "released_at": "2016-11-04", "updated_at": "2016-11-04"}, {"name": "Sci-Fi RTS", "category": "2D", "series": "RTS", "page_link": "https://www.kenney.nl/assets/sci-fi-rts", "tags": ["tile", "map", "building", "rts", "future", "sci-fi"], "changelog": [{"date": "2016-11-30", "version": "1.0", "description": "", "files": 120, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sci-fi-rts/fe54b36f65-1677693650/kenney_sci-fi-rts.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sci-fi-rts/64d2da10e7-1677693644/preview.png", "https://www.kenney.nl/media/pages/assets/sci-fi-rts/228ddb1763-1677693646/sample.png"], "released_at": "2016-11-30", "updated_at": "2016-11-30"}, {"name": "Holiday Pack 2016", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/holiday-pack-2016", "tags": ["roguelike", "top-down", "holiday", "tile", "voxel", "hexagon", "rts"], "changelog": [{"date": "2016-12-20", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/holiday-pack-2016/eb7e083d63-1677693829/kenney_holiday-pack-2016.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/holiday-pack-2016/56d1182947-1677693822/preview.png", "https://www.kenney.nl/media/pages/assets/holiday-pack-2016/744ef70505-1677693824/sample.png"], "released_at": "2016-12-20", "updated_at": "2016-12-20"}, {"name": "Platformer Characters", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/platformer-characters", "tags": ["platformer", "character", "zombie"], "changelog": [{"date": "2017-01-10", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-characters/1a82b3514c-1677693768/kenney_platformer-characters.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-characters/39a4579773-1677693764/preview.png"], "released_at": "2017-01-10", "updated_at": "2017-01-10"}, {"name": "Tanks", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/tanks", "tags": ["tank", "side"], "changelog": [{"date": "2017-01-30", "version": "1.0", "description": "", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tanks/cc79cf83fc-1677579063/kenney_tanks.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tanks/9bbd310ffe-1677579055/preview.png", "https://www.kenney.nl/media/pages/assets/tanks/590c6ae753-1677579060/sample.png"], "released_at": "2017-01-30", "updated_at": "2017-01-30"}, {"name": "Pirate Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/pirate-pack", "tags": ["ship", "pirate", "top-down", "tile"], "changelog": [{"date": "2017-02-12", "version": "1.0", "description": "", "files": 190, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pirate-pack/74634a27df-1677579020/kenney_pirate-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pirate-pack/62c6145713-1677579010/preview.png", "https://www.kenney.nl/media/pages/assets/pirate-pack/3e65e641ed-1677579015/sample.png"], "released_at": "2017-02-12", "updated_at": "2017-02-12"}, {"name": "Sokoban", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/sokoban", "tags": ["tile", "puzzle", "top-down", "character"], "changelog": [{"date": "2017-02-24", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sokoban/729087062b-1677579120/kenney_sokoban-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sokoban/279d7b6889-1677579114/preview.png", "https://www.kenney.nl/media/pages/assets/sokoban/623a0094e9-1677579116/sample.png"], "released_at": "2017-02-24", "updated_at": "2017-02-24"}, {"name": "Sports Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/sports-pack", "tags": ["sports", "top-down", "tile", "character"], "changelog": [{"date": "2017-04-29", "version": "1.0", "description": "", "files": 380, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sports-pack/a8069126fe-1677693282/kenney_sports-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sports-pack/a85f0839a9-1677693273/preview.png", "https://www.kenney.nl/media/pages/assets/sports-pack/6ce4dafaa2-1677693275/sample1.png", "https://www.kenney.nl/media/pages/assets/sports-pack/448482e345-1677693278/sample2.png"], "released_at": "2017-04-29", "updated_at": "2017-04-29"}, {"name": "Castle Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/castle-kit", "tags": ["castle", "medieval"], "changelog": [{"date": "2017-08-01", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-03-27", "version": "2.0", "description": "Complete remake", "files": 75, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/castle-kit/5e344a4444-1711543616/kenney_castle-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/castle-kit/7c0979cd94-1711543640/preview.png", "https://www.kenney.nl/media/pages/assets/castle-kit/a6dffc5793-1711543631/sample.png"], "released_at": "2017-08-01", "updated_at": "2024-03-27"}, {"name": "Platformer Pack Industrial", "category": "2D", "series": "Platformer Pack", "page_link": "https://www.kenney.nl/assets/platformer-pack-industrial", "tags": ["industrial", "space", "metal", "platformer", "tile"], "changelog": [{"date": "2017-09-27", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-pack-industrial/ebf330e236-1677696008/kenney_platformer-pack-industrial.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-pack-industrial/839faea25c-1677696002/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-pack-industrial/584ef160d0-1677696004/sample.png"], "released_at": "2017-09-27", "updated_at": "2017-09-27"}, {"name": "Voiceover Pack (Fighter)", "category": "Audio", "series": "Voiceover", "page_link": "https://www.kenney.nl/assets/voiceover-pack-fighter", "tags": ["voice", "male", "fighter"], "changelog": [{"date": "2017-10-28", "version": "1.0", "description": "", "files": 45, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/voiceover-pack-fighter/08afb354ef-1677589837/kenney_voiceover-pack-fighter.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/voiceover-pack-fighter/68c7938f9a-1677589824/preview.png"], "released_at": "2017-10-28", "updated_at": "2017-10-28"}, {"name": "Top-down Tanks Redux", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/top-down-tanks-redux", "tags": ["vehicle", "tank", "top-down", "tile"], "changelog": [{"date": "2017-11-02", "version": "1.0", "description": "", "files": 180, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/top-down-tanks-redux/6ae25dbf02-1677666783/kenney_top-down-tanks-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/top-down-tanks-redux/1dba162e09-1677666774/preview.png", "https://www.kenney.nl/media/pages/assets/top-down-tanks-redux/56509c99a1-1677666778/sample.png"], "released_at": "2017-11-02", "updated_at": "2017-11-02"}, {"name": "Fish Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/fish-pack", "tags": ["fish", "underwater", "animal"], "changelog": [{"date": "2017-11-28", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-05-14", "version": "2.0", "description": "Added separate vector files", "files": 120, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/fish-pack/88acc6be32-1747237960/kenney_fish-pack_2.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/fish-pack/d7244269c6-1747237949/preview.png", "https://www.kenney.nl/media/pages/assets/fish-pack/10d0ada636-1747237954/sample.png"], "released_at": "2017-11-28", "updated_at": "2025-05-14"}, {"name": "Animal Pack Redux", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/animal-pack-redux", "tags": ["animal", "pet"], "changelog": [{"date": "2018-02-02", "version": "1.0", "description": "", "files": 240, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/animal-pack-redux/2e60ae7603-1677666936/kenney_animal-pack-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/animal-pack-redux/b45cb3bfe7-1677666930/preview.png"], "released_at": "2018-02-02", "updated_at": "2018-02-02"}, {"name": "Crosshair Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/crosshair-pack", "tags": ["crosshair", "shooter", "fps", "interface"], "changelog": [{"date": "2018-05-14", "version": "1.0", "description": "", "files": 200, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/crosshair-pack/2b9265f552-1677697139/kenney_crosshair-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/crosshair-pack/f52f1aef42-1677697135/preview.png"], "released_at": "2018-05-14", "updated_at": "2018-05-14"}, {"name": "Ranks Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/ranks-pack", "tags": ["rank", "medal", "interface"], "changelog": [{"date": "2018-05-22", "version": "1.0", "description": "", "files": 70, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ranks-pack/dbfb992998-1677578852/kenney_ranks-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ranks-pack/306da4235a-1677578848/preview.png"], "released_at": "2018-05-22", "updated_at": "2018-05-22"}, {"name": "Simplified Platformer Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/simplified-platformer-pack", "tags": ["platformer", "tile"], "changelog": [{"date": "2018-06-26", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/simplified-platformer-pack/80861da94b-1677693200/kenney_simplified-platformer-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/simplified-platformer-pack/937738d4c9-1677693195/preview.png"], "released_at": "2018-06-26", "updated_at": "2018-06-26"}, {"name": "Particle Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/particle-pack", "tags": ["particle", "shader", "vfx"], "changelog": [{"date": "2018-06-30", "version": "1.0", "description": "", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/particle-pack/1dd3d4cbe2-1677578741/kenney_particle-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/particle-pack/f4b578ccc9-1677578655/preview.png"], "released_at": "2018-06-30", "updated_at": "2018-06-30"}, {"name": "Emotes Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/emotes-pack", "tags": ["emote", "icon", "balloon", "interface"], "changelog": [{"date": "2018-07-09", "version": "1.0", "description": "", "files": 480, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/emotes-pack/a3823d6799-1677578798/kenney_emotes-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/emotes-pack/18205fd82b-1677578794/preview.png"], "released_at": "2018-07-09", "updated_at": "2018-07-09"}, {"name": "Pirate Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/pirate-kit", "tags": ["pirate", "boat", "ship", "island", "tropical", "character"], "changelog": [{"date": "2018-09-20", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-12-25", "version": "2.0", "description": "Completely remade", "files": 60, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pirate-kit/85d331e664-1735140511/kenney_pirate-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pirate-kit/7691dedd48-1735140499/preview.png", "https://www.kenney.nl/media/pages/assets/pirate-kit/c82b25dae8-1735140505/sample.png"], "released_at": "2018-09-20", "updated_at": "2024-12-25"}, {"name": "Furniture Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/furniture-kit", "tags": ["furniture", "interior", "table", "chair", "bed"], "changelog": [{"date": "2018-10-20", "version": "1.0", "description": "", "files": 140, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/furniture-kit/e56d2a9828-1677580847/kenney_furniture-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/furniture-kit/a201eda253-1677580840/preview.png", "https://www.kenney.nl/media/pages/assets/furniture-kit/587d8996c2-1677580842/sample.png"], "released_at": "2018-10-20", "updated_at": "2018-10-20"}, {"name": "Racing Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/racing-kit", "tags": ["racing", "tile", "track", "vehicle", "car"], "changelog": [{"date": "2018-11-07", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/racing-kit/ea9561ec33-1677580949/kenney_racing-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/racing-kit/0acc8879f5-1677580942/preview.png", "https://www.kenney.nl/media/pages/assets/racing-kit/6aa0c430ba-1677580945/sample.png"], "released_at": "2018-11-07", "updated_at": "2018-11-07"}, {"name": "RPG Urban Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/rpg-urban-pack", "tags": ["rpg", "city", "urban", "character", "pixel"], "changelog": [{"date": "2019-01-05", "version": "1.0", "description": "", "files": 480, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/rpg-urban-pack/63ed57d122-1677578575/kenney_rpg-urban-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/rpg-urban-pack/30a22f644d-1677578569/preview.png", "https://www.kenney.nl/media/pages/assets/rpg-urban-pack/9cd1ad6a20-1677578571/sample.png"], "released_at": "2019-01-05", "updated_at": "2019-01-05"}, {"name": "Isometric Miniature Prototype", "category": "2D", "series": "Isometric Miniature", "page_link": "https://www.kenney.nl/assets/isometric-miniature-prototype", "tags": ["isometric", "prototype"], "changelog": [{"date": "2019-02-15", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-miniature-prototype/ef609d4a8b-1674932174/kenney_isometric-miniature-prototype.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-miniature-prototype/184e284b57-1674932120/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-miniature-prototype/8e09ce09d3-1674932123/sample.png"], "released_at": "2019-02-15", "updated_at": "2019-02-15"}, {"name": "Isometric Miniature Library", "category": "2D", "series": "Isometric Miniature", "page_link": "https://www.kenney.nl/assets/isometric-miniature-library", "tags": ["isometric", "library"], "changelog": [{"date": "2019-02-15", "version": "1.0", "description": "", "files": 35, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-miniature-library/d259cc34d5-1674932086/kenney_isometric-miniature-library.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-miniature-library/5a393af012-1674932042/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-miniature-library/64cbf3ee0f-1674932044/sample.png"], "released_at": "2019-02-15", "updated_at": "2019-02-15"}, {"name": "Isometric Miniature Dungeon", "category": "2D", "series": "Isometric Miniature", "page_link": "https://www.kenney.nl/assets/isometric-miniature-dungeon", "tags": ["isometric", "dungeon"], "changelog": [{"date": "2019-02-15", "version": "1.0", "description": "", "files": 70, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-miniature-dungeon/7cac173be8-1674932261/kenney_isometric-miniature-dungeon.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-miniature-dungeon/52cba7e16e-1674932237/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-miniature-dungeon/32b0fa44cc-1674932240/sample.png"], "released_at": "2019-02-15", "updated_at": "2019-02-15"}, {"name": "Isometric Miniature Farm", "category": "2D", "series": "Isometric Miniature", "page_link": "https://www.kenney.nl/assets/isometric-miniature-farm", "tags": ["farm", "isometric"], "changelog": [{"date": "2019-02-22", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-miniature-farm/2e04b9f1c6-1670690319/kenney_isometric-miniature-farm.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-miniature-farm/6051925e23-1670690278/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-miniature-farm/9e3139a2ce-1670690281/sample.png"], "released_at": "2019-02-22", "updated_at": "2019-02-22"}, {"name": "Background Elements Redux", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/background-elements-redux", "tags": ["background"], "changelog": [{"date": "2019-02-26", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/background-elements-redux/67dde54060-1677693164/kenney_background-elements-redux.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/background-elements-redux/d894fb83ed-1677693153/preview.png", "https://www.kenney.nl/media/pages/assets/background-elements-redux/3388a05b85-1677693157/sample.png"], "released_at": "2019-02-26", "updated_at": "2019-02-26"}, {"name": "Pixel Vehicle Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/pixel-vehicle-pack", "tags": ["car", "vehicle", "pixel"], "changelog": [{"date": "2019-05-19", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-vehicle-pack/5f6498e987-1677578609/kenney_pixel-vehicle-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-vehicle-pack/745cc0937b-1677578606/preview.png"], "released_at": "2019-05-19", "updated_at": "2019-05-19"}, {"name": "Tower Defense Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/tower-defense-kit", "tags": ["medieval", "castle", "defense"], "changelog": [{"date": "2019-08-28", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-09-11", "version": "2.0", "description": "Completely remade", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-09-16", "version": "2.1", "description": "Fixed water issue", "files": 160, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tower-defense-kit/73f5e756ea-1726471567/kenney_tower-defense-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tower-defense-kit/1a7fc36951-1726042025/preview.png", "https://www.kenney.nl/media/pages/assets/tower-defense-kit/c0702112ff-1726042030/sample.png", "https://www.kenney.nl/media/pages/assets/tower-defense-kit/a6bd8ba9a8-1726042092/preview-variation-a.png"], "released_at": "2019-08-28", "updated_at": "2024-09-16"}, {"name": "Toon Characters 1", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/toon-characters-1", "tags": ["character", "poses", "platormer"], "changelog": [{"date": "2019-09-26", "version": "1.0", "description": "", "files": 270, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/toon-characters-1/7394da28b2-1677693120/kenney_toon-characters-1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/toon-characters-1/7521fed859-1677693113/preview.png"], "released_at": "2019-09-26", "updated_at": "2019-09-26"}, {"name": "Animated Characters 1", "category": "3D", "series": "Animated Characters", "page_link": "https://www.kenney.nl/assets/animated-characters-1", "tags": ["character", "zombie", "survivor", "survival"], "changelog": [{"date": "2019-11-05", "version": "1.0", "description": "", "files": 8, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/animated-characters-1/8c3221c3de-1694862559/kenney_animated-characters-1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/animated-characters-1/a6df5a5848-1674931680/preview.png"], "released_at": "2019-11-05", "updated_at": "2019-11-05"}, {"name": "Road Textures", "category": "Textures", "series": null, "page_link": "https://www.kenney.nl/assets/road-textures", "tags": ["texture", "road"], "changelog": [{"date": "2019-11-23", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/road-textures/90a796b47e-1677578348/kenney_road-textures.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/road-textures/058d537ce4-1677578345/preview.png"], "released_at": "2019-11-23", "updated_at": "2019-11-23"}, {"name": "Impact Sounds", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/impact-sounds", "tags": ["impact", "foley"], "changelog": [{"date": "2019-12-19", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/impact-sounds/6eeae25aef-1677589768/kenney_impact-sounds.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/impact-sounds/f72240c9e6-1677589720/audio_impact.png"], "released_at": "2019-12-19", "updated_at": "2019-12-19"}, {"name": "Animated Characters 2", "category": "3D", "series": "Animated Characters", "page_link": "https://www.kenney.nl/assets/animated-characters-2", "tags": ["character", "skater", "skating", "cyborg", "criminal"], "changelog": [{"date": "2020-02-04", "version": "1.0", "description": "", "files": 8, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/animated-characters-2/97b9013f4b-1694862573/kenney_animated-characters-2.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/animated-characters-2/34cf697c10-1674931821/preview.png"], "released_at": "2020-02-04", "updated_at": "2020-02-04"}, {"name": "Foliage Sprites", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/foliage-sprites", "tags": ["nature", "foliage", "vfx"], "changelog": [{"date": "2020-02-08", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/foliage-sprites/ff923287d0-1677495980/kenney_foliage-sprites.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/foliage-sprites/551510825f-1677495973/preview.png", "https://www.kenney.nl/media/pages/assets/foliage-sprites/fb7bc87d0c-1677495976/sample.png"], "released_at": "2020-02-08", "updated_at": "2020-02-08"}, {"name": "Interface Sounds", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/interface-sounds", "tags": ["interface", "click", "button"], "changelog": [{"date": "2020-02-11", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/interface-sounds/f3134a7c4c-1677589452/kenney_interface-sounds.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/interface-sounds/0480ca0c55-1677589445/preview_interface.png"], "released_at": "2020-02-11", "updated_at": "2020-02-11"}, {"name": "Scribble Platformer", "category": "2D", "series": "Scribble", "page_link": "https://www.kenney.nl/assets/scribble-platformer", "tags": ["platformer"], "changelog": [{"date": "2020-03-10", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/scribble-platformer/f360ff0626-1674932936/kenney_scribble-platformer.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/scribble-platformer/5e3f48f7e5-1674932927/preview.png", "https://www.kenney.nl/media/pages/assets/scribble-platformer/f308c7810a-1674932930/sample.png"], "released_at": "2020-03-10", "updated_at": "2020-03-10"}, {"name": "Prototype Textures", "category": "Textures", "series": null, "page_link": "https://www.kenney.nl/assets/prototype-textures", "tags": ["texture", "prototype", "grid"], "changelog": [{"date": "2020-04-08", "version": "1.0", "description": "", "files": 75, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/prototype-textures/c936d9058b-1677578307/kenney_prototype-textures.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/prototype-textures/7e5ad3f9f6-1677578300/preview.png", "https://www.kenney.nl/media/pages/assets/prototype-textures/d1c7bebc35-1677578302/sample.png"], "released_at": "2020-04-08", "updated_at": "2020-04-08"}, {"name": "Nature Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/nature-kit", "tags": ["nature", "tree", "rock", "foliage"], "changelog": [{"date": "2020-04-29", "version": "1.0", "description": "", "files": 330, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/nature-kit/7422ddeb86-1677698939/kenney_nature-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/nature-kit/04dd77f251-1677698893/preview.png", "https://www.kenney.nl/media/pages/assets/nature-kit/904c1f385b-1677698896/sample.png"], "released_at": "2020-04-29", "updated_at": "2020-04-29"}, {"name": "Hexagon Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/hexagon-kit", "tags": ["hexagon", "terrain", "building"], "changelog": [{"date": "2020-05-23", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-01-23", "version": "2.0", "description": "Color map, color variations and new models", "files": 70, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/hexagon-kit/fb69e5119e-1706007730/kenney_hexagon-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/hexagon-kit/baaed58351-1706007664/preview.png", "https://www.kenney.nl/media/pages/assets/hexagon-kit/d226f4bc9a-1706007672/sample.png"], "released_at": "2020-05-23", "updated_at": "2024-01-23"}, {"name": "Cartography Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/cartography-pack", "tags": ["map", "icon", "town", "castle", "fantasy"], "changelog": [{"date": "2020-06-16", "version": "1.0", "description": "", "files": 85, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/cartography-pack/c0cb13c753-1677578192/kenney_cartography-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/cartography-pack/1cd90bbc45-1677578186/preview.png", "https://www.kenney.nl/media/pages/assets/cartography-pack/8dd3302413-1677578188/sample.png"], "released_at": "2020-06-16", "updated_at": "2020-06-16"}, {"name": "Space Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/space-kit", "tags": ["planet", "ship", "space"], "changelog": [{"date": "2020-08-27", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/space-kit/3988cb18e8-1677698978/kenney_space-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/space-kit/55da804509-1677698965/preview.png", "https://www.kenney.nl/media/pages/assets/space-kit/c33abf8eac-1677698968/sample.png"], "released_at": "2020-08-27", "updated_at": "2020-08-27"}, {"name": "Holiday Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/holiday-kit", "tags": ["holiday", "christmas", "tree", "cabin"], "changelog": [{"date": "2020-10-03", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-12-11", "version": "2.0", "description": "Completely remade", "files": 100, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/holiday-kit/1a0f5c0d51-1733923970/kenney_holiday-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/holiday-kit/cfa1944cc3-1733923957/preview.png", "https://www.kenney.nl/media/pages/assets/holiday-kit/1a2e1514db-1733923964/sample.png"], "released_at": "2020-10-03", "updated_at": "2024-12-11"}, {"name": "Sci-fi Sounds", "category": "Audio", "series": null, "page_link": "https://www.kenney.nl/assets/sci-fi-sounds", "tags": ["sci-fi", "space", "engine"], "changelog": [{"date": "2020-10-11", "version": "1.0", "description": "", "files": 70, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sci-fi-sounds/81d6323e0a-1677589334/kenney_sci-fi-sounds.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sci-fi-sounds/a99868e7cb-1677589328/audiopreview_scifi.png"], "released_at": "2020-10-11", "updated_at": "2020-10-11"}, {"name": "Playing Cards Pack", "category": "2D", "series": "Board Games", "page_link": "https://www.kenney.nl/assets/playing-cards-pack", "tags": ["pixel", "cards", "boardgame", "dice"], "changelog": [{"date": "2020-12-01", "version": "1.0", "description": "", "files": 270, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/playing-cards-pack/08ea695cb6-1677495915/kenney_playing-cards-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/playing-cards-pack/a770a01df3-1677495909/preview.png", "https://www.kenney.nl/media/pages/assets/playing-cards-pack/28b47168b3-1677495902/preview-a.png", "https://www.kenney.nl/media/pages/assets/playing-cards-pack/3bfa7aa712-1677495905/preview-b.png"], "released_at": "2020-12-01", "updated_at": "2020-12-01"}, {"name": "City Kit (Suburban)", "category": "3D", "series": "City", "page_link": "https://www.kenney.nl/assets/city-kit-suburban", "tags": ["city", "suburban", "building"], "changelog": [{"date": "2020-12-01", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-04-24", "version": "2.0", "description": "Completely remade", "files": 40, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/city-kit-suburban/167f6dbc31-1745479373/kenney_city-kit-suburban_20.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/city-kit-suburban/5643c4dca2-1745479397/preview.png", "https://www.kenney.nl/media/pages/assets/city-kit-suburban/32ed30a7a3-1745479402/sample.png", "https://www.kenney.nl/media/pages/assets/city-kit-suburban/074b57905c-1745479410/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/city-kit-suburban/34dacc559d-1745479410/preview-variation-c.png", "https://www.kenney.nl/media/pages/assets/city-kit-suburban/a5136f9458-1745479411/preview-variation-b.png"], "released_at": "2020-12-01", "updated_at": "2025-04-24"}, {"name": "Rolling Ball Assets", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/rolling-ball-assets", "tags": ["ball", "top-down"], "changelog": [{"date": "2020-12-11", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/rolling-ball-assets/2f4cda9784-1677495701/kenney_rolling-ball-assets.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/rolling-ball-assets/834cf33325-1677495683/preview.png", "https://www.kenney.nl/media/pages/assets/rolling-ball-assets/8985e8ce1f-1677495687/sample.png"], "released_at": "2020-12-11", "updated_at": "2020-12-11"}, {"name": "Simple Space", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/simple-space", "tags": ["space", "sci-fi", "map"], "changelog": [{"date": "2021-03-03", "version": "1.0", "description": "", "files": 48, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/simple-space/f694a6eca6-1677578143/kenney_simple-space.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/simple-space/08c4cb0ca8-1677578137/preview.png", "https://www.kenney.nl/media/pages/assets/simple-space/7e8b2171fb-1677578140/sample.png"], "released_at": "2021-03-03", "updated_at": "2021-03-03"}, {"name": "Retro Urban Kit", "category": "3D", "series": "Retro", "page_link": "https://www.kenney.nl/assets/retro-urban-kit", "tags": ["retro", "urban", "building", "city"], "changelog": [{"date": "2021-03-20", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-01-29", "version": "2.0", "description": "Additional objects", "files": 120, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/retro-urban-kit/bb0380d23d-1738147509/kenney_retro-urban-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/retro-urban-kit/0384a6efa5-1738147494/preview.png", "https://www.kenney.nl/media/pages/assets/retro-urban-kit/160a0ee740-1738147501/sample.png"], "released_at": "2021-03-20", "updated_at": "2025-01-29"}, {"name": "Sketch Town", "category": "2D", "series": "Sketch", "page_link": "https://www.kenney.nl/assets/sketch-town", "tags": ["town", "rpg", "isometric"], "changelog": [{"date": "2021-05-12", "version": "1.0", "description": "", "files": 340, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sketch-town/21b33c4197-1677484094/kenney_sketch-town.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sketch-town/903027d1e1-1677484083/preview.png", "https://www.kenney.nl/media/pages/assets/sketch-town/27820f3489-1677484087/sample.png"], "released_at": "2021-05-12", "updated_at": "2021-05-12"}, {"name": "Pixel Platformer", "category": "2D", "series": "Pixel Platformer", "page_link": "https://www.kenney.nl/assets/pixel-platformer", "tags": ["platformer", "pixel", "oopi"], "changelog": [{"date": "2021-05-22", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-10-07", "version": "1.2", "description": "Color adjustments, backgrounds", "files": 200, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-platformer/bef991136c-1696667883/kenney_pixel-platformer.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-platformer/6847bc9012-1696667871/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer/f1edd7a868-1696667860/samplea.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer/4489e1b303-1696667866/sampleb.png"], "released_at": "2021-05-22", "updated_at": "2023-10-07"}, {"name": "Retro Medieval Kit", "category": "3D", "series": "Retro", "page_link": "https://www.kenney.nl/assets/retro-medieval-kit", "tags": ["retro", "medieval", "castle", "building", "town"], "changelog": [{"date": "2021-07-01", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-02-19", "version": "2.0", "description": "Additional objects", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/retro-medieval-kit/b6128f9130-1739977960/kenney_retro-medieval-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/retro-medieval-kit/19c9cc6d28-1739977937/preview.png", "https://www.kenney.nl/media/pages/assets/retro-medieval-kit/7fcca82361-1739977943/sample.png"], "released_at": "2021-07-01", "updated_at": "2025-02-19"}, {"name": "Pixel Line Platformer", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/pixel-line-platformer", "tags": ["platformer", "godot", "pixel"], "changelog": [{"date": "2021-08-15", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-line-platformer/b6419b54a9-1677495839/kenney_pixel-line-platformer.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-line-platformer/08a2a02f68-1677495833/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-line-platformer/2aadd720e8-1677495836/sample.png"], "released_at": "2021-08-15", "updated_at": "2021-08-15"}, {"name": "Input Prompts Pixel 16\u00c3\u2014", "category": "2D", "series": "Input Prompts", "page_link": "https://www.kenney.nl/assets/input-prompts-pixel-16", "tags": ["pixel", "input", "prompt", "button", "gamepad", "control", "interface"], "changelog": [{"date": "2021-09-23", "version": "1.0", "description": "", "files": 800, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/input-prompts-pixel-16/a9d5de5009-1677495570/kenney_input-prompts-pixel-16.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/input-prompts-pixel-16/acedac39e2-1677495486/preview.png"], "released_at": "2021-09-23", "updated_at": "2021-09-23"}, {"name": "City Kit (Commercial)", "category": "3D", "series": "City", "page_link": "https://www.kenney.nl/assets/city-kit-commercial", "tags": ["city", "skyscraper", "building"], "changelog": [{"date": "2021-10-13", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-05-17", "version": "2.0", "description": "Completely remade", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-07-21", "version": "2.1", "description": "Fixed problem skyscraper E", "files": 50, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/city-kit-commercial/16eb35d771-1753115042/kenney_city-kit-commercial_2.1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/city-kit-commercial/c898791c91-1747481468/preview.png", "https://www.kenney.nl/media/pages/assets/city-kit-commercial/44aa3589e4-1747481474/sample.png", "https://www.kenney.nl/media/pages/assets/city-kit-commercial/c8fbd76871-1747481478/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/city-kit-commercial/66f7b5fb56-1747481480/preview-variation-b.png"], "released_at": "2021-10-13", "updated_at": "2025-07-21"}, {"name": "City Kit (Roads)", "category": "3D", "series": "City", "page_link": "https://www.kenney.nl/assets/city-kit-roads", "tags": ["road", "city", "town"], "changelog": [{"date": "2021-10-15", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-03-13", "version": "2.0", "description": "Optimization, fixes and expansion", "files": 70, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/city-kit-roads/4b84d0ea8d-1741864740/kenney_city-kit-roads.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/city-kit-roads/216dd1f4f4-1741864346/preview.png", "https://www.kenney.nl/media/pages/assets/city-kit-roads/d1b7123657-1741864353/sample.png", "https://www.kenney.nl/media/pages/assets/city-kit-roads/14a0c2891f-1741864735/preview-variation-a.png"], "released_at": "2021-10-15", "updated_at": "2025-03-13"}, {"name": "Pattern Pack", "category": "Textures", "series": "Patterns", "page_link": "https://www.kenney.nl/assets/pattern-pack", "tags": ["pattern", "texture", "seamless", "vfx"], "changelog": [{"date": "2021-10-27", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-25", "version": "1.1", "description": "Fixed issue, added vector files", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pattern-pack/f2f3a959e1-1721940715/kenney_pattern-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pattern-pack/8d5d444048-1677484337/preview.png"], "released_at": "2021-10-27", "updated_at": "2024-07-25"}, {"name": "Pixel Shmup", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/pixel-shmup", "tags": ["pixel", "shmup", "top-down", "plane"], "changelog": [{"date": "2021-11-01", "version": "1.0", "description": "", "files": 128, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-shmup/899a89fc6e-1677495782/kenney_pixel-shmup.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-shmup/fdb90a0834-1677495741/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-shmup/2887fcc7ab-1677495743/sample.png"], "released_at": "2021-11-01", "updated_at": "2021-11-01"}, {"name": "Monochrome RPG", "category": "2D", "series": "Monochrome", "page_link": "https://www.kenney.nl/assets/monochrome-rpg", "tags": ["rpg", "roguelike", "monochrome", "pixel"], "changelog": [{"date": "2021-11-01", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/monochrome-rpg/f05d9b5c5b-1674742619/kenney_monochrome-rpg.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/monochrome-rpg/74e59ebb84-1674742614/preview.png", "https://www.kenney.nl/media/pages/assets/monochrome-rpg/41151fda79-1674742616/sample.png"], "released_at": "2021-11-01", "updated_at": "2021-11-01"}, {"name": "Micro Roguelike", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/micro-roguelike", "tags": ["roguelike", "1-bit", "tile", "rpg", "pixel"], "changelog": [{"date": "2021-11-01", "version": "1.0", "description": "", "files": 320, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/micro-roguelike/df5bdec5fc-1677578239/kenney_micro-roguelike.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/micro-roguelike/6b27ceae48-1677578233/preview.png", "https://www.kenney.nl/media/pages/assets/micro-roguelike/779a807fd4-1677578235/sample.png"], "released_at": "2021-11-01", "updated_at": "2021-11-01"}, {"name": "1-Bit Platformer Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/1-bit-platformer-pack", "tags": ["1-bit", "platformer", "character", "tile", "terrain", "pixel"], "changelog": [{"date": "2021-11-02", "version": "1.0", "description": "", "files": 400, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/1-bit-platformer-pack/4ec105bbbe-1677693072/kenney_1-bit-platformer-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/1-bit-platformer-pack/e0438f6884-1677693067/preview.png", "https://www.kenney.nl/media/pages/assets/1-bit-platformer-pack/a16de23a59-1677693069/sample.png"], "released_at": "2021-11-02", "updated_at": "2021-11-02"}, {"name": "1-Bit Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/1-bit-pack", "tags": ["roguelike", "rpg", "1-bit", "pixel"], "changelog": [{"date": "2021-11-09", "version": "1.0", "description": "", "files": 1078, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/1-bit-pack/f41b6925f0-1677578516/kenney_1-bit-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/1-bit-pack/cf2109186a-1677578505/preview.png", "https://www.kenney.nl/media/pages/assets/1-bit-pack/fda061c324-1677578508/sample_fantasy.png", "https://www.kenney.nl/media/pages/assets/1-bit-pack/7d7cbe7638-1677578511/sample_platformer.png", "https://www.kenney.nl/media/pages/assets/1-bit-pack/736b46bef1-1677578512/sample_interior.png", "https://www.kenney.nl/media/pages/assets/1-bit-pack/fedb532cf8-1677578512/sample_urban.png"], "released_at": "2021-11-09", "updated_at": "2021-11-09"}, {"name": "Pixel Platformer Blocks", "category": "2D", "series": "Pixel Platformer", "page_link": "https://www.kenney.nl/assets/pixel-platformer-blocks", "tags": ["blocks", "pixel"], "changelog": [{"date": "2021-11-28", "version": "1.0", "description": "", "files": 80, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-platformer-blocks/b62ceca019-1668793626/kenney_pixel-platformer-blocks.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-platformer-blocks/230f57100b-1668793620/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer-blocks/81d72dc9c2-1668793623/sample.png"], "released_at": "2021-11-28", "updated_at": "2021-11-28"}, {"name": "Board Game Icons", "category": "2D", "series": "Board Games", "page_link": "https://www.kenney.nl/assets/board-game-icons", "tags": ["board", "icon", "card", "interface"], "changelog": [{"date": "2022-01-10", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-22", "version": "1.1", "description": "Small fixes", "files": 250, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/board-game-icons/1a6c93ddc0-1721645690/kenney_board-game-icons.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/board-game-icons/392632aa1d-1674933139/preview.png"], "released_at": "2022-01-10", "updated_at": "2024-07-22"}, {"name": "Monster Builder Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/monster-builder-pack", "tags": ["monster", "creature"], "changelog": [{"date": "2022-01-19", "version": "1.0", "description": "", "files": 170, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/monster-builder-pack/cc58d3827e-1677495438/kenney_monster-builder-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/monster-builder-pack/72ec500580-1677495432/preview.png", "https://www.kenney.nl/media/pages/assets/monster-builder-pack/01c67e5692-1677495442/sample.png"], "released_at": "2022-01-19", "updated_at": "2022-01-19"}, {"name": "Board Game Info", "category": "2D", "series": "Board Games", "page_link": "https://www.kenney.nl/assets/board-game-info", "tags": ["board", "information", "icon", "interface"], "changelog": [{"date": "2022-02-14", "version": "1.0", "description": "", "files": 280, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/board-game-info/d273e72144-1674933074/kenney_board-game-info.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/board-game-info/2bdda8bf04-1674933044/preview.png"], "released_at": "2022-02-14", "updated_at": "2022-02-14"}, {"name": "Scribble Dungeons", "category": "2D", "series": "Scribble", "page_link": "https://www.kenney.nl/assets/scribble-dungeons", "tags": ["rpg", "dungeon", "top-down"], "changelog": [{"date": "2022-02-16", "version": "1.0", "description": "", "files": 256, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/scribble-dungeons/2cfe03a47d-1674932859/kenney_scribble-dungeons.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/scribble-dungeons/785f19d04b-1674932850/preview.png", "https://www.kenney.nl/media/pages/assets/scribble-dungeons/6930851d9c-1674932853/sample.png"], "released_at": "2022-02-16", "updated_at": "2022-02-16"}, {"name": "Splat Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/splat-pack", "tags": ["splat", "texture", "vfx"], "changelog": [{"date": "2022-03-16", "version": "1.0", "description": "", "files": 30, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/splat-pack/bfdea3440d-1677495350/kenney_splat-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/splat-pack/64b49b7805-1677495346/preview.png"], "released_at": "2022-03-16", "updated_at": "2022-03-16"}, {"name": "Sketch Town Expansion", "category": "2D", "series": "Sketch", "page_link": "https://www.kenney.nl/assets/sketch-town-expansion", "tags": ["isometric", "rpg", "town"], "changelog": [{"date": "2022-04-13", "version": "1.0", "description": "", "files": 230, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sketch-town-expansion/d703fcca2c-1677484182/kenney_sketch-town-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sketch-town-expansion/2ba1acd717-1677484174/preview.png", "https://www.kenney.nl/media/pages/assets/sketch-town-expansion/867ec33635-1677484177/sample.png"], "released_at": "2022-04-13", "updated_at": "2022-04-13"}, {"name": "Survival Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/survival-kit", "tags": ["survival", "nature"], "changelog": [{"date": "2022-05-25", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-04-03", "version": "2.0", "description": "Completely remade, added 40 models", "files": 80, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/survival-kit/750a1eb3f9-1712149243/kenney_survival-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/survival-kit/f7200133de-1712149231/preview.png", "https://www.kenney.nl/media/pages/assets/survival-kit/25f7570cf5-1712149236/sample.png"], "released_at": "2022-05-25", "updated_at": "2024-04-03"}, {"name": "Blaster Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/blaster-kit", "tags": ["blaster", "weapon", "target"], "changelog": [{"date": "2022-05-30", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-03-26", "version": "2.0", "description": "Completely remade", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-07-31", "version": "2.1", "description": "Added crates, silencer, throwables and smoke", "files": 40, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/blaster-kit/aa06525a20-1753959510/kenney_blaster-kit_2.1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/blaster-kit/2a0a51ce70-1753959516/preview.png", "https://www.kenney.nl/media/pages/assets/blaster-kit/bd7c6826a0-1753959522/preview-variation-a.png"], "released_at": "2022-05-30", "updated_at": "2025-07-31"}, {"name": "Food Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/food-kit", "tags": ["food", "kitchen", "eat"], "changelog": [{"date": "2022-06-02", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-06-26", "version": "2.0", "description": "Completely remade", "files": 200, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/food-kit/719eef5f43-1719418518/kenney_food-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/food-kit/c7543d9c0d-1719418523/preview.png"], "released_at": "2022-06-02", "updated_at": "2024-06-26"}, {"name": "Fantasy Town Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/fantasy-town-kit", "tags": ["medieval", "wall", "town", "building"], "changelog": [{"date": "2022-06-03", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-08-03", "version": "2.0", "description": "Completely remade", "files": 160, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/fantasy-town-kit/40ed2a2d51-1754222374/kenney_fantasy-town-kit_2.0.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/fantasy-town-kit/46654aa09c-1754222358/preview.png", "https://www.kenney.nl/media/pages/assets/fantasy-town-kit/df49f1779e-1754222363/sample.png", "https://www.kenney.nl/media/pages/assets/fantasy-town-kit/6d75529187-1754222370/preview-variation-a.png"], "released_at": "2022-06-03", "updated_at": "2025-08-03"}, {"name": "Graveyard Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/graveyard-kit", "tags": ["graveyard", "halloween", "horror", "monster"], "changelog": [{"date": "2022-06-05", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-10-03", "version": "4.0", "description": "Animations added", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-10-25", "version": "4.1", "description": "Updated trees, colors", "files": 80, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/graveyard-kit/5b223d719c-1698252099/kenney_graveyard-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/graveyard-kit/38337b4d95-1698252063/preview.png", "https://www.kenney.nl/media/pages/assets/graveyard-kit/3c3e603633-1698252080/sample.png"], "released_at": "2022-06-05", "updated_at": "2023-10-25"}, {"name": "Tiny Dungeon", "category": "2D", "series": "Tiny", "page_link": "https://www.kenney.nl/assets/tiny-dungeon", "tags": ["rpg", "roguelike", "dungeon", "sewer", "pixel"], "changelog": [{"date": "2022-07-05", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tiny-dungeon/b56d7a13e3-1674742415/kenney_tiny-dungeon.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tiny-dungeon/e7a561dbb2-1674742409/preview.png", "https://www.kenney.nl/media/pages/assets/tiny-dungeon/331078e148-1674742412/sample.png"], "released_at": "2022-07-05", "updated_at": "2022-07-05"}, {"name": "Block Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/block-pack", "tags": ["terrain", "rpg", "town", "building"], "changelog": [{"date": "2022-07-11", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/block-pack/595a648d83-1677698772/kenney_block-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/block-pack/85f3b75de6-1677698766/preview.png", "https://www.kenney.nl/media/pages/assets/block-pack/f1bc1672aa-1677698768/sample.png"], "released_at": "2022-07-11", "updated_at": "2022-07-11"}, {"name": "Car Kit", "category": "3D", "series": "Transport", "page_link": "https://www.kenney.nl/assets/car-kit", "tags": ["car", "vehicle", "transportation"], "changelog": [{"date": "2022-07-24", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-05-01", "version": "2.0", "description": "Completely remade, added debris", "files": 45, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/car-kit/a9b1e99e92-1714554900/kenney_car-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/car-kit/59e3bdfadd-1714554893/preview.png"], "released_at": "2022-07-24", "updated_at": "2024-05-01"}, {"name": "Planets", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/planets", "tags": ["planet", "space", "galaxy"], "changelog": [{"date": "2022-07-28", "version": "1.0", "description": "", "files": 50, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/planets/b62f72bfc7-1677495391/kenney_planets.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/planets/24a5f6054e-1677495381/preview.png", "https://www.kenney.nl/media/pages/assets/planets/a7900d810c-1677495384/sample.png"], "released_at": "2022-07-28", "updated_at": "2022-07-28"}, {"name": "Marble Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/marble-kit", "tags": ["track", "marble"], "changelog": [{"date": "2022-08-08", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-05-22", "version": "2.0", "description": "Optimization, fixes and expansion", "files": 160, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/marble-kit/6652b7181e-1716385090/kenney_marble-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/marble-kit/19346e0854-1716385139/preview.png", "https://www.kenney.nl/media/pages/assets/marble-kit/6468c5168b-1716385096/sample.png", "https://www.kenney.nl/media/pages/assets/marble-kit/cf762b2c55-1716385132/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/marble-kit/c8fdf17ac8-1716385132/preview-variation-b.png", "https://www.kenney.nl/media/pages/assets/marble-kit/dcb55320cb-1716385133/preview-variation-c.png"], "released_at": "2022-08-08", "updated_at": "2024-05-22"}, {"name": "1-Bit Input Prompts Pixel 16\u00c3\u2014", "category": "2D", "series": "Input Prompts", "page_link": "https://www.kenney.nl/assets/1-bit-input-prompts-pixel-16", "tags": ["pixel", "input", "prompt", "button", "gamepad", "control", "1-bit", "interface"], "changelog": [{"date": "2022-08-16", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-02-04", "version": "1.1", "description": "Fixed small issue", "files": 800, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/1-bit-input-prompts-pixel-16/816fe3fabc-1707056469/kenney_1-bit-input-prompts-pixel-16.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/1-bit-input-prompts-pixel-16/1318dde6da-1707056476/preview.png"], "released_at": "2022-08-16", "updated_at": "2024-02-04"}, {"name": "Sketch Desert", "category": "2D", "series": "Sketch", "page_link": "https://www.kenney.nl/assets/sketch-desert", "tags": ["isometric", "rpg", "desert"], "changelog": [{"date": "2022-08-28", "version": "1.0", "description": "", "files": 240, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/sketch-desert/faac6dd989-1677484250/kenney_sketch-desert.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/sketch-desert/f9d4fec892-1677484239/preview.png", "https://www.kenney.nl/media/pages/assets/sketch-desert/cba3c7f738-1677484243/sample.png"], "released_at": "2022-08-28", "updated_at": "2022-08-28"}, {"name": "Animated Characters 3", "category": "3D", "series": "Animated Characters", "page_link": "https://www.kenney.nl/assets/animated-characters-3", "tags": ["character", "zombie", "survivor", "survival"], "changelog": [{"date": "2022-09-12", "version": "1.0", "description": "", "files": 8, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/animated-characters-3/df080ca4ab-1694862585/kenney_animated-characters-3.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/animated-characters-3/b5f93eb695-1670690130/preview.png"], "released_at": "2022-09-12", "updated_at": "2022-09-12"}, {"name": "Pixel Platformer Farm Expansion", "category": "2D", "series": "Pixel Platformer", "page_link": "https://www.kenney.nl/assets/pixel-platformer-farm-expansion", "tags": ["platformer", "farm", "pixel"], "changelog": [{"date": "2022-10-05", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-platformer-farm-expansion/9e6da5dacf-1668789813/kenney_pixel-platformer-farm-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-platformer-farm-expansion/213bfe1c70-1668789784/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer-farm-expansion/173ae4efff-1668789788/sample.png"], "released_at": "2022-10-05", "updated_at": "2022-10-05"}, {"name": "Pattern Pack 2", "category": "Textures", "series": "Patterns", "page_link": "https://www.kenney.nl/assets/pattern-pack-2", "tags": ["pattern", "texture", "seamless", "vfx"], "changelog": [{"date": "2022-10-28", "version": "1.0", "description": "", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pattern-pack-2/678557e111-1677484388/kenney_pattern-pack-2.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pattern-pack-2/5490285073-1677484383/preview.png"], "released_at": "2022-10-28", "updated_at": "2022-10-28"}, {"name": "Pixel Platformer Industrial Expansion", "category": "2D", "series": "Pixel Platformer", "page_link": "https://www.kenney.nl/assets/pixel-platformer-industrial-expansion", "tags": ["platformer", "industrial", "metal", "construction", "factory", "pixel"], "changelog": [{"date": "2022-11-05", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-platformer-industrial-expansion/dc418fdcd3-1668793443/kenney_pixel-platformer-industrial-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-platformer-industrial-expansion/b57228abd9-1668793434/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer-industrial-expansion/19b879fc55-1668793437/sample.png"], "released_at": "2022-11-05", "updated_at": "2022-11-05"}, {"name": "Pattern Pack Pixel", "category": "Textures", "series": "Patterns", "page_link": "https://www.kenney.nl/assets/pattern-pack-pixel", "tags": ["pattern", "texture", "seamless", "pixel", "vfx"], "changelog": [{"date": "2022-11-18", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-22", "version": "1.1", "description": "Small fixes", "files": 60, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pattern-pack-pixel/686b5b978f-1721640064/kenney_pattern-pack-pixel.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pattern-pack-pixel/fc1aeacaf2-1721639978/preview.png"], "released_at": "2022-11-18", "updated_at": "2024-07-22"}, {"name": "Minigolf Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/minigolf-kit", "tags": ["golf", "course", "level"], "changelog": [{"date": "2022-12-04", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-10-28", "version": "3.0", "description": "Color map, color variations", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-03-05", "version": "3.1", "description": "Additional models", "files": 125, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/minigolf-kit/378928a3bb-1741163874/kenney_minigolf-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/minigolf-kit/1f2c7d3a2b-1741163831/preview.png", "https://www.kenney.nl/media/pages/assets/minigolf-kit/a9688fc240-1741163840/sample.png", "https://www.kenney.nl/media/pages/assets/minigolf-kit/0c600c252d-1741163847/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/minigolf-kit/28c79d03b1-1741163853/preview-variation-b.png", "https://www.kenney.nl/media/pages/assets/minigolf-kit/eca91c843d-1741163867/preview-spline-concave.png"], "released_at": "2022-12-04", "updated_at": "2025-03-05"}, {"name": "Platformer Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/platformer-kit", "tags": ["platformer", "level"], "changelog": [{"date": "2022-12-05", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-05-15", "version": "3.0", "description": "Completely remade", "files": 140, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/platformer-kit/9fd25e14aa-1715799525/kenney_platformer-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/platformer-kit/896d65cbaf-1715756143/preview.png", "https://www.kenney.nl/media/pages/assets/platformer-kit/1c659f9dd7-1715756156/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/platformer-kit/bc4001651f-1715756150/sample.png"], "released_at": "2022-12-05", "updated_at": "2024-05-15"}, {"name": "Tiny Town", "category": "2D", "series": "Tiny", "page_link": "https://www.kenney.nl/assets/tiny-town", "tags": ["rpg", "roguelike", "town", "overworld", "map", "pixel"], "changelog": [{"date": "2023-01-11", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-01-01", "version": "1.1", "description": "Fixed small issue", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tiny-town/5e46f9e551-1735736916/kenney_tiny-town.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tiny-town/047cdc4757-1674742335/preview.png", "https://www.kenney.nl/media/pages/assets/tiny-town/1c57d72b26-1674742338/sample.png"], "released_at": "2023-01-11", "updated_at": "2025-01-01"}, {"name": "Conveyor Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/conveyor-kit", "tags": ["conveyor", "belt", "factory", "industrial", "warehouse"], "changelog": [{"date": "2023-02-14", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2023-10-31", "version": "2.0", "description": "Color map, color variations", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-01-07", "version": "2.1", "description": "Minor smoothing fixes", "files": 60, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/conveyor-kit/3e951d8bb9-1704624250/kenney_conveyor-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/conveyor-kit/a11fd9b4f5-1704624284/preview.png", "https://www.kenney.nl/media/pages/assets/conveyor-kit/1cd8f2ef99-1698750194/sample.png", "https://www.kenney.nl/media/pages/assets/conveyor-kit/1f6752f541-1704624293/preview-variation-a.png"], "released_at": "2023-02-14", "updated_at": "2024-01-07"}, {"name": "Tiny Ski", "category": "2D", "series": "Tiny", "page_link": "https://www.kenney.nl/assets/tiny-ski", "tags": ["ski", "pixel", "sports"], "changelog": [{"date": "2023-03-30", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tiny-ski/25dc1207a0-1680201514/kenney_tiny-ski.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tiny-ski/a4c540c4fb-1680201500/preview.png", "https://www.kenney.nl/media/pages/assets/tiny-ski/059076b38d-1680201502/sample.png"], "released_at": "2023-03-30", "updated_at": "2023-03-30"}, {"name": "Mini Dungeon", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-dungeon", "tags": ["dungeon", "rpg", "roguelike", "medieval"], "changelog": [{"date": "2023-05-26", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-02-29", "version": "1.5", "description": "Character rig(s)", "files": 20, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-dungeon/2de2de674e-1709221094/kenney_mini-dungeon.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-dungeon/a84cf49dd7-1709221105/preview.png", "https://www.kenney.nl/media/pages/assets/mini-dungeon/7212f8ae8b-1709221112/sample.png"], "released_at": "2023-05-26", "updated_at": "2024-02-29"}, {"name": "Isometric Miniature Bases", "category": "2D", "series": "Isometric Miniature", "page_link": "https://www.kenney.nl/assets/isometric-miniature-bases", "tags": ["isometric", "base", "tabletop"], "changelog": [{"date": "2023-06-15", "version": "1.0", "description": "", "files": 40, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/isometric-miniature-bases/b8f20a6a9c-1686811744/kenney_isometric-miniature-bases.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/isometric-miniature-bases/b5cc6d2994-1686811736/preview.png", "https://www.kenney.nl/media/pages/assets/isometric-miniature-bases/4d41333c45-1686811808/sample.png"], "released_at": "2023-06-15", "updated_at": "2023-06-15"}, {"name": "Tiny Battle", "category": "2D", "series": "Tiny", "page_link": "https://www.kenney.nl/assets/tiny-battle", "tags": ["pixel", "battle", "war", "tank", "vehicle", "unit"], "changelog": [{"date": "2023-08-08", "version": "1.0", "description": "", "files": 190, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/tiny-battle/c290ec1e4b-1691487575/kenney_tiny-battle.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/tiny-battle/52c96cc3ff-1691487569/preview.png", "https://www.kenney.nl/media/pages/assets/tiny-battle/96a9e8d2b6-1691487572/sample.png"], "released_at": "2023-08-08", "updated_at": "2023-08-08"}, {"name": "Mini Skate", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-skate", "tags": ["skateboard", "park"], "changelog": [{"date": "2023-08-27", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-02-29", "version": "1.2", "description": "Character rig(s)", "files": 20, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-skate/87b3a70475-1709221152/kenney_mini-skate.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-skate/a18b1632ea-1709221246/preview.png", "https://www.kenney.nl/media/pages/assets/mini-skate/144b38b80c-1709221252/sample.png"], "released_at": "2023-08-27", "updated_at": "2024-02-29"}, {"name": "Pico-8 City", "category": "2D", "series": "Pico-8", "page_link": "https://www.kenney.nl/assets/pico-8-city", "tags": ["city", "town", "vehicles", "pixel"], "changelog": [{"date": "2023-09-01", "version": "1.0", "description": "", "files": 360, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pico-8-city/bcb2ac2a8d-1693576593/kenney_pico-8-city.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pico-8-city/e7e7adfe95-1693576584/preview.png", "https://www.kenney.nl/media/pages/assets/pico-8-city/51c45f5992-1693576588/sample.png"], "released_at": "2023-09-01", "updated_at": "2023-09-01"}, {"name": "Pixel Platformer Food Expansion", "category": "2D", "series": "Pixel Platformer", "page_link": "https://www.kenney.nl/assets/pixel-platformer-food-expansion", "tags": ["platformer", "food", "pixel"], "changelog": [{"date": "2023-10-06", "version": "1.0", "description": "", "files": 110, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pixel-platformer-food-expansion/058b90cca3-1696596511/kenney_pixel-platformer-food-expansion.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pixel-platformer-food-expansion/df723225a7-1696596501/preview.png", "https://www.kenney.nl/media/pages/assets/pixel-platformer-food-expansion/9ac49f3999-1696596505/sample.png"], "released_at": "2023-10-06", "updated_at": "2023-10-06"}, {"name": "Shape Characters", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/shape-characters", "tags": ["characters", "geometric", "shape"], "changelog": [{"date": "2023-10-26", "version": "1.0", "description": "", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/shape-characters/10e737ac29-1698339465/kenney_shape-characters.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/shape-characters/de94d95c39-1698339456/preview.png", "https://www.kenney.nl/media/pages/assets/shape-characters/81b9e106b6-1698339460/sample.png"], "released_at": "2023-10-26", "updated_at": "2023-10-26"}, {"name": "Monochrome Pirates", "category": "2D", "series": "Monochrome", "page_link": "https://www.kenney.nl/assets/monochrome-pirates", "tags": ["pirate", "pixel", "monochrome"], "changelog": [{"date": "2023-11-29", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/monochrome-pirates/7c68d7ad33-1701252760/kenney_monochrome-pirates.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/monochrome-pirates/14643c8946-1701252750/preview.png", "https://www.kenney.nl/media/pages/assets/monochrome-pirates/cc64006564-1701252754/sample-a.png", "https://www.kenney.nl/media/pages/assets/monochrome-pirates/c01d181892-1701252757/sample-b.png"], "released_at": "2023-11-29", "updated_at": "2023-11-29"}, {"name": "Fantasy UI Borders", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/fantasy-ui-borders", "tags": ["panel", "button", "interface", "decorative", "rpg", "fantasy"], "changelog": [{"date": "2023-12-03", "version": "1.0", "description": "", "files": 140, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/fantasy-ui-borders/458f216b46-1701602367/kenney_fantasy-ui-borders.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/fantasy-ui-borders/af0287afe3-1701602361/preview.png", "https://www.kenney.nl/media/pages/assets/fantasy-ui-borders/29d02d4cce-1701602364/sample.png"], "released_at": "2023-12-03", "updated_at": "2023-12-03"}, {"name": "Mini Arena", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-arena", "tags": ["arena", "battle", "roman"], "changelog": [{"date": "2024-01-16", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-02-29", "version": "1.1", "description": "Character rig", "files": 20, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-arena/9d8461e159-1709220730/kenney_mini-arena.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-arena/b93527abf9-1709220740/preview.png", "https://www.kenney.nl/media/pages/assets/mini-arena/8a27776c7e-1709220747/sample.png"], "released_at": "2024-01-16", "updated_at": "2024-02-29"}, {"name": "Input Prompts", "category": "2D", "series": "Input Prompts", "page_link": "https://www.kenney.nl/assets/input-prompts", "tags": ["input", "prompt", "button", "gamepad", "control", "interface"], "changelog": [{"date": "2024-01-20", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-03-04", "version": "1.1", "description": "Added consoles, improved icons", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-03-19", "version": "1.1a", "description": "Fixed mouse scroll icons", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-06-26", "version": "1.1b", "description": "Updated PlayStation 'options' button", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-04-02", "version": "1.2", "description": "Added Nintendo Switch 2", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-04-02", "version": "1.2a", "description": "Fixed Nintendo Switch 2 issues", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-04-03", "version": "1.3", "description": "Added Gamecube and touch", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-04-07", "version": "1.4", "description": "Added spritesheets and fonts", "files": 1280, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/input-prompts/8e0d363875-1744027012/kenney_input-prompts_1.4.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/input-prompts/ae6f3db5b2-1744026983/preview-xbox-series.png", "https://www.kenney.nl/media/pages/assets/input-prompts/88dfbd2830-1744026989/preview-playstation-series.png", "https://www.kenney.nl/media/pages/assets/input-prompts/1aa8a91c74-1709558165/preview-nintendo-switch.png", "https://www.kenney.nl/media/pages/assets/input-prompts/2824df077e-1743606869/preview-nintendo-switch-2.png", "https://www.kenney.nl/media/pages/assets/input-prompts/6e6bc45acb-1744026995/preview-keyboard-mouse.png", "https://www.kenney.nl/media/pages/assets/input-prompts/bb86b4bf71-1709558167/preview-steam-deck.png", "https://www.kenney.nl/media/pages/assets/input-prompts/0b91ab2b99-1709558165/preview-generic.png", "https://www.kenney.nl/media/pages/assets/input-prompts/4a107a53bc-1709558165/preview-flairs-overlays.png", "https://www.kenney.nl/media/pages/assets/input-prompts/e4f8751831-1709558167/preview-playdate.png", "https://www.kenney.nl/media/pages/assets/input-prompts/f400bb34bb-1709558166/preview-steam-controller.png", "https://www.kenney.nl/media/pages/assets/input-prompts/cec6bfa201-1709558166/preview-nintendo-wii.png", "https://www.kenney.nl/media/pages/assets/input-prompts/aee7308c7a-1709558165/preview-nintendo-wiiu.png", "https://www.kenney.nl/media/pages/assets/input-prompts/a0ba0795bd-1743683508/preview-gamecube.png"], "released_at": "2024-01-20", "updated_at": "2025-04-07"}, {"name": "Yellow Paint Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/yellow-paint-pack", "tags": ["yellow", "paint"], "changelog": [{"date": "2024-02-11", "version": "1.0", "description": "", "files": 10, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/yellow-paint-pack/bbb55ff3c7-1707675361/kenney_yellow-paint-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/yellow-paint-pack/24b15580b5-1707675344/preview.png"], "released_at": "2024-02-11", "updated_at": "2024-02-11"}, {"name": "Googly Eyes", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/googly-eyes", "tags": ["googly"], "changelog": [{"date": "2024-03-04", "version": "1.0", "description": "", "files": 5, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/googly-eyes/c3ee938a11-1709670508/kenney_googly-eyes.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/googly-eyes/e94ed0b517-1709574776/preview.png"], "released_at": "2024-03-04", "updated_at": "2024-03-04"}, {"name": "Space Station Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/space-station-kit", "tags": ["space", "station", "sci-fi", "interior"], "changelog": [{"date": "2024-04-10", "version": "1.0", "description": "", "files": 90, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/space-station-kit/1fb1ea1b36-1712749919/kenney_space-station-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/space-station-kit/a04e7b8ce2-1712749912/preview.png", "https://www.kenney.nl/media/pages/assets/space-station-kit/4e040a8758-1712749915/sample.png"], "released_at": "2024-04-10", "updated_at": "2024-04-10"}, {"name": "Cursor Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/cursor-pack", "tags": ["cursor", "icon", "interface"], "changelog": [{"date": "2024-04-23", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-06-05", "version": "1.1", "description": "Added 70 cursors", "files": 180, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/cursor-pack/3218fbb7ac-1717599281/kenney_cursor-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/cursor-pack/c2ee3e1c6c-1717599288/preview.png"], "released_at": "2024-04-23", "updated_at": "2024-06-05"}, {"name": "Brick Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/brick-kit", "tags": ["brick", "toy", "plastic", "building"], "changelog": [{"date": "2024-05-29", "version": "1.0", "description": "", "files": 290, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/brick-kit/130bb5f8f7-1716981002/kenney_brick-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/brick-kit/b55d0ce236-1716980994/preview.png", "https://www.kenney.nl/media/pages/assets/brick-kit/8457de1bc2-1716980998/sample.png"], "released_at": "2024-05-29", "updated_at": "2024-05-29"}, {"name": "Building Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/building-kit", "tags": ["building", "structure", "house"], "changelog": [{"date": "2024-06-19", "version": "1.0", "description": "", "files": 80, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/building-kit/973da8686e-1743244741/kenney_building-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/building-kit/2795c92044-1718801876/preview.png", "https://www.kenney.nl/media/pages/assets/building-kit/a2ec9b9017-1718801879/sample.png", "https://www.kenney.nl/media/pages/assets/building-kit/1bc95c2ef4-1718801900/preview-variation-a.png"], "released_at": "2024-06-19", "updated_at": "2024-06-19"}, {"name": "Mini Arcade", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-arcade", "tags": ["arcade", "game", "machine", "play"], "changelog": [{"date": "2024-07-03", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-05", "version": "1.1", "description": "Small changes", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-07-22", "version": "1.2", "description": "Small fixes", "files": 20, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-arcade/6864c49401-1721638600/kenney_mini-arcade.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-arcade/f06412b60e-1720210162/preview.png", "https://www.kenney.nl/media/pages/assets/mini-arcade/2ec6d82617-1720210169/sample.png", "https://www.kenney.nl/media/pages/assets/mini-arcade/3d18b20e5b-1720210178/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/mini-arcade/e9c6b9e232-1720210178/preview-variation-b.png"], "released_at": "2024-07-03", "updated_at": "2024-07-22"}, {"name": "Cursor Pixel Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/cursor-pixel-pack", "tags": ["cursor", "icon", "interface", "pixel"], "changelog": [{"date": "2024-07-10", "version": "1.0", "description": "", "files": 180, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/cursor-pixel-pack/dd2ddab563-1720601332/kenney_cursor-pixel-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/cursor-pixel-pack/84c1eee934-1720601327/preview.png"], "released_at": "2024-07-10", "updated_at": "2024-07-10"}, {"name": "Mini Characters 1", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-characters-1", "tags": ["character", "people", "disability"], "changelog": [{"date": "2024-07-17", "version": "1.0", "description": "", "files": 25, "feat_animation": true, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-characters-1/546ff0fed5-1721210573/kenney_mini-characters.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-characters-1/fc690734c1-1721210569/preview.png"], "released_at": "2024-07-17", "updated_at": "2024-07-17"}, {"name": "Train Kit", "category": "3D", "series": "Transport", "page_link": "https://www.kenney.nl/assets/train-kit", "tags": ["train", "tram", "trolley", "track", "railroad", "rail"], "changelog": [{"date": "2024-07-31", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2024-09-22", "version": "1.1", "description": "Added tracks", "files": 100, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/train-kit/f58e738ada-1727040883/kenney_train-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/train-kit/96698fa141-1722429699/preview.png", "https://www.kenney.nl/media/pages/assets/train-kit/5992a2c1f7-1727040968/preview-railroad-damaged.png", "https://www.kenney.nl/media/pages/assets/train-kit/e4604f48dd-1727040968/preview-railroad-rail.png", "https://www.kenney.nl/media/pages/assets/train-kit/9fd2c53289-1727040968/preview-railroad.png"], "released_at": "2024-07-31", "updated_at": "2024-09-22"}, {"name": "Pico-8 Platformer", "category": "2D", "series": "Pico-8", "page_link": "https://www.kenney.nl/assets/pico-8-platformer", "tags": ["platformer", "tile", "characters", "enemy", "pixel"], "changelog": [{"date": "2024-08-07", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/pico-8-platformer/df35001afc-1723028953/kenney_pico-8-platformer.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/pico-8-platformer/cc6ea15fe4-1723028948/preview.png", "https://www.kenney.nl/media/pages/assets/pico-8-platformer/7515b33357-1723028951/sample.png"], "released_at": "2024-08-07", "updated_at": "2024-08-07"}, {"name": "UI Pack - Adventure", "category": "2D", "series": "UI Pack", "page_link": "https://www.kenney.nl/assets/ui-pack-adventure", "tags": ["button", "panel", "slider", "interface"], "changelog": [{"date": "2024-08-14", "version": "1.0", "description": "", "files": 130, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-pack-adventure/e3276466a8-1723597274/kenney_ui-pack-adventure.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-pack-adventure/569fa4e8e7-1723597269/preview.png", "https://www.kenney.nl/media/pages/assets/ui-pack-adventure/97473106f0-1723597272/sample.png"], "released_at": "2024-08-14", "updated_at": "2024-08-14"}, {"name": "Prototype Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/prototype-kit", "tags": ["prototype", "animal", "wheelchair", "character", "vehicle", "wall", "building"], "changelog": [{"date": "2024-08-28", "version": "1.0", "description": "", "files": 145, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/prototype-kit/32ac007983-1724832076/kenney_prototype-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/prototype-kit/766d3c00fe-1724832070/preview.png"], "released_at": "2024-08-28", "updated_at": "2024-08-28"}, {"name": "UI Pack - Pixel Adventure", "category": "2D", "series": "UI Pack", "page_link": "https://www.kenney.nl/assets/ui-pack-pixel-adventure", "tags": ["button", "panel", "slider", "interface", "pixel"], "changelog": [{"date": "2024-09-04", "version": "1.0", "description": "", "files": 500, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/ui-pack-pixel-adventure/6fe9992305-1729196257/kenney_ui-pack-pixel-adventure.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/ui-pack-pixel-adventure/a818bdb5d2-1725434335/preview.png", "https://www.kenney.nl/media/pages/assets/ui-pack-pixel-adventure/db896543b7-1725434429/sample.png"], "released_at": "2024-09-04", "updated_at": "2024-09-04"}, {"name": "Toy Car Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/toy-car-kit", "tags": ["car", "vehicle", "toy", "track"], "changelog": [{"date": "2024-09-24", "version": "1.0", "description": "", "files": 0, "feat_animation": false, "feat_variation": false, "orig_file_link": null}, {"date": "2025-01-08", "version": "1.2", "description": "Additional models, fixes", "files": 100, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/toy-car-kit/450d9aff6e-1736346027/kenney_toy-car-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/toy-car-kit/910f3044c7-1736346119/preview.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/b2d86a6bf0-1736346132/preview-track-narrow.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/17ab919d1e-1736346131/preview-track-wide.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/f3e4cfa806-1736346132/preview-track-road-narrow.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/1417fc7f01-1736346131/preview-track-road-wide.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/a28b15a088-1736346132/preview-track-striped-narrow.png", "https://www.kenney.nl/media/pages/assets/toy-car-kit/7f9e7e70dd-1736346131/preview-track-striped-wide.png"], "released_at": "2024-09-24", "updated_at": "2025-01-08"}, {"name": "Mini Market", "category": "3D", "series": "Mini", "page_link": "https://www.kenney.nl/assets/mini-market", "tags": ["shop", "market", "supermarket", "store"], "changelog": [{"date": "2024-10-25", "version": "1.0", "description": "", "files": 20, "feat_animation": true, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mini-market/9b3ce850b6-1729865423/kenney_mini-market.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mini-market/0c5e12170c-1729865126/preview.png", "https://www.kenney.nl/media/pages/assets/mini-market/42a26eaa85-1729865129/sample.png", "https://www.kenney.nl/media/pages/assets/mini-market/ef57e86df3-1729865167/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/mini-market/66cb77c06c-1729865169/preview-variation-b.png"], "released_at": "2024-10-25", "updated_at": "2024-10-25"}, {"name": "Minimap Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/minimap-pack", "tags": ["minimap", "search action", "metroidvania", "map", "pixel", "ui"], "changelog": [{"date": "2024-11-06", "version": "1.0", "description": "", "files": 150, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/minimap-pack/ceaae8f7f3-1730884114/kenney_minimap-pack.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/minimap-pack/9ed071e5f5-1730884744/preview.png", "https://www.kenney.nl/media/pages/assets/minimap-pack/83eb030972-1730884731/sample.png"], "released_at": "2024-11-06", "updated_at": "2024-11-06"}, {"name": "Coaster Kit", "category": "3D", "series": null, "page_link": "https://www.kenney.nl/assets/coaster-kit", "tags": ["rollercoaster", "coaster", "theme park", "attraction", "ride", "track"], "changelog": [{"date": "2024-11-13", "version": "1.0", "description": "", "files": 180, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/coaster-kit/9cd2988103-1731487890/kenney_coaster-kit.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/coaster-kit/5fb6d6bbee-1731487879/preview.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/5c98a6c344-1731487885/preview-coaster-monorail.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/3fbc367090-1731487885/preview-coaster-steel.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/7d023c3f34-1731487885/preview-coaster-wood.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/a073d6f319-1731487885/preview-coaster-mouse.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/b2a8fcda9d-1731487885/preview-coaster-hanging.png", "https://www.kenney.nl/media/pages/assets/coaster-kit/d64f4c921f-1731487885/preview-coaster-flume.png"], "released_at": "2024-11-13", "updated_at": "2024-11-13"}, {"name": "New Platformer Pack", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/new-platformer-pack", "tags": ["platformer", "tile", "character", "oopi"], "changelog": [{"date": "2025-05-06", "version": "1.0", "description": "", "files": 440, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/new-platformer-pack/9ec528942d-1746559494/kenney_new-platformer-pack-1.0.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/new-platformer-pack/4339843610-1746559478/preview-tiles.png", "https://www.kenney.nl/media/pages/assets/new-platformer-pack/bc63514347-1746559478/preview-characters.png", "https://www.kenney.nl/media/pages/assets/new-platformer-pack/1a9f50b2ac-1746559478/preview-backgrounds.png", "https://www.kenney.nl/media/pages/assets/new-platformer-pack/9c383bd5ae-1746559490/sample-a.png", "https://www.kenney.nl/media/pages/assets/new-platformer-pack/4091992cee-1746559490/sample-b.png"], "released_at": "2025-05-06", "updated_at": "2025-05-06"}, {"name": "City Kit (Industrial)", "category": "3D", "series": "City", "page_link": "https://www.kenney.nl/assets/city-kit-industrial", "tags": ["city", "building", "factory", "warehouse"], "changelog": [{"date": "2025-06-25", "version": "1.0", "description": "", "files": 25, "feat_animation": false, "feat_variation": true, "orig_file_link": "https://www.kenney.nl/media/pages/assets/city-kit-industrial/558e215159-1750838303/kenney_city-kit-industrial_1.0.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/city-kit-industrial/12d5c96299-1750838283/preview.png", "https://www.kenney.nl/media/pages/assets/city-kit-industrial/61dc3cf161-1750838287/sample.png", "https://www.kenney.nl/media/pages/assets/city-kit-industrial/80f52dd77f-1750838295/preview-variation-a.png", "https://www.kenney.nl/media/pages/assets/city-kit-industrial/1a66aa84d2-1750838295/preview-variation-c.png", "https://www.kenney.nl/media/pages/assets/city-kit-industrial/99142ccd80-1750838295/preview-variation-b.png"], "released_at": "2025-06-25", "updated_at": "2025-06-25"}, {"name": "Mobile Controls", "category": "2D", "series": null, "page_link": "https://www.kenney.nl/assets/mobile-controls", "tags": ["control", "prompt", "button", "hud", "interface"], "changelog": [{"date": "2025-08-09", "version": "1.0", "description": "", "files": 900, "feat_animation": false, "feat_variation": false, "orig_file_link": "https://www.kenney.nl/media/pages/assets/mobile-controls/4202ff5c3b-1754738457/mobile-controls-1.zip"}], "images": ["https://www.kenney.nl/media/pages/assets/mobile-controls/07b413015d-1754738442/preview.png", "https://www.kenney.nl/media/pages/assets/mobile-controls/dd5c51c78a-1754738447/sample.png"], "released_at": "2025-08-09", "updated_at": "2025-08-09"}] \ No newline at end of file diff --git a/frontend/v1/index.html b/frontend/v1/index.html deleted file mode 100644 index e1b0162..0000000 --- a/frontend/v1/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Kenney Asset Gallery - - - - - - - - - -

🎮 Kenney Asset Gallery

- - -
- - - - -
- - - - - - diff --git a/frontend/v1/script.js b/frontend/v1/script.js deleted file mode 100644 index f5ae82e..0000000 --- a/frontend/v1/script.js +++ /dev/null @@ -1,98 +0,0 @@ -let allData = []; - -function sanitize(str) { - return str.replaceAll("\\", "/"); -} - -function populateFilters(data) { - const catSet = new Set(); - const tagSet = new Set(); - - data.forEach(item => { - catSet.add(item.properties?.Category?.[0]); - (item.properties?.Tags || []).forEach(tag => tagSet.add(tag)); - }); - - const catFilter = document.getElementById("categoryFilter"); - [...catSet].sort().forEach(cat => { - const option = document.createElement("option"); - option.value = cat; - option.textContent = cat; - catFilter.appendChild(option); - }); - - const tagFilter = document.getElementById("tagFilter"); - [...tagSet].sort().forEach(tag => { - const option = document.createElement("option"); - option.value = tag; - option.textContent = tag; - tagFilter.appendChild(option); - }); -} - -function render(data) { - const gallery = document.getElementById("gallery"); - gallery.innerHTML = ""; // clear - - data.forEach((item, index) => { - const images = (item.images || []).map(sanitize); - const tags = (item.properties?.Tags || []).join(', '); - const category = item.properties?.Category?.[0] || 'Uncategorized'; - const downloadPath = sanitize(item.download); - - const card = document.createElement("div"); - card.className = "card"; - card.setAttribute("data-category", category); - card.setAttribute("data-tags", tags); - - const galleryGroupId = `gallery-${index}`; - card.innerHTML = ` - -
-
${item.title}
-
Tags: ${tags}
- -
- `; - gallery.appendChild(card); - - // 初始化 lightGallery - lightGallery(document.getElementById(galleryGroupId), { - selector: 'a', - thumbnail: true, - zoom: true - }); - }); -} - -function filterGallery() { - const cat = document.getElementById("categoryFilter").value; - const tag = document.getElementById("tagFilter").value; - - const filtered = allData.filter(item => { - const matchCat = (cat === 'all') || (item.properties?.Category?.[0] === cat); - const matchTag = (tag === 'all') || (item.properties?.Tags || []).includes(tag); - return matchCat && matchTag; - }); - - render(filtered); -} - -fetch("data/kenney_data_local.json") - .then(res => res.json()) - .then(data => { - allData = data; - populateFilters(data); - render(data); - document.getElementById("categoryFilter").addEventListener("change", filterGallery); - document.getElementById("tagFilter").addEventListener("change", filterGallery); - }); diff --git a/frontend/v1/style.css b/frontend/v1/style.css deleted file mode 100644 index 2123a15..0000000 --- a/frontend/v1/style.css +++ /dev/null @@ -1,82 +0,0 @@ -body { - font-family: "Segoe UI", sans-serif; - background-color: #f0f2f5; - margin: 0; - padding: 2rem; - color: #333; -} - -h1 { - text-align: center; - margin-bottom: 2rem; - color: #444; -} - -#gallery { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); - gap: 1.5rem; -} - -.card { - background: white; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - overflow: hidden; - transition: transform 0.2s; -} - -.card:hover { - transform: translateY(-5px); -} - -.card img { - width: 100%; - height: 200px; - object-fit: cover; -} - -.card-body { - padding: 1rem; -} - -.card-title { - font-size: 1.2rem; - margin-bottom: 0.5rem; -} - -.card-tags { - font-size: 0.85rem; - color: #666; -} - -.card-footer { - margin-top: 1rem; -} - -.download-btn { - display: inline-block; - padding: 0.4rem 0.8rem; - background: #4caf50; - color: white; - border-radius: 6px; - text-decoration: none; - font-size: 0.9rem; - transition: background 0.2s; -} - -.download-btn:hover { - background: #45a049; -} - -#filters { - display: flex; - justify-content: center; - gap: 1rem; - margin-bottom: 1.5rem; -} - -select { - padding: 0.5rem; - font-size: 1rem; -} diff --git a/frontend/v2/index.html b/frontend/v2/index.html deleted file mode 100644 index 72a170f..0000000 --- a/frontend/v2/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Kenney 资源库 - - - - - - - - - - -
- - -
- -
- ← 请选择左侧资源以查看详情 -
-
-
- - - - - - - diff --git a/frontend/v2/script.js b/frontend/v2/script.js deleted file mode 100644 index bdfb75c..0000000 --- a/frontend/v2/script.js +++ /dev/null @@ -1,108 +0,0 @@ -let allData = []; -let currentActive = null; - -// 定义一个函数,用于将字符串中的反斜杠替换为正斜杠 -function sanitize(str) { - return str.replaceAll("\\", "/"); -} - -function renderList(data) { - const list = document.getElementById("resourceList"); - list.innerHTML = ""; - - data.forEach((item, index) => { - const li = document.createElement("li"); - li.setAttribute("data-index", index); - - const thumb = item.images?.[0] ? sanitize(item.images[0]) : ""; - const name = item.title; - const assets = item.properties?.Assets || "未知"; - - li.innerHTML = ` - -
-
${name}
-
素材量: ${assets}
-
- `; - - li.addEventListener("click", () => showDetails(item, li)); - list.appendChild(li); - }); -} - -function showDetails(item, li) { - if (currentActive) currentActive.classList.remove("active"); - currentActive = li; - currentActive.classList.add("active"); - - document.getElementById("placeholder").classList.add("hidden"); - document.getElementById("details").classList.remove("hidden"); - - document.getElementById("detailTitle").textContent = item.title; - document.getElementById("detailTags").textContent = `分类: ${ - item.properties?.Category?.[0] || "N/A" - } | 标签: ${(item.properties?.Tags || []).join(", ")}`; - - // 下载链接 - const download = sanitize(item.download); - document.getElementById( - "downloadBlock" - ).innerHTML = `⬇️ 下载资源`; - - // 图集 - const gallery = document.createElement("div"); - gallery.id = "gallery"; - item.images?.forEach((img) => { - img = sanitize(img); - const a = document.createElement("a"); - a.href = img; - a.innerHTML = ``; - gallery.appendChild(a); - }); - const galleryWrapper = document.getElementById("galleryWrapper"); - galleryWrapper.innerHTML = ""; - galleryWrapper.appendChild(gallery); - - lightGallery(gallery, { - selector: "a", - thumbnail: true, - zoom: true, - }); - - // 版本信息 - const versionBlock = document.getElementById("versionTableWrapper"); - if (item.changelog?.length > 0) { - let table = ``; - item.changelog.forEach((row) => { - table += ``; - }); - table += `
日期版本描述
${row.date}${row.version}${ - row.description || "" - }
`; - versionBlock.innerHTML = table; - } else { - versionBlock.innerHTML = ""; - } -} - -function handleSearch() { - const keyword = document - .getElementById("searchInput") - .value.trim() - .toLowerCase(); - const filtered = allData.filter((item) => - item.title.toLowerCase().includes(keyword) - ); - renderList(filtered); -} - -fetch("data/kenney_data_local.json") - .then((res) => res.json()) - .then((data) => { - allData = data; - renderList(data); - document - .getElementById("searchInput") - .addEventListener("input", handleSearch); - }); diff --git a/frontend/v2/style.css b/frontend/v2/style.css deleted file mode 100644 index fa714a3..0000000 --- a/frontend/v2/style.css +++ /dev/null @@ -1,115 +0,0 @@ -body { - margin: 0; - font-family: "Segoe UI", sans-serif; - background-color: #f0f2f5; -} - -.container { - display: flex; - height: 100vh; -} - -.sidebar { - width: 320px; - background: #fff; - border-right: 1px solid #ddd; - padding: 1rem; - overflow-y: auto; -} - -.sidebar input { - width: 100%; - padding: 0.5rem; - margin-bottom: 1rem; - font-size: 1rem; -} - -.sidebar ul { - list-style: none; - padding: 0; - margin: 0; -} - -.sidebar li { - padding: 0.5rem; - margin-bottom: 0.5rem; - cursor: pointer; - border-radius: 6px; - display: flex; - align-items: center; - gap: 1rem; - transition: background 0.2s; -} - -.sidebar li:hover, -.sidebar li.active { - background-color: #e6f7ff; -} - -.sidebar img.thumb { - width: 48px; - height: 48px; - object-fit: cover; - border-radius: 4px; -} - -.content { - flex: 1; - padding: 2rem; - overflow-y: auto; -} - -.placeholder { - font-size: 1.2rem; - color: #999; -} - -.hidden { - display: none; -} - -#galleryWrapper { - margin-top: 1rem; -} - -#galleryWrapper a img { - height: 120px; - margin: 5px; - object-fit: cover; - border-radius: 4px; -} - -#detailTags { - margin-bottom: 1rem; - color: #666; - font-size: 0.9rem; -} - -#downloadBlock { - margin: 1rem 0; -} - -.download-btn { - padding: 0.5rem 1rem; - background-color: #4caf50; - color: white; - border-radius: 6px; - text-decoration: none; - font-size: 0.95rem; -} - -.download-btn:hover { - background-color: #45a049; -} - -#versionTableWrapper table { - margin-top: 1rem; - width: 100%; - border-collapse: collapse; -} - -#versionTableWrapper th, -#versionTableWrapper td { - padding: 0.5rem; - border: 1px solid #ccc; -} diff --git a/main.py b/main.py new file mode 100644 index 0000000..0a64663 --- /dev/null +++ b/main.py @@ -0,0 +1,364 @@ +import os +import re +import requests +import random +import time +import json +from datetime import datetime +from mysql_helper import MySQLHelper +from bs4 import BeautifulSoup +from tqdm import tqdm, trange + +KENNEY_ASSET_URL = "https://www.kenney.nl/assets/" + +def get_headers(): + """生成随机 UA 的请求头""" + # 一些常见的桌面浏览器 UA 列表(可以自己扩充) + USER_AGENTS = [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/126.0.0.0 Safari/537.36", + + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/605.1.15 (KHTML, like Gecko) " + "Version/17.3 Safari/605.1.15", + + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) " + "Gecko/20100101 Firefox/128.0" + ] + return { + "User-Agent": random.choice(USER_AGENTS), + "Accept": ( + "text/html,application/xhtml+xml,application/xml;" + "q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8" + ), + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Connection": "keep-alive", + "Referer": "https://www.google.com/", + "Upgrade-Insecure-Requests": "1" + } + +class SmartCrawler: + def __init__(self, delay_range=(1, 3)): + self.session = requests.Session() + self.delay_range = delay_range + self.headers = get_headers() + + def get(self, url): + time.sleep(random.uniform(*self.delay_range)) + return self.session.get(url, headers=self.headers) + +def parse_date(date_str): + """将 dd/mm/yyyy 转为 yyyy-mm-dd 格式""" + return datetime.strptime(date_str, "%d/%m/%Y").strftime("%Y-%m-%d") + +def get_total_pages() -> int: + """Get total asset pages""" + crawler = SmartCrawler() + resp = crawler.get(KENNEY_ASSET_URL) + soup = BeautifulSoup(resp.text, "lxml") + result = 0 + last_page_button_selector = "#content > section > div > div.row.text-center.margin-top > div > ul > li:last-child > a" + last_page_button = soup.select_one(last_page_button_selector) + # Should obtain element like this: + # ... + # obtain the href attribute, and extract the number after "page:" + if last_page_button and "href" in last_page_button.attrs: + page_link = last_page_button["href"] + splitted_page_link = page_link.split(':') + if splitted_page_link[-1].isdigit(): + result = int(splitted_page_link[-1]) + else: + raise ValueError(f"Expected int in page number, got {splitted_page_link[-1]}") + else: + raise Exception("Last page button or its href attribute not found") + return result + +def get_all_asset_infos(total_pages: int) -> list[dict[str, str]]: + result = [] + for page in trange(1, total_pages + 1, desc="Fetching all assets' page links"): + asset_page_url = KENNEY_ASSET_URL + f"page:{page}?search=&sort=release" + crawler = SmartCrawler(delay_range=(1, 3)) + resp = crawler.get(asset_page_url) + soup = BeautifulSoup(resp.text, "lxml") + contents_selector = "#content > section > div > div:nth-of-type(1)" + contents_div = soup.select_one(contents_selector) + if contents_div: + item_divs = contents_div.find_all("div", recursive=False) + for item_div in item_divs: + # We may get these info from the grid + asset_info = { + "name": "", + "category": "", + "series": "", + "page_link": "" + } + h2_tag = item_div.find("h2") + asset_info["name"] = h2_tag.text if h2_tag else None + a_tags = item_div.find_all("a") + asset_info["category"] = a_tags[2].text if len(a_tags) > 2 else None + asset_info["series"] = a_tags[3].text if len(a_tags) > 3 else None + asset_info["page_link"] = a_tags[1]["href"] if "href" in a_tags[0].attrs else None + result.append(asset_info) + return result + +def get_asset_pack_info(asset: dict[str, ]) -> None: + crawler = SmartCrawler() + resp = crawler.get(asset["page_link"]) + soup = BeautifulSoup(resp.text, "lxml") + + properties = {} + prop_table = soup.select_one("#content > section > div > div > div.col-md-6.text-left > table:nth-of-type(1) > tbody") + if prop_table: + for row in prop_table.find_all("tr"): + cols = row.find_all('td') + if len(cols) == 2: + key = cols[0].text.strip().rstrip(':') + value_links = cols[1].find_all('a') + if value_links: + value = [a.text.strip() for a in value_links] + else: + value = cols[1].text.strip() + properties[key] = value + asset["tags"] = properties.get("Tags", []) + + zip_link = None + for a_tag in soup.find_all("a", href=True): + href = a_tag["href"] + if href.endswith(".zip"): + zip_link = "https://www.kenney.nl" + \ + href if href.startswith("/") else href + break + + changelog = [] + update_table = soup.select_one( + '#content > section > div > div > div:nth-of-type(1) > table:nth-of-type(2) > tbody') + if update_table: + for idx, row in enumerate(update_table.find_all('tr')): + cols = row.find_all('td') + if len(cols) == 2: + date = cols[0].text.strip() + spans = cols[1].find_all('span') + version = spans[0].text.strip() if len(spans) >= 1 else '' + description = spans[1].text.strip() if len(spans) >= 2 else '' + version_info = { + 'date': parse_date(date), + 'version': version, + 'description': description, + 'files': 0, + 'feat_animation': False, + 'feat_variation': False, + 'orig_file_link': None + } + if idx == 0: + # Latest version + version_info["files"] = int(''.join(ch for ch in properties["Files"] if ch.isdigit())) if "Files" in properties else 0 + version_info["feat_animation"] = "Animation" in properties["Features"] + version_info["feat_variation"] = "Variation" in properties["Features"] + version_info["orig_file_link"] = zip_link if zip_link else None + changelog.append(version_info) + changelog.reverse() + asset["changelog"] = changelog + asset["released_at"] = changelog[-1]["date"] + asset["updated_at"] = changelog[0]["date"] + + images = [] + # 封面图(Cover) + cover_img = soup.select_one( + '#content > section > div > div > div:nth-of-type(2) > a > img') + if cover_img and cover_img.get("src"): + cover_url = cover_img["src"] + if cover_url.startswith("/"): + cover_url = "https://www.kenney.nl" + cover_url + images.append(cover_url) + # 图集中的图像 + gallery_divs = soup.select( + '#content > section > div > div > div:nth-of-type(2) > div > div') + for div in gallery_divs: + img_tag = div.select_one("a > img") + if img_tag and img_tag.get("src"): + img_url = img_tag["src"] + if img_url.startswith("/"): + img_url = "https://www.kenney.nl" + img_url + images.append(img_url) + asset['images'] = images + +def sync_table( + db, + table_name: str, + column_name: str, + items: set[str], +) -> dict[str, int]: + """同步唯一字段数据到指定表,并返回 name -> id 的映射""" + # 从数据库读取已存在的记录 + saved_records = db.fetch_all(f"SELECT * FROM {table_name}") + saved_names = {r[column_name] for r in saved_records} + + # 找出缺失项 + missing_items = sorted(items - saved_names) + + # 插入缺失项(假设 id 是自增,不需要手动计算) + if missing_items: + insert_sql = f"INSERT INTO {table_name} ({column_name}) VALUES (%s)" + with db.get_conn() as conn: + cursor = conn.cursor() + cursor.executemany(insert_sql, [(name,) for name in missing_items]) + conn.commit() + cursor.close() + + # 重新获取完整映射(保证 ID 正确) + final_records = db.fetch_all(f"SELECT * FROM {table_name}") + return {r[column_name]: r["id"] for r in final_records} + +def build_id_map(db, table, name_field, values): + return sync_table(db, table, name_field, {v for v in values if v}) + +def build_insert_sql(table: str, columns: list[str]): + cols_str = ', '.join(columns) + placeholders = ', '.join(['%s'] * len(columns)) + return f"INSERT INTO {table} ({cols_str}) VALUES ({placeholders})" + +allowed_path_pattern = re.compile(r'[^a-zA-Z0-9._-]') +def sanitize_path(path: str): + if not path: + return None + return '_'.join([allowed_path_pattern.sub('', word.lower()) for word in path.split()]) + +def main() -> None: + # total_pages = get_total_pages() + # all_asset_infos = get_all_asset_infos(total_pages) + + # # Let the oldest become first in the array to make sure it can be inserted into database first + # all_asset_infos.reverse() + + # for asset in tqdm(all_asset_infos, "Fetching asset pack info"): + # get_asset_pack_info(asset) + + all_asset_infos: list[dict[str, ]] = json.load(open("all_asset_infos_detailed.json")) + # for asset in all_asset_infos: + # asset["name"] = None if asset["name"] == "" else asset["name"] + # asset["category"] = None if asset["category"] == "" else asset["category"] + # asset["series"] = None if asset["series"] == "" else asset["series"] + # asset["page_link"] = None if asset["page_link"] == "" else asset["page_link"] + # # for log in asset["changelog"]: + # # log['files'] = 0 if "files" not in log else log["files"] + # # log['feat_animation'] = False if "feat_animation" not in log else log["feat_animation"] + # # log['feat_variation'] = False if "feat_variation" not in log else log["feat_variation"] + # # log['orig_file_link'] = asset["download"] if log["files"] != 0 else None + # # asset.pop('download') + # json.dump(all_asset_infos, open("all_asset_infos_detailed_fix.json", "w")) + # exit() + + # Download file and save to database + output_dir = "media" + + for asset in tqdm(all_asset_infos, "Downloading assets and images"): + asset_name = sanitize_path(asset["name"]) + asset_category = sanitize_path(asset["category"]) + asset_version = asset["changelog"][-1]["version"] + asset_dir_path = os.path.join(output_dir, asset_category) + asset_dir_path = os.path.join(asset_dir_path, asset_name) + asset["base_asset_path"] = asset_dir_path + os.makedirs(asset_dir_path, exist_ok=True) + filename = f"{asset_name} V{asset_version}.zip" + filepath = os.path.join(asset_dir_path, filename) + if os.path.exists(filepath): + print(f"✅ {filename} exists, skipping...") + else: + try: + download_url = asset["changelog"][-1]["orig_file_link"] + with requests.get(download_url, headers=get_headers()) as resp: + resp.raise_for_status() + with open(filepath, "wb") as f: + for chunk in resp.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + print(f"✅ {filename} download completed.") + except Exception as e: + print(f"❌ Download failed: {filename} - {e}") + time.sleep(random.uniform(1.5, 4.0)) + # Download asset file + exit() + + # Initialize database + db = MySQLHelper( + "10.147.20.103", + "kenney-assets", + "9a77caa2a5c705db7e8a93c6a3fbc46a", + "kenney_assets" + ) + + # Build mapping tables + category_id_map = build_id_map(db, "category", "name", (a["category"] for a in all_asset_infos)) + series_id_map = build_id_map(db, "series", "name", (a["series"] for a in all_asset_infos)) + tags_id_map = build_id_map(db, "tag", "name", (tag for a in all_asset_infos for tag in (a.get("tags") or []))) + + asset_pack_sql = build_insert_sql("asset_pack", ["name", "category_id", "series_id", "released_at", "updated_at", "base_asset_path", "orig_page_link"]) + asset_pack_values: list[tuple] = [] + # 给每个 asset 添加 category_id 和 series_id + for asset in all_asset_infos: + asset["category_id"] = category_id_map.get(asset.get("category")) + asset["series_id"] = series_id_map.get(asset.get("series")) + asset_pack_values.append(( + asset["name"], + asset["category_id"], + asset["series_id"], + asset["released_at"], + asset["updated_at"], + asset["base_asset_path"], + asset["page_link"] + )) + db.bulk_insert(asset_pack_sql, asset_pack_values) + + # Get asset_pack id map + asset_pack_records = db.fetch_all(f"SELECT id, name FROM asset_pack") + asset_pack_id_map = {r["name"]: r["id"] for r in asset_pack_records} + + asset_pack_tag_sql = build_insert_sql("asset_pack_tag", ["asset_pack_id", "tag_id"]) + asset_pack_tag_values: list[tuple] = [] + + update_log_sql = build_insert_sql("update_log", ["asset_pack_id", "released_date", "version", "description", "files_count", "feat_animations", "feat_variations", "orig_download_link"]) + update_log_values: list[tuple] = [] + + asset_pack_image_sql = build_insert_sql("asset_pack_image", ["asset_pack_id", "orig_file_link"]) + asset_pack_image_values: list[tuple] = [] + + for asset in tqdm(all_asset_infos, "Preparing data to database"): + asset_pack_id = asset_pack_id_map.get(asset.get("name")) + tags = asset.get("tags") + for tag in tags: + asset_pack_tag_values.append(( + asset_pack_id, + tags_id_map[tag] + )) + changelog = asset.get("changelog") + for log in changelog: + update_log_values.append(( + asset_pack_id, + log["date"], + log["version"], + log["description"], + log["files"], + log["feat_animation"], + log["feat_variation"], + log["orig_file_link"] + )) + images = asset.get("images") + for image in images: + asset_pack_image_values.append(( + asset_pack_id, + image + )) + + with db.get_conn() as conn: + cursor = conn.cursor() + cursor.executemany(asset_pack_tag_sql, asset_pack_tag_values) + cursor.executemany(update_log_sql, update_log_values) + cursor.executemany(asset_pack_image_sql, asset_pack_image_values) + conn.commit() + cursor.close() + + +if __name__ == "__main__": + main() diff --git a/mysql_helper.py b/mysql_helper.py new file mode 100644 index 0000000..a5fb0ee --- /dev/null +++ b/mysql_helper.py @@ -0,0 +1,145 @@ +from mysql.connector import pooling, Error +import logging +from contextlib import contextmanager +import time + +# ========== 日志配置 ========== +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(message)s" +) +logger = logging.getLogger("MySQLHelper") + +class MySQLHelper: + def __init__(self, host, user, password, database, pool_size=5): + """ + 初始化 MySQL 连接池 + """ + try: + self.pool = pooling.MySQLConnectionPool( + pool_name="mypool", + pool_size=pool_size, + pool_reset_session=True, + host=host, + user=user, + password=password, + database=database, + charset="utf8mb4" + ) + logger.info("✅ MySQL 连接池已创建,大小=%s", pool_size) + except Error as e: + logger.error("❌ 创建连接池失败: %s", e) + raise + + @contextmanager + def get_conn(self): + """ + 获取连接并在使用完毕后释放 + """ + conn = None + try: + conn = self.pool.get_connection() + yield conn + except Error as e: + logger.error("数据库连接错误: %s", e) + raise + finally: + if conn: + conn.close() + + def execute(self, sql, params=None, commit=False, retry=3): + """ + 执行 INSERT/UPDATE/DELETE 等操作 + """ + for attempt in range(1, retry + 1): + try: + with self.get_conn() as conn: + cursor = conn.cursor() + cursor.execute(sql, params or ()) + if commit: + conn.commit() + affected = cursor.rowcount + cursor.close() + return affected + except Error as e: + logger.warning("执行 SQL 失败 (尝试 %s/%s): %s", attempt, retry, e) + time.sleep(1) + if attempt == retry: + raise + + def fetch_all(self, sql, params=None, retry=3): + """ + 查询多条记录 + """ + for attempt in range(1, retry + 1): + try: + with self.get_conn() as conn: + cursor = conn.cursor(dictionary=True) + cursor.execute(sql, params or ()) + result = cursor.fetchall() + cursor.close() + return result + except Error as e: + logger.warning("查询失败 (尝试 %s/%s): %s", attempt, retry, e) + time.sleep(1) + if attempt == retry: + raise + + def fetch_one(self, sql, params=None, retry=3): + """ + 查询单条记录 + """ + result = self.fetch_all(sql, params, retry) + return result[0] if result else None + + def bulk_insert(self, sql: str, rows: list[tuple]): + with self.get_conn() as conn: + cursor = conn.cursor() + cursor.executemany(sql, rows) + conn.commit() + cursor.close() + + @contextmanager + def transaction(self): + """ + 事务上下文管理器 + 用法: + with db.transaction() as cursor: + cursor.execute(...) + cursor.execute(...) + """ + with self.get_conn() as conn: + try: + cursor = conn.cursor() + yield cursor + conn.commit() + except: + conn.rollback() + raise + finally: + cursor.close() + +# ================= 使用示例 ================= +if __name__ == "__main__": + db = MySQLHelper( + host="localhost", + user="root", + password="123456", + database="test_db", + pool_size=5 + ) + + # 插入数据 + db.execute("INSERT INTO users(name, age) VALUES (%s, %s)", ("Alice", 25), commit=True) + + # 查询数据 + users = db.fetch_all("SELECT * FROM users WHERE age > %s", (18,)) + logger.info("查询结果: %s", users) + + # 事务示例 + try: + with db.transaction() as cur: + cur.execute("UPDATE users SET age = age + 1 WHERE name = %s", ("Alice",)) + cur.execute("INSERT INTO logs(message) VALUES (%s)", ("Alice age updated",)) + except Error as e: + logger.error("事务失败: %s", e) diff --git a/queries.sql b/queries.sql new file mode 100644 index 0000000..b9efd53 --- /dev/null +++ b/queries.sql @@ -0,0 +1,73 @@ +SET FOREIGN_KEY_CHECKS = 0; +DROP TABLE IF EXISTS category; +DROP TABLE IF EXISTS series; +DROP TABLE IF EXISTS tag; +DROP TABLE IF EXISTS asset_pack; +DROP TABLE IF EXISTS asset_pack_image; +DROP TABLE IF EXISTS asset_pack_tag; +DROP TABLE IF EXISTS update_log; +SET FOREIGN_KEY_CHECKS = 1; + +CREATE TABLE category ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100) NOT NULL UNIQUE +); + +CREATE TABLE series ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100) NOT NULL UNIQUE +); + +CREATE TABLE tag ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100) NOT NULL UNIQUE +); + +CREATE TABLE asset_pack ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL UNIQUE, + category_id INT NOT NULL, + series_id INT, + discovered_at DATETIME DEFAULT CURRENT_TIMESTAMP, + released_at DATE, + updated_at DATE, + base_asset_path VARCHAR(255), + orig_page_link VARCHAR(255), + FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE RESTRICT ON UPDATE CASCADE, + FOREIGN KEY (series_id) REFERENCES series(id) ON DELETE SET NULL ON UPDATE CASCADE, + INDEX idx_name (name), + INDEX idx_category (category_id), + INDEX idx_series (series_id) +); + +CREATE TABLE asset_pack_image ( + id INT PRIMARY KEY AUTO_INCREMENT, + asset_pack_id INT NOT NULL, + image_file_name VARCHAR(255), + orig_file_link VARCHAR(255), + FOREIGN KEY (asset_pack_id) REFERENCES asset_pack(id) ON DELETE CASCADE, + INDEX idx_asset_pack_id (asset_pack_id) +); + +CREATE TABLE asset_pack_tag ( + asset_pack_id INT NOT NULL, + tag_id INT NOT NULL, + PRIMARY KEY (asset_pack_id, tag_id), + FOREIGN KEY (asset_pack_id) REFERENCES asset_pack(id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE +); + +CREATE TABLE update_log ( + id INT PRIMARY KEY AUTO_INCREMENT, + asset_pack_id INT NOT NULL, + released_date DATE NOT NULL, + version VARCHAR(20), + description VARCHAR(500), + files_count INT UNSIGNED DEFAULT 0, + feat_animations TINYINT(1) DEFAULT 0, + feat_variations TINYINT(1) DEFAULT 0, + zip_file_name VARCHAR(255), + orig_download_link VARCHAR(255), + FOREIGN KEY (asset_pack_id) REFERENCES asset_pack(id) ON DELETE CASCADE, + INDEX idx_released_date (released_date) +); \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index c76d3d5..0000000 --- a/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -beautifulsoup4==4.13.4 -certifi==2025.1.31 -charset-normalizer==3.4.1 -colorama==0.4.6 -idna==3.10 -lxml==5.3.2 -requests==2.32.3 -soupsieve==2.6 -tqdm==4.67.1 -typing_extensions==4.13.2 -urllib3==2.4.0 diff --git a/scrapper/1 main.py b/scrapper/1 main.py deleted file mode 100644 index 240ce25..0000000 --- a/scrapper/1 main.py +++ /dev/null @@ -1,136 +0,0 @@ -import requests -import json -from bs4 import BeautifulSoup -from tqdm import tqdm, trange - -base_url = "https://www.kenney.nl/assets/page:" -total_pages = 13 -all_links = [] - -headers = { - "User-Agent": "Mozilla/5.0" -} - - -def parse_resource_page(url): - response = requests.get(url, headers=headers) - soup = BeautifulSoup(response.text, "lxml") - result = {} - - # 资源名称 - title_tag = soup.select_one( - '#content > section > div > div > div:nth-of-type(1) > h1') - result['title'] = title_tag.text.strip() if title_tag else 'N/A' - - # 属性表 - properties = {} - prop_table = soup.select_one( - '#content > section > div > div > div:nth-of-type(1) > table:nth-of-type(1) > tbody') - if prop_table: - for row in prop_table.find_all('tr'): - cols = row.find_all('td') - if len(cols) == 2: - key = cols[0].text.strip().rstrip(':') - value_links = cols[1].find_all('a') - if value_links: - value = [a.text.strip() for a in value_links] - else: - value = cols[1].text.strip() - properties[key] = value - result['properties'] = properties - - # 更新记录 - changelog = [] - update_table = soup.select_one( - '#content > section > div > div > div:nth-of-type(1) > table:nth-of-type(2) > tbody') - if update_table: - for row in update_table.find_all('tr'): - cols = row.find_all('td') - if len(cols) == 2: - date = cols[0].text.strip() - spans = cols[1].find_all('span') - version = spans[0].text.strip() if len(spans) >= 1 else '' - description = spans[1].text.strip() if len(spans) >= 2 else '' - changelog.append({ - 'date': date, - 'version': version, - 'description': description - }) - result['changelog'] = changelog - - # 下载链接 - zip_link = None - for a_tag in soup.find_all("a", href=True): - href = a_tag["href"] - if href.endswith(".zip"): - zip_link = "https://www.kenney.nl" + \ - href if href.startswith("/") else href - break - result['download'] = zip_link if zip_link else "N/A" - - # ✅ 图片提取 - images = [] - - # 封面图(Cover) - cover_img = soup.select_one( - '#content > section > div > div > div:nth-of-type(2) > a > img') - if cover_img and cover_img.get("src"): - cover_url = cover_img["src"] - if cover_url.startswith("/"): - cover_url = "https://www.kenney.nl" + cover_url - images.append(cover_url) - - # 图集中的图像 - gallery_divs = soup.select( - '#content > section > div > div > div:nth-of-type(2) > div > div') - for div in gallery_divs: - img_tag = div.select_one("a > img") - if img_tag and img_tag.get("src"): - img_url = img_tag["src"] - if img_url.startswith("/"): - img_url = "https://www.kenney.nl" + img_url - images.append(img_url) - - result['images'] = images - - return result - - -# for page in range(1, total_pages + 1): -for page in trange(1, total_pages + 1, desc="Fetching all assets' page links"): - url = base_url + str(page) - response = requests.get(url, headers=headers) - soup = BeautifulSoup(response.text, "lxml") - - # 定位到//*[@id="content"]/section/div/div[1] - content_div = soup.select_one( - "#content > section > div > div:nth-of-type(1)") - - if content_div: - item_divs = content_div.find_all("div", recursive=False) - - for item_div in item_divs: - a_tag = item_div.find("a") - if a_tag and "href" in a_tag.attrs: - link = a_tag["href"] - full_link = link - all_links.append(full_link) - -print(f"总共提取到 {len(all_links)} 个链接 ✅") - -with open("kenney_links.txt", "w", encoding="utf-8") as f: - for link in all_links: - f.write(link + "\n") - -# 爬取页面内的信息 -all_resource_data = [] - -# for link in all_links: -for link in tqdm(all_links, desc="Fetching all assets' data"): - resource_data = parse_resource_page(link) - all_resource_data.append(resource_data) - -with open("kenney_data.json", "w", encoding="utf-8") as f: - json.dump(all_resource_data, f, ensure_ascii=False, indent=4) - -print("数据爬取完成 ✅") diff --git a/scrapper/2 asset_downloader.py b/scrapper/2 asset_downloader.py deleted file mode 100644 index 069efaf..0000000 --- a/scrapper/2 asset_downloader.py +++ /dev/null @@ -1,72 +0,0 @@ -import os -import json -import requests -import time -import random -from tqdm import tqdm - -# === 配置路径 === -json_path = "kenney_data.json" # JSON 数据路径 -output_dir = "kenney_assets" # 下载根目录 - -# === 加载 JSON 数据 === -with open(json_path, "r", encoding="utf-8") as f: - resources = json.load(f) - -# === 工具函数 === - - -def sanitize_filename(name): - return "".join(c for c in name if c.isalnum() or c in "._- ()").strip() - - -def download_zip(entry): - title = entry["title"] - version = entry["changelog"][0]["version"] if entry["changelog"] else "1.0" - download_url = entry.get("download") - - # 提取分类、系列 - category = entry["properties"].get("Category", ["Uncategorized"])[0] - series = entry["properties"].get("Series", [None])[0] - - # 构建目录结构 - folder_path = os.path.join(output_dir, sanitize_filename(category)) - if series: - folder_path = os.path.join(folder_path, sanitize_filename(series)) - os.makedirs(folder_path, exist_ok=True) - - # 构建文件路径 - filename = f"{sanitize_filename(title)} V{version}.zip" - filepath = os.path.join(folder_path, filename) - - if os.path.exists(filepath): - print(f"✅ 已存在,跳过: {filename}") - return - - try: - print(f"⬇️ 开始下载: {filename}") - with requests.get(download_url, stream=True, timeout=60) as r: - r.raise_for_status() - with open(filepath, "wb") as f: - for chunk in r.iter_content(chunk_size=8192): - if chunk: - f.write(chunk) - print(f"✅ 下载完成: {filename}") - except Exception as e: - print(f"❌ 下载失败: {filename} - {e}") - - # 模拟人类行为:随机等待 - time.sleep(random.uniform(1.5, 4.0)) - - -# === 启动批量下载 === -idx = 0 -for resource in tqdm(resources, desc="处理资源"): - if idx < 156: - idx += 1 - continue - if "download" in resource and resource["download"].endswith(".zip"): - download_zip(resource) - idx += 1 - -print("\n✅ 所有资源处理完成") diff --git a/scrapper/3 image_downloader.py b/scrapper/3 image_downloader.py deleted file mode 100644 index 687756f..0000000 --- a/scrapper/3 image_downloader.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import json -import requests -import time -import random -from urllib.parse import urlparse, unquote -from tqdm import tqdm - -# ========== 配置 ========== -json_path = "kenney_data.json" # JSON 数据路径 -output_root = "kenney_assets_images" # 存储根目录 -headers = {"User-Agent": "Mozilla/5.0"} - -# ========== 工具函数 ========== - - -def sanitize_filename(name): - return "".join(c for c in name if c.isalnum() or c in "._- ()").strip() - - -def download_image(url, save_path): - if os.path.exists(save_path): - print(f"✅ 已存在,跳过: {save_path}") - return - try: - response = requests.get(url, stream=True, timeout=30) - with open(save_path, "wb") as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - print(f"✅ 下载完成: {save_path}") - except Exception as e: - print(f"❌ 下载失败: {url} - {e}") - time.sleep(random.uniform(1.5, 4.0)) # 模拟人类访问 - - -# ========== 加载 JSON ========== -with open(json_path, "r", encoding="utf-8") as f: - resources = json.load(f) - -# ========== 批量处理 ========== -for entry in tqdm(resources, desc="处理资源"): - title = entry["title"] - category = entry["properties"].get("Category", ["Uncategorized"])[0] - series = entry["properties"].get("Series", [None])[0] - images = entry.get("images", []) - - # 构建路径:Category/Series/Title/ - path = os.path.join(output_root, sanitize_filename(category)) - if series: - path = os.path.join(path, sanitize_filename(series)) - path = os.path.join(path, sanitize_filename(title)) - os.makedirs(path, exist_ok=True) - - for img_url in images: - parsed_url = urlparse(img_url) - img_name = os.path.basename(parsed_url.path) - img_name = unquote(img_name) # 处理 URL 编码,如 %20 => 空格 - img_path = os.path.join(path, img_name) - download_image(img_url, img_path) - -print("\n🎉 所有图片处理完成!") diff --git a/scrapper/4 kenney_data_to_local.py b/scrapper/4 kenney_data_to_local.py deleted file mode 100644 index 80729bc..0000000 --- a/scrapper/4 kenney_data_to_local.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import json -from urllib.parse import urlparse, unquote - -# === 配置路径 === -input_json = "kenney_data.json" -output_json = "kenney_data_local.json" - -zip_root = "kenney_assets" -img_root = "kenney_assets_images" - -# === 工具函数 === - - -def sanitize_filename(name): - return "".join(c for c in name if c.isalnum() or c in "._- ()").strip() - - -def build_zip_path(entry): - title = entry["title"] - version = entry["changelog"][0]["version"] if entry["changelog"] else "1.0" - category = entry["properties"].get("Category", ["Uncategorized"])[0] - series = entry["properties"].get("Series", [None])[0] - - folder = os.path.join(zip_root, sanitize_filename(category)) - if series: - folder = os.path.join(folder, sanitize_filename(series)) - filename = f"{sanitize_filename(title)} V{version}.zip" - return os.path.join(folder, filename) - - -def build_image_paths(entry): - title = entry["title"] - category = entry["properties"].get("Category", ["Uncategorized"])[0] - series = entry["properties"].get("Series", [None])[0] - images = entry.get("images", []) - - folder = os.path.join(img_root, sanitize_filename(category)) - if series: - folder = os.path.join(folder, sanitize_filename(series)) - folder = os.path.join(folder, sanitize_filename(title)) - - local_paths = [] - for img_url in images: - parsed = urlparse(img_url) - filename = unquote(os.path.basename(parsed.path)) - local_paths.append(os.path.join(folder, filename)) - - return local_paths - - -# === 主处理 === -with open(input_json, "r", encoding="utf-8") as f: - data = json.load(f) - -for entry in data: - if "download" in entry and entry["download"].endswith(".zip"): - zip_path = build_zip_path(entry) - if os.path.exists(zip_path): - entry["download"] = zip_path # 替换为本地路径 - if "images" in entry and isinstance(entry["images"], list): - entry["images"] = build_image_paths(entry) - -# === 保存修改后的 JSON === -with open(output_json, "w", encoding="utf-8") as f: - json.dump(data, f, ensure_ascii=False, indent=2) - -print("✅ 已更新 JSON:本地路径写入完毕!") diff --git a/思路.txt b/思路.txt deleted file mode 100644 index 240a5f7..0000000 --- a/思路.txt +++ /dev/null @@ -1,33 +0,0 @@ -我想要爬取这个网页 https://www.kenney.nl/assets/page:1 下(共有 13 页) -//*[@id="content"]/section/div/div[1] 这个元素(里边是 n 个 div 元素) -我需要获取每个 Div 元素的 -//*[@id="content"]/section/div/div[1]/div[1]/div/a 这个 a 元素 -将它的链接保存成一个列表 - -然后依次访问这个列表中的所有页面, - -CSV 格式如下: -资源名称, 分类, 系列, 资源数, 标签(有多个),资源数量 - -访问这个界面,然后我需要获取它的所有信息: -资源名称://*[@id="content"]/section/div/div/div[1]/h1 - -各种属性://*[@id="content"]/section/div/div/div[1]/table[1]/tbody -上面这个表,他是个两列 N 行的表。 -表的左侧可以看作是 key: Category, Series, Assets, Variation(s), Tags, License 等…… -表的右侧是 Value,但它可能会有各种组成方式,下边是常见的: -- 普通的 td > a -- 只有 td -- td 之后有多个 a(如 Tags) - -更新记录://*[@id="content"]/section/div/div/div[1]/table[2]/tbody -他也是个两行 N 列的表, -左侧是更新日期 dd/mm/yyyy -右侧是 td > 第一个 span 是版本,第二个 span 是更新内容,有时候没有第二个 span - -继续增加 parse_resource_page(url) 函数, -我需要获取它的封面图://*[@id="content"]/section/div/div/div[2]/a/img -以及其他图片(如有) -//*[@id="content"]/section/div/div/div[2]/div 这里子元素可能有 n 个 div,我需要拿到它的 img -//*[@id="content"]/section/div/div/div[2]/div/div[1]/a/img -封面图存了之后,也得加在图集的数组里。 \ No newline at end of file