documentation

Thumble app guide.

Everything needed to set up Thumble, connect your iPhone to your Mac, customize keypad layouts, use the CLI, and delegate configuration to an AI agent.

Thumble Mac keypad editor showing a layout canvas and inspectors
Thumble iPhone landscape keypad

overview

What Thumble does

Thumble turns an iPhone into a programmable control surface for a Mac. The macOS helper hosts a local pairing server, stores keypad profiles, and sends keyboard, pointer, or virtual gamepad output to the focused app. The iOS app displays the synced keypad and sends low-latency button, joystick, trigger, and trackpad input over your local network or a nearby peer-to-peer path.

macOS

Helper + editor

Grant Accessibility, pair iPhones, manage profiles, record shortcuts, and edit each keypad visually.

iOS

Touch controller

Use synced profiles, switch setups, export keypads, toggle haptics, and make quick freeform layout edits.

CLI

Scriptable parity

Generate, import, export, select, bind, inspect, and test keypads from the terminal.

requirements

What you need

  • macOS 14 or newer running Thumble Mac.
  • iOS 17 or newer running Thumble on iPhone.
  • Same local network or nearby peer-to-peer for Smart Connect, QR pairing, and realtime input.
  • Accessibility permission on Mac so Thumble can inject keyboard and pointer events.
  • Local Network permission if iOS or macOS prompts for it.
  • Camera permission on iPhone only if you scan the Mac QR code.

setup

First-run setup

  1. Open Thumble Mac.

    The Home screen shows readiness for Accessibility, the helper server, and iPhone pairing. A first-run setup guide walks through the same steps.

  2. Enable Accessibility.

    Click Request Accessibility Permission or Open Accessibility Settings, then enable Thumble Mac in System Settings → Privacy & Security → Accessibility.

  3. Open Thumble on iPhone.

    The iOS onboarding explains Local Network and Camera prompts. Tap Smart Connect, or use Scan Mac QR Code if this is the first pairing. For airplane/offline use, keep Wi‑Fi and Bluetooth enabled after enabling Airplane Mode so peer-to-peer discovery can run.

  4. Pair securely.

    Scan the QR code on the Mac, or manually enter a displayed ws://<mac-ip>:<port> address. If prompted, type the six-digit code shown on Thumble Mac.

  5. Focus the target Mac app.

    After pairing, Thumble controls whichever Mac app is currently focused. Use Release All if a key ever feels stuck.

mac app

Home, Keypad, and Settings

The Mac app is the source of truth for saved keypads and bindings. It runs the server, displays QR and manual pairing information, previews the active keypad, and exposes diagnostics.

Home

Use Home to check readiness, copy the pairing code, scan QR from the iPhone, switch profiles, make a setup the default, and perform quick local shortcut tests.

Keypad

Use Keypad to visually edit layouts, manage profiles, record shortcuts, configure output mode, and sync changes to the connected iPhone.

Settings

Use Settings for appearance defaults, input diagnostics, local addresses, server restart/stop, and advanced connection troubleshooting.

Thumble Mac Keypad editor
Mac Keypad editor with setup list, canvas, and inspector.

ios app

Connection screen and controller screen

The iOS app starts on a connection screen unless it can reconnect to a trusted Mac or show a saved keypad offline.

Connection screen

Use Smart Connect for remembered Macs, scan a Mac QR code for first-time pairing, or manually enter host and port. You can also view the last synced keypad when offline.

Controller screen

The top bar shows connection status, the active keypad setup, edit lock, haptics and appearance settings, export actions, and Disconnect. Swipe down from the top edge if the bar is hidden.

Offline saved keypad

After a successful sync, iPhone can display saved profiles even when Thumble Mac is closed. Input only controls the Mac while connected.

Thumble iPhone portrait keypad
Portrait keypad with synced controls and top bar actions.

editor

Build a keypad setup

A setup is a saved profile containing layout, output mode, bindings, colors, haptics, style tokens, assets, and per-orientation variants. Edits on Mac save automatically and sync to the paired iPhone.

profiles

Setups and templates

Create, duplicate, delete, switch, import, export, and mark defaults. The active setup is sent to the iPhone and can be changed from either device.

canvas

Device frames

Match the editor to the connected iPhone, choose any supported iPhone display class, or use a custom canvas size. Portrait and landscape variants are saved separately.

layout

Controls and grid

Add buttons, joysticks, triggers, and trackpads. Drag on the canvas, nudge, align, distribute, layer, group, and use snap/grid preferences for precision.

design

Styles and haptics

Customize fills, strokes, pressed states, icons, glows, reusable style tokens, background fills, gradients, image fills, and per-control haptic patterns.

Typical editor workflow

  1. Choose a setup.

    Start from the default keypad, install a template, or generate/import a profile.

  2. Pick the device canvas.

    Use the connected iPhone frame or choose a model and orientation manually.

  3. Place controls.

    Add controls, resize them, and test hit targets with the preview.

  4. Record outputs.

    Select a control, click the shortcut field, press the desired Mac keystroke sequence, and pause to save.

  5. Sync and test.

    Connect the iPhone, focus the target Mac app, and press controls. Use Release All if you change apps mid-press.

skins

Browse, install, and create visual themes

Thumble skins are shareable .pocketpad packages for appearance only. They can style backgrounds, native controls, icons, materials, pressed states, light/dark modes, and portrait/landscape variants. They cannot replace your geometry, labels, keyboard shortcuts, controller bindings, pointer actions, launch targets, or accessibility.

browse

Install from the directory

Open the Skin Directory, preview a theme, and tap Install. On iPhone, choose Thumble in the Share Sheet. On Mac, download the package and choose Import Skin from the Skins library.

review

Nothing applies silently

Thumble validates the archive and shows its creator, license, warnings, and visual preview before installation. Install stores it in your library; Install & Apply adds it to the selected keypad.

customize

Keep local overrides

Apply a skin as-is, customize its appearance while retaining a package reference, or fork the current result into a fully local look. Detaching never changes bindings.

sync

Available on both devices

Installed packages and required assets sync between trusted Mac and iPhone peers. Offline copies remain available for saved keypads and reconnect safely.

Create a directory-ready skin

Copy the starter under docs/skins/starter, give it a unique reverse-DNS identifier and semantic version, then use semantic roles such as movement, primary_action, menu, and trackpad instead of profile UUIDs.

cp -R docs/skins/starter MySkin
thumble skin validate MySkin
thumble skin pack MySkin -o MySkin.pocketpad
thumble skin validate MySkin.pocketpad --strict
thumble skin render MySkin.pocketpad --clean -o preview.png

Packages submitted to the public directory must pass strict validation, include a preview and license, use declared assets with SHA-256 hashes, and contain no executable files or profile bindings. See the repository’s complete format and security guide.

outputs

Keyboard, pointer, and controller output

Thumble can send multiple kinds of output depending on the selected profile and binding.

ModeUse it forNotes
KeyboardShortcuts, game keys, terminal workflows, app commandsRequires macOS Accessibility.
PointerTrackpad movement, clicking, right click, scrollingTrackpad controls inject CGEvent mouse and scroll events.
ControllerGames that recognize a system gamepadVirtual controller requires Apple-granted virtual HID entitlement.
CustomMixed keyboard + gamepad + pointer profilesBind each element or element part to the output you need.

Shortcut recording tips

  • Press Control + B to save a modifier combo like ⌃B.
  • Press a combo, release it, then press another key to create prefix sequences such as ⌃B H.
  • Modifier-only shortcuts save when you press and release the modifier key.
  • Use Default for one control or Reset All to restore starter bindings.

cli

Script Thumble with thumble

The CLI mirrors the saved-configuration features in the Mac Keypad editor and adds runtime helper commands for automation and debugging. Existing automation can continue using the thumbconsole and pocketpad compatibility executables.

If thumble is not already on PATH, build it from a source checkout to a predictable location:

xcodebuild -project Thumble.xcodeproj \
  -scheme ThumbleCLI \
  -destination 'platform=macOS' \
  -derivedDataPath build/DerivedData build
export PATH="$PWD/build/DerivedData/Build/Products/Debug:$PATH"
thumble --help
thumble profile list --ids
thumble template list
thumble template install snes --name "SNES Browser Controls" --default
thumble profile export --all -o thumble-profiles.json
thumble profile import thumble-profiles.json
thumble skin list
thumble skin import Aurora.pocketpad
thumble skin apply com.example.pocketpad.skin.aurora --profile active
thumble binding set focus --sequence 'Control+B,H'
thumble output mode keyboard
thumble element add joystick --label "Right Stick" --up custom1 --down custom2 --left custom3 --right custom4
thumble element set jump --label A --shape circle --width 1.2 --height 1.2

Runtime helper commands

thumble app open
thumble app screenshot -o /tmp/thumble-window.png --json
thumble status --json
thumble server restart
thumble pairing payload
thumble accessibility status
thumble test tap jump
thumble release-all

When Thumble Mac is running, CLI profile, customization, and binding changes are pushed to the app via distributed notifications and then synced to the paired iPhone. app screenshot captures only the largest visible Thumble window without activating the app or sending input events; it requires Screen Recording access for the terminal or agent host.

ChatGPT controller builder

Create a controller in conversation, approve it in Thumble

The public Thumble Controller Builder plugin creates portable controller drafts without connecting to your Mac. You do not need developer mode, a terminal, an MCP configuration file, or the alternate Rust host.

  1. Describe.

    Tell ChatGPT the game or workflow, semantic Mac keys, orientation, and desired layout.

  2. Preview.

    Review the controller rendered in ChatGPT and ask for revisions until the layout and bindings are right.

  3. Download.

    Approve the preview and ask for the short-lived .thumblecontroller download.

  4. Review locally.

    Open the file in Thumble Mac. Check every binding and layout finding, then choose Install as New Setup.

  5. Select when ready.

    The import preserves existing setups and does not select or default itself. Choose it manually when you want to use it.

thumble controller review Controller.thumblecontroller --json
thumble controller review Controller.thumblecontroller --preview-output preview.png
thumble controller install Controller.thumblecontroller --yes

Artifacts contain semantic controls and key names only. They cannot include raw key codes, files, paths, images, credentials, application launch targets, shell commands, installed-profile operations, or input execution. Draft tokens expire after one hour and download links after ten minutes; ask ChatGPT to prepare a fresh download if needed.

See Create controllers in ChatGPT or controller import support.

ai agents

Tell an agent what you want, not how to click

Thumble includes a repository SKILL.md for terminal-capable agents. It explains how to choose between game generation, templates, targeted profile editing, layout repair, skin operations, and runtime diagnostics while avoiding unsafe UI automation.

1 · context

Give it the skill

Tell the agent to read the local SKILL.md, or install that file in the skill directory supported by your agent host.

2 · outcome

Describe the result

Name the game or app, important controls, preferred orientation, and whether the agent may install, select, or default the profile.

3 · evidence

Require verification

Ask for a dry-run or preview, layout validation, final bindings, confidence/source, and confirmation of what actually synced.

Copy this starter prompt

Read /absolute/path/to/Thumble/SKILL.md, then use the
thumble CLI to create a landscape keypad for Celeste.
Research the default Mac keyboard controls, inspect my profiles,
and dry-run before installing. Preserve unrelated profiles,
validate the final layout, and report the source, confidence,
bindings, whether it became selected/default, and whether sync
could be confirmed. Do not use UI automation.

The reliable agent loop

  1. Inspect.

    Run profile list, profile show active --json, and status --json before editing.

  2. Preview.

    Use generate --dry-run, layout validate, and layout preview when available.

  3. Apply.

    Make only the requested profile, binding, output, layout, or skin changes. Generation selects and defaults a profile unless the agent passes --no-select or --no-default.

  4. Verify.

    Re-read the saved profile and bindings, rerun layout checks, and distinguish saved configuration from confirmed iPhone sync or physical-device feel.

Safe boundaries to include

  • Use the CLI instead of clicking through the Mac or iPhone UI.
  • Use thumble app screenshot for visual checks; do not activate the app or send keyboard/mouse events.
  • Ask before launching apps, opening System Settings, triggering permission prompts, restarting the server, or sending test input.
  • Treat test tap|down|up as real output to the currently focused Mac app, and use release-all if a test is interrupted.
  • Inspect before deleting/resetting profiles, removing skins, clearing bindings, or replacing output modes. Export all profiles before a broad migration or reset.
  • For handcrafted community skins, require editable source, native-rendered review evidence, independent critique/QA, and explicit human approval before publication.

See the complete Using Thumble with an AI agent guide for reusable instruction-file snippets and copy-paste prompts for games, productivity pads, layout repair, diagnostics, and skin installation.

troubleshooting

Fix common setup issues

Smart Connect does not find my Mac

Make sure Thumble Mac is running, Local Network permission is allowed, and both devices are on the same Wi‑Fi network or have Wi‑Fi/Bluetooth enabled nearby for peer-to-peer. Use QR pairing as a fallback.

QR pairing fails

Confirm the iPhone camera permission is allowed. If the code still fails, manually enter one of the Mac helper's ws:// addresses and use the six-digit code shown on Mac.

Buttons press but nothing happens on Mac

Re-check Accessibility permission for Thumble Mac, then refresh the permission status in the app. Also confirm the target Mac app is focused.

A key feels stuck

Tap Release All in the iPhone settings menu, the Mac Home quick actions, or run thumble release-all. Thumble also releases held keys on disconnect, server stop, app background, and heartbeat timeout.

The virtual gamepad does not appear in games

Keyboard and pointer output work in normal builds. System-visible virtual controller output requires the app to be signed with Apple's com.apple.developer.hid.virtual.device entitlement.

safety

Local, authenticated, and recoverable input

  • Pairing uses a six-digit setup challenge and trusted reconnect token.
  • Input travels over the local network or nearby peer-to-peer; Smart Connect advertises as _pocketpad._tcp.
  • Button state transitions use compact authenticated UDP frames with WebSocket mirroring for recovery.
  • macOS releases held keys after heartbeat timeout, disconnect, server stop, manual Release All, and app quit.
  • iOS sends a best-effort Release All when disconnecting, backgrounding, or becoming inactive.

faq

Frequently asked questions

Is Thumble only for games?

No. It works well for games, but it is also useful for terminal shortcuts, tmux prefixes, Cursor commands, window management, browser actions, and any Mac app that accepts keyboard or pointer input.

Can I use it without the Mac app open?

The iPhone can view saved keypads offline, but controlling the Mac requires Thumble Mac to be running and connected.

Can I back up my layouts?

Yes. In Thumble Mac, open the Keypad editor's Export menu and export the current setup or all setups as JSON. You can also export from iPhone or use thumble profile export --all from the CLI. Imports use the same versioned Thumble keypad configuration envelope.

Can I make game-specific profiles?

Yes. Install templates, generate a profile from a known game, or create an agent-provided JSON spec and import it with the CLI.

Can a downloaded skin change what my buttons do?

No. Skin packages are appearance-only. Thumble rejects profile content and executable assets, and applying a skin preserves your local geometry, labels, bindings, launch targets, and accessibility.