A flake8 plugin that checks your code's vibes, not just its syntax.
Project description
flake8-vibes
A Flake8 plugin for the emotional and spiritual correctness of your Python code.
Overview
flake8-vibes is a Flake8 plugin that performs vibe analysis on your codebase. Unlike traditional linters that concern themselves with correctness, style, or performance, flake8-vibes focuses on what really matters: whether your code is okay (emotionally).
Your code can be PEP 8 compliant, fully typed, and 100% test-covered while still being, energetically speaking, a disaster. This plugin surfaces those issues.
It integrates via Flake8's standard entry point system, ships a vibe-check CLI for full codebase readings, and produces violation messages that are specific, accurate, and not particularly gentle.
Key Features
| Feature | Vibe |
|---|---|
| 87 rules, 17 categories | naming crimes, boolean chaos, exception dishonesty, complexity, hardcoding, docstring energy, temporal risk, and more |
| Git-aware | git blame tells VIB001 exactly who wrote that function on a Thursday |
vibe-check CLI |
per-file scores, verdicts, and a final reckoning |
| Standard Flake8 | flake8 --select=VIB — works with your existing config and CI |
| Randomised messages | every rule picks from 2+ options, so the shame stays fresh |
| VS Code extension | squiggles and inline judgment without leaving the editor |
| Pre-commit hook | the vibe score lives in your git history, forever |
Rules
A highlight reel. → Full rules reference
VIB001 thursday-energy — flags functions over 20 lines authored on a Thursday, as identified by git blame. Thursdays are a liminal space: too close to Friday to think clearly, too far from Monday to care.
'process_invoice_batch' is 34 lines of pure thursday hubris. we felt it. the diff felt it.
VIB002 todo-shame — a TODO is a dream with a comment attached. A FIXME is a bug with good self-awareness. Acknowledging a problem and solving it are not the same thing.
this TODO has survived more sprints than some of your teammates
FIXME: acknowledged, unaddressed, unforgiven, and now publicly humiliated
VIB013 naming-crime — data, result, info, stuff, obj. A variable named data is a box labelled "box."
`data` holds everything and describes absolutely nothing. a true void.
VIB018 final-hubris — nothing named final_ is final. It will be changed twice before lunch.
`final_result` — the hubris of `final` in a variable name that will be changed twice before lunch.
VIB041 magic-number — a bare integer in a comparison tells you the value, not the meaning. >= 5 means nothing. >= MAX_RETRIES means everything.
magic number 5: a constant that knows its value but not its purpose.
VIB081 boolean-chaos — == True when you already have a boolean. What more do you need.
None is a singleton. you don't compare singletons with `==`. this is non-negotiable.
Demo
$ vibe-check ./src
Scanned 8 file(s)
Total violations: 7
Per-file breakdown:
src/app.py ████████░░ 82/100 decent energy
src/utils.py ██████░░░░ 61/100 concerning
src/models/user.py █████████░ 91/100 slaying
src/models/manager.py ████░░░░░░ 43/100 chaotic
src/config.py ██████████ 100/100 immaculate
src/auth.py ███████░░░ 74/100 decent energy
src/tasks.py ████████░░ 80/100 decent energy
src/helpers.py ██████████ 100/100 she ate and left no crumbs
Vibe score: 71/100
Verdict: decent energy
In the Wild
We ran vibe-check across 12 of the most beloved Python repos. No one was ready.
| Repo | Files | Violations | Score | Verdict |
|---|---|---|---|---|
| django | 902 | 8,801 | 51/100 | concerning |
| flask | 24 | 608 | 0/100 | cooked |
| fastapi | 48 | 1,066 | 0/100 | cooked |
| pandas | 1,414 | 56,653 | 0/100 | expired |
| scikit-learn | 631 | 26,277 | 0/100 | cooked |
| transformers | 2,476 | 54,012 | 0/100 | cooked |
| pip | 401 | 5,907 | 26/100 | this is a cry for help |
| ruff | 14 | 136 | 51/100 | the vibes are questionable |
| pytest | 73 | 1,734 | 0/100 | it's giving dumpster fire |
| bottle | 30 | 1,561 | 0/100 | cooked |
| requests | 18 | 413 | 0/100 | it's giving dumpster fire |
| rich | 100 | 1,552 | 22/100 | cooked |
Django is the only one that cleared 50. Ruff lints everything except, apparently, itself. Pandas has 56,653 violations, which tracks.
Installation
pip install flake8-vibes
Once installed, Flake8 picks it up automatically via entry points. No configuration required to get started.
Usage
Via Flake8:
flake8 --select=VIB your_file.py
Enable project-wide in setup.cfg or pyproject.toml:
[flake8]
extend-select = VIB
Full codebase reading via the CLI:
vibe-check ./src
Suppress a specific rule inline:
response_data = fetch() # noqa: VIB013
Contributing
You want all-green CI and the satisfaction of telling people you contribute to a linter. Valid. Here's the fastest way in.
The lowest-lift contribution is adding messages to an existing rule. Every rule picks from a list at random — more messages means more variety, less déjà vu, and more ways to make someone stare at their screen and reconsider their variable names.
Find the rule file in src/flake8_vibes/rules/, locate the _MESSAGES list, drop in a string, open a PR. The message needs to be lowercase, specific to the violation, and have actual opinions. "this could be improved" is not a message. It's a LinkedIn comment. Rewrite it.
# src/flake8_vibes/rules/boolean_chaos.py
_EQUALS_TRUE_MESSAGES = [
"comparing to `True` explicitly is a trust issue with your own type system and honestly? it shows.",
"`== True` — you already have a boolean. what are you waiting for. use it.",
# yours goes here. make it count.
]
No new files. No registration. No tests to write. Just a string with a spine.
Want to go deeper — new rules, fixes, changes to how the plugin works? That's in CONTRIBUTING.md. It has opinions too.
Documentation
flake8-vibes does not make claims about your mental health, work-life balance, or professional conduct. It makes claims about your code. These are different things, mostly.
This project was inspired by scx_horoscope and built using Claude.
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
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 flake8_vibes-0.1.3.tar.gz.
File metadata
- Download URL: flake8_vibes-0.1.3.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f513f3d46e26be3e63b42b34ec8f401be930c7b394b6aa9a4d4674915005162
|
|
| MD5 |
6837dbc39a3f2625d67fc1a172c8fa18
|
|
| BLAKE2b-256 |
18b77e0957c114ebd9fcd8364d28a3f696f34e0e271d28fd0dd1cf0582d37594
|
Provenance
The following attestation bundles were made for flake8_vibes-0.1.3.tar.gz:
Publisher:
publish.yml on DannyIsYog/vibe-checker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flake8_vibes-0.1.3.tar.gz -
Subject digest:
5f513f3d46e26be3e63b42b34ec8f401be930c7b394b6aa9a4d4674915005162 - Sigstore transparency entry: 1046168954
- Sigstore integration time:
-
Permalink:
DannyIsYog/vibe-checker@a6a944f69633807ab624c0030c6693a824b0d823 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/DannyIsYog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a6a944f69633807ab624c0030c6693a824b0d823 -
Trigger Event:
release
-
Statement type:
File details
Details for the file flake8_vibes-0.1.3-py3-none-any.whl.
File metadata
- Download URL: flake8_vibes-0.1.3-py3-none-any.whl
- Upload date:
- Size: 54.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0003a3d7fa031be0f7f760228c8e211c1726a816d65217f333a261dad45d0e32
|
|
| MD5 |
2113c13292bb1aeec68adc36f53dc492
|
|
| BLAKE2b-256 |
0204825397ae64c6710472302f9a6ac07f4122a0c9fdb02dca0a188ccd7c8200
|
Provenance
The following attestation bundles were made for flake8_vibes-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on DannyIsYog/vibe-checker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flake8_vibes-0.1.3-py3-none-any.whl -
Subject digest:
0003a3d7fa031be0f7f760228c8e211c1726a816d65217f333a261dad45d0e32 - Sigstore transparency entry: 1046169004
- Sigstore integration time:
-
Permalink:
DannyIsYog/vibe-checker@a6a944f69633807ab624c0030c6693a824b0d823 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/DannyIsYog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a6a944f69633807ab624c0030c6693a824b0d823 -
Trigger Event:
release
-
Statement type: