Skip to main content

ascii-guard

Zero-dependency Python linter for detecting and fixing misaligned ASCII art boxes in documentation.

License Python CI codecov Code style: ruff Type checked: mypy PRs Welcome


🎯 Why ascii-guard?

AI-generated ASCII flowcharts and diagrams often have subtle formatting errors where box borders are misaligned by 1-2 characters. This breaks visual integrity and makes documentation harder to read.

ascii-guard automatically detects and fixes these alignment issues, ensuring your ASCII art looks perfect.

✨ Key Features

  • 🚀 Minimal dependencies - Zero for Python 3.11+, one tiny dep for Python 3.10 (tomli)
  • 💾 Tiny footprint - Lightweight and fast
  • 🔒 Minimal supply chain risk - Pure stdlib on 3.11+
  • ⚡ Quick startup - No import overhead
  • 📦 Simple installation - One command, automatic dependency handling
  • 🐍 Python API - Stable programmatic interface for integration into pipelines and scripts
  • 🛡️ Type-safe - Full mypy strict mode
  • ✅ Well tested - Comprehensive test coverage

📦 Installation

We recommend using uv for the fastest installation experience, but pip and pipx are fully supported alternatives. uv provides faster dependency resolution and better reproducibility, while pip and pipx work with any standard Python environment.

Recommended: Using uv (Fastest)

# Install ascii-guard
uv tool install ascii-guard

Note: If uv is not installed, you may install it with: curl -LsSf https://astral.sh/uv/install.sh | sh

Alternative: Using pip

pip install ascii-guard

Alternative: Using pipx (Isolated Environment)

pipx install ascii-guard

That's it! No other dependencies needed.


🚀 Quick Start

Check files for ASCII art issues

ascii-guard lint README.md
ascii-guard lint docs/**/*.md

Auto-fix alignment issues

ascii-guard fix README.md
ascii-guard fix --dry-run docs/guide.md  # Preview changes first

Example 1: Simple Box

Before (misaligned):

┌─────────────────────┐
│ Box Content         │
└────────────────────┘   ← Missing one character!

After (fixed):

┌─────────────────────┐
│ Box Content         │
└─────────────────────┘  ← Perfect alignment ✓

Example 2: Flowchart

Before (multiple alignment issues):

┌──────────────┐
│    Start     │
└──────┬───────┘
       │
┌──────▼───────┐
│    Step     │        ← Right border misaligned
└──────┬───────┘
       │
┌──────▼───────┐
│     End      ││      ← Duplicate right border
└──────────────        ← Broken bottom right corner

After (all boxes aligned):

┌──────────────┐
│    Start     │
└──────┬───────┘
       │
┌──────▼───────┐
│    Step      │
└──────┬───────┘
       │
┌──────▼───────┐
│     End      │
└──────────────┘

ascii-guard automatically detects and fixes alignment issues across multiple boxes, nested structures, and complex flowcharts.


🎭 Ignore Markers

Need to show intentionally broken boxes in your docs? Use ignore markers:

**❌ Common Mistake (don't do this):**

<!-- ascii-guard-ignore-next -->
┌─────────────────────┐
│ Box Content         │
└────────────────────┘   ← Misaligned on purpose for demonstration

**✅ Correct Way:**

┌─────────────────────┐
│ Box Content         │
└─────────────────────┘  ← Perfect alignment

The ignore markers are invisible in rendered markdown but tell ascii-guard to skip validation. Perfect for:

  • Before/after comparisons
  • Tutorial examples showing common mistakes
  • Documentation with intentionally broken examples

See USAGE.md for complete syntax and examples.


🎨 Supported Box-Drawing Characters

ascii-guard supports Unicode box-drawing characters:

Type Characters Description
Horizontal ─ (U+2500) Horizontal line
Vertical │ (U+2502) Vertical line
Corners ┌ ┐ └ ┘ Standard corners
T-junctions ├ ┤ ┬ ┴ Connection points
Cross ┼ Four-way intersection
Heavy lines ━ ┃ ┏ ┓ ┗ ┛ Bold variants
Double lines ═ ║ ╔ ╗ ╚ ╝ Double-line variants

📋 Validation Rules

ascii-guard checks for:

  1. Vertical alignment - All │ characters in a column align
  2. Horizontal alignment - All ─ characters connect properly
  3. Corner correctness - Corner characters match adjacent lines
  4. Width consistency - Top, middle, and bottom borders match
  5. Content fit - Content stays within box borders

🐍 Python API

ascii-guard provides a stable Python API for programmatic use. Perfect for integrating into documentation pipelines, CI/CD scripts, or custom tooling.

from ascii_guard import lint_file, fix_file, detect_boxes

# Lint a file for issues
result = lint_file("README.md")
if result.has_errors:
    print(f"Found {len(result.errors)} alignment errors")
    for error in result.errors:
        print(f"  Line {error.line + 1}: {error.message}")

# Auto-fix alignment issues
result = fix_file("README.md", dry_run=True)  # Preview first
print(f"Would fix {result.boxes_fixed} boxes")

# Detect boxes without validation
boxes = detect_boxes("docs/guide.md")
print(f"Found {len(boxes)} ASCII art boxes")

Available functions:

  • lint_file() - Lint a file for ASCII art alignment issues
  • fix_file() - Fix alignment issues in a file
  • detect_boxes() - Detect ASCII art boxes without validation
  • validate_box() - Validate a single Box object
  • fix_box() - Fix a single Box object

Data models: Box, ValidationError, LintResult, FixResult

📖 Full API documentation: See API Reference for complete details, type signatures, and advanced examples.


🤝 Contributing

We welcome contributions! Here's how to get started:

Prerequisites:

  • Python 3.10+
  • uv - Fast Python package manager
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Fork and clone the repository
git clone https://github.com/YOUR-USERNAME/ascii-guard.git
cd ascii-guard

# One-step setup (creates venv, installs deps, configures hooks)
./setup.sh

# Use uv run for commands
uv run pytest              # Run tests
uv run ruff check .        # Lint code
uv run mypy src/           # Type check

# Make your changes and submit a PR

For detailed development guide, see docs/DEVELOPMENT.md

For contribution guidelines, see CONTRIBUTING.md


📄 License

Apache License 2.0 - see LICENSE for details.

Copyright 2025 Oliver Ratzesberger


🔗 Links


🙏 Acknowledgments

Inspired by the need for better ASCII art formatting in AI-generated documentation.

Built with ❤️ using only Python's standard library.


Note: ascii-guard is stable and actively maintained. Contributions and feedback are welcome!

Metadata

Release files for ascii-guard 2.3.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 ascii-guard 2.3.0
File Size Uploaded Provenance
ascii_guard-2.3.0.tar.gz 58.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ascii-guard 2.3.0
File Interpreter ABI Platform
ascii_guard-2.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 94.3 kB

Release files / ascii_guard-2.3.0.tar.gz

Download URL ascii_guard-2.3.0.tar.gz
Size 58.9 kB
Tags Source
SHA-256 checksum
How to use checksums
d02cbbac7f283ca4bc77fb0a050c5d9f5bacb5d26f7acfce7e957b011e645114
BLAKE2b-256 checksum
How to use checksums
35fbb9496737a03c47c08e6619fa0cfadd7ae462c2199f51183af15c0e5ade12
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Feb 12, 2026.

Transparency log

Release files / ascii_guard-2.3.0-py3-none-any.whl

Download URL ascii_guard-2.3.0-py3-none-any.whl
Size 35.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6594432b9770ca9c52883541abe1052469d1816bc6aa0c51993e7fabadebddfc
BLAKE2b-256 checksum
How to use checksums
1283b05c5a6e7dc6771a4f1c6f13c9868b9e377358953aad37df94c21b5165f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Feb 12, 2026.

Transparency log

Security for ascii-guard 2.3.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.

Select from 2 files

Attestation for ascii_guard-2.3.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 Feb 12, 2026.

Transparency log

A 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.

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