fuck-your-markdown
Fuck your markdown. Ship checks that actually fucking run.
Your coding agent fixed a typo and left you IMPLEMENTATION_PLAN.md,
PHASE_2_SUMMARY.md and REFACTOR_COMPLETE.md. Congratulations. The repo has
more paperwork than working software.
fym is a small CLI that calls this shit out. It flags stray Markdown and agent
instruction files, reads what they say, and suggests where enforceable rules
belong: tests, linters, type checks, scripts and CI.
“Please respect the architecture” is a wish. An architecture test is a boundary. “Keep it fast” measures fuck all. Write a benchmark.
No API keys. No model calls. No files changed. Just a failing exit code and some strongly worded advice.
What gets bollocked
Two filename rules identify offences; their contents determine suggested replacements.
- Markdown outside
docs/fails. - Markdown named like agent slop fails wherever it lives, including inside
docs/.SPEC.md,IMPLEMENTATION_PLAN.md,phase-2-summary.md,REFACTOR_COMPLETE.md,CLAUDE.md,AGENTS.md,SKILL.mdand friends, at any depth.
README.md, CONTRIBUTING.md, CHANGELOG.md and LICENSE.md are spared.
Recursive scans skip hidden files, hidden directories and node_modules/ at any
depth. Those dependencies have enough fucking problems. Explicit file or directory
arguments can still be checked directly.
Skill bundles are an exception to hidden-directory exclusion: skills/ under
.agents, .claude, .codex, .cursor, .github, .gemini, .opencode,
.windsurf, .roo and .kilocode is scanned, including reference Markdown.
Other directories under those namespaces remain excluded. YAML frontmatter is
ignored when suggesting replacements; body line numbers are preserved.
Install
Requires Python 3.13+.
Run it without adding a project dependency:
uvx --from fuck-your-markdown fym
Or install it as a tool:
uv tool install fuck-your-markdown
# pip works too
pip install fuck-your-markdown
For a project development dependency:
uv add --dev fuck-your-markdown
uv run fym
Usage
fym
fym src tests
fym --docs documentation
fym --allow README.md --allow CONTRIBUTING.md
fym --agent
Exit code is 1 on any offence, 0 otherwise. Passing --allow replaces the spared list rather than adding to it. Slop names are checked before the allow list, so you cannot whitelist a plan.
Diagnostics go to stderr. A clean run says nothing. A dirty one has words.
Architecture tests
Put the boundaries in architecture tests. The diagram isn't going to enforce itself, is it?
CLAUDE.md:3,12
Linters / ast-grep
Put it in a linter or ast-grep rule. Stop asking nicely and make the bloody thing fail.
CLAUDE.md:5
Both modes group by replacement type. Terminals get bold headings, bright feedback,
cyan paths and yellow line references. Redirected output is plain; NO_COLOR is respected.
Agent mode
fym reads flagged files in both modes. --agent swaps the swearing for neutral,
actionable guidance, with the same replacement groups and file and line references.
Apparently the robots need a fucking HR department. Repeated matches in a file share one entry.
It recognises architecture, style, typing, contracts, security, performance,
accessibility, environment setup, documentation requirements and commit conventions.
Commands can be fenced, inline or plain text. Topic-only headings are referenced
when no specific requirement is found underneath; filenames alone do not trigger
recommendations. --agent keeps the same groups with neutral guidance.
Architecture tests
Enforce the cited import boundaries and file placement with architecture tests.
CLAUDE.md:3,12
design.md:7
Linters / ast-grep
Encode the cited conventions as linter or ast-grep rules with passing/failing fixtures.
CLAUDE.md:5
Reuse existing checks. Verify they catch violations before removing the cited prose.
Matching is local and heuristic, with no model calls. Unrecognised content gets an explicit review message instead of invented requirements. Unreadable files are reported without stopping the remaining analysis. The command does not edit files. Implement and verify the suggested checks before removing the corresponding prose; preserve useful human context in the configured docs directory.
The matchers draw on an empirical instruction-file taxonomy and public examples; see research notes for sources and limitations.
Paths, --docs, --allow and exit codes work as usual. Clean runs remain silent.
Make it fail in CI
uvx --from fuck-your-markdown==0.1.0 fym
For pre-commit, use a local hook. Scan the whole repo so files hidden in a quiet corner still get their bollocking:
repos:
- repo: local
hooks:
- id: fym
name: Fuck your markdown
entry: fym
language: python
additional_dependencies: [fuck-your-markdown==0.1.0]
pass_filenames: false
always_run: true
Keep the useful shit
This is deliberately opinionated. A filename is a policy trigger, not proof that the document is worthless. The content matcher is heuristic; read the suggestions before acting on them.
Keep explanations humans need in docs/. Turn enforceable requirements into
checks. Verify those checks catch a real violation. Then delete the redundant
fucking prose.
Development
uv sync
uv run --with pytest pytest
uv build --no-sources
Source and issues: github.com/benomahony/fuck-your-markdown.
Metadata
Release files for fuck-your-markdown 0.1.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 | Provenance | Actions |
|---|---|---|---|---|
| fuck_your_markdown-0.1.0.tar.gz | 9.3 kB | With provenance | Details for fuck_your_markdown-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fuck_your_markdown-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for fuck_your_markdown-0.1.0-py3-none-any.whl |
Total release size: 19.9 kB
Release files / fuck_your_markdown-0.1.0.tar.gz
| Download URL | fuck_your_markdown-0.1.0.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3c58d1889dc9fc27efc86c72d4509ff9a84e01083bf391cc80d40578377c52ff
|
|
BLAKE2b-256 checksum How to use checksums |
958ed6c7db246babdeabe8a2ba390a8d6c88bd18a2e0ec03e7a30468dd5263cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 23, 2026.
Transparency logRelease files / fuck_your_markdown-0.1.0-py3-none-any.whl
| Download URL | fuck_your_markdown-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c41e986d59d3b4fe22bc0f7625b58e3b04267f1f23443be371ae5afe4f2417fc
|
|
BLAKE2b-256 checksum How to use checksums |
6215efe9260cff65af1fd51c8ae216fd1308b171243160d60135e22a67629433
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 23, 2026.
Transparency logSecurity for fuck-your-markdown 0.1.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for fuck_your_markdown-0.1.0.tar.gz
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 Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.