[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83017":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":14,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":27,"discoverSource":28},83017,"MkPFS","PSBrew\u002FMkPFS","PSBrew","Create and Manage Unsigned PFS (Playstation File System) image files with file compression and checksum support.",null,"Python",112,16,6,2,0,42,54,14,3.69,"GNU General Public License v3.0",false,"main",[],"2026-06-12 02:04:30","# MkPFS\n\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fmkpfs?style=flat-square&logo=pypi&logoColor=white&color=2563eb)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fmkpfs\u002F)\n[![Python 3.8+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.8%2B-2563eb?style=flat-square&logo=python&logoColor=white)](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Frelease\u002Fpython-380\u002F)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-GPL--3.0-0f172a?style=flat-square)](LICENSE)\n[![Status](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-production%2Fstable-1d4ed8?style=flat-square)](https:\u002F\u002Fgithub.com\u002FPSBrew\u002FMkPFS\u002Factions)\n[![Platforms](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatforms-Windows%20%7C%20macOS%20%7C%20Linux-2563eb?style=flat-square)](#installation)\n[![Profiles](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fprofiles-PS4%20%2F%20PS5-3b82f6?style=flat-square)](#command-reference)\n[![GitHub Sponsors](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFund%20Development-GitHub%20Sponsors-e11d48?style=flat-square&logo=githubsponsors&logoColor=white)](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FRenanGBarreto)\n\nMkPFS is a command-line tool and Python library for building, verifying, inspecting, browsing, and extracting PlayStation FileSystem (PFS) disk images. It works with common image naming conventions such as `.ffpfs`, `.ffpfsc`, `.pfs`, `.dat`, and `.bin`, and fits both direct image workflows and PKG or FPKG inner-PFS generation.\n\n[Quick Start](#-quick-start) · [Compression Statistics](#-compression-statistics) · [Installation](#-installation) · [Command reference](#command-reference) · [Development](#-development) · [Related projects](#related-projects) · [Sponsor](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FRenanGBarreto)\n\n## 🎯 Why MkPFS\n\nMkPFS is designed to be a clean and practical entry point for PlayStation PFS image workflows:\n\n- Create and manage PFS disk images for PlayStation-oriented workflows\n- Verify structure, payload hashes, layout consistency, and source-tree matches\n- Inspect image contents quickly with a tree view instead of digging through raw structures\n- Work with common image extensions such as `.ffpfs`, `.ffpfsc`.\n- Use the generated images with tools like [MicroMount](https:\u002F\u002Fgithub.com\u002Fdrakmor\u002FShadowMountPlus) and [ShadowMountPlus](https:\u002F\u002Fgithub.com\u002Fdrakmor\u002FShadowMountPlus)\n- Build the inner PFS filesystem used inside PKG or FPKG workflows\n- Use the same core workflow from both the CLI and the Python library\n- Explore a bundled, source-backed knowledge base for PFS and PKG research\n\n## 🚀 Quick Start\n\n```bash\n# Install using pip\npip install mkpfs\n\n# Convert an .exfat or .ffpkg file into a PFSC compressed image .ffpfsc\nmkpfs pack file --compress --verify .\u002FGAME1234.exfat .\u002FGAME1234.ffpfsc\n\n# Convert a homebrew folder into a PFS image with compression and verification\nmkpfs pack folder --compress --verify .\u002FGAME1234-app .\u002FGAME1234.ffpfs\n\n# Inspect the generated image\nmkpfs inspect .\u002FGAME1234.ffpfs\n\n# Unpack the image back into a folder\nmkpfs unpack .\u002FGAME1234.ffpfs .\u002FGAME1234-extracted\u002F\n```\n\n> **Note on conversion speed:** Antivirus scanning can reduce conversion speed, especially during the writing phase or when processing many loose files.\n> If you plan to convert many titles in bulk and you trust this software in your environment, you may temporarily disable real-time antivirus protection to speed up the process.\n> If you are unsure, keep antivirus enabled and expect slower conversions.\n\n## 💖 Sponsorship\n\nMkPFS is easier to sustain when users who benefit from it help fund it.\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsponsors\u002FRenanGBarreto\">\n    \u003Cimg alt=\"GitHub Sponsors\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFund%20Development-GitHub%20Sponsors-e11d48?style=flat-square&logo=githubsponsors&logoColor=white\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\nSupport helps with:\n\n- Ongoing CLI improvements\n- The Python library and reusable internals\n- Better test coverage and compatibility work\n- More documentation, examples, and research notes\n\nSponsor here:\n- https:\u002F\u002Fgithub.com\u002Fsponsors\u002FRenanGBarreto\n\nOr donate directly using:\n - **BTC:**  **`141kKRoDpaS6PNC2yxSi8vziDFTmzCnArE`**\n - **USDT (TRC-20):**  **`TQb7bUYSYRmdWgALHCejH33dNij9XyTAnU`**\n - **USDT (ERC-20):**  **`0x63c0b4b21133c4068375ae7566dafcf1398cf6fb`**\n\n\n## 📊 Compression Statistics\n\nUsing the compression from MkPFS, you can have your game files reduced by **40-60%**, drastically reducing the size of the image. \nThe PlayStation kernel is already able to read the files natively in the PFSC format with minimal performance impact!\n\nThe numbers below are measured from a real homebrew title that previously had 6.5 GB of game files:\n\n| Format | Description | Size    | Space saved     |\n| --- | --- |---------|-----------------|\n| `.exfat` | Raw game image (exFAT) | ~6.5 GB | baseline        |\n| `.ffpkg` | Raw game image (UFS) | ~6.5 GB | baseline        |\n| `.exfat.ffpfsc` | PFSC-compressed wrapper around the exFAT image | ~3.4 GB | **-47%**        |\n| `.ffpkg.ffpfsc` | PFSC-compressed wrapper around the UFS image | ~3.4 GB | **-47%**        |\n| `.ffpfs` | Source folder packed directly into a PFSC image | ~3.5 GB | **-46%** |\n\nBoth single-file wrapping (`pack file`) and folder-based packing (`pack folder`) produce compressed images of equivalent size, giving you flexibility without sacrificing efficiency.\n\n## 📦 Installation\n\n### Run from a local checkout\n\n### Install from PyPI\n\n```bash\npip install mkpfs\nmkpfs -h\n```\n\n```bash\nuv sync --group dev\nuv run mkpfs -h\n```\n\n### Install as a local tool\n\n```bash\nuv tool install .\nmkpfs -h\n```\n\n### Build distributables\n\n```bash\nuv build\nuv run --frozen twine check dist\u002F*\n```\n\n## Command Reference\n\nMkPFS keeps the command surface focused on the image lifecycle. \nThe CLI currently supports `pack`, `verify`, `inspect`, `tree`, and `unpack`.\n\n### Top-level CLI\n\n```text\nmkpfs [-h] {pack,verify,inspect,tree,unpack} ...\n```\n\n| Parameter | Description |\n| --- | --- |\n| `-h`, `--help` | Show the top-level help text and exit. |\n| `pack` | Pack a folder or a single file into a PFS image. |\n| `verify` | Validate image structure and payload checksums. |\n| `inspect` | Inspect image metadata and integrity summary. |\n| `tree` | Print the image tree representation. |\n| `unpack` | Extract files from an image into a destination directory. |\n\n### `pack`\n\n```text\nmkpfs pack [-h] {folder,file} ...\n```\n\nUse `pack folder` to build from a directory tree, or `pack file` to treat one file as a virtual single-file tree.\n\n### `pack folder`\n\n```text\nmkpfs pack folder [-h] [--adjust-output-file-extension | --no-adjust-output-file-extension]\n                  [--compress | --no-compress] [--threshold-gain THRESHOLD_GAIN]\n                  [--block-size BLOCK_SIZE] [--version {PS4,PS5}] [--inode-bits {32,64}]\n                  [--case-sensitive | --case-insensitive] [--cpu-count CPU_COUNT]\n                  [--compression-level COMPRESSION_LEVEL]\n                  [--max-compressed-ratio MAX_COMPRESSED_RATIO]\n                  [--min-compress-size MIN_COMPRESS_SIZE]\n                  [--skip-executable-compression] [--signed] [--encrypted]\n                  [--ekpfs-key EKPFS_KEY] [--require-game-files] [--temp-folder TEMP_FOLDER] [--verbose]\n                  [--dry-run] [--verify] source_dir image_file\n```\n\nExamples:\n\n```bash\nmkpfs pack folder .\u002Finput .\u002Fgame.ffpfs\nmkpfs pack folder .\u002Finput .\u002Fgame.ffpfs --encrypted\nmkpfs pack folder .\u002Finput .\u002Fgame.ffpfs --require-game-files --verify\nmkpfs pack folder .\u002Finput .\u002Fgame.ffpfs --temp-folder .\u002Ftmp\u002Fmkpfs\n```\n\nPowerShell example with tuned PFSC compression:\n\n```powershell\npython -m mkpfs pack folder c:\\game_folder d:\\game.ffpfs `\n  --compress `\n  --skip-executable-compression `\n  --compression-level 9 `\n  --max-compressed-ratio 95 `\n  --min-compress-size 65536\n```\n\n| Parameter | Description |\n| --- | --- |\n| `source_dir` | Source app or homebrew folder to pack. |\n| `image_file` | Output image file path. |\n| `-h`, `--help` | Show help and exit. |\n| `--adjust-output-file-extension` | Automatically adjust the output extension to match the detected pack mode. This is the default. |\n| `--no-adjust-output-file-extension` | Keep the requested output file name unchanged. |\n| `--compress` | Enable PFSC block compression. This is the default. |\n| `--no-compress` | Disable PFSC block compression. |\n| `--threshold-gain THRESHOLD_GAIN` | Minimum per-block gain percent required to keep PFSC-compressed blocks. Default: `0`. |\n| `--block-size BLOCK_SIZE` | PFS block size in bytes, `auto`, or `auto-fit`. Default: `auto`, which resolves to `65536`; `auto-fit` picks 4096..65536 by estimated file-data padding. |\n| `--version {PS4,PS5}` | PFS profile version. Default: `PS4`. |\n| `--inode-bits {32,64}` | Inode width mode bit. Default: `32`. (NOTE: 64 bits migth be unstable) |\n| `--case-sensitive` | Build a case-sensitive image. |\n| `--case-insensitive` | Set the case-insensitive mode bit. This is the default behavior. |\n| `--cpu-count CPU_COUNT` | Number of CPU cores to use for PFSC compression. `0` means auto `max(1, cpu_count())`, non-zero uses `max(1, user value)`. |\n| `--compression-level COMPRESSION_LEVEL` | Zlib compression level from `0` to `9`. Default: `9`. |\n| `--max-compressed-ratio MAX_COMPRESSED_RATIO` | Maximum PFSC size as percent of the raw file size. Use `95` to store files raw unless PFSC is 95% of raw size or smaller. Default: disabled. |\n| `--min-compress-size MIN_COMPRESS_SIZE` | Store files smaller than this many bytes raw without trying PFSC compression. Use `65536` to skip files smaller than one PFSC logical block. Default: `0`. |\n| `--skip-executable-compression` | Store `eboot*.bin`, `*.prx`, and `*.sprx` files raw even when PFSC compression is enabled. Default: enabled. |\n| `--signed` | Build a signed PFS image using a zero EKPFS key and seed. |\n| `--encrypted` | Encrypt filesystem blocks with AES-XTS. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key. When omitted with `--encrypted`, MkPFS uses an all-zero key. |\n| `--require-game-files` | Require `sce_sys\u002Fparam.json` and `eboot.bin` before packing. |\n| `--temp-folder TEMP_FOLDER` | Directory used for temporary pack artifacts, including staged single-file trees and PFSC spool files. Default: the system temp folder. |\n| `--verbose` | Print verbose per-file decisions during packing. |\n| `--dry-run` | Scan, layout, and report only. Do not write an image file. |\n| `--verify` | Run `mkpfs verify` automatically after a successful pack. |\n\nNotes:\n\n- Folder output names are adjusted automatically by default.\n- MkPFS chooses `.ffpfs` when `sce_sys\u002Fparam.json` exposes a title ID, otherwise it falls back to `.ffpfsc`.\n- `--ekpfs-key` is only meaningful when used with `--encrypted`.\n\n### `pack file`\n\n```text\nmkpfs pack file [-h] [--adjust-output-file-extension | --no-adjust-output-file-extension]\n                [--compress | --no-compress] [--threshold-gain THRESHOLD_GAIN]\n                [--block-size BLOCK_SIZE] [--version {PS4,PS5}] [--inode-bits {32,64}]\n                [--case-sensitive | --case-insensitive] [--cpu-count CPU_COUNT]\n                [--compression-level COMPRESSION_LEVEL]\n                [--max-compressed-ratio MAX_COMPRESSED_RATIO]\n                [--min-compress-size MIN_COMPRESS_SIZE]\n                [--skip-executable-compression] [--signed] [--encrypted]\n                [--ekpfs-key EKPFS_KEY] [--temp-folder TEMP_FOLDER] [--verbose] [--dry-run] [--verify]\n                source_file image_file\n```\n\nExamples:\n\n```bash\nmkpfs pack file .\u002Fpayload.exfat .\u002Fpayload.ffpfsc\nmkpfs pack file .\u002Fpayload.exfat .\u002Fpayload.ffpfsc --verify\nmkpfs pack file .\u002Fpayload.exfat .\u002Fpayload.ffpfsc --temp-folder .\u002Ftmp\u002Fmkpfs\n```\n\n| Parameter | Description |\n| --- | --- |\n| `source_file` | Single source file to pack. |\n| `image_file` | Output image file path. |\n| `-h`, `--help` | Show help and exit. |\n| `--adjust-output-file-extension` | Automatically adjust the output extension to match the detected pack mode. This is the default. |\n| `--no-adjust-output-file-extension` | Keep the requested output file name unchanged. |\n| `--compress` | Enable PFSC block compression. This is the default. |\n| `--no-compress` | Disable PFSC block compression. |\n| `--threshold-gain THRESHOLD_GAIN` | Minimum per-block gain percent required to keep PFSC-compressed blocks. Default: `0`. |\n| `--block-size BLOCK_SIZE` | PFS block size in bytes, `auto`, or `auto-fit`. Default: `auto`, which resolves to `65536`; `auto-fit` picks 4096..65536 by estimated file-data padding. |\n| `--version {PS4,PS5}` | PFS profile version. Default: `PS4`. |\n| `--inode-bits {32,64}` | Inode width mode bit. Default: `32`. |\n| `--case-sensitive` | Build a case-sensitive image. |\n| `--case-insensitive` | Set the case-insensitive mode bit. This is the default behavior. |\n| `--cpu-count CPU_COUNT` | Number of CPU cores to use for PFSC compression. `0` means auto `max(1, cpu_count())`, non-zero uses `max(1, user value)`. |\n| `--compression-level COMPRESSION_LEVEL` | Zlib compression level from `0` to `9`. Default: `9`. |\n| `--max-compressed-ratio MAX_COMPRESSED_RATIO` | Maximum PFSC size as percent of the raw file size. Use `95` to store files raw unless PFSC is 95% of raw size or smaller. Default: disabled. |\n| `--min-compress-size MIN_COMPRESS_SIZE` | Store files smaller than this many bytes raw without trying PFSC compression. Use `65536` to skip files smaller than one PFSC logical block. Default: `0`. |\n| `--skip-executable-compression` | Store `eboot*.bin`, `*.prx`, and `*.sprx` files raw even when PFSC compression is enabled. Default: enabled. |\n| `--signed` | Build a signed PFS image using a zero EKPFS key and seed. |\n| `--encrypted` | Encrypt filesystem blocks with AES-XTS. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key. When omitted with `--encrypted`, MkPFS uses an all-zero key. |\n| `--temp-folder TEMP_FOLDER` | Directory used for temporary pack artifacts, including the one-file staging tree and PFSC spool files. Default: the system temp folder. |\n| `--verbose` | Print verbose per-file decisions during packing. |\n| `--dry-run` | Scan, layout, and report only. Do not write an image file. |\n| `--verify` | Run `mkpfs verify` automatically after a successful pack. |\n\nNotes:\n\n- Single-file packing stages the file in a temporary one-file tree using links, so the source payload is not duplicated on disk.\n- Use `--temp-folder` when you want staged files and PFSC spool files to live somewhere other than the system temp directory.\n- The default adjusted extension for single-file output is `.ffpfsc`.\n\n### `verify`\n\n```text\nmkpfs verify [-h] [--source-dir SOURCE_DIR | --source-file SOURCE_FILE]\n             [--expect-crc32 EXPECT_CRC32]\n             [--expect-manifest-sha256 EXPECT_MANIFEST_SHA256]\n             [--ekpfs-key EKPFS_KEY] [--new-crypt] image_file\n```\n\nExamples:\n\n```bash\nmkpfs verify .\u002Fgame.ffpfs\nmkpfs verify .\u002Fsingle.ffpfsc --source-file .\u002Fpayload.exfat\nmkpfs verify .\u002Fgame.ffpfs --source-dir .\u002Finput --expect-crc32 0x7F528D1F\n```\n\n| Parameter | Description |\n| --- | --- |\n| `image_file` | Path to the input `.ffpfs` image. |\n| `-h`, `--help` | Show help and exit. |\n| `--source-dir SOURCE_DIR` | Optional source folder for hierarchy and payload comparison. |\n| `--source-file SOURCE_FILE` | Optional source file for single-file image comparison. Mutually exclusive with `--source-dir`. |\n| `--expect-crc32 EXPECT_CRC32` | Expected cumulative data CRC32 in hex. Verification fails if the computed value differs. |\n| `--expect-manifest-sha256 EXPECT_MANIFEST_SHA256` | Expected manifest SHA256 as 64 hex characters. Verification fails if it differs. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key for encrypted images. |\n| `--new-crypt` | Use the alternate `newCrypt` EKPFS derivation. |\n\n### `inspect`\n\n```text\nmkpfs inspect [-h] [--format {text,json}] [--ekpfs-key EKPFS_KEY] [--new-crypt] image_file\n```\n\nExamples:\n\n```bash\nmkpfs inspect .\u002Fgame.ffpfs\nmkpfs inspect .\u002Fgame.ffpfs --format json\n```\n\n| Parameter | Description |\n| --- | --- |\n| `image_file` | Path to the input `.ffpfs` image. |\n| `-h`, `--help` | Show help and exit. |\n| `--format {text,json}` | Output format for the inspection report. Default: `text`. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key for encrypted images. |\n| `--new-crypt` | Use the alternate `newCrypt` EKPFS derivation. |\n\n### `tree`\n\n```text\nmkpfs tree [-h] [--ekpfs-key EKPFS_KEY] [--new-crypt] image_file\n```\n\nExamples:\n\n```bash\nmkpfs tree .\u002Fgame.ffpfs\n```\n\n| Parameter | Description |\n| --- | --- |\n| `image_file` | Path to the input `.ffpfs` image. |\n| `-h`, `--help` | Show help and exit. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key for encrypted images. |\n| `--new-crypt` | Use the alternate `newCrypt` EKPFS derivation. |\n\n### `unpack`\n\n```text\nmkpfs unpack [-h] [--overwrite] [--ekpfs-key EKPFS_KEY] [--new-crypt] image_file output_dir\n```\n\nExamples:\n\n```bash\nmkpfs unpack .\u002Fgame.ffpfs .\u002Fextracted\u002F\nmkpfs unpack .\u002Fgame.ffpfs .\u002Fextracted\u002F --overwrite\n```\n\n| Parameter | Description |\n| --- | --- |\n| `image_file` | Path to the input `.ffpfs` image. |\n| `output_dir` | Destination directory for extraction. |\n| `-h`, `--help` | Show help and exit. |\n| `--overwrite` | Overwrite an existing output path. |\n| `--ekpfs-key EKPFS_KEY` | Optional 64-hex EKPFS key for encrypted images. |\n| `--new-crypt` | Use the alternate `newCrypt` EKPFS derivation. |\n\n## 🔁 Typical Workflow\n\n```bash\n# 1. Pack an image from a source tree\nmkpfs pack folder .\u002Finput .\u002Foutput.ffpfs\n\n# 2. Verify the generated image\nmkpfs verify .\u002Foutput.ffpfs\n\n# 3. Inspect the final tree layout\nmkpfs tree .\u002Foutput.ffpfs\n```\n\n## 💻 Example Output\n\n```bash\n$ mkpfs pack folder --verify --compress \".\u002FBREW00000-app\" \".\u002FBREW00000.ffpfs\"\n======================================================================\nPFS Image Builder - Parameters\n======================================================================\n  Source path:       .\u002FBREW00000-app\n  Output path:       .\u002FBREW00000.ffpfs\n  Version:           1 (PS4)\n  Header magic:      PFS (20130315)\n  Compression Setup: PFSC (0x43534650)\n  Block size:        65,536 bytes (64 KiB)\n  Inode width:       32-bit\n  PFS mode:          0x0008  (Bit 0=signed, Bit 1=64-bit inodes, Bit 2=encrypted, Bit 3=case insensitive)\n    Signed:          no\n    64-bit inodes:   no\n    Encrypted:       no\n    New crypt:       no\n    Case insensitive: yes\n  Compression:       enabled\n  Game-file checks:   disabled\n  Threshold gain:    20%\n  CPU cores:         auto (max(1, cpu_count()))\n  Zlib level:        7\n  Dry run:           no\n======================================================================\n\nDiscovering files...\n[################################] 100% scan\n\nCompressing 180 files (5.87 GB) using 10 CPU cores...\n[################################] 100% compress @ 68.75 MB\u002Fs            \n\nWriting PFS image to .\u002FBREW00000.ffpfs...\n[################################] 100% write @ 728.27 MB\u002Fs\n\nSuccessfully wrote 3.21 GB image\n======================================================================\nBuild Summary\n======================================================================\n  Input path:              .\u002FBREW00000-app\n  Output path:             .\u002FBREW00000.ffpfs\n  Total files:             180\n  Total uncompressed size: 5.87 GB\n  Total stored size:       3.21 GB\n\n  Compression Statistics:\n    Compressed files:       53\n    Uncompressed files:     127\n    Actual gain achieved:   45.40%\n    All-PFSC gain:          46.51%  (3.14 GB if every file used PFSC)\n\n  Block Alignment Waste:\n    Block size:             64 KiB (65,536 bytes)\n    Wasted space:           6.75 MB (0.21% of file data blocks)\n\n  Elapsed time:            92.46s\n  Throughput:              65.05 MB\u002Fs\n\n\nRunning post-create check...\n======================================================================\nPFS Check Report\n======================================================================\nImage:                 .\u002FBREW00000.ffpfs\nVersion:               1 (PS4)\nHeader magic:          PFS (20130315)\nCompression Setup:     PFSC (0x43534650)\nRead-only:             yes\nMode:                  0x0008  (Bit 0=signed, Bit 1=64-bit inodes, Bit 2=encrypted, Bit 3=case insensitive)\n  Signed:              no\n  64-bit inodes:       no\n  Encrypted:           no\n  Case insensitive:    yes\nBlock size:            65,536 bytes\nInodes:                196\nDirectories:           14\nFiles:                 180\nCompressed files:      53\nFiles hash-checked:    180\nData CRC32:            0x7A6E1B38\nManifest SHA256:       5eee3aed04394d0abf978037ccfc6ddcf9c3945fa11816fe14f11d5853e5553e\nLogical file bytes:    3,443,395,982\nStored file bytes:     6,306,784,749\nflat_path_table keys:  193\nWarnings:              0\nErrors:                0\n======================================================================\n\n```\n\n## 🛠️ Development\n\nSet up the local environment:\n\n```bash\nuv sync --group dev\nuv run pre-commit install\n```\n\nRun the validation commands:\n\n```bash\n.\u002Frun-tests.sh\nuv run --frozen ruff format .\nuv run --frozen ruff check .\n```\n\n## 💙 Special thanks and Contributors\n\nSpecial thanks to the people and communities helping shape MkPFS:\n\n- **Renan @ PSBrew**: main creator and maintainer of MkPFS\n- **Darkmor @ ShadowMountPlus**: creator of [ShadowMountPlus](https:\u002F\u002Fgithub.com\u002Fdrakmor\u002FShadowMountPlus), whose work helped inspire practical PFS mounting workflows\n- **The PlayStation and reverse-engineering community**: for tools, research threads, testing feedback, technical notes, and historical knowledge\n- **Community-maintained references and wiki pages**: especially the projects and archives that preserve PFS, PKG, and FPKG implementation details\n\n## Related projects\n\n- [ShadowMountPlus](https:\u002F\u002Fgithub.com\u002Fdrakmor\u002FShadowMountPlus): Practical PS5 auto-mounter and a key reference for `.ffpfs` compatibility\n- [PSDevWiki PFS](https:\u002F\u002Fwww.psdevwiki.com\u002Fps4\u002FPFS): Community reference for PFS on-disk structures\n- [PSDevWiki PKG files](https:\u002F\u002Fwww.psdevwiki.com\u002Fps4\u002FPKG_files): PKG format reference and tooling pointers\n- [ShadPKG HOWWORKS](https:\u002F\u002Fgithub.com\u002Fseregonwar\u002FShadPKG\u002Fblob\u002Fmain\u002Fdocs\u002FHOWWORKS.md): Implementation-focused PKG\u002FPFS decryption walkthrough\n- [Wololo: PS4 FPKG writeup by Flatz](https:\u002F\u002Fwololo.net\u002Fps4-fpkg-writeup-by-flatz\u002F): Historical writeup on FPKG\u002FPKG techniques\n","MkPFS 是一个用于创建和管理 PlayStation 文件系统（PFS）镜像文件的命令行工具和 Python 库，支持文件压缩和校验。其核心功能包括构建、验证、检查、浏览和提取 PFS 镜像，并且兼容多种常见的镜像格式如 `.ffpfs`、`.ffpfsc`、`.pfs` 等。MkPFS 提供了直观的树状视图来快速查看镜像内容，并支持从命令行界面或直接通过 Python 库进行操作，适用于需要处理 PlayStation 游戏数据包（PKG 或 FPKG）的工作流中。该工具特别适合游戏开发者、逆向工程师以及对 PlayStation 文件系统感兴趣的用户使用。","2026-06-11 04:09:53","CREATED_QUERY"]