Converters where figures survive — DOCX/XLSX to Markdown with native OOXML chart-data extraction (no rasterize/OCR/VLM needed) + zero-loss composite-figure markers, with optional VLM interpretation for figures with no native chart data
- ✓Open-source license (Apache-2.0)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/HelgDemidov/refigureResumen de Tools
# refigure
**Converters where figures survive.**
[](https://github.com/HelgDemidov/refigure/actions/workflows/ci.yml)
[](https://github.com/HelgDemidov/refigure/actions/workflows/ci.yml)
[](LICENSE)
[](pyproject.toml)
<!-- mcp-name: io.github.HelgDemidov/refigure -->
DOCX / XLSX → Markdown converters that treat embedded charts, composite
diagrams and infographics as single semantic objects instead of silently
dropping or fragmenting them: native OOXML chart-data extraction (no
rasterize/OCR/VLM) plus positioned machine-readable markers as the zero-loss
floor, optional VLM interpretation (prose + mermaid) on top, cached and
reproducible offline.
## Demo
**Optional VLM interpretation** — for a figure with no native chart data at
all (a screenshot, not an OOXML chart part) AND no matching mermaid
construct either (a dense radial sunburst — nothing in the 4 original
mermaid types could represent it), `--vlm` both recovers the real content
and produces a genuinely renderable diagram, not just recovered text:
<img src="docs/assets/demo-vlm-dark.svg" alt="A real docx image (a dense wireless-technology sunburst chart with no native chart data) converted by refigure.docx.convert(use_vlm=True) into a rich VLM-generated description and a real rendered mermaid mindmap diagram, laid out radially instead of the unreadable flat strip a generic flowchart construct would have produced">
**Native chart-data extraction** — real OOXML `numCache`, not a screenshot,
not OCR:
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/demo-dark.svg">
<img src="docs/assets/demo-light.svg" alt="A real xlsx bar chart converted by refigure.xlsx.convert() into Markdown, shown both as the raw text an LLM reads and as the same data re-rendered as a diagram">
</picture>
**Same extraction, from DOCX** — Word embeds native charts too, not just
Excel; refigure reads the same cached OOXML data either way:
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/demo-docx-chart-dark.svg">
<img src="docs/assets/demo-docx-chart-light.svg" alt="A real docx pie chart from an EU labour-platform survey converted by refigure.docx.convert() into Markdown, shown both as the raw text an LLM reads (mermaid fence + data table) and as the same data re-rendered as a diagram">
</picture>
**Composite figures** — positioned, zero-loss, even when the figure itself
can't be rendered (no incumbent does this — see
[Docling issue #1287](https://github.com/docling-project/docling/issues/1287),
open >1 year):
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/demo-groups-dark.svg">
<img src="docs/assets/demo-groups-light.svg" alt="A real docx composite figure (a grouped diagram refigure.docx.convert() can't render) converted into a positioned zero-loss marker that keeps the figure's own caption/legend text">
</picture>
## Quickstart
```bash
pip install "refigure[docx,xlsx]"
```
```bash
refigure report.docx # markdown to stdout
```
```python
from refigure.docx import convert
result = convert("report.docx")
print(result.markdown)
print(f"{result.charts_found} charts, {result.groups_found} composite figures")
```
Or without a permanent install, via [uv](https://docs.astral.sh/uv/)/`uvx`:
```bash
uvx --from "refigure[docx,xlsx]" refigure report.docx
```
Optional VLM interpretation, for a composite figure the chart engine can't
reconstruct on its own (see Features below):
```bash
pip install "refigure[docx,vlm]"
export OPENROUTER_API_KEY=... # or --vlm-api-key-file/--vlm-provider
refigure report.docx --vlm # needs the system soffice/LibreOffice binary too
```
## Features
- **Native chart-data extraction** — reads OOXML `numCache`/`strCache`
directly; no rasterize/OCR/VLM step for charts, real numbers every time.
- **Positioned zero-loss markers for composite figures** (DOCX) — grouped
shapes/infographics that mammoth would otherwise silently fragment into
disconnected pieces get a clean marker instead, with position and any
caption text preserved. Absent even in well-funded incumbents — see
[Docling issue #1287](https://github.com/docling-project/docling/issues/1287).
- **Optional VLM interpretation** (DOCX composite figures, `[vlm]` extra,
`--vlm`/`Config(use_vlm=True)`) — cloud description + a real rendered
mermaid diagram (26 supported diagram types — flowcharts, pie/xy charts,
sequence/state/ER diagrams, Gantt/timeline/sankey/treemap and more, see
Status below) on top of the zero-loss floor, for figures with no native
chart data at all (e.g. a dashboard screenshot). Provider-agnostic —
OpenRouter by default, or direct OpenAI/Ollama/vLLM/LM Studio/Anthropic
via `--vlm-provider` (`[vlm-direct]` extra). `--strict` upgrades one
specific failure (the system `soffice`/LibreOffice binary missing) from
a graceful skip to a hard error; every other VLM failure still degrades.
- **Rich, typed result** — `ConversionResult` (markdown + warnings +
chart/group counts + `vlm_used`), not a bare string.
- **CLI included** — `refigure` console command, stdin/stdout-first, native
batch mode, typed exit codes (see below).
- **MCP server included** — `refigure-mcp` console command (`[mcp]` extra),
stdio or Streamable HTTP, tools/resources/prompts, batch conversion with
per-file isolation (see below).
- **Docker image** — `ghcr.io/helgdemidov/refigure`, both console commands
on `PATH`, `soffice`/LibreOffice baked in — the VLM composite-figure
path works turnkey, no manual LibreOffice install (see below).
## CLI
`refigure` installs a console command — a thin wrapper over the same
`convert()` used programmatically, no separate logic:
```bash
refigure report.docx # markdown to stdout
refigure report.docx -o report.md # markdown to a file
cat report.docx | refigure --format docx # stdin, format hint required
refigure reports/ -o out/ # batch: directory, walked recursively
refigure a.docx b.xlsx -o out/ # batch: 2+ explicit sources
```
Batch mode (2+ sources, or a single directory) requires `-o DIR`, keeps
going past a failed source by default (`--fail-fast` aborts on the first
one instead), and always prints a summary (`N/M converted, K failed`) to
stderr. `--json` emits the full result — markdown plus chart/group counts
and warnings — instead of plain markdown. `-v`/`-q` control verbosity;
`--strict` is forwarded to the same `Config.strict` the Python API uses.
Exit codes:
| Code | Meaning |
| --- | --- |
| 0 | success |
| 1 | batch mode: 1+ sources failed (keep-going default) |
| 2 | usage error (bad arguments/flags) |
| 3 | input isn't a valid document of its format |
| 4 | input isn't a valid/safe archive |
| 5 | the format's extra (`[docx]`/`[xlsx]`) isn't installed |
| 6 | unexpected internal error |
## MCP server
`refigure-mcp` — the same converters as an
[MCP](https://modelcontextprotocol.io) server, for agents/IDEs that speak
the protocol directly instead of shelling out to a CLI or importing the
library:
```bash
pip install "refigure[mcp,docx,xlsx]"
refigure-mcp # stdio — the MCP client launches it
```
```json
{
"mcpServers": {
"refigure": { "command": "refigure-mcp" }
}
}
```
Or point the client at `uvx` instead, with no permanent install at all:
```json
{
"mcpServers": {
"refigure": {
"command": "uvx",
"args": ["--from", "refigure[mcp,docx,xlsx,vlm-direct]", "refigure-mcp"]
}
}
}
```
`refigure[full]` is a shortcut for `refigure[mcp,docx,xlsx,vlm-direct]` —
every tool, both formats, every VLM provider, one extras string.
Three tools — `convert_docx`, `convert_xlsx`, and `convert_batch` (multiple
files in one call: one bad file reports its own error without aborting the
rest) — each registered only if its format extra is actually installed.
`use_vlm`/`--vlm-provider` and friends work the same as the CLI. A result
too large to inline is stored and handed back as a
`refigure://conversion/{id}` resource instead of inflating the tool
response. Two prompts (`ingest_for_rag`, `explain_conversion_warnings`)
help a client pick the right tool/VLM settings for the job.
Streamable HTTP is opt-in, for a shared/remote deployment — bearer-token
auth is required, not optional:
```bash
echo "sk-... = alice" > tokens.txt
refigure-mcp --transport http --mcp-auth-token-file tokens.txt
```
Per-caller rate-limiting (protects the operator's own spend from a
leaked/runaway token) applies automatically over HTTP, together with a
fairness soft-cap once 2+ callers are configured; `refigure-mcp --help`
covers every tuning flag (concurrency, timeouts, resource-store limits,
batch size, VLM ceiling).
## Docker
One image, both surfaces — `refigure` and `refigure-mcp` are already on
`PATH`, no separate CLI/MCP builds to choose between. The one thing this
format buys over `pip`/`uvx` that neither can: the system `soffice`/
LibreOffice binary the VLM composite-figure path needs is baked in, not a
manual install.
```bash
docker pull ghcr.io/helgdemidov/refigure:0.3.1
```
CLI, via a bind mount (the image's working directory is already `/data`):
```bash
docker run --rm -v "$PWD:/data:ro" ghcr.io/helgdemidov/refigure:0.3.1 \
refigure /data/report.docx
```
MCP, stdio — the client launches the container itself:
```json
{
"mcpServers": {
"refigure": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/helgdemidov/refigure:0.3.1", "refigure-mcp"]
}
}
}
```
MCP, Streamable HTTP — `--mcp-http-host 0.0.0.Lo que la gente pregunta sobre refigure
¿Qué es HelgDemidov/refigure?
+
HelgDemidov/refigure es tools para el ecosistema de Claude AI. Converters where figures survive — DOCX/XLSX to Markdown with native OOXML chart-data extraction (no rasterize/OCR/VLM needed) + zero-loss composite-figure markers, with optional VLM interpretation for figures with no native chart data Tiene 0 estrellas en GitHub y su última actualización registrada es del 2026-08-21.
¿Cómo se instala refigure?
+
Puedes instalar refigure clonando el repositorio (https://github.com/HelgDemidov/refigure) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar HelgDemidov/refigure?
+
Nuestro agente de seguridad ha analizado HelgDemidov/refigure y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene HelgDemidov/refigure?
+
HelgDemidov/refigure es mantenido por HelgDemidov. La última actividad registrada en GitHub es del 2026-08-21, con 0 issues abiertos.
¿Hay alternativas a refigure?
+
Sí. En ClaudeWave puedes explorar tools similares en /categories/tools, ordenados por popularidad o actividad reciente.
Despliega refigure en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/helgdemidov-refigure)<a href="https://claudewave.com/repo/helgdemidov-refigure"><img src="https://claudewave.com/api/badge/helgdemidov-refigure" alt="Featured on ClaudeWave: HelgDemidov/refigure" width="320" height="64" /></a>Más Tools
A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.
An AI skill that provides design intelligence for building professional UI/UX across multiple platforms.
🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman
CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies
The best-benchmarked open-source AI memory system. And it's free.
The fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]