Skip to content
chrissotraidisPublic

About

Paper Mario 64, native for Mac, iOS, and iPadOS.

Topics

Resources

Contributing

Security policy

Stars

38 stars

Watchers

1 watching

Forks

Repository files navigation

PaperPad

PaperPad 0.2.0 uses Harbour Masters’ PaperBoat, with PaperPad's native Apple touch controls, settings, ROM import and diagnostics. The app and download are named PaperPad.

  • iPhone/iPad, iOS/iPadOS 16.3 or newer; unsigned IPA for signing with your own credentials.
  • Supply an unmodified Paper Mario (US) 1.0 ROM locally. No ROM or extracted game archive is included.
  • Floating touch-down stick, compact native settings, controller support, Auto/1×–4× rendering and shared diagnostics.
  • The new app keeps separate saves from PaperPad Original. Earlier progress stays in Original; there is no automatic conversion.
  • Title-menu animation stutter remains a known issue. See the release notes for test scope and limitations.

The release includes exact nested sources, notices, build provenance and checksums. Source updates and offline archive builds and rights limitations are documented. Report app/platform issues here with the build and diagnostic log; do not assume upstream owns an Apple-port issue.

Note

AI disclosure: PaperPad uses substantial AI assistance for code, tests, documentation, debugging and maintenance. Some support replies and maintenance tasks are automated. There is no audited percentage of AI-generated code. Build, test and device records describe what was checked. This disclosure concerns PaperPad's workflow, not the authorship of its upstream projects.

Get PaperPad

Releases publish no app: PaperPad is compiled from the Paper Mario decompilation, so you make your own on an Apple silicon Mac with Xcode and its iOS platform. Install CMake and Ninja once with brew install cmake ninja, then download PadMint, unzip it, double-click PadMint.command and choose PaperPad. PadMint builds the app from this repository's latest release and saves an unsigned IPA in your Downloads folder; install it with AltStore Classic, SideStore or Sideloadly (see the unsigned IPA installation guide). On first launch, choose your own Paper Mario (USA) 1.0 ROM in Files; PaperPad extracts it privately on the device. Install over an existing PaperPad to keep your saves. PaperPad Original (below) is a separate app with separate saves.

PaperPad Original reference

The following screenshots, platform status and instructions describe the retained Original Preview 2 build. Its ReCut/RT64 runtime and earlier saves remain available separately; they are not the PaperBoat build above.

PaperPad battle with Mario and three flying Goombas on iPad

Paper Mario recompiled for Apple Silicon.
Native Metal rendering, customizable iPhone and iPad controls, controller support, and private ROM import.

iOS and iPadOS 15 or newer Apple Silicon macOS Metal renderer Public preview 2 ROM not included Build PaperPad with PadMint Join the PaperPad Discord

PaperPad combines the pmret Paper Mario decompilation with the statically recompiled runtime and renderer from Paper-Mario-ReCut, pinned through PaperPad’s maintained source branch. It adds a native Apple application shell, Metal presentation, keyboard and controller input, customizable touch controls, native settings, and private first-run ROM import.

PaperPad is a game-specific static recompile, not a general Nintendo 64 emulator. It currently supports only an unmodified Paper Mario (US) 1.0 ROM supplied by the user.

This repository contains integration source, pinned maintained dependencies, scripts, and documentation. It does not contain Paper Mario, a ROM, extracted Nintendo assets, generated playable game code, saves, or a playable ROM-derived archive. Read the rights and licensing boundary before redistributing source or a build.

Project status

PaperPad Original's preview downloads are retired. PadMint builds the current PaperPad (see Get PaperPad); to build Original yourself, use scripts/build-ios-device.sh --rom /absolute/path/to/rom as described in Get started. There is no TestFlight, App Store release, signed download, or notarized macOS build.

Target Current status
Apple Silicon macOS Source build, launch, file creation, early gameplay, keyboard input, and clean quit verified
iPhone Simulator Current development build and compact touch layout verified
iPad Simulator Current development build, touch/settings flows, diagnostics, and later-game fixture verified
Physical iPad Preview 2 installed in place and booted through active gameplay without changing the private ROM, saves, or controller preferences; earlier battle, progression, and longer controller routes remain valid
Physical iPhone Current clean build installed and launched; private test ROM/save migrated, with hands-on touch and gameplay acceptance open

Preview 2 adds targeted SDL2 controller-slot reconciliation for missed disconnects, reconnects, and foreground resume. Deterministic tests cover single-controller return, two-controller slot preservation, held-input release, and a missed removal event. The exact signed release candidate also booted on the attached iPad after an in-place update that preserved its private ROM, saves, and controller preferences. Physical Bluetooth, wired, and natural-sleep reconnect acceptance remains open, as do complete mapping, physical-iPhone hands-on acceptance, and chapter-spanning testing.

See Current status, Technical debt, and the Release checklist for dated evidence and the remaining gates.

Get started

Requirements

  • An Apple Silicon Mac
  • Xcode with the macOS and iOS SDKs, plus the downloadable Metal Toolchain
  • Homebrew
  • CMake, Ninja, Git, jq, Python 3.11 or newer, and Rust/Cargo
  • GNU cpp-16 (brew install gcc)
  • Several gigabytes of free build space
  • Your own legally obtained, unmodified Paper Mario (US) 1.0 ROM

PaperPad accepts .z64, .v64, and .n64 byte orders. The supported ROM normalizes to 40 MiB with SHA-1 3837f44cda784b466c9a2d99df70d77c322b97a0. This fingerprint verifies compatibility; it is not a download hint.

Clone the repository:

git clone https://github.com/chrissotraidis/paperpad.git
cd paperpad

macOS

xcodebuild -downloadComponent MetalToolchain
export TOOLCHAINS="$(xcodebuild -showComponent MetalToolchain -json | plutil -extract toolchainIdentifier raw -o - -)"
scripts/build-macos-app.sh --rom /absolute/path/to/your/paper-mario-rom
open build-macos-release/PaperPad.app

The first command installs Xcode's optional Metal compiler, and TOOLCHAINS selects the installed version explicitly for Xcode releases that do not select it automatically. The build then fetches and verifies pinned maintained source, validates the ROM, generates local AOT game code, builds PaperPad, and ad-hoc signs a ROM-free app. After the first successful generation, incremental builds can run without --rom in the same shell:

scripts/build-macos-app.sh

The macOS app reads the normalized ROM from the ignored local workspace. It is not copied into PaperPad.app.

iPhone or iPad Simulator

Build the app, boot one Simulator at a time, then install and launch it:

scripts/build-ios-simulator.sh --rom /absolute/path/to/your/paper-mario-rom
xcrun simctl list devices available
xcrun simctl boot "iPad Pro 11-inch (M4)"
open -a Simulator
xcrun simctl install booted build-ios-simulator/Release/PaperPad.app
xcrun simctl launch booted com.chrissotraidis.paperpad

On first launch, select your ROM through the native document picker. PaperPad validates the exact revision, normalizes its byte order, and stores the private copy in that Simulator's Application Support container. The installed .app remains ROM-free.

Shut down the active Simulator before switching device classes:

xcrun simctl terminate booted com.chrissotraidis.paperpad || true
xcrun simctl shutdown booted

Physical iPhone and iPad builds require your own Apple development team and provisioning profile. Follow the device build and in-place installation guide; never uninstall an existing copy merely to update it if its private ROM, saves, or settings must be preserved.

First launch

PaperPad never downloads game data.

  1. Launch the iPhone, iPad, or Simulator app.
  2. Choose Choose ROM.
  3. Select your own supported dump in Files.
  4. Wait for validation and private normalization to complete.
  5. Start the game with the on-screen Start button or a connected input device.

Use PaperPad Menu → Settings → Manage Game ROM to replace or remove the private copy later. ROM and save contents are never included in shared diagnostics.

Touch controls and settings

PaperPad provides every standard N64 input on screen: analog stick, D-pad, A, B, Z, C-buttons, L, R, and Start. Phone and tablet layouts are independent, persist locally, and can be moved or reset from Settings.

  • Menu: the persistent ••• button opens PaperPad settings and support actions.
  • Touch controls: show or hide the gameplay overlay and adjust its opacity.
  • Layout editor: move controls without snapping their centers to the initial touch point. D-pad and C buttons move individually by default; select one and choose Link to move that four-button cluster together, or Unlink to return to individual placement. Reset restores the current device-class defaults.
  • Resolution: choose Auto, 1x, 2x, 3x, or 4x internal rendering. Auto reports its current renderer-confirmed scale and dimensions and may exceed 4x when the display permits it.
  • Framing: Original preserves the largest centered 4:3 presentation. Fill Screen center-crops that presentation and may crop image edges on wider displays.
  • Volume: adjust and persist master output volume.
  • Diagnostics: create a reviewable text report through the system share sheet.
  • ROM management: replace or remove the privately stored game ROM.

Opening the menu, Settings, share sheet, or ROM picker clears held input and hides gameplay touch targets. Dismissing the sheet restores them only when Touch Controls is enabled. When a hardware controller is connected, the iOS build hides the gameplay overlay while keeping the menu available, then restores touch controls on disconnect. SDL2 handles are reconciled on controller events, foreground resume, and a bounded active check so stale handles release their player slot and held input; hands-on reconnect and complete mapping acceptance remain open.

Keyboard and controller bindings

N64 input macOS keyboard N64 input macOS keyboard
A Z B X
Start Return Z Left Shift
L / R Q / E Analog stick Arrow keys
D-pad W A S D C-buttons I J K L

SDL-compatible controllers use the left stick, D-pad, face buttons, shoulders, left trigger for Z, and right stick for the C-buttons. A physical Kishi V2 session verified analog plus A/B/Z/L/R/Start during sustained play. Automated tests cover disconnect input release, single-controller reconnect, two-controller slot preservation, and foreground reconciliation after a missed removal; D-pad, all C directions, Bluetooth/wired reconnect, and natural-sleep behavior still require physical acceptance.

Screenshots

PaperPad battle gameplay with touch controls on iPad Paper Mario title screen running in PaperPad on iPad
Battle gameplay
Native Metal presentation with the complete touch interface.
Paper Mario on iPad
Original 4:3 presentation with customizable controls.

What works

Area Current implementation
Native code Static arm64 game code on Apple targets; no JIT or downloaded executable code
Rendering RT64 presentation through Metal with Retina drawable sizing
Game setup Native ROM selection, three-byte-order normalization, exact revision validation, and private storage
Touch Full N64 overlay, multi-touch, fixed/clamped analog knob, opacity, independent phone/tablet layouts, editing, and reset
Display Auto and fixed 1x–4x internal scales; original 4:3 and center-cropped Fill Screen modes
Input macOS keyboard/controller support and iOS SDL controller mappings
Saves Flash-save handling plus in-place device updates that preserve the app container
Support First-level diagnostics action, bounded current/previous logs, session marker, and system share sheet
Repository safety Pinned dependencies, maintained patch replay, and ROM/signing/private-data publication checks

Internal resolution improves geometry edges and sampling, but it cannot reconstruct detail absent from the original low-resolution text, sprites, or textures. PaperPad uses RT64's stable smooth path and does not ship or endorse a third-party texture pack.

Supported game

Game Revision Status
Paper Mario US 1.0 Supported input for local builds and runtime import
Paper Mario Japan, PAL, iQue, modified/randomized ROMs Not supported by the current configuration
Other Nintendo 64 games Any Not supported; PaperPad is not a general emulator

Diagnostics and bug reports

Open PaperPad Menu → Share Diagnostics & Logs… after reproducing a problem. The generated report includes:

  • app/build, system, screen, settings, and renderer-confirmed resolution metadata;
  • only whether a supported-size ROM is present, never its contents;
  • at most the last 512 KiB of the current and previous runtime logs; and
  • a possible-unclean-session label when the previous run did not remove its private session marker.

Each private log is capped at 4 MiB. Known app-container, home, and temporary paths are replaced, but arbitrary runtime text is not guaranteed to be anonymous. Review and redact the report before sharing it.

Include the PaperPad commit, device and OS, exact reproduction steps, expected and actual behavior, and a screenshot for visual defects. Never attach or request ROMs, extracted assets, generated playable code, saves, signing files, credentials, or private device data. See CONTRIBUTING.md.

Reproducible and ROM-free

flowchart LR
    A["PaperPad scripts"] --> B["Pinned upstream source"]
    B --> C["Maintained Apple/runtime patches"]
    D["Your supported ROM"] --> E["Ignored local AOT generation"]
    C --> E
    E --> F["ROM-free PaperPad app"]
    D --> G["Private first-run import on iOS"]
    F --> H["Local gameplay"]
    G --> H
Loading

dependencies.lock.json records exact source revisions and the supported ROM fingerprint. The maintained ReCut fork is pinned at vendor/paper-mario-recut; unmodified inputs remain under ignored ref/, and private ROM-derived/AOT input under ignored generated/. Normal builds verify clean sources and do not replay patches. See source maintenance, source archives and rollback.

The PaperBoat audit and engine decision selects PaperBoat as the foundation for a future major version. This source-maintenance change keeps the existing ReCut engine and Preview 2 behavior; no PaperBoat features or new binary release are included.

Before publishing source, run:

scripts/check-repo-safety.sh
git diff --check

The safety audit rejects game data, generated packages, signing material, likely credentials, tracked reference checkouts, personal paths, and oversized files from the publishable tree and history.

Frequently asked questions

Does PaperPad include Paper Mario?

No. You must provide your own legally obtained, unmodified Paper Mario (US) 1.0 ROM. Do not open issues requesting game data or download links.

Is there an IPA or App Store build?

No published IPA: PadMint builds your own on an Apple silicon Mac (see Get PaperPad). There is no App Store or TestFlight build.

Why does Auto sometimes show more than 4x?

Manual choices are capped at 4x. Auto chooses the largest integer scale that fits the current display and reports the renderer-confirmed value, so it can legitimately show a higher number.

Why can the game still look soft at a high internal resolution?

Higher internal resolution improves polygon edges and sampling. It cannot add detail to original low-resolution glyphs, sprites, or textures. The removed Crisp 2D experiment made those assets harsher rather than genuinely clearer.

Does it support physical controllers?

Controller mappings and touch-overlay handoff are implemented through SDL2. A physical Kishi V2 has completed a longer iPad gameplay session using analog plus A/B/Z/L/R/Start. Deterministic reconnect coverage now protects player slots and held-input release, while D-pad, all C directions, physical reconnect/sleep, and iPhone controller behavior remain release checks.

Is the entire game verified?

No. Development testing covers the opening flow, early battles and progression, selected later-game fixtures, and targeted stability routes. A chapter-spanning/full-game regression and longer device soak remain open.

Project map

Path Purpose
apple/app/ UIKit lifecycle, setup, settings, diagnostics, touch UI, privacy manifest, and app metadata
src/ Native runner, input, renderer bridge, runtime hooks, paths, and generated-code integration
config/ N64Recomp configuration
vendor/paper-mario-recut Pinned maintained ReCut/runtime/compiler/RT64 source
patches/ Historical provenance only; mapped to maintained source commits
scripts/ Fetch, validate, generate, build, test-support, and repository-audit automation
docs/ Architecture, building, status, testing, dependencies, issues, and release documentation
ref/ Ignored pinned source and local reference inputs; never published
generated/ Ignored ROM-derived/AOT build input; never published

Documentation

Community and support

Join the Discord for help and news. It is one community for PaperPad and its sibling projects, such as KartPad, BlueWake and MeleePad: ask about setup, building with PadMint, and installing, share how it runs on your device, and hear about new releases first.

Found a bug? Open an issue with your device, its OS version, and the steps that led to it.

Credits and design references

PaperPad builds on work from pmret/papermario, Paper-Mario-ReCut, N64Recomp/N64ModernRuntime, RT64, mupen64plus-rsp-hle, SDL, zstd, and their contributors.

Its phone/tablet layout, persistent menu, modal input lifecycle, and customization model are adapted from HarkinianPad. PaperPad retains its own SDL2/N64 input bridge and does not copy another project's controller patch: physical controller acceptance, HarkinianPad's hold-to-latch Z gesture, and per-control gameplay VoiceOver elements remain open or intentionally separate.

Legal

PaperPad is an independent, unofficial project and is not affiliated with or endorsed by Nintendo or any upstream project. Paper Mario and all related game names, characters, copyrights, and trademarks belong to their respective owners. Every dependency retains its own license and rights boundary; the combined tree should not be described as carrying a single blanket license. See RIGHTS_AND_LICENSES.md and docs/DEPENDENCIES.md. Neither document is legal advice.

About

Paper Mario 64, native for Mac, iOS, and iPadOS.

Topics

Resources

Contributing

Security policy

Stars

38 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages