borse
borse is a terminal program meant to practice reading braille, Morse code, and semaphore, which are common encodings for puzzle hunts. Also supports A1Z26 practice.
Usage
uvx borse
Or you can install from PyPI by using uv, pip, etc.
Configuration
Configuration is stored in ~/.config/borse/config.toml by default, e.g.
progress_file = "~/.config/borse/progress.json"
words_per_game = 15
single_letter_probability = 0.3
Your daily progress is also automatically saved and displayed on the main menu.
Hints for memorizing the encodings
Actually this is a note-to-self.
Remembering braille
For Grade 1 (just the letters A-Z),
the chart on Wikipedia
is helpful!
The trick is to memorize just the first 10 symbols for A-J,
which only use the upper four dots.
That's because K-T are the same as A-J with one extra dot,
while UVXYZ are A-E with one extra dot.
Remembering Morse code
In Morse code, the most frequent letters are shorter. So I think it's a lot easier to remember Morse code as a binary tree, since the common letters will all be towards the top. I found this picture on the Internet:
I think the dot looks like 0 and a dash looks like a (rotated) 1, so it makes sense to me that dots are in the left of the tree.
Then you can just memorize the letters in each row in order. Here are some terrible mnemonics I made up that worked for me for the first three rows (you're on your own for the last one):
ET: Eastern Time, or a 1982 movieIANM: I Am Not MadSURWDKGO: SuperUser ReWrote DynamicKernel in GO
(Also, surwdkgo is also the name of a
Taiwanese CodeForces grandmaster.)
If you're learning Morse code for actual usage rather than puzzle hunt usage (meaning you plan to hear the sounds, not see them in a hunt spreadsheet) then in fact you need to practice with the sounds and not the visuals. It's simply too slow to try to remap sounds visually at 20+ WPM; you need to hear the letter directly from the audio. (In fact I think people don't even count the dits and dashes, they just hear the letter automatically.) So really in this case you should be using a real training rather than my silly puzzle hunt hobby project, e.g. https://lcwo.net/.
Remembering semaphore
If you look at a semaphore chart,
what you'll find is that there are some groups of adjacent letters
that just differ in one hand rotating clockwise.
For example, the letters from A-G are obtained
by fixing one arm at 6 o'clock and rotating the other arm
all the way from 7:30 to 4:30.
So in my head, I organize the letters in "blocks", where each block starts with two arms at a 45-degree angle, and then having the other arm rotate clockwise. The resulting blocks are then easier to remember:
- A block:
ABCDEFG - H block:
HIKLMN(noteJis missing) - O block:
OPQRS - T block:
TUY(note the additionalY) - # block:
#JV(this is the weird exceptions one) - W block:
WX - Z block:
Z
I don't know if A HOT #WZ means anything to you.
Development
Set up by cloning the repository and running
uv sync
uv run prek install # pre-commit hooks
To manually run the linter and tests:
uv run prek --all-files # run linter
uv run prek --all-files --hook-stage pre-push
Rust port
Dean Menzenes maintains a Rust port named borse-rs.
FAQ
-
Where does the name come from?
From
Braille mORse SEmaphore. -
Should "braille" be capitalized?
No.
-
Why would you spend time learning this?
It could be a great conversation starter for a first date…
Metadata
Release files for borse 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| borse-0.7.0.tar.gz | 128.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| borse-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 180.7 kB
Release files / borse-0.7.0.tar.gz
| Download URL | borse-0.7.0.tar.gz |
|---|---|
| Size | 128.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7f02392aab05382a1c538c102f054a2f6ec39233a31629163c6d3753d912a9e0
|
|
BLAKE2b-256 checksum How to use checksums |
497b11bf2471f186705ad8c90d22faefde6383959b86867c70c7bfa333d0e2a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.
Transparency logRelease files / borse-0.7.0-py3-none-any.whl
| Download URL | borse-0.7.0-py3-none-any.whl |
|---|---|
| Size | 52.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0ef0f7142e09503cb2ee97704123fe10491f277b93e913861c180ceebb460fb1
|
|
BLAKE2b-256 checksum How to use checksums |
09da3dcda57c81172c6675cbf6fbac09b466c97fe14512c1d17e7f855a7e53f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.
Transparency log