Skip to main content

A Textual terminal UI for mkpfs — pack, inspect, verify, tree, and unpack PlayStation PFS images.

Project description

mkpfs-tui

CI Python License: GPL-3.0-or-later

A Textual terminal UI for mkpfspack, inspect, verify, tree, and unpack PlayStation PFS images from a single sidebar-driven app. Every operation has its own view with file/directory pickers, live progress, and a result panel that surfaces warnings and errors without ever leaving the terminal.

mkpfs-tui is a third-party frontend. It pins mkpfs as a dependency and never modifies it.

Contents: Screenshots · Operations · Requirements · Install · Usage · Contributing · License


Operations

Operation What it does
Pack Build a PFS image from a source folder or file (compression, signing, encryption, dry-run).
Inspect Show an image's header, inode/dir/file counts, sizes, and checksums in a table.
Verify Validate an image's structure and checksums — optionally against a source tree or expected CRC32 / manifest.
Tree Browse the file tree stored inside an image.
Unpack Extract an image to a target directory, with progress and a files/dirs/bytes summary.

Screenshots

About — the welcome screen:

mkpfs-tui — the About / welcome screen

Pack — build an image from a folder or file:

mkpfs-tui — the Pack view

Inspect — header, counts, sizes, and checksums:

mkpfs-tui — the Inspect view

Verify — structure / checksum checks with a PASS/FAIL banner:

mkpfs-tui — the Verify view

Tree — browse the file tree stored inside an image:

mkpfs-tui — the Tree view


Requirements

  • Python 3.11 or newer (only needed for the uvx/pipx install; the Linux binary bundles its own).
  • A terminal that renders modern TUIs. Most do; on Windows use Windows Terminal (the default on Windows 11), not the legacy console.
  • mkpfs is installed automatically as a dependency — you do not install it yourself.

Install

Prefer a self-contained download? Grab a build from the Releases page.

The cross-platform way is via Python, using either uv (recommended — uvx runs it without installing) or pipx (installs the mkpfs-tui command).

Linux

# Prerequisite — uv (one line, no root):
curl -LsSf https://astral.sh/uv/install.sh | sh

# Run it (downloads + runs in an isolated env, nothing to clean up):
uvx mkpfs-tui

Or with pipx — sudo apt install pipx (Debian/Ubuntu) / sudo pacman -S python-pipx (Arch), then:

pipx ensurepath        # once, then restart the shell
pipx install mkpfs-tui
mkpfs-tui

No Python? Download mkpfs-tui-linux-x86_64.tar.gz from the Releases page, then:

tar -xzf mkpfs-tui-linux-x86_64.tar.gz
./mkpfs-tui/mkpfs-tui

macOS

# Prerequisite — uv (via Homebrew or the install script):
brew install uv          # or: curl -LsSf https://astral.sh/uv/install.sh | sh

uvx mkpfs-tui

Or with pipx: brew install pipx && pipx ensurepath, then pipx install mkpfs-tui. (No prebuilt macOS binary yet — use the Python install above.)

Windows

Use Windows Terminal for a TUI. In PowerShell:

# Prerequisite — uv:
winget install --id=astral-sh.uv  # or: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

uvx mkpfs-tui

Or with pipx: py -m pip install --user pipx, then py -m pipx ensurepath (restart the terminal) and pipx install mkpfs-tui. (No prebuilt Windows binary yet — use the Python install above.)


Usage

Launch the app (uvx mkpfs-tui, or mkpfs-tui if installed). You land on the Pack view.

The interface

  • Left sidebar — the five operations. Move with /; the right pane switches as you go.
  • Right pane — the selected operation's form, run button, progress, and a result panel (errors in red, warnings in amber, success in green).
  • Browse… buttons open a file/directory picker — navigate with the arrows, Choose to accept, Cancel/Escape to dismiss. You can also just type a path into the field.

Keyboard

Key Action
/ Move in the sidebar / lists / tree
Tab / Shift+Tab Move between form fields
Enter / Space Activate the focused button / switch
Ctrl+P Command palette — includes theme switching
Escape Close a modal (picker / overwrite prompt)
Ctrl+Q Quit

By operation

  • Pack — choose Folder or File mode, pick the Source and the Output image path (the image is written exactly to the path you type — include the extension you want), then set options: PS4/PS5 version, inode width (folder mode only), compression level, CPU count, block size, and the switches (Compress, Case-insensitive, Signed, Encrypted, Dry run, Verify after). Press Pack to watch a live progress bar; Cancel stops the build. If the output already exists you'll be asked to confirm before it's overwritten.
  • Inspect — point at an Image and press Inspect; the table fills with version, sizes, counts, and checksums.
  • Verify — give an Image and, optionally, a Source directory and/or an expected CRC32 / manifest SHA-256, then press Verify for a PASS/FAIL banner plus any errors.
  • Tree — pick an Image and press Build tree to browse its contents.
  • Unpack — pick an Image and an Output directory and press Unpack. Turn on Overwrite to clear a non-empty output directory first (you'll be asked to confirm the deletion).

Encrypted images

Every view has an EKPFS key field (64 hex characters) and a newCrypt switch for encrypted images; leave them blank/off for unencrypted ones. In Pack, the key is only applied when Encrypted is on.


Contributing

Issues and PRs are welcome. The project uses uv for everything.

Set up

git clone https://github.com/ClaudioVarandas/mkpfs-tui
cd mkpfs-tui
uv sync                                              # creates .venv with deps + dev tools
uv run textual run --dev mkpfs_tui.app:MkpfsTuiApp   # run the app (or: uv run python -m mkpfs_tui)

Tip: run uv run textual console in a second pane to see logs/tracebacks from the --dev app.

Test & lint

./run-tests.sh        # ruff format + ruff check --fix + pytest (what to run before committing)
uv run pytest         # tests only

Tests use Textual's App.run_test() Pilot harness with pytest-asyncio in auto mode. CI runs lint + tests (check-mode) on every push and PR.

Conventions

  • uv onlyuv sync, uv run …; never pip or a global Python.
  • Type hints everywhere, Google-style docstrings, from __future__ import annotations at the top of every module, prefer X | None over Optional. ruff is law (config in pyproject.toml).
  • The mkpfs boundary (most important rule): all imports of and calls to mkpfs.* live in the single module mkpfs_tui/mkpfs_runner.py, which exposes the app's own value types. No other module imports mkpfs. When you depend on new mkpfs surface, add an assertion to tests/test_mkpfs_contract.py so an upstream change fails loudly.
  • Updating the pinned mkpfs: uv lock --upgrade-package mkpfs, run the tests (including the contract test), then commit.

See CHANGELOG.md for release history. The architecture and the per-milestone build plans are kept outside the repo (in the author's planning notes).


License

GPL-3.0-or-later. mkpfs-tui imports mkpfs, which is GPLv3, so the combined work is GPL.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mkpfs_tui-0.1.2.tar.gz (431.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mkpfs_tui-0.1.2-py3-none-any.whl (46.8 kB view details)

Uploaded Python 3

File details

Details for the file mkpfs_tui-0.1.2.tar.gz.

File metadata

  • Download URL: mkpfs_tui-0.1.2.tar.gz
  • Upload date:
  • Size: 431.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mkpfs_tui-0.1.2.tar.gz
Algorithm Hash digest
SHA256 31447e06360700538e6ffff487e326dbe239dddae8dd0188ad2651da50c9142d
MD5 32d1d6b70c22bd8137a0af4fbf9a6a1c
BLAKE2b-256 4e66cf83f1f0739eb966a79059085d5580ae80a1a8763b108c0fcd10a4520f8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for mkpfs_tui-0.1.2.tar.gz:

Publisher: release.yml on ClaudioVarandas/mkpfs-tui

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mkpfs_tui-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: mkpfs_tui-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 46.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mkpfs_tui-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b34cb2b903e64d477fbe4e9f9b9672a874ff844a928585637e87fc96030c6899
MD5 f2639cd122d7d09ada0b602ca741c212
BLAKE2b-256 80cede506f5d3200c07d93983d50142cf3939de49ab07937d1cb6dad11f7c65d

See more details on using hashes here.

Provenance

The following attestation bundles were made for mkpfs_tui-0.1.2-py3-none-any.whl:

Publisher: release.yml on ClaudioVarandas/mkpfs-tui

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page