Skip to main content

Readability

A CLI tool that keeps code aligned with Google style conventions. It runs the right linters, formatters, and type checkers for your project with sensible defaults, and serves the official Google style guides in Markdown format. This is ideal for AI agents or developers who want consistent code quality checks and quick access to style conventions without browsing HTML pages.

Features

  • Linting & Formatting: A check command that automatically detects and runs relevant tools (Ruff, Pyrefly, Biome, Prettier, gofmt) for your project.
  • Sensible Defaults: Bundled Google-style configurations for Ruff and Pyrefly are used automatically when a project does not define its own.
  • Style Guides: A guide command that fetches the latest Google style guides (Python, Shell, C++, Java, JS/TS, Go, etc.) converted to Markdown, navigable by outline and by section rather than read whole.
  • Offline Mode: Local caching of style guides for fast, offline access, kept fresh with a single sync command.

Quick Start

You can run the tool directly without installing it using uvx:

# Check and fix formatting for the current directory
uvx --from readability-cli readability check . --fix

# Get the Python style guide
uvx --from readability-cli readability guide python

Installation

Install it as a global tool with uv:

# Install the readability tool
uv tool install readability-cli

# Use it anywhere
readability check .
readability guide python

For Development

This project uses uv for dependency management:

# Clone the repository
git clone https://github.com/owahltinez/readability.git
cd readability

# Install dependencies and create a virtual environment
uv sync

# (Optional) Populate the local cache for offline use
uv run readability sync

Checking and Formatting

The check command identifies and runs relevant linting and formatting tools based on file extensions and the presence of configuration files (triggers) in your project root:

# Run checks on the current directory
readability check .

# Check specific files or directories
readability check src/ tests/ main.py

# Automatically fix and format files
readability check . --fix

Supported Tools

Tool Supported Extensions Trigger Files
Ruff .py pyproject.toml, ruff.toml, .ruff.toml
Pyrefly .py pyproject.toml, pyrefly.toml
Biome .js, .ts, .jsx, .tsx, .json, .jsonc, .css, .html biome.json, biome.jsonc
Prettier .js, .ts, .jsx, .tsx, .json, .css, .scss, .html, .md, .yml, .yaml .prettierrc*, prettier.config.*
gofmt .go go.mod

The command will only run a tool if its trigger file exists in the current working directory and the tool is available in your PATH. For biome and prettier, it attempts to run them via npx.

Default Configurations

For Ruff and Pyrefly, bundled defaults based on the Google Python style guide (80-column lines, Google docstring convention, import ordering, full type checking) are applied when the project does not define its own configuration. To override them, add a [tool.ruff] or [tool.pyrefly] section to your pyproject.toml (or a dedicated ruff.toml / pyrefly.toml) — any project-level configuration takes full precedence over the bundled defaults.

Style Guides

The guide command prints a Google style guide as Markdown, using the local cache when available:

# Get the Python style guide (uses local cache if available)
readability guide python

# Force fetching the latest version from the web
readability guide python --remote

# Save a style guide to a file
readability guide cpp --output cpp-style.md

# Search a guide without printing it: the pipe carries it, you see matches
readability guide python | grep -n "f-string"

# Synchronize all supported style guides to the local cache
readability sync

A guide can exceed 100 KB, so printing one whole is rarely what you want. --outline and --section below cover navigating to a rule; piping to grep covers finding wording that no heading names. Neither leaves a copy behind, which is what a coding agent should do rather than redirecting a guide into the repository it is working on.

Navigating a Guide

--outline lists a guide's headings and --section prints just one of them, which turns "read 200 KB" into "list the sections, fetch the one you need":

# List every heading, with the index to pass to --section
readability guide cpp --outline

# Only the top two levels, for a bird's eye view of a large guide
readability guide cpp --outline --depth 2

# Print one section: its heading and everything nested under it
readability guide shell --section "Function Comments"
readability guide cpp --section 10.4

# Sections can be saved like whole guides can
readability guide python --section "Imports" --output imports.md

A section reference can be any of the following:

Reference Example
Section index, as shown by --outline --section 2.2.4
Heading text, case-insensitive, or its slug --section "function comments"
A parent-scoped path, spaces around the > --section "Imports > Decision"

Whole matches are preferred; a reference that matches nothing in full is retried as a substring of the heading text.

Three of the shipped guides — Python, JavaScript, and Java — number their own sections, and those numbers are the index. A rule cited from the outline then matches the published guide exactly, including where the guide skips a number: the Python guide has no 2.15 at all, so its 2.16 is listed as 2.16 rather than renumbered. The other eleven guides number nothing, so their index comes from each heading's position in the tree.

Either way the index is unique, which is what makes a repeated heading addressable — Definition, Pros, Cons, and Decision appear under every rule in the Python guide. For a reference stored and used later, prefer a printed section number or the heading text over a positional index, since positional indices shift when an unnumbered guide is re-synced.

A reference that matches several headings is reported rather than guessed at, listing the index and path of every candidate on stderr:

$ readability guide python --section Decision
Error: 'Decision' matches 19 headings in the 'python' guide. Repeat with one of:
  --section 2.1.4 (Python Language Rules > Lint > Decision)
  --section 2.2.4 (Python Language Rules > Imports > Decision)
  ...

Content goes to stdout and diagnostics to stderr, so both flags are safe to pipe. Headings inside fenced code blocks are ignored, which matters for the Shell and Python guides where # starts a comment.

Supported Languages

Use readability languages to see a full list of supported languages and their aliases. This command also indicates which guides are currently available in the local cache with a [cached] label:

$ readability languages
Supported languages and their aliases:
  - r [cached]
  - c++, cpp [cached]
  - c#, csharp [cached]
  - docguide, markdown [cached]
  - go [cached]
  - css, html [cached]
  - java [cached]
  - javascript, js [cached]
  - json [cached]
  - objc, objective-c [cached]
  - python [cached]
  - shell [cached]
  - ts, typescript [cached]
  - vim [cached]

Offline Mode

The tool stores local copies of the style guides in the guides/ directory and the guide command uses these local files when they exist. The bundled copies are automatically synchronized weekly from the official Google Style Guides repository via GitHub Actions, and you can refresh your local cache at any time with the sync command.

You can override the default guides/ directory by setting the READABILITY_CACHE environment variable. This is useful if you want to store the guides in a specific location or share them across different installations:

export READABILITY_CACHE=/path/to/my/guides
readability guide python

Development

Run tests with pytest:

uv run pytest

Check code style with ruff:

uv run ruff check .
uv run ruff format .

Releasing

Releases are published to PyPI as readability-cli via trusted publishing: pushing a v* tag triggers the publish.yml GitHub Actions workflow, which builds the package with uv build and uploads it.

# 1. Bump the version in pyproject.toml, commit, and push
# 2. Tag the release and push the tag
git tag v0.4.1
git push origin v0.4.1

Release files for readability-cli 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for readability-cli 0.7.0
File Size Uploaded
readability_cli-0.7.0.tar.gz 325.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for readability-cli 0.7.0
File Interpreter ABI Platform
readability_cli-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 639.1 kB

Release files / readability_cli-0.7.0.tar.gz

Download URL readability_cli-0.7.0.tar.gz
Size 325.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1a5ef12a48df786a61e94fbce81d928d5e22a4a7f9e0fb4dea088a433e53cbfc
BLAKE2b-256 checksum
How to use checksums
3f6c2ded982a3c880b789fadbd959b80142c96652b2ccf4e677d224f88ef1463
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / readability_cli-0.7.0-py3-none-any.whl

Download URL readability_cli-0.7.0-py3-none-any.whl
Size 313.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
140c771b8b332e8fd713049d8e8e2545f8b688a86a8b9aea5fd7551600da170f
BLAKE2b-256 checksum
How to use checksums
3627ece19cbebe624d25ccf161c342769e41f52d4d742896ff9990cb2b39b4d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

This release

0.7.0 This release

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page