Content Gate Kit — free sample
The check no prose linter does: did I already publish this, in different words?
Vale, textlint, proselint and alex all lint one document in isolation. None of them can see that today's draft has the same skeleton as last Tuesday's post. That is the gate people actually need once they publish on a schedule.
This repo ships the substance gate, working and unrestricted, so you can judge the code before paying for the rest. The similarity gate — the one nothing else does — is in the full kit.
git clone https://github.com/zxcv0952290292-lang/content-gate-kit-free
cd content-gate-kit-free
python3 cli.py --demo
=== 01_blocked_no_substance.json -> BLOCKED
- no takeaway: one concrete thing the reader can do or check
- opening is a conclusion, not a hook: 'Everyone should start saving money.'
- nothing checkable in the whole piece (needs >=2 numbers/rules/named things)
=== 04_pass.json -> PASS
No dependencies. No API key. No model call. No network. Python 3.8+. Under a millisecond.
How this relates to Vale
Use both. They do not overlap.
| Vale / textlint / proselint | Content Gate Kit | |
|---|---|---|
| Scope | one document at a time | this draft vs everything you already published |
| Catches "I wrote this last week in other words" | no | yes — the whole point |
| House style, banned words, passive voice | yes, and better than this | no |
| Language | English-centric | English and CJK (character 2-grams, not word tokens) |
| Price | free | free sample here, $29 for all four gates |
If you want a style guide enforced, install Vale — it is free, excellent, and this is not trying to replace it. If your problem is that everything you publish is starting to feel the same, no linter solves that.
The four gates
| Gate | Blocks | In this repo |
|---|---|---|
| Substance | Nothing to take away. A number with no source. An opening that is a slogan instead of a hook. | ✅ yes, fully working |
| Similarity | The post you already published — in different words. Compares wording overlap, skeleton (opening shape, ending shape, line rhythm, filler phrases) and scene. | full kit |
| Tone | Snark, and the "X is more impressive than Y" pattern. A banned-word list never catches that — the next draft writes "more impressive than wagyu". | full kit |
| Style | Punctuation normalised to your house habits. | full kit |
Full kit — four gates, the n8n workflow, and the config presets: $29 on Gumroad
Why these rules and not other rules
Every rule was written after something real went out wrong, and the comment above it says which. That is the part you cannot get from a linter: not "here are some quality heuristics" but "this exact sentence shape shipped nine smug replies, six of which were identical in structure."
A rule without its incident is the first thing someone deletes. So they all kept their incidents.
Usage
from gatekit import check
r = check(
text=draft,
takeaway="one concrete thing the reader can do",
source="where the numbers came from",
)
r["pass"] # bool
r["reasons"] # list of strings, empty when it passes
Shell / CI — exit code 0 passes, 1 blocks:
python3 cli.py --file draft.json && ./publish.sh
Config
{ "takeaway_min": 12, "hard_min": 2, "require_layers": false }
require_layers is strict mode. It additionally demands an operating layer (a verb plus a place the reader can open — "read the Total column") and a numbers layer (the difference converted into a figure — 0.22% vs 0.57%, that is 2.6x).
If a gate blocks the same good draft three times, loosen it. A rule that makes you rewrite good work into compliance is worse than the problem it prevents.
What this is not
- Not a grammar or plagiarism checker
- Not an AI-detector
- It does not call a model, so it cannot judge whether a claim is true. It checks that a claim has a source attached, not that the source is right.
Licence
See LICENSE.txt. Use it in your own and your clients' projects. Do not resell the source as a competing product.
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 content_gate_lite-0.1.0.tar.gz.
File metadata
- Download URL: content_gate_lite-0.1.0.tar.gz
- Upload date:
- Size: 6.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3de1417ec7a9460da515393a0210a68864fd07ef20c211537ee676997dae020
|
|
| MD5 |
d3b5888e45e668fdfd91ee7aec2679ef
|
|
| BLAKE2b-256 |
22eeb442b3be104641fe85e8b428fda148f742c811a63e7b663450905b712bf5
|
Provenance
The following attestation bundles were made for content_gate_lite-0.1.0.tar.gz:
Publisher:
publish.yml on zxcv0952290292-lang/content-gate-kit-free
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
content_gate_lite-0.1.0.tar.gz -
Subject digest:
d3de1417ec7a9460da515393a0210a68864fd07ef20c211537ee676997dae020 - Sigstore transparency entry: 2769236984
- Sigstore integration time:
-
Permalink:
zxcv0952290292-lang/content-gate-kit-free@292e9f897e91de96122a0a5b4ba8b5017b388af6 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/zxcv0952290292-lang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@292e9f897e91de96122a0a5b4ba8b5017b388af6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file content_gate_lite-0.1.0-py3-none-any.whl.
File metadata
- Download URL: content_gate_lite-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3cb1561c05a9c6ffd3ca4ce2f94f7ce22ce21e77b1c9edb054836cf5bebe697
|
|
| MD5 |
aa52952c49feb7db2c7043b53da1b286
|
|
| BLAKE2b-256 |
dad0963662f69a12074e64df8ace0f340c46c956d4168c9af5d359b095ee8eff
|
Provenance
The following attestation bundles were made for content_gate_lite-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on zxcv0952290292-lang/content-gate-kit-free
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
content_gate_lite-0.1.0-py3-none-any.whl -
Subject digest:
e3cb1561c05a9c6ffd3ca4ce2f94f7ce22ce21e77b1c9edb054836cf5bebe697 - Sigstore transparency entry: 2769237066
- Sigstore integration time:
-
Permalink:
zxcv0952290292-lang/content-gate-kit-free@292e9f897e91de96122a0a5b4ba8b5017b388af6 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/zxcv0952290292-lang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@292e9f897e91de96122a0a5b4ba8b5017b388af6 -
Trigger Event:
release
-
Statement type: