Command-line interface for ContentRX — content-design linter for Figma, code, and CI.
Project description
ContentRX CLI
contentrx-cli is a thin command-line client for the ContentRX
content-standards checker. It posts your strings to the ContentRX API and
prints violations — the kind of thing you'd call from a pre-commit hook,
a CI job, or an ad-hoc terminal check while writing UI copy.
pip install contentrx-cli
export CONTENTRX_API_KEY=cx_... # mint at https://contentrx.io/dashboard
contentrx "Click here to learn more"
The CLI ships with no third-party dependencies — stdlib only. Install time is seconds, the attack surface is whatever Python itself already includes.
Authentication
All requests need an API key. Generate one in the dashboard:
https://contentrx.io/dashboard → Generate key (or Rotate)
The key is shown exactly once. Store it somewhere you trust. The CLI
reads it from the CONTENTRX_API_KEY environment variable — no global
config file, no per-directory .contentrxrc.
export CONTENTRX_API_KEY=cx_a1b2c3...
If the key is missing or expired the CLI prints a short, actionable error pointing back at the dashboard URL.
Pointing at a non-default backend
Self-hosted or test-deployment users can override the API URL:
export CONTENTRX_API_URL=https://contentrx-staging.example.com
Usage
Single check
contentrx "Save changes"
✓ PASS
Content type: button_cta
Active-voice verb. Specific action. Clean.
With hints:
contentrx --content-type error_message "Something went wrong."
contentrx --moment destructive_action "Delete forever?"
JSON output
For piping into other tools or inspecting the raw response:
contentrx --json "Save changes"
Batch check
Text file, one string per line:
cat > strings.txt <<'EOF'
Save changes
Click here to learn more
Something went wrong.
EOF
contentrx --batch strings.txt
JSON with per-string hints:
cat > strings.json <<'EOF'
[
{"text": "Save changes", "content_type": "button_cta"},
{"text": "Delete forever?", "moment": "destructive_action"}
]
EOF
contentrx --batch strings.json
Verbose mode
Adds latency + month-to-date usage from the API response:
contentrx -v "Save changes"
Scenarios
Three concrete things you can do with the CLI today.
1. Ad-hoc check while writing copy
You're writing a button label for a hero section. Is "Click here to learn more" actually good?
$ contentrx --content-type button_cta "Click here to learn more"
✗ FAIL
Moment: decision_point
2 violations:
ACT-02 [block] Vague CTA — "Click here" doesn't name the destination.
Suggestion: Lead with verb+object: "Learn more" or "Read the docs".
CLR-03 [warn] Redundant phrasing — "to learn more" duplicates the button's purpose.
$ contentrx --content-type button_cta "Read the docs"
✓ PASS
Moment: decision_point
Verb-first. Object named. Length appropriate for a CTA.
Takes <2 seconds per check. Free tier gives 25 checks/month for exactly this kind of exploration.
2. Linting an i18n catalog during CI
You have locales/en.json with every user-facing string. Lint it on
every PR that touches it:
# .github/workflows/copy-lint.yml
on:
pull_request:
paths: ['locales/en.json']
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install contentrx-cli
- name: Convert en.json → ContentRX batch format
run: |
jq -r 'to_entries | map({text: .value}) | tostring' locales/en.json > strings.json
- name: Lint
env:
CONTENTRX_API_KEY: ${{ secrets.CONTENTRX_API_KEY }}
run: contentrx --batch strings.json
Exit code 1 on any violation fails the job and blocks the PR. Engineers get a terminal output they can scan in 10 seconds.
3. Pre-commit hook on a specific file
You only care about the canonical strings file, not every edit. One hook, scoped to that file:
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: contentrx
name: ContentRX
entry: contentrx --batch
language: system
files: ^content/strings\.json$
pass_filenames: true
Runs only when content/strings.json changes. Catches violations
before they leave your laptop.
Exit codes
Stable across versions — safe to pin on in CI.
| Code | Meaning |
|---|---|
0 |
All checks passed |
1 |
At least one check failed (violations present) |
2 |
Usage error (argparse / invalid arguments / bad batch file) |
3 |
Missing or invalid CONTENTRX_API_KEY |
4 |
Monthly quota exhausted |
5 |
Rate limit exceeded |
6 |
Network / upstream error |
CI examples
GitHub Actions
name: Content lint
on:
pull_request:
paths: ['src/**/*.tsx', 'src/**/*.ts']
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install contentrx-cli
- name: Lint changed UI strings
env:
CONTENTRX_API_KEY: ${{ secrets.CONTENTRX_API_KEY }}
run: |
contentrx --batch strings.json
(For AST-based extraction of strings from TSX/JSX, use the
contentrx-action GitHub Action instead of rolling your own
extraction. Shipped separately in github-action/.)
pre-commit
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: contentrx
name: ContentRX
entry: contentrx --batch
language: system
files: ^content/strings\.json$
Development
cd cli-client
pip install -e ".[dev]"
pytest tests/
Tests mock the HTTP layer so they run offline without an API key.
License
MIT. See LICENSE.
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 contentrx_cli-0.2.0.tar.gz.
File metadata
- Download URL: contentrx_cli-0.2.0.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2569e8446535ac98418a9fd4ff5dc9a89499da9614a2689ecd91408dfcece232
|
|
| MD5 |
96d269fe2e4142f568fcd8d4696f40c4
|
|
| BLAKE2b-256 |
e3dd942422343fa20ea66ddfbff808f4ae113a996bf808617a9150aa4f1cd58f
|
File details
Details for the file contentrx_cli-0.2.0-py3-none-any.whl.
File metadata
- Download URL: contentrx_cli-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9990b9f296404eab6b13ef285bd6d0c66b4790dda51513bfdb91d588613c5356
|
|
| MD5 |
2dbf6826367414ca7af7c6c74472fcb6
|
|
| BLAKE2b-256 |
924451027d4dcea8f180908c3cb0a3b9505eac105f542cee3434e560d2fa5db7
|