YanMate

See what's actually inside a character card

A character card is an ordinary PNG image with the character's data hidden inside it, base64-encoded into a text chunk named chara (V2) or ccv3 (V3) — or a plain .json file, or a .charx ZIP bundle. Because the data lives in image metadata, any app that re-saves the picture silently strips the character out, which is the single most common reason a card will not import. Drop a card below and this page decodes it in your browser and shows every field, every warning and every value other apps left behind. The file is never uploaded.

Check a card

No card yet? Browse the cast — every character opens without an account.

What a character card actually is

Three containers, one set of data. Knowing which one you are holding is most of the answer when something will not import — and if you would rather start clean, you can make a card from scratch.

PNG cards (chara and ccv3 chunks)

A PNG is a signature followed by a chain of length-prefixed chunks, each with its own CRC. Some of those chunks are the picture; a tEXt chunk is a keyword and a string, and that is where a character card lives. The keyword is chara for a V2 card and ccv3 for a V3 one, and the string is the card's JSON, base64-encoded.

That design is why cards spread — a card is a picture, so it can be posted anywhere a picture can — and it is why they break. Nothing about a tEXt chunk is part of the image, so any tool that decodes and re-encodes the picture drops it: a screenshot, a crop, a resize, an upload through a service that strips metadata, or a messaging app that recompresses what you send. The file still opens, still looks identical, and has no character in it.

A card may carry both chunks at once, which is how the ecosystem stays compatible with V2-only readers. When it does, the ccv3 copy is the real one and the chara copy is lossy — V2 has nowhere to put assets, source, a nickname, group-only greetings, or lorebook decorators. This page reads ccv3 and says so.

JSON cards (V1, V2 and V3)

The same data without the picture. V1 is a bare object with six fields — name, description, personality, scenario, first_mes, mes_example — and no version marker at all; if a JSON card has no spec key, it is V1 by definition. V2 wraps those under a data key beside spec: "chara_card_v2", and adds the system prompt, alternate greetings, tags, a creator and a character_book. V3 adds a nickname, assets, a source chain, creation and modification dates, group-only greetings, translated creator notes and lorebook decorators.

A .json card is the format to ask for when a PNG will not import, because it has no metadata to lose. It is also usually much smaller, since it carries no picture.

.charx bundles

A ZIP with a card.json at its root and an assets/ folder beside it — V3's answer to a card that wants more than one image. A .charx that has no card.json is a valid ZIP and not a card, and this page says exactly that rather than failing vaguely.

Unpacking one needs the browser's DecompressionStream, which Safari did not ship until 16.4. On an older browser this page will say so rather than throwing.

Why a card fails to import

Five causes account for nearly all of it, and they are distinguishable from each other — which is the point of opening the file rather than guessing.

The image was re-saved
By far the most common cause, and the one that looks like nothing is wrong. Cropping, resizing, screenshotting, or sending a card through an app that recompresses images all produce a valid PNG with no tEXt chunk. The error you get elsewhere is usually "no character data"; the fix is the original download, or a .json export from the app you are leaving.
The card data is compressed
A few tools write the payload into a zTXt chunk — the compressed variant of tEXt — rather than a plain one. This page does not inflate compressed card chunks and will report no character data rather than pretending. Re-exporting from the source app is the fix.
The base64 is damaged
The chunk is there and its payload will not decode. Usually a truncated download or a file edited by hand. Nothing can be recovered from it, so the original file is the only route.
The character has no name
A card whose name is empty or only spaces is refused by most importers, including this page's parser, because there is nothing to call the result. It is a surprising failure to hit and an easy one to fix in the app that wrote the card.
It is a chat export, not a character
A JSON file full of messages is a conversation, not a character definition. Some exports — Character.AI's in particular — pack both, and this page will recover the character from one and tell you it did so as a best-effort read.

Converting between formats

Once a card has parsed, this page can write it back out three ways, in your browser, with no upload in either direction.

V3 JSON is the lossless one: everything the file carried, including fields no version of the spec defines, which are kept verbatim rather than dropped. V2 JSON is the compatibility copy for an app that cannot read V3, and it is honestly lossy — assets, source, nickname, group_only_greetings, the two dates and creator_notes_multilingual have nowhere to go in V2 and are dropped rather than smuggled in under keys a V2 reader would not understand. PNG writes both chunks at once, so a single file opens in old and new apps.

The one thing a PNG export cannot always do is keep the picture. Writing a card into a PNG appends chunks to an existing PNG, so a portrait that is already a PNG comes through and one that is a WebP or a JPEG does not. A card with no image at all exports onto a 1×1 transparent one. The download row says which case you are in before you click.

Questions

Why does my character card say "no character data"?
Because the PNG has no chara or ccv3 text chunk in it. Almost always the image was re-saved by something that strips metadata — a crop, a resize, a screenshot, an upload through a service that recompresses images, or a messaging app. The picture is intact and the character is gone. Use the original download, or ask for a .json card, which has no metadata to lose. A rarer cause is a card written into a compressed zTXt chunk, which this page does not inflate.
What is the difference between a V2 and a V3 character card?
V3 is V2 plus six things V2 has nowhere to put: a nickname that replaces {{char}}, an assets list for more than one image, a source chain recording where the card came from, creation and modification dates, group-only greetings for multi-character scenes, translated creator notes, and @@decorator lines on lorebook entries. Everything V2 has, V3 has. A PNG can carry both formats at once, in a chara chunk and a ccv3 chunk, so one file opens in old and new apps — and when it does, the V2 copy is the lossy one.
Can I convert a .charx file to a PNG?
Yes. Drop the .charx here and download it as a PNG: the card's text is written into both a ccv3 and a chara chunk, so the result works in apps that read either. If the bundle packs a PNG avatar, that picture becomes the image the card is written onto. If its avatar is a WebP or JPEG, the PNG export has no picture — appending a chunk to an existing PNG cannot re-encode another format — and this page says so before you click rather than after.
Is my card uploaded anywhere?
No. The file is read by JavaScript running in your browser, using the same parser this site uses server-side for imports. Dropping a card here produces no network request at all — you can confirm that in your browser's network tab. Nothing is stored, nothing is logged, and there is no result URL to share, because there is no result on any server to share.
Why does the PNG I download have no picture?
Because only a PNG portrait can be carried through. Writing a card into a PNG means appending text chunks to an existing PNG, and re-encoding a WebP or JPEG into one would need an image decoder this page does not carry. So a card that arrived as .json, or whose portrait is in another format, exports onto a 1x1 transparent image. The character data is complete either way; it is the picture that is missing, and the download row says which case you are in before you click.
Does this work with SillyTavern, Chub or Janitor AI cards?
Yes — those all write standard V1, V2 or V3 cards, as PNG or JSON, and that is what this page reads. It also reads RisuAI's V3 cards including their assets and lorebook decorators, .charx bundles, and Character.AI exports as a best-effort fallback. Fields no spec defines are kept rather than dropped, so a card converted here and taken back to the app it came from is the same card.

Other free tools

An AI character on YanMate.