Thanks for considering a contribution. citable stays useful by accepting feedback and PRs from real users.
Open an issue first for anything beyond a typo. We want to align on scope before you write code, so neither of us wastes time on something that doesn't land.
We aim to respond to every issue within 48 hours during the week. We may not always have a fix the same week, but you'll get a real reply.
Three issue templates exist:
- Bug report — citable produced a wrong verdict, false positive, or false negative
- Feature request — you'd like citable to check something it doesn't, or output something differently
- Question — how do I do X with citable
git clone https://github.com/WorkSmartAI-alt/citable.git
cd citable
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -e ".[dev]"pytest tests/ # smoke tests, no network
pytest tests/ -m live # hits work-smart.ai sitemap. Run before releases.18 smoke tests + 2 live URL tests should pass on a clean install.
- Python 3.10+
- Format with ruff:
ruff format src tests - Lint with ruff:
ruff check src tests - Match existing patterns. The codebase is small enough to read in one sitting.
These are non-negotiable. PRs that violate them will be asked to rework.
- No em-dashes (—) or en-dashes (–). Use commas, colons, or "to" for ranges.
- No exclamation points.
- No emoji unless explicitly required.
- Direct, declarative, operator tone. Not consultant-speak. Not SaaS marketing hype.
- Buyer's language first. Never "transform", "leverage" as a verb, "unlock", "synergy", "robust", "seamless", "innovative", "empower", "best-in-class", "world-class", "paradigm", "delve."
- Short paragraphs. Concrete numbers over abstractions.
If you want to add a new check (call it C-XX):
- Read src/citable/checks.py to see the existing 15 checks
- Pick a category (Crawlability / Entity / Content / Schema / Authority / Internal Linkage / AI-specific)
- Write the check function returning a
list[CheckResult]. Useunverifiedornarather than guessing when evidence is mixed. - Add specific, paste-ready
fix_text(not generic "add schema markup") - Add the check to
CHECK_FUNCTIONSregistry at the bottom of checks.py - Add the check to
src/citable/briefing.pyCHECK_OWNER,CHECK_EFFORT,CHECK_WHY_AGENCYmaps - Add the check to
src/citable/promo.pyRESOURCE_MAPwith a verified live URL - Run
pytest tests/to confirmtest_resource_map_covers_all_shipped_checkspasses - Run
pytest tests/ -m liveto verify any new URLs are reachable - Update CHANGELOG.md
Always verify the URL is live against the relevant site's sitemap before adding. The pytest live test enforces this — if the URL returns a non-200, the test fails.
We do not promise a release schedule. Releases happen when the work is ready, not on a calendar.
By contributing, you agree your contribution is licensed under MIT (the same license as the project).