Skip to main content

Learn the keyboard shortcuts for common apps

Project description

keypal

Spaced-repetition practice for keyboard shortcuts in your terminal. Build muscle memory for the shortcuts you actually use, scheduled with FSRS.

Why a TUI?

  • Browsers can't capture most shortcuts. Browsers intercept Ctrl+W, Ctrl+T, Ctrl+N, Ctrl+Q, etc. at the OS level before JavaScript sees them.
  • A raw-mode terminal captures almost everything. Ctrl+A, Ctrl+E, Ctrl+K, Alt+F, even Ctrl+C come through.
  • Distribution is simple. One CLI install. No packaging headaches.

Install

uv tool install keypal

Or run without installing:

uvx keypal

To run from source (you may need to uv tool install rust-just first):

git clone https://github.com/treyhunner/keypal
cd keypal
uv sync
just run

Built-in packs

Pack What
readline Common bash / readline shortcuts (Ctrl+A, Alt+F, Ctrl+W, etc.)
python_repl Python 3.13+ REPL: F1/F2/F3 modes, Tab autocomplete, plus shared readline overlap
tmux Your live tmux config, parsed from tmux list-keys at startup
obsidian Your live Obsidian hotkeys, read from ~/.config/obsidian/.../hotkeys.json

The tmux and obsidian packs are hybrid: a curated list of common shortcuts with friendly descriptions, with your actual key bindings substituted in if you have customs. Change a binding in tmux or Obsidian, restart keypal, and the pack reflects it.

A shared_id mechanism lets shortcuts in different packs share the same FSRS card. Practice Ctrl+A in readline and it counts toward python_repl too (since the Python REPL uses readline under the hood).

Using the app

Home screen

Key Action
Arrow keys Navigate between packs
Enter Start practicing the highlighted pack
B Browse the highlighted pack (read-only cheat sheet)
S Stats (cards by FSRS state, per-pack progress)
D Diagnostic screen for testing what your terminal sends
Q Quit

In a quiz session

Key Action
(the shortcut) Submit your answer
Space "I don't know" (treated as wrong)
Enter Continue after a correct answer
Y After wrong: claim "I actually had it right" and save it as an alias
F4 Skip this shortcut forever (won't appear in future sessions)
Esc Back to home

After a correct answer, three dots fill in left to right over three seconds, then auto-advances. Press Enter any time to skip the wait.

After a wrong answer

You'll see what you pressed (red), the expected combo (green), and a hint with your options. Press the correct combo to advance with practice credit, or use the keys above to skip / claim correct / dismiss.

Storage

Your data lives in ~/.local/share/keypal/ on Linux (platform-equivalent elsewhere via platformdirs):

  • cards.json: FSRS state for each shortcut you've practiced
  • review_log.jsonl: append-only log of every review
  • aliases.json: terminal-mistranslation aliases you've taught keypal
  • disabled.json: shortcuts you've dismissed with F4

Override the location with the KEYPAL_DATA_DIR environment variable.

Limitations

  • Some Ctrl combos are byte-equivalent to other keys in terminals: Ctrl+H ≡ Backspace, Ctrl+I ≡ Tab, Ctrl+M ≡ Enter, Ctrl+[ ≡ Esc. keypal accepts both forms automatically.
  • Your terminal emulator may eat some shortcuts before they reach keypal (GNOME Terminal binds Ctrl+Shift+F to Find, for example). Use the diagnostic screen (D) to confirm. Fix in your terminal's preferences.
  • Inside tmux, shortcuts that conflict with your tmux prefix won't reach keypal unless you opt in to the per-pack prefix swap (offered automatically when you enter the tmux pack).
  • Keys that physically exist on the keyboard but aren't in keypal (rare combos, complex chords beyond two keys) need to be added to a pack manually.

Contributing

See AGENTS.md for code conventions, project layout, and common gotchas.

just qa     # format + lint + test
just test   # tests only

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

keypal-0.1.0.tar.gz (24.3 kB view details)

Uploaded Source

Built Distribution

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

keypal-0.1.0-py3-none-any.whl (31.7 kB view details)

Uploaded Python 3

File details

Details for the file keypal-0.1.0.tar.gz.

File metadata

  • Download URL: keypal-0.1.0.tar.gz
  • Upload date:
  • Size: 24.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for keypal-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d81cd9a68e2cfb07f72daca87e2f9a661092d352ed24cfe3fe568235e4981d6e
MD5 5de27c8d0bba5a7e38722659db767c00
BLAKE2b-256 a17018fbfb3f760d978cd8c508eaee0347249fec85f01e75c7428f4217ba9f53

See more details on using hashes here.

File details

Details for the file keypal-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: keypal-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 31.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for keypal-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3653537f0c927c5219a2cf480140fc2e460f7657e4a23d0472973345b2cc58f9
MD5 2f56466ce8fb691616d582695d1824bf
BLAKE2b-256 77f0bdc7c7c79e1c47bf6935c9303478646b15d4b3cbe4242725534a759cc74f

See more details on using hashes here.

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