Skip to main content

A goalkeeper who denies your terminal access. Renders a random image from a folder as terminal pixels.

Project description

keeper

image

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.

image

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 rm
  • git push --force to main/master
  • chmod 777
  • mkfs (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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vozinha_keeper-0.1.0.tar.gz (137.7 kB view details)

Uploaded Source

Built Distribution

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

vozinha_keeper-0.1.0-py3-none-any.whl (136.7 kB view details)

Uploaded Python 3

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

Hashes for vozinha_keeper-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0ec441a07c262179530fbe7352318529a9b9d840b63d8e7de84250feca56e391
MD5 bcaf4ee53ad29a4e2f419d595eb068d2
BLAKE2b-256 ba386053a2c35b5a7885a0fd59e6c4a48bd45bcc16cf691a0558136bd138cd37

See more details on using hashes here.

Provenance

The following attestation bundles were made for vozinha_keeper-0.1.0.tar.gz:

Publisher: publish.yml on pranavkumaarofficial/keeper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for vozinha_keeper-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ca6b12d66a48ac0c493b6884640df7b06b556243c76e5d962b3569c5c7955cf
MD5 9d85a6351d919ee6535d8366466c6a70
BLAKE2b-256 d7457cd77ba06e31f77990aa9004a3e4ccd756ed45af0c20e8d48079d719a1aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for vozinha_keeper-0.1.0-py3-none-any.whl:

Publisher: publish.yml on pranavkumaarofficial/keeper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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