A goalkeeper who denies your terminal access. Renders a random image from a folder as terminal pixels.
Project description
keeper
A terminal tribute to Vozinha -- the 40-year-old Cape Verde goalkeeper who went viral at the 2026 World Cup for denying everyone. Spain, Messi, all of them. Blocked.
keeper renders Vozinha (or any image you throw at it) as ASCII art in your terminal, then slams an ACCESS DENIED screen. Because that's what he does literally.
It also works as a Claude Code hook that blocks dangerous shell commands before they run. Vozinha doesn't care who you are. He dives full-stretch and denies you.
Install
pip install vozinha-keeper
Usage
keeper # ASCII art, center-cropped at width 90, + ACCESS DENIED
keeper --style color # truecolor half-block, looks like a photo
keeper --style mono # green phosphor retro terminal
keeper --no-crop # render the full frame instead of cropping
keeper -w 120 # wider render
keeper --demo # compare all 3 styles side by side
Works out of the box. Ships with bundled sample images so there's something to render on a fresh install.
Add your own images
keeper --add some_photo.jpg # copies into ~/.keeper/images
export KEEPER_IMAGES=~/Pictures/vozinha # or point at a whole folder
keeper --dir ~/Pictures/keepers # one-off folder
It picks a random image from the pool each run. The pool checks (in order): --dir flag, $KEEPER_IMAGES env var, ~/.keeper/images, bundled samples.
Claude Code hook
This is the real use case. Keeper runs as a PreToolUse hook in Claude Code. Before Claude executes a shell command, Vozinha inspects it. If it matches a dangerous pattern -- rm -rf, force-push to main, chmod 777, fork bombs, DROP TABLE -- the keeper dives in and blocks it. Exit code 2. Command denied. Safe commands pass through untouched.
One-command setup
keeper --install-hook # writes to ~/.claude/settings.json
keeper --install-hook --project # or ./.claude/settings.json for this repo only
Remove it:
keeper --uninstall-hook
Try it locally without Claude Code
keeper --simulate # demo reel: safe + dangerous commands
keeper --simulate "rm -rf ./build" # blocked
keeper --simulate "npm test" # allowed
Manual hook setup
If you prefer to set it up yourself, add this to your ~/.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"/path/to/python\" -m keeper --hook"
}
]
}
]
}
}
Find your python path with python -c "import sys; print(sys.executable)".
What gets blocked
The danger patterns live in keeper/cli.py. Current list:
rm -rf(recursive force delete)sudo rmgit push --forceto main/masterchmod 777mkfs(format disk)dd if=(raw disk write)- Redirects to
/dev/sd* - Fork bombs
DROP TABLE
Edit the DANGER list to add your own.
Render styles
- ascii (default) -- brightness-ramp characters tinted with pixel color. Clean subjects look great. This is what the hook uses.
- color -- truecolor half-block. Two pixels per character cell. Busy photos with lots of detail work best here.
- mono -- green phosphor brightness ramp. Retro CRT look. Works on any terminal.
Center-crop at width 90 is the default -- the sweet spot for most images. Pass --no-crop to render the full frame, or -w to change the width.
About
Built as a fun weekend project after watching Vozinha deny everything at the 2026 World Cup. The man is 40 years old and he's out there making saves that have no business being made.
This is a tribute. Nothing official, just a fan who thought it would be funny to have a goalkeeper blocking your terminal commands.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vozinha_keeper-0.1.0.tar.gz.
File metadata
- Download URL: vozinha_keeper-0.1.0.tar.gz
- Upload date:
- Size: 137.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ec441a07c262179530fbe7352318529a9b9d840b63d8e7de84250feca56e391
|
|
| MD5 |
bcaf4ee53ad29a4e2f419d595eb068d2
|
|
| BLAKE2b-256 |
ba386053a2c35b5a7885a0fd59e6c4a48bd45bcc16cf691a0558136bd138cd37
|
Provenance
The following attestation bundles were made for vozinha_keeper-0.1.0.tar.gz:
Publisher:
publish.yml on pranavkumaarofficial/keeper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vozinha_keeper-0.1.0.tar.gz -
Subject digest:
0ec441a07c262179530fbe7352318529a9b9d840b63d8e7de84250feca56e391 - Sigstore transparency entry: 2077925391
- Sigstore integration time:
-
Permalink:
pranavkumaarofficial/keeper@e2cc8176839b9736a6f3417ff5844b2a83a21f70 -
Branch / Tag:
- Owner: https://github.com/pranavkumaarofficial
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e2cc8176839b9736a6f3417ff5844b2a83a21f70 -
Trigger Event:
release
-
Statement type:
File details
Details for the file vozinha_keeper-0.1.0-py3-none-any.whl.
File metadata
- Download URL: vozinha_keeper-0.1.0-py3-none-any.whl
- Upload date:
- Size: 136.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ca6b12d66a48ac0c493b6884640df7b06b556243c76e5d962b3569c5c7955cf
|
|
| MD5 |
9d85a6351d919ee6535d8366466c6a70
|
|
| BLAKE2b-256 |
d7457cd77ba06e31f77990aa9004a3e4ccd756ed45af0c20e8d48079d719a1aa
|
Provenance
The following attestation bundles were made for vozinha_keeper-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on pranavkumaarofficial/keeper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vozinha_keeper-0.1.0-py3-none-any.whl -
Subject digest:
4ca6b12d66a48ac0c493b6884640df7b06b556243c76e5d962b3569c5c7955cf - Sigstore transparency entry: 2077925768
- Sigstore integration time:
-
Permalink:
pranavkumaarofficial/keeper@e2cc8176839b9736a6f3417ff5844b2a83a21f70 -
Branch / Tag:
- Owner: https://github.com/pranavkumaarofficial
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e2cc8176839b9736a6f3417ff5844b2a83a21f70 -
Trigger Event:
release
-
Statement type: