Plumemu
0.0.2-alpha · free · Android 6.0+

A home screen for retro handhelds.

Point Plumemu at your ROMs folder. It works out what each game is, picks an emulator for it, and puts everything in one list you can use with buttons or touch. You don't need an account, and it works offline.

Download APK 7.8 MB GitHub

Alpha, released 23 October 2026. Tested on the AYN Thor. All releases

the clock is real
12:08 PM50%
      ASelectXSearchSTARTSettings

      This is a working copy of the main screen. Hover over a system, or click the screen and use the arrow keys.

      Features

      What it does

      1. 01

        Setup takes a minute or two

        You pick your ROMs folder in Android's own folder picker. Plumemu never asks for access to all your files.

      2. 02

        It picks the emulators

        It checks which emulators you have installed and picks one for each system. You can change it for a whole system or for one game.

      3. 03

        It names your games offline

        It reads each game's header or disc serial to find its real name. If a name is wrong, fix it from the game menu and the fix stays.

      4. 04

        One sliding view

        Systems, games and details sit side by side and slide along as you move. Laid out for 16:9 and 4:3 screens.

      5. 05

        Box art if you want it

        Sign in with your own free ScreenScraper account and covers download over Wi-Fi. Show a system as a list or as a grid of covers.

      6. 06

        Second screen

        On a dual-screen handheld like the AYN Thor, the bottom screen shows the selected game. While you play it shows a clock, or goes black.

      7. 07

        Backup and restore

        Save your settings, or everything including box art and play time, to one file. Restore it on the same device or a new one.

      8. 08

        Your colours

        Pick a background, light or dark text and an accent. The app comes with eight backgrounds and five accents.

      Screens

      What it looks like

      Setup: the chosen ROMs folder and a Continue button
      Setup in two steps
      Game info, including where the game's name came from
      Every name says where it came from
      Appearance settings: background colours and a live preview
      Background, text and accent
      The main screen with a light background
      The main screen on a light background

      Under the hood

      How it works

      Plumemu is written in Kotlin with Jetpack Compose. This is how 0.0.2-alpha handles your files, your games and the network.

      Your folder

      Setup opens Android's folder picker (ACTION_OPEN_DOCUMENT_TREE) and keeps access to that one folder. The manifest has no storage permission.

      The scan walks the folder with DocumentsContract queries. A rescan only lists folders whose modified time changed, so when nothing is new it takes about 10 ms. A first scan of 10,000 files took 2.3 s on the test emulator.

      Starting a game

      The app carries a table of 161 systems and 356 emulator setups, 198 of them RetroArch cores. It is built from the data of Daijishō and ES-DE, both MIT licensed.

      After the first frame is drawn, Plumemu asks Android's PackageManager which of those emulators are installed. A game starts with an Android intent built from that table.

      Naming games without the internet

      Plumemu reads a few kilobytes of each file, never the whole game. Zip files are read from their central directory. CHD disc images are opened with a small LZMA decoder written for Plumemu.

      The name lists ship inside the APK as 85 compressed packs, 4.4 MB in total. When nothing matches, it cleans up the file name instead. A game split over several discs or files shows up once.

      Every game remembers where its name came from, and the game info screen tells you.

      What it reads to name a game
      SystemWhat Plumemu reads
      PlayStation, PS2The boot serial in SYSTEM.CNF
      PSPUMD_DATA.BIN and PARAM.SFO
      SNESThe internal header, LoROM or HiROM, with or without a copier header
      Game Boy, GBCThe logo bytes and the header checksum
      Game Boy AdvanceThe header and its complement check
      Nintendo DSThe header CRC and the banner
      NESThe iNES header
      Nintendo 3DSNCCH, NCSD and CIA headers. Nothing is decrypted.
      SwitchThe title id, matched against 24,194 ids from titledb
      ArcadeThe short set name, matched against MAME's list of about 42,000 sets

      Box art

      Box art comes from the ScreenScraper API and needs your own account. Plumemu looks a game up by checksum or serial first, then by name.

      Requests are spaced 1.2 s apart and use as many threads as your account allows, up to four. When the daily limit runs out it waits for ScreenScraper's reset at midnight in Paris. Downloads only run on Wi-Fi, and answers are cached for 30 days.

      Your ScreenScraper password is encrypted with AES-256-GCM, using a key kept in the Android Keystore.

      Second screen

      The bottom screen is an android.app.Presentation on the display that DisplayManager lists as a presentation display. Nothing else in the app depends on it.

      Backup

      A backup is one zip, saved through Android's save dialog. It holds a manifest, your settings as JSON and the library database. A full backup adds the box art.

      Network

      Only the box art module declares the INTERNET permission. There are no ads and no Plumemu account, and this version sends no usage statistics.

      Built with

      Plumemu module mapThe app module and its screens sit on five feature modules (library, identify, scraper, platforms, launcher) and three core modules. Numbered paths: the ROMs folder feeds library, library asks identify for names and stores games in core-data, launcher starts installed emulators from the platforms table, scraper talks to ScreenScraper and keeps its key in the Android Keystore, the app draws the second display and writes backup zips.ABCDEFGHON THE HANDHELDINSIDE THE APKOUTSIDE PLUMEMUplumemu-0.0.2-alpha.apk · 7,825,555 bytesappone Activity · Jetpack Compose · navigationSecond screenHome stripSettingsSetupSearchlibraryscan, group10k in 2.3 sidentify85 packs4.4 MB, LZMAscraperOkHttpWi-Fi onlyplatforms161 systems356 setupslauncherfind, startplay timecore-dataRoom v6 · DataStoreabout 150 B per gamecore-inputbuttons and touchinto one set of actionscore-uitheme · Plum fontswidth classestelemetry · empty, sends nothing in 0.0.2tests: ~3,800 unit · Macrobenchmarkbenchmark, tools and the build scripts never ship in the APKdepends onsecond displaythe Thor's lower screenROMs folderzip · 7z · CHD · ISOSD card or storageonly this folderbackup.zipmanifest · settingsdatabase · box artScreenScraper APIyour own accountemulatorsRetroArch and othersalready installed198 core entriesAndroid KeystoreAES-256-GCM key123456789NOTES1Picked with ACTION_OPEN_DOCUMENT_TREE. No storage permission.2First kilobytes only: headers, disc serials, a zip's directory.3One Room row per game. A rescan with nothing new: about 10 ms.4One emulator per system from the table; change any by hand.5PackageManager finds what is installed; an Intent starts the game.6Checksum or serial first. 1.2 s apart, up to 4 threads, Wi-Fi only.7The ScreenScraper password is encrypted with a Keystore key.8The lower screen is an android.app.Presentation.9Back up writes one zip through Android's save dialog.DEPENDS ONcore-uicore-inputcore-dataidentifyscraperplatformslibrarylauncherapplibrarylaunchercore-inputthe other modules depend on nonePLUMEMUmodule map and data pathsKotlin · Jetpack ComposeREV0.0.2-alphaSHEET1 of 1DRAWN23 Oct 2026minSdk23 · target 3710 modules · 1 Activitynot to scaleLEGENDdata path, see notedepends onAPK boundaryGradle module

      Scroll sideways to see the whole drawing.

      Kotlin 2.4 and Jetpack Compose, with Room, DataStore, OkHttp, Coil and WorkManager. minSdk 23, targetSdk 37. Release builds use R8 with resource shrinking and a baseline profile. The code has about 3,800 unit tests, and Macrobenchmark tests measure cold start and scrolling.

      Performance

      It tries hard not to slow your handheld down

      A lot of retro handhelds have weak chips and old Android, so I measure every release.

      zero. It waits for Android's
      minute tick instead
      7.8MBAPK size
      0.25sCold start to your library
      54MBMemory with 10,000 games
      0Wakeups in 60 s on the home screen

      Measured on 0.0.2-alpha in an Android 6.0 emulator with 2 GB of memory and 10,000 games. Start time is the median of 11 cold starts. Memory is PSS. The clock listens for Android's once-a-minute time tick instead of running its own timer, so an idle home screen does no work. Nothing runs in the background except box art downloads you asked for.

      Install

      Three steps

      1. Download plumemu-0.0.2-alpha.apk on the handheld, or copy it over.
      2. Open it and allow the install when Android asks.
      3. Pick your ROMs folder. To make Plumemu your home screen, say yes when it asks, or press Home and choose Plumemu.

      I've only tested it on the AYN Thor, because it's the one device I have.

      It is laid out for 4.5 to 6 inch screens in 16:9 and 4:3, like the Retroid Pocket 5, 4 Pro, Mini and Nova or the AYN Odin, but I haven't tried those. If you run it on one, a short report helps a lot.

      Controls

      AOpen, play
      BBack
      XSearch
      YAdd to or remove from Favorites
      STARTGame menu, or Settings from the system column
      SELECTSwitch between list and cover grid
      L1R1Previous or next system. In a grid, smaller or larger covers
      HOMEBack to the game you played last

      On pads where the confirm button is at the bottom, Settings › Advanced can swap A and B.

      Try it

      Plumemu is free. It doesn't come with games, BIOS files, keys or emulators, so use your own.

      Download 0.0.2-alpha Changelog

      SHA-256 2fde7f5e95970ec4b490bd960dbae85460840b8c545d36acc475f8aab1962eee