




![]() |
![]() |
|---|---|
A Bruce app for hackers, tinkerers and lock nerds.
Decode and randomly generate key bitting patterns for a bunch of lock brands.
Visualize the cuts, tweak the pins, and save/load your keys.
This app is designed for Bruce Interpreter compatible devices with screen 170x320:
| Tested | Brand | Pin Options |
|---|---|---|
| ✔️ | ASSA | 5, 6, 7 pins |
| ✔️ | Abloy Classic | 7, 9, 11 disks |
| ✔️ | Abloy High Profile | 7, 9, 11 disks |
| ✔️ | American | 5, 6 pins |
| ✔️ | Best | 7 pins |
| ✔️ | Corbin Russwin | 5 pins/RU45, 6 pins/CX6A |
| ✔️ | Kwikset | 5 pins |
| ✔️ | Master | 4, 5 pins |
| ✔️ | Medeco Biaxial | 6 pins |
| ✔️ | Schlage | 5 pins/SC1, 6 pins/SC4 |
| ✔️ | Titan | 5, 6 pins |
| ✔️ | Yale | 5 pins |
| ✔️ | Yale Small | 4, 5 pins |
KeyDecoding.js onto your Bruce deviceKeys are saved as JSON in /keys/:
{
"type": "Titan",
"outline": "5 pins",
"pins": [ 3, 5, 2, 7, 4 ]
}
KeyExample: {
displayName: "Key Example", // display name shown in menu
isDiskDetainer: false, // whether the key is a disk detainer type (default false)
bladeHeight: 45, // blade height for disk detainer keys (default 45)
outlines: ["5 pins", "6 pins"], // number of pins
pinSpacing: 31, // distance between pins (default 31)
maxKeyCut: 9, // number of cuts (default 9)
flatSpotWidth: 5, // width of flat spot of the cut (default 5)
cutDepthOffset: 5, // depth offset of each cut (default 5)
zeroCutOffset: 0, // depth offset of zero cut (default 0)
edgeOffsetX: 0, // x offset of the bottom-right diagonal (default 0)
edgeOffsetY: 0, // y offset of the bottom line (default 0)
pinsStartAtZero: false, // whether pin numbers start at 0 or 1 (default false)
pinNumbersOffset: 0 // x offset for pin numbers with underline (default 0)
}
For educational, CTF and red team use only.
Don't break the law. Don't be a jerk.
$ claude mcp add key-decoding \
-- python -m otcore.mcp_server <graph>