TwilightBoxart
Box art for TWiLightMenu++, Pico Launcher and AKMenu-Next, straight onto your SD card.
Plug the card in, press scan.
Automatically downloads box art / covers for your favorite launcher. DS, DSi and GBA, plus everything
else a Nintendo DS can play that is supported: Gameboy, SNES, NES, Mega Drive, PC Engine, WonderSwan, Neo Geo
Pocket, the Atari consoles and more. Runs in your browser, as a desktop app,
or as homebrew on the DS itself. 😊
Missing a cover? Easily create your own custom covers! (Web only)
👾 DS / DSi version
Hate connecting your SD card to a computer? No problem. Copy the .nds to your card, launch it, and
the console joins your WiFi and fills its own boxart folder. Works on a DSi, and on a DS or DS Lite
with a flashcart.
Reads each game’s header, so badly named roms still match. Out of the box it picks the launcher from
what is on the card and skips games that already have a cover, but that is just the default: launcher,
shape, size, border, overwrite and scan mode are all in the options menu.
Releases
🌐 Web version
twilightboxart.com scans the card and writes the covers straight onto
it, no upload and no install.
Nothing found for a game? Add your own: drop any image on it (a scan, a photo of the box, a
screenshot) and it comes back exactly as needed for your launcher. It is sent once to be converted
and never stored. :)
💻 Desktop version
Windows, macOS and Linux. Works offline: it builds its own game database when it cannot reach a
backend. Releases
🚀 Supported launchers
Every app asks which launcher up front.
| Launcher |
Format |
Where it goes |
| TWiLightMenu++ |
PNG, sized to the menu’s limits |
_nds/TWiLightMenu/boxart/<rom name>.png |
| Pico Launcher (DS Pico) |
8-bit BMP, 128 × 96 |
_pico/covers/user/<rom name>.bmp |
| AKMenu-Next |
8-bit BMP, 128 × 96 |
_nds/covers_name/<rom name without extension>.bmp |
Pico covers go in the filename-keyed user folder: it works for every system below, where the
game-code folders only do NDS and GBA.
AKMenu-Next reads the same BMP (its loader trims the black padding columns) and looks covers up by
the ROM filename without its extension.
Only cover images are written, into the boxart folder. Nothing else on the card is touched.
🕹️ Supported systems
Games are identified by what they contain, not what they are called. Rename a rom to
aaaa.gba and it still gets the right cover.
All 26 systems, and how each one is matched
| System |
Matching (in order) |
| Nintendo - Nintendo DS |
title id / crc32 / sha1 / filename |
| Nintendo - Nintendo DSi |
title id / crc32 / sha1 / filename |
| Nintendo - Game Boy Advance |
title id / crc32 / sha1 / filename |
| Nintendo - Game Boy |
game code / crc32 / sha1 / filename |
| Nintendo - Game Boy Color |
game code / crc32 / sha1 / filename |
| Nintendo - Nintendo 64 (new in 2.0) |
game code / crc32 / sha1 / filename |
| Nintendo - Nintendo Entertainment System |
crc32 / sha1 / filename |
| Nintendo - Super Nintendo Entertainment System |
crc32 / sha1 / filename |
| Nintendo - Family Computer Disk System |
game code / crc32 / sha1 / filename |
| Sega - Mega Drive - Genesis |
serial / crc32 / sha1 / filename |
| Sega - Master System - Mark III |
crc32 / sha1 / filename |
| Sega - Game Gear |
crc32 / sha1 / filename |
| Sega - SG-1000 (new in 2.0) |
crc32 / sha1 / filename |
| NEC - PC Engine - TurboGrafx 16 (new in 2.0) |
crc32 / sha1 / filename |
| Bandai - WonderSwan (new in 2.0) |
crc32 / sha1 / filename |
| Bandai - WonderSwan Color (new in 2.0) |
crc32 / sha1 / filename |
| SNK - Neo Geo Pocket (new in 2.0) |
crc32 / sha1 / filename |
| SNK - Neo Geo Pocket Color (new in 2.0) |
crc32 / sha1 / filename |
| Atari - 2600 (new in 2.0) |
crc32 / sha1 / filename |
| Atari - 5200 (new in 2.0) |
crc32 / sha1 / filename |
| Atari - 7800 (new in 2.0) |
crc32 / sha1 / filename |
| Coleco - ColecoVision (new in 2.0) |
crc32 / sha1 / filename |
| Mattel - Intellivision (new in 2.0) |
crc32 / sha1 / filename |
| Microsoft - MSX (new in 2.0) |
crc32 / sha1 / filename |
| Microsoft - MSX2 (new in 2.0) |
crc32 / sha1 / filename |
| Nintendo - Pokemon Mini (new in 2.0) |
crc32 / sha1 / filename |
That is every console TWiLightMenu++ emulates that both No-Intro and
libretro-thumbnails have data for. It takes both: one
names the dump, the other has the cover. The menu also lists .xex/.atr (Atari 8-bit), .m5
(Sord M5) and .dsk (Amstrad CPC), which are left out on purpose. Nothing publishes box art for
them, so every lookup would miss.
File extensions follow TWiLightMenu++'s own list, so anything the menu will launch is something
this will scan. That includes .agb/.mb for GBA and .srl/.ids/.app/.ndz for DS(i).
A lot of work went into the matching. It rarely misses.
🖼️ Boxart sources
- GameTDB by title id matching.
- libretro-thumbnails by
No-Intro name matching.
- Every TWiLightMenu++ cover is delivered under the menu’s box art size limit, so nothing silently
refuses to show up on the console. Pico and AKMenu-Next covers come pre-converted to their
compatible 8-bit BMP format, no separate converter needed.
For Pico Launcher and AKMenu-Next, the apps show the fixed cover size and mark border settings as
unavailable. AKMenu-Next currently shows covers for DS and GBA games only; covers for the other
systems it launches through plugins are written all the same, ready for when it does. Switching
back to TWiLightMenu++ restores its saved size and border choices.
🐳 Self-hosting
One container, one volume, no database server, no preparation:
docker compose up -d # then open http://localhost:8186
On first boot the server downloads the public No-Intro data and builds its own game index in the
background, serving all the while. Set an admin password and /admin.html gives you instance
stats and an “update No-Intro index” button for whenever the database should catch up.
Configuration is documented inline in docker-compose.yml; the backend’s own
README covers the API.
License
GPL-3.0. See LICENSE.md. The DS/DSi client ships with
Mbed TLS (Apache-2.0/GPL-2.0) and a patched
dswifi (MIT), built with
BlocksDS; their notices are in
THIRD-PARTY-NOTICES.md.
Credits
Covers come from GameTDB and
libretro-thumbnails; identification data from
No-Intro via the libretro-database
mirror. Built for TWiLightMenu++,
Pico Launcher and
AKMenu-Next by
LNH-team.
Music on the DS/DSi client: “Pixel Cart Drift” by Jesse Sander.
Legal
TwilightBoxart is a fan-made, open-source tool and is not affiliated with, endorsed by or
sponsored by Nintendo. It distributes no games and contains none: it reads files already on your
card to identify them, and writes cover images, nothing else. Covers are fetched from the
community databases credited above; identification data is factual metadata (names, serials,
checksums). If you hold rights to something served by this project and want it removed, open a
GitHub issue and it will be handled promptly.
Development
TwilightBoxart.Web The API server and the web app it serves
TwilightBoxart.Pipeline Art fetching, caching and eviction
TwilightBoxart.Data EF Core + SQLite records
TwilightBoxart.Core Identification, header parsers, index building, rendering, art sources
TwilightBoxart.Desktop Desktop app (Avalonia)
TwilightBoxart.DSi DS/DSi homebrew client (BlocksDS)
TwilightBoxart.Tests MSTest suite
dotnet run --project TwilightBoxart.Web starts everything on port 8186.
评论