Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill handles file format conversions across documents (PDF, DOCX, Markdown, HTML, TXT), data files (JSON, CSV, YAML, XML, TOML), and images (PNG, JPG, WebP, SVG, GIF). Use when the user requests converting, transforming, or exporting files between formats. Generates conversion code dynamically based on the specific request.
.claude/skills/aiskillstore-file-converter/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-10 | ✓→✗ | ▼ Worse | 8% | 0% |
| case-01 | ✓→✓ | = Same ✓ | -6% | 0% |
| case-02 | ✓→✓ | = Same ✓ | -7% | 0% |
Convert files between formats across three categories: documents, data files, and images. Generate Python code dynamically for each conversion request, selecting appropriate libraries and handling edge cases.
| From | To | Recommended Library | |------|-----|---------------------| | Markdown | HTML | markdown or mistune | | HTML | Markdown | markdownify or html2text | | HTML | PDF | weasyprint or pdfkit (requires wkhtmltopdf) | | PDF | Text | pypdf or pdfplumber | | DOCX | Markdown | mammoth | | DOCX | PDF | docx2pdf (Windows/macOS) or LibreOffice CLI | | Markdown | PDF | Convert via HTML first, then to PDF |
| From | To | Recommended Library | |------|-----|---------------------| | JSON | YAML | pyyaml | | YAML | JSON | pyyaml | | JSON | CSV | pandas or stdlib csv + json | | CSV | JSON | pandas or stdlib csv + json | | JSON | TOML | tomli/tomllib (read) + tomli-w (write) | | XML | JSON | xmltodict | | JSON | XML | dicttoxml or xmltodict.unparse |
| From | To | Recommended Library | |------|-----|---------------------| | PNG/JPG/WebP/GIF | Any raster | Pillow (PIL) | | SVG | PNG/JPG | cairosvg or svglib + reportlab | | PNG | SVG | potrace (CLI) for tracing, limited fidelity |
references/ for format-specific guidancepythonimport json import yaml with open("input.json") as f: data = json.load(f) with open("output.yaml", "w") as f: yaml.dump(data, f, default_flow_style=False, allow_unicode=True)
pythonimport csv import json with open("input.csv") as f: reader = csv.DictReader(f) data = list(reader) with open("output.json", "w") as f: json.dump(data, f, indent=2)
pythonimport markdown with open("input.md") as f: md_content = f.read() html = markdown.markdown(md_content, extensions=["tables", "fenced_code"]) with open("output.html", "w") as f: f.write(html)
pythonfrom PIL import Image img = Image.open("input.png") img.save("output.webp", "WEBP", quality=85)
pythonimport cairosvg cairosvg.svg2png(url="input.svg", write_to="output.png", scale=2)
Detailed guidance for complex conversions is in references/:
references/document-conversions.md - PDF handling, encoding issues, styling preservationreferences/data-conversions.md - Schema handling, type coercion, nested structuresreferences/image-conversions.md - Quality settings, transparency, color profilesConsult these references when handling edge cases or when the user has specific quality/fidelity requirements.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 9,787 | 5,005 | -49% | 1 | 1 | 0% | 2,032 | 1,909 | -6% | 0 | 0 | — |
case-02 | pass→pass | 12,118 | 7,257 | -40% | 1 | 1 | 0% | 2,314 | 2,146 | -7% | 0 | 0 | — |
case-03 | pass→pass | 12,079 | 7,259 | -40% | 1 | 1 | 0% | 2,238 | 2,289 | +2% | 0 | 0 | — |
case-04 | pass→pass | 7,318 | 5,223 | -29% | 1 | 1 | 0% | 1,439 | 1,898 | +32% | 0 | 0 | — |
case-05 | pass→pass | 11,481 | 6,933 | -40% | 1 | 1 | 0% | 1,906 | 1,978 | +4% | 0 | 0 | — |
case-06 | pass→pass | 6,639 | 5,430 | -18% | 1 | 1 | 0% | 1,034 | 1,784 | +73% | 0 | 0 | — |
case-07 | pass→pass | 16,069 | 16,617 | +3% | 1 | 1 | 0% | 2,870 | 3,088 | +8% | 0 | 0 | — |
case-08 | pass→pass | 4,480 | 4,384 | -2% | 1 | 1 | 0% | 699 | 1,660 | +137% | 0 | 0 | — |
case-09 | pass→pass | 3,917 | 3,365 | -14% | 1 | 1 | 0% | 712 | 1,568 | +120% | 0 | 0 | — |
case-10 | pass→fail | 10,024 | 6,153 | -39% | 1 | 1 | 0% | 1,842 | 1,993 | +8% | 0 | 0 | — |
case-11 | pass→pass | 6,310 | 6,054 | -4% | 1 | 1 | 0% | 1,148 | 2,016 | +76% | 0 | 0 | — |
case-12 | fail→pass | 7,660 | 6,047 | -21% | 1 | 1 | 0% | 1,278 | 1,950 | +53% | 0 | 0 | — |
case-13 | pass→pass | 4,766 | 8,850 | +86% | 1 | 1 | 0% | 888 | 1,646 | +85% | 0 | 0 | — |
case-14 | fail→pass | 12,156 | 14,662 | +21% | 1 | 1 | 0% | 2,155 | 2,972 | +38% | 0 | 0 | — |
case-15 | pass→pass | 3,328 | 3,786 | +14% | 1 | 1 | 0% | 523 | 1,501 | +187% | 0 | 0 | — |
case-16 | pass→pass | 10,615 | 5,127 | -52% | 1 | 1 | 0% | 1,852 | 1,826 | -1% | 0 | 0 | — |
case-17 | pass→pass | 11,961 | 10,549 | -12% | 1 | 1 | 0% | 1,905 | 2,757 | +45% | 0 | 0 | — |
case-18 | pass→pass | 5,196 | 5,074 | -2% | 1 | 1 | 0% | 896 | 1,788 | +100% | 0 | 0 | — |
case-19 | pass→pass | 3,059 | 3,328 | +9% | 1 | 1 | 0% | 491 | 1,521 | +210% | 0 | 0 | — |
case-20 | pass→pass | 9,117 | 6,489 | -29% | 1 | 1 | 0% | 1,611 | 1,953 | +21% | 0 | 0 | — |
case-21 | pass→pass | 6,949 | 11,041 | +59% | 1 | 1 | 0% | 1,329 | 2,016 | +52% | 0 | 0 | — |
case-22 | pass→pass | 12,853 | 13,354 | +4% | 1 | 1 | 0% | 2,341 | 3,507 | +50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.