diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc
new file mode 100644
index 0000000..225b713
--- /dev/null
+++ b/.markdownlint.jsonc
@@ -0,0 +1,27 @@
+// Project-wide markdownlint configuration.
+// Docs: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md
+{
+ "default": true,
+
+ // Line length: disabled. CHANGELOG entries, badge URLs and inline code
+ // references frequently exceed 80 columns; soft-wrap is handled by the
+ // renderer, not by hard line breaks in source.
+ "MD013": false,
+
+ // Duplicate headings: permitted across sibling scopes. Keep a Changelog
+ // mandates repeated `### Added` / `### Changed` / `### Removed` under each
+ // version, but we still flag accidental duplicates within the same scope.
+ "MD024": { "siblings_only": true },
+
+ // Inline HTML: permitted. README uses
,
, and
+ // similar elements for badges, centered headers and tables.
+ "MD033": false,
+
+ // Emphasis used as heading: permitted. Lightweight **bold** section labels
+ // are common in changelogs and migration blocks.
+ "MD036": false,
+
+ // First line must be a top-level heading: disabled. README typically opens
+ // with badges or centered logo blocks before the `# Title` heading.
+ "MD041": false
+}
diff --git a/Justfile b/Justfile
new file mode 100644
index 0000000..5536864
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,40 @@
+# Run all checks and tests.
+all: check test
+
+# Show all available recipes.
+help:
+ @just --list
+
+# Install the package in editable mode with all dependencies.
+install:
+ uv sync --extra dev --extra all
+ uv run pre-commit install
+
+# Run Ruff lint checks.
+lint:
+ uv run ruff check .
+
+# Auto-fix Ruff findings and format the code.
+format:
+ uv run ruff check --fix .
+ uv run ruff format .
+
+# Run the mypy type checker.
+typecheck:
+ uv run mypy src/x402_openai
+
+# Run pytest.
+test:
+ uv run pytest
+
+# Build wheel and source distributions.
+build:
+ uv build
+
+# Remove build artifacts and caches using the project's Python environment.
+clean:
+ uv run python -c "import shutil, pathlib; [shutil.rmtree(p, ignore_errors=True) for p in ['dist', 'build', '.mypy_cache', '.pytest_cache']]; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('__pycache__')]; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('*.egg-info')]"
+
+# Run all pre-commit hooks.
+check:
+ uv run pre-commit run --all-files
diff --git a/README.md b/README.md
index b54ab17..88764db 100644
--- a/README.md
+++ b/README.md
@@ -155,11 +155,10 @@ This project is licensed under the [MIT License](LICENSE).
-A **[QNTX](https://qntx.fun)** open-source project.
+A **[QuantX](https://qntx.fun)** open-source project.
-

+

-
Code is law. We write both.