---
title: "Pxpipe Review: Cut Claude Code Token Costs with Images"
canonical: https://wavect.io/blog/text-as-image-token-savings/
language: en
description: "Pxpipe renders dense Claude Code context as images and reports 59-70% lower bills. See the benchmarks, exact-string failures and safe use cases."
image: "https://wavect.io/img/blog/headers/header_text-as-image-token-savings.png"
---

[**Back**](/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/team/kevin-riedl/)

[Kevin Riedl](/team/kevin-riedl/) https://linkedin.com/in/wsdt

10 min read · 03 Jul 2026 Last reviewed August 7, 2026

[**Next**](/blog/cost-per-token-vs-cost-per-task/)

# Pxpipe Review: Can Images Really Cut Claude Code Token Costs 60%?

TL;DR

Pxpipe is a local MIT-licensed proxy that converts eligible Claude Code system prompts, tool output and older history into dense PNG pages. Its repository now reports 59 to 70 percent lower end-to-end Fable 5 bills, a 10/10 paired SWE-bench Lite result and 14/19 versus 15/19 on a small SWE-bench Pro comparison at roughly 60 percent less request data. The savings are workload- and model-dependent. Exact strings remain the hard failure mode: dense hex recall scores 13/15 on Fable 5, 14/15 on Gemini 3.6 Flash, 2/15 on Opus 5 and 0/15 on GPT-5.6 Sol in the project's own tests. Use pxpipe only for dense, mostly static, gist-oriented context; keep IDs, hashes, secrets and critical numbers as text; and compare it against prompt caching on your own traffic.

Related service: [AI Enablement](/services/ai-enablement/)

**Yes, pxpipe can cut the end-to-end bill for some Claude Code workloads by roughly 59 to 70%, but only by accepting a new correctness risk.** It turns bulky context such as system prompts, tool documentation, old history, and pasted code into dense images before the request reaches the model. Exact strings remain text.

The reasoning sounds absurd, which is exactly why it went viral. An image costs the model a fixed number of tokens based on its pixel size, not on how much text is crammed inside it. So you can pack a lot of characters into one dense picture and pay for the pixels, not the prose.

[pxpipe](https://github.com/teamchong/pxpipe) is an MIT-licensed local proxy for Anthropic, OpenAI, and Google-compatible request paths. Its current repository reports **59 to 70% lower end-to-end bills** on tested Fable 5 workflows, while its SWE-bench runs preserved 10 of 10 Lite tasks and 14 of 19 Pro tasks versus 15 of 19 for plain text. Those are author-run benchmarks, not an independent guarantee.

Our verdict, reviewed 7 August 2026: the pricing mechanism is real, but pxpipe should be a measured optimization for recall-tolerant context, not a default for production agents. The decisive question is not whether images are cheaper. It is whether your eval catches a silently misread identifier before the model acts on it.

## Why this actually works: the pricing physics

Text and images are billed at the same per-token rate, but they are counted very differently.

Text is tokenized by content. More characters, more tokens, more cost. Anthropic prices an image instead by its pixel area, using a rough formula of `(width x height) / 750` tokens, and it caps the count (images are resized so the long edge stays around 1568px, which lands near 1,600 tokens per image at the top end). The key point: that number does not care whether the image is a blank rectangle or a wall of text.

On real Claude Code traffic, pxpipe measures dense content like code and JSON packing around 3.1 characters per image-token, against roughly 1.9 characters per text-token. Once your text is denser than about 19 characters per token, imaging it starts to pay. So a block that would cost 25k text tokens can come back as roughly 2.7k image tokens. That is where the 60% headline comes from.

This is what the model actually receives instead of your text:

![A dense wall of whitespace-minified text rendered as a single image, roughly 48k characters packed into about 2.7k image tokens, with an OCR instruction banner across the top](/img/blog/text-as-image-what-the-model-sees_hu_75a279e2854fd825.webp)Around 48k characters of system prompt and tool docs, about 25k tokens as text, rendered as roughly 2.7k image tokens on one page. Source: the [pxpipe](https://github.com/teamchong/pxpipe) repository (MIT), used for illustration.

One nuance the viral version glosses over: because each image is capped near 1,600 tokens, you cannot pour an unlimited context onto a single giant canvas. The tool renders many pages, not one poster. The savings are real, but they come from tiling dense text across several capped images, not from magic.

## This is not a hack. It is a research direction.

The counterintuitive part, that pictures of text can be cheaper than text, is not a proxy-tool gimmick. It is an active area of research.

In October 2025, DeepSeek published [DeepSeek-OCR: Contexts Optical Compression](https://arxiv.org/abs/2510.18234), showing a vision model can decode text from a small set of visual tokens at roughly 10x compression while holding around 97% OCR precision when the compression ratio stays under 10x. Andrej Karpathy picked it up to argue that text tokens might be wasteful "historical baggage," and that feeding models images of text could turn out more efficient. Follow-up papers, such as [Text or Pixels? It Takes Half](https://arxiv.org/html/2510.18279v1), report similar token savings on visual text inputs.

So the idea is legitimate and the long-context economics are genuinely interesting. pxpipe is just an early, aggressive attempt to cash that in on today's commercial APIs, before the models are trained to do it well. And "before the models are trained to do it well" is where the trouble starts.

## The catch that makes it absurd for most work

Rendering text as an image is lossy, and the loss is silent.

When the model misreads an imaged character, it does not throw an error or flag low confidence. pxpipe's current exact-recall test makes the model recover 12-character hex strings from dense imaged content: Fable 5 scored **13 of 15**, Gemini 14 of 15, Opus 5 scored 2 of 15, and GPT-5.6 Sol scored 0 of 15. That spread is why a result on one model cannot be generalized to another.

That is the whole risk in one sentence: **anything you need back byte-exact must stay as text.** IDs, hashes, secrets, exact numbers, precise names. pxpipe keeps recent turns and exact identifiers as text alongside the images for exactly this reason.

A few more things the headline skips:

- **It is model-dependent.** Fable 5 and Gemini performed strongly on the repository's current exact-recall test, while Opus 5 and GPT-5.6 Sol did not. The trick that saves money on one model can quietly corrupt context on another.
- **It adds latency.** Encoding large requests to PNG takes time before the request even leaves your machine.
- **It interacts with prompt caching.** Your biggest, most static context, the system prompt and tool docs, is also the ideal candidate for prompt caching, which already discounts repeated tokens heavily. On the GPT path pxpipe forgoes native cache markers. Imaging context and caching context both target the same tokens, so the real comparison is against a properly cached baseline, not a naive one.

## When it is worth it, and when it will burn you

This is not a yes or no. It is a routing decision, the same discipline we apply to model selection. Match the technique to the payload.

| Good fit for imaging | Do not image this |
| --- | --- |
| Large, static system prompts and tool docs | Anything byte-exact: IDs, hashes, secrets, keys |
| Read-only reference context and long docs | Exact numbers you will compute or quote |
| Collapsed, older conversation history | Recent turns the model must reason over precisely |
| Fable 5 or other strong image readers | Opus-routed or vision-weaker workloads |
| Bulk context where gist is enough | Anything where a silent misread is unacceptable |

If your workload is a huge, stable instruction block feeding a Fable 5 agent that mostly needs the gist, imaging can be a real win. If it is a compliance workflow moving exact figures and identifiers, the same trick is a quiet liability.

## Where this fits in a real cost stack

Imaging context is one lever, and not the first one we would pull. Before reaching for a lossy trick, the boring levers usually win, and they do not risk your data:

- **Prompt caching** for the static prefix, which is lossless and already large.
- **Model routing:** cheap models for mechanical work, strong models for judgment. See [how we route work across Fable, Opus, Sonnet and Haiku](/blog/coding-with-claude-fable-5/).
- **Measuring cost per completed task, not price per token,** which is the number that lands on your invoice. See [cheaper per token, more expensive per answer](/blog/cost-per-token-vs-cost-per-task/).
- **A gateway** to centralise fallback, caching and spend limits. See our [LLM gateway comparison](/blog/llm-gateway-router-comparison-2026/).
- **Self-hosting or open weights** when volume and data residency justify it, covered in [the real cost of self-hosting LLMs in the EU](/blog/self-hosting-llms-eu-cost/).

Imaging context sits at the aggressive end of that list: high potential savings, real correctness risk, worth piloting on the right payload once the safer levers are in place.

Deciding which lever to pull, in what order, against a real bill rather than a benchmark is the work behind our [AI enablement service](/services/ai-enablement/): instrument the current spend, exhaust the lossless levers first, then gate anything lossy behind an eval that would actually catch a corrupted value. [Twinsoft AI](/case-studies/twinsoft-ai/) is that same sequencing applied to a production system, and our [technology-selection guide](/software-development-guide/how-to-choose-a-tech-stack-for-mvp/) states the general rule: decide against the constraint that is expensive to reverse.

![Kevin Riedl](/img/team/kevin.webp)

"The pricing physics is real and the research is serious. But a 60% saving that occasionally invents a hash or a name is not a saving, it is deferred debugging. Image the bulk context that only needs the gist, keep every exact value as text, and never point it at a model that reads images poorly."

## Frequently Asked Questions

### Is rendering context as images safe for production?

Only for context where a silent misread is acceptable, such as large static instructions or read-only reference material fed to a model that reads images well. It is lossy, so keep anything byte-exact (IDs, hashes, secrets, exact numbers) as text. Treat it as a targeted optimisation on the right payload, not a default.

### Does imaging context break prompt caching?

It competes with it. Your biggest static context is also the best candidate for prompt caching, which is lossless. On the GPT path pxpipe forgoes native cache markers. So compare imaging against a properly cached baseline, not an uncached one, or you will overstate the win.

### Why does Opus do worse than Fable at reading imaged text?

It is model-dependent. On pxpipe's own hex-recall test Fable 5 scored 13 of 15 and Opus 0 of 15, so pxpipe defaults to Fable 5 and GPT-5.6 and makes Opus opt-in. The same trick that saves money on a strong image reader can corrupt context on a weaker one.

### Is this the same as DeepSeek-OCR?

It is the same underlying idea, optical context compression, applied differently. DeepSeek-OCR is a model trained to decode text from a small set of visual tokens at about 10x compression. pxpipe is a proxy that images your context for existing commercial APIs that were not trained specifically for it, which is why the loss shows up.

### How much can it actually save?

The pxpipe repository claims a 59 to 70% lower end-to-end bill on Fable 5 and shows a demo task at $42.21 text versus $6.06 imaged. Treat that as the tool author's own figure on their own workload and re-measure on yours, against a cached baseline.

## Final thoughts

So, genius or absurd? Both. The mechanism is real, image tokens are priced by pixels, and serious research points the same way. But bolting it onto models that were not trained for it trades money for silent errors, and silent errors are the most expensive kind.

Use it the way you would use any aggressive optimisation: deliberately, on the payload that fits, with the exact values kept as text and the safer levers, caching, routing, measurement, already in place. Do that and imaging bulk context is a sharp tool. Turn it on everywhere and it will eventually hand you a confidently wrong answer you never see coming.

## You may also like..

[**Cheaper Per Token. More Expensive Per Answer.** Why cost per completed task, not price per token, is the number that lands on your invoice, and how to measure it on your own workload.](/blog/cost-per-token-vs-cost-per-task/) [**AI Enablement vs a generic AI consultancy** One hands you a strategy deck. The other ships a working setup on your infrastructure that your team owns and can run.](/compare/ai-enablement-vs-generic-ai-consultancy/)

Models and infrastructure

## Continue through this cluster

Model selection, inference economics, local deployment, compression and serving architecture.

[Start with the cornerstone**Self-Hosting LLMs in the EU: When Open Weights Actually Pay Off**](/blog/self-hosting-llms-eu-cost/)

- [How to Self-Host LiteLLM in Production: 2026 Guide](/blog/self-host-litellm-production-2026/)
- [AI-Ready Company Wiki: Architecture and Build Guide](/blog/ai-ready-company-wiki/)
- [Does Claude Watermark Text? The 2026 API Answer](/blog/claude-text-watermark-api-2026/)
- [OpenKB Review: Knowledge Compiler vs RAG](/blog/openkb-review-vs-rag/)
- [Unsloth Desktop Review: A Private Local AI Workstation?](/blog/unsloth-desktop-local-ai-workstation-review/)

Inbox, without the noise

## Follow the work that matters to you

Get a short email when we publish something new. Follow the whole blog or only the problems you care about.

[**Back**](/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/team/kevin-riedl/)

[Kevin Riedl](/team/kevin-riedl/) https://linkedin.com/in/wsdt

10 min read · 03 Jul 2026 Last reviewed August 7, 2026

[**Next**](/blog/cost-per-token-vs-cost-per-task/)

New posts by email ×

×

Get new posts by email

A short email when we publish. Free, no tracking.

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/blog/text-as-image-token-savings/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-07-07",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-07-07",
      "url": "https://wavect.io/blog/text-as-image-token-savings/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "Pxpipe is a local MIT-licensed proxy that converts eligible Claude Code system prompts, tool output and older history into dense PNG pages. Its repository now reports 59 to 70 percent lower end-to-end Fable 5 bills, a 10/10 paired SWE-bench Lite result and 14/19 versus 15/19 on a small SWE-bench Pro comparison at roughly 60 percent less request data. The savings are workload- and model-dependent. Exact strings remain the hard failure mode: dense hex recall scores 13/15 on Fable 5, 14/15 on Gemini 3.6 Flash, 2/15 on Opus 5 and 0/15 on GPT-5.6 Sol in the project's own tests. Use pxpipe only for dense, mostly static, gist-oriented context; keep IDs, hashes, secrets and critical numbers as text; and compare it against prompt caching on your own traffic.",
  "articleBody": " Blog overview/AI and agents/Models and infrastructure Pxpipe Review: Can Images Really Cut Claude Code Token Costs 60%? TL;DR Pxpipe is a local MIT-licensed proxy that converts eligible Claude Code system prompts, tool output and older history into dense PNG pages. Its repository now reports 59 to 70 percent lower end-to-end Fable 5 bills, a 10/10 paired SWE-bench Lite result and 14/19 versus 15/19 on a small SWE-bench Pro comparison at roughly 60 percent less request data. The savings are workload- and model-dependent. Exact strings remain the hard failure mode: dense hex recall scores 13/15 on Fable 5, 14/15 on Gemini 3.6 Flash, 2/15 on Opus 5 and 0/15 on GPT-5.6 Sol in the project's own tests. Use pxpipe only for dense, mostly static, gist-oriented context; keep IDs, hashes, secrets and critical numbers as text; and compare it against prompt caching on your own traffic. Related service: AI Enablement Yes, pxpipe can cut the end-to-end bill for some Claude Code workloads by roughly 59 to 70%, but only by accepting a new correctness risk. It turns bulky context such as system prompts, tool documentation, old history, and pasted code into dense images before the request reaches the model. Exact strings remain text. The reasoning sounds absurd, which is exactly why it went viral. An image costs the model a fixed number of tokens based on its pixel size, not on how much text is crammed inside it. So you can pack a lot of characters into one dense picture and pay for the pixels, not the prose. pxpipe is an MIT-licensed local proxy for Anthropic, OpenAI, and Google-compatible request paths. Its current repository reports 59 to 70% lower end-to-end bills on tested Fable 5 workflows, while its SWE-bench runs preserved 10 of 10 Lite tasks and 14 of 19 Pro tasks versus 15 of 19 for plain text. Those are author-run benchmarks, not an independent guarantee. Our verdict, reviewed 7 August 2026: the pricing mechanism is real, but pxpipe should be a measured optimization for recall-tolerant context, not a default for production agents. The decisive question is not whether images are cheaper. It is whether your eval catches a silently misread identifier before the model acts on it. Why this actually works: the pricing physics Text and images are billed at the same per-token rate, but they are counted very differently. Text is tokenized by content. More characters, more tokens, more cost. Anthropic prices an image instead by its pixel area, using a rough formula of (width x height) / 750 tokens, and it caps the count (images are resized so the long edge stays around 1568px, which lands near 1,600 tokens per image at the top end). The key point: that number does not care whether the image is a blank rectangle or a wall of text. On real Claude Code traffic, pxpipe measures dense content like code and JSON packing around 3.1 characters per image-token, against roughly 1.9 characters per text-token. Once your text is denser than about 19 characters per token, imaging it starts to pay. So a block that would cost 25k text tokens can come back as roughly 2.7k image tokens. That is where the 60% headline comes from. This is what the model actually receives instead of your text: Around 48k characters of system prompt and tool docs, about 25k tokens as text, rendered as roughly 2.7k image tokens on one page. Source: the pxpipe repository (MIT), used for illustration. One nuance the viral version glosses over: because each image is capped near 1,600 tokens, you cannot pour an unlimited context onto a single giant canvas. The tool renders many pages, not one poster. The savings are real, but they come from tiling dense text across several capped images, not from magic. This is not a hack. It is a research direction. The counterintuitive part, that pictures of text can be cheaper than text, is not a proxy-tool gimmick. It is an active area of research. In October 2025, DeepSeek published DeepSeek-OCR: Contexts Optical Compression, showing a vision model can decode text from a small set of visual tokens at roughly 10x compression while holding around 97% OCR precision when the compression ratio stays under 10x. Andrej Karpathy picked it up to argue that text tokens might be wasteful \"historical baggage,\" and that feeding models images of text could turn out more efficient. Follow-up papers, such as Text or Pixels? It Takes Half, report similar token savings on visual text inputs. So the idea is legitimate and the long-context economics are genuinely interesting. pxpipe is just an early, aggressive attempt to cash that in on today's commercial APIs, before the models are trained to do it well. And \"before the models are trained to do it well\" is where the trouble starts. The catch that makes it absurd for most work Rendering text as an image is lossy, and the loss is silent. When the model misreads an imaged character, it does not throw an error or flag low confidence. pxpipe's current exact-recall test makes the model recover",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "dateModified": "2026-08-07",
  "datePublished": "2026-07-03",
  "description": "Pxpipe is a local MIT-licensed proxy that converts eligible Claude Code system prompts, tool output and older history into dense PNG pages. Its repository now reports 59 to 70 percent lower end-to-end Fable 5 bills, a 10/10 paired SWE-bench Lite result and 14/19 versus 15/19 on a small SWE-bench Pro comparison at roughly 60 percent less request data. The savings are workload- and model-dependent. Exact strings remain the hard failure mode: dense hex recall scores 13/15 on Fable 5, 14/15 on Gemini 3.6 Flash, 2/15 on Opus 5 and 0/15 on GPT-5.6 Sol in the project's own tests. Use pxpipe only for dense, mostly static, gist-oriented context; keep IDs, hashes, secrets and critical numbers as text; and compare it against prompt caching on your own traffic.",
  "headline": "Pxpipe Review: Can Images Cut Claude Code Token Costs 60%?",
  "image": "https://wavect.io/img/blog/headers/header_text-as-image-token-savings.svg",
  "inLanguage": "en",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/blog/text-as-image-token-savings/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/blog/text-as-image-token-savings/",
  "wordCount": 2189
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/",
      "name": "Home",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/overview/",
      "name": "Blog overview",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/topics/ai-agents/",
      "name": "AI and agents",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/clusters/models-infrastructure/",
      "name": "Models and infrastructure",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/text-as-image-token-savings/",
      "name": "Pxpipe Review: Cut Claude Code Token Costs with Images | ",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Only for context where a silent misread is acceptable, such as large static instructions or read-only reference material fed to a model that reads images well. It is lossy, so keep anything byte-exact (IDs, hashes, secrets, exact numbers) as text. Treat it as a targeted optimisation on the right payload, not a default."
      },
      "name": "Is rendering context as images safe for production?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It competes with it. Your biggest static context is also the best candidate for prompt caching, which is lossless. On the GPT path pxpipe forgoes native cache markers. So compare imaging against a properly cached baseline, not an uncached one, or you will overstate the win."
      },
      "name": "Does imaging context break prompt caching?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It is model-dependent. On pxpipe's own hex-recall test Fable 5 scored 13 of 15 and Opus 0 of 15, so pxpipe defaults to Fable 5 and GPT-5.6 and makes Opus opt-in. The same trick that saves money on a strong image reader can corrupt context on a weaker one."
      },
      "name": "Why does Opus do worse than Fable at reading imaged text?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It is the same underlying idea, optical context compression, applied differently. DeepSeek-OCR is a model trained to decode text from a small set of visual tokens at about 10x compression. pxpipe is a proxy that images your context for existing commercial APIs that were not trained specifically for it, which is why the loss shows up."
      },
      "name": "Is this the same as DeepSeek-OCR?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The pxpipe repository claims a 59 to 70% lower end-to-end bill on Fable 5 and shows a demo task at $42.21 text versus $6.06 imaged. Treat that as the tool author's own figure on their own workload and re-measure on yours, against a cached baseline."
      },
      "name": "How much can it actually save?"
    }
  ]
}
```
