Pupdate - A thing for updating your Analogue Pocket
A free utility for updating openFPGA cores, firmware, and related assets on your Analogue Pocket. It can run as an interactive console menu or from the command line.
A browsable list of available cores is here: openFPGA cores inventory.
Please use the latest release before reporting issues; older builds are not supported.
Do not clone the repo if you only want to run the tool. Download the latest release, unzip it, place the executable for your OS on the root of your SD card (or another folder you use as the install path), and run it.
Use Settings from the main menu to walk through toggles, or edit pupdate_settings.json for advanced options. In the full-screen UI (--tui) the same options live on the Settings tab, grouped — see Settings.
In most macOS default installation setups, you will likely encounter issues running the script the "easy way". The following command will remove the quarantine from the pupdate script only. ⚠️ Use sparingly ⚠️
xattr -d com.apple.quarantine /path/to/pupdate
The full menu tree is documented in MENU.md.
pocket_extras.json
Plugins
Plugins for custom functionality
Update All · Update Firmware · Select Cores · Download Assets · Backup Saves & Memories · Pocket Setup · Pocket Maintenance · Pocket Extras · Plugins · Pin / unpin core version · Settings · Additional settings · Asset archives · CLI · Jotego beta · Analogizer · Troubleshooting · Developers
The “do everything” option. Steps marked with * follow your Settings toggles.
Pinned versions: If a core has pinned_version set in settings, the updater resolves that version from the inventory release list only. If the pin does not match any listed release, that core is skipped with a message and the run continues.
(Pocket Maintenance) — Pick installed cores to update.
(Pocket Maintenance) — Pick cores you do not have installed yet; installs them without running a full Update All.
Checks for Pocket firmware updates only, then exits.
Asks how new cores should be handled:
Fetches missing assets (ROMs, BIOS, etc.) for selected cores from your configured archives.
You supply your own ROMs for non-arcade cores where the archive does not provide them.
Zips the Pocket Saves and Memories folders to the path in settings (default: Backups next to the executable unless overridden).
display_modes.json to the cores that reference those modes.To override the hosted display_modes.json, place a copy next to the executable and set use_local_display_modes to true.
Lists image packs (from image_packs.json), downloads and extracts to Platforms/_images.
Library_Image_Set_v1.0.zip from your configured archive.pocket_library_images.json (bundled next to the executable), same idea as Pocket Extras. Each group has a menu_title (submenu label) and entries with menu_label, id, github_user, github_repository, and sources: an array of release_asset (zip on the release), path_under_extract (folder path inside that zip to .bin files, /-separated), and dest_images_subfolder (under System/Library/Images/ on the device). Optional post_install_note is printed after a successful install (when any files were copied). Enable Use a local pocket_library_images.json file in Settings to read only the local copy instead of fetching the catalog from GitHub (see use_local_pocket_library_images in pupdate_settings.json).CLI (like pocket-extras): pocket-library-images alone installs Spiritualized. pocket-library-images -l lists catalog entry id values; -n <id> installs that entry; -n <id> -i prints details. Example: pocket-library-images -n codewario_boxarts.
Downloads palette packs maintained by davewongillies and others (see original palette credits in prior releases); large collection of official and community palettes.
/Assets/{platform}/common, one game per folder (full game title as folder name).common and builds launch JSONs.build_instance_jsons: false in settings.ignore_instance.json with use_local_ignore_instance_json if you maintain exclusions.Create:
/Assets/gameandwatch/agg23.GameAndWatch/artwork/Assets/gameandwatch/agg23.GameAndWatch/romsPut [game].zip in each; run the menu item to build. Game & Watch asset downloads are configured under archives (core-specific archive for agg23.GameAndWatch)—enable/configure there rather than a separate global toggle.
Apply 8:7 to chosen Spiritualized.SuperGB* cores, or restore 4:3.
Jotego vs Standard wizards for Analogizer JSON. See Analogizer setup.
Submenu under Pocket Setup.
session_id cookie for experimental Patreon-based jtbeta.zip auto-fetch. See Jotego beta for full steps and caveats.Submenu under Pocket Setup.
Backups is a relative path (resolved from the process current directory when the tool runs; use an absolute path if you need a fixed location). Clearing the value when prompted resets to Backups. Same as config.backup_saves_location in JSON.pupdate\cache (Windows) / equivalent. Leave empty (or save an empty line) to use that default. Same as config.archive_cache_location.Path.GetTempPath()). Same as config.temp_directory.Stores a personal access token for GitHub API calls (higher rate limits than anonymous requests). The current value is shown when you open this item. You can also set config.github_token in pupdate_settings.json.
Prints a summary of platform categories and cores (debug / reference).
romsets.json).For installed cores with a GitHub-backed inventory entry:
metadata.version value in the inventory’s releases array for updates to succeed.Update behavior: The pinned ZIP URL is taken only from the inventory release that matches the pin (with simple v prefix normalization). There is no GitHub API fallback for pins. If the pin is missing from releases, the core is skipped for that run with a clear message.
No open issues yet, or sync has not completed.