Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add dieter-medium/bidi2pdf --skill diagnose-pdfgit clone --depth 1 https://github.com/dieter-medium/bidi2pdfWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/dieter-medium/bidi2pdf/diagnose-pdf)<a href="https://agentmods.dev/skills/dieter-medium/bidi2pdf/diagnose-pdf"><img src="https://agentmods.dev/badge/skills/dieter-medium/bidi2pdf/diagnose-pdf/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/dieter-medium/bidi2pdf/diagnose-pdf"><img src="https://agentmods.dev/badge/skills/dieter-medium/bidi2pdf/diagnose-pdf.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00083 | $0.00929 |
| Opus 5.5 | $0.00033 | $0.00372 |
| Sonnet 5.5 | $0.00017 | $0.00186 |
| Haiku 4.5 | $0.00008 | $0.00093 |
Grade A, and why
diagnose-pdf scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 58 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Find out why a PDF looks wrong
Start with what Chrome reports, not with the page's code. Each check below names what to look at and the usual cause.
Does not: fix the page's design or CSS for you - it finds why the PDF differs from what was expected, then the fix belongs in the page or the render call.
1. Ask Chrome
bidi2pdf diagnose --url https://example.com/report --json --screenshot seen.png --pdf try.pdf
Use the same --remote-browser-url, cookies, headers and waits as the real render: a diagnosis of a
different request explains nothing. Read the JSON in this order.
2. The checklist
network_failures- every stylesheet, font, image or script the browser could not load. The most common cause of a blank or unstyled PDF: the address works from your machine but not from the browser's. A browser in a container resolves names in its own network;localhostthere is the container itself. Use an address the browser can reach (for a Rails app, the asset host the browser sees - bidi2pdf-rails' asset-host setting), then diagnose again.console- a script error can stop the page before it renders its content.page.url/navigation.final_url- a redirect to a login page answers 200 and prints perfectly; the right cookies or headers are missing. (A 4xx/5xx answer fails the render withNAVIGATION_NOT_FOUNDorNAVIGATION_FAILEDinstead.)fonts.status-loadingor entries infonts.failed: the PDF falls back to another font or shows boxes. Add a wait (--wait-network-idle), or fix the font URL (see 1).print_media- the page's@media printrules and@pagerules. A print stylesheet that hides content,fixed_or_sticky_elementsrepeated on every page, or a@pagesize that fights--page-width. To print what the screen shows instead:--media screen.paged_js-detected: truebutready: false: Paged.js had not finished. Render with--wait-window-loadedand let the page setwindow.loaded = truewhen Paged.js is done; without that flag the wait runs into--default-timeout.- Late content (charts, lazy images):
--wait-network-idle, or a recipe withwait_for(selector:of the last thing that appears). - Page count or cut-off content - page size and margins are in cm; Chrome's own default margin is 1 cm a side. A layout breakpoint follows the width between the side margins, not the paper's (96 / 2.54 CSS px per cm).
- Dates and number formats in form fields come from the browser's locale, not the page: set
LANG/LANGUAGEon the browser's container (e.g.de_DE.UTF-8). - Hyphenation (
hyphens: autodoes nothing, or breaks anywhere): the browser needs Chrome's hyphenation dictionaries installed for the page'slang. bidi2pdf's chromedriver image ships them; a self-built image may not. The page needs a correctlangattribute.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 58 lines · 83 tokens per session scan A 243b14e84104
diagnose-pdf is a skill published in the GitHub repository dieter-medium/bidi2pdf (58 stars, last pushed 9d ago), licensed MIT. It adds 83 tokens to every session and 929 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-26.
Other skills, from other repositories
pandoc-pdf-error-resolution
Systematic debugging workflow for pandoc PDF conversion errors.
pdf-debug-unbuffered
Debug Python PDF generation errors by using unbuffered output and stderr inspection to reveal actual tracebacks.
python-shell-fallback
Fallback to shell execution when sandbox fails for library-dependent Python code.
pandoc-unicode-sanitize
Pre-process Markdown to replace non-ASCII characters before pandoc PDF conversion.
fin-paper-convert
Compile LaTeX to PDF and convert to target journal format.
pandoc-pdf-error-diagnosis
Systematic diagnostic workflow for resolving pandoc PDF conversion errors.