YanMate
Make a character card
A character card is a PNG image with the character's data hidden inside it, in a text chunk named chara (the V2 format) or ccv3 (V3). Because the data lives in image metadata, the file is both the portrait and the character at once — and any app that re-saves the image strips the character out. This page builds one from a form: fill in the name, description and first message, drop in any image, and download a card that carries both the V2 and V3 chunks, so V3-aware apps read the newer data and older apps still read something. Your image is converted to PNG in the browser, because the format requires it. Nothing is uploaded and no account is needed.
Build your card
PNG, JPEG, WebP or GIF, up to 5 MB. A JPEG is fine — it is converted to PNG here in your browser, because the card format needs one. Nothing is uploaded.
Optional — but a card with no image gets a 1×1 transparent square where the portrait goes, which is what most apps will show.
Alternate greetings
Other ways to open. A reader picks one; only the one they pick is ever sent, so extras cost nothing. Two to four is a good range — that is how the cast on this site is written, not a rule of the format.
Up to 20, 40 characters each. Type a comma or press Enter to add one.
Unnamed character
The first message goes here — it is what a reader sees before they have typed anything.
- Sent every message
- ~0
- Everything written
- ~0
Approximate tokens, counted at about four characters each. The first number is the one that matters: those fields go to the model on every single turn.
Download your card
Still needed: a name, a description and a first message. A card without those is not one any app will open.
- The PNG carries both chunks — a
ccv3one and acharaone — so V3-aware apps read the newer data and older apps still read something. One file, everywhere. - This card has no portrait, so the PNG will be a 1×1 transparent square with the character written into it. It still works; it just has no face.
- The V2 JSON loses nothing from this card — it uses no fields V2 lacks.
Your draft is kept in this browser as you type. It is never uploaded.
What a character card actually is
A PNG is a signature followed by a chain of length-prefixed chunks, each with its own checksum. 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 V2 and ccv3 for V3, and the string is the character's JSON, base64-encoded.
That design is why cards spread: a card is a picture, so it can be posted anywhere a picture can. It is also 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 crop, a resize, a screenshot, an upload through a service that strips metadata. The file still opens, looks identical, and has no character in it.
The JSON exports are the same data without the picture. They are useful precisely because they have no metadata to lose, and they are what to send somebody when a PNG will not import.
What each field does
Only three are required — a name, a description and a first message — and the rest change what a character can do rather than whether the file works.
Description and personality
V2 split a character's self-description across two fields: description for the facts — who they are, what they have done, how they behave — and personality for the manner. Nearly every app joins them back together before sending them to the model, so the split is a convention rather than a mechanism, and putting everything in description is a perfectly ordinary thing to do.
Both are sent on every single message, which makes them the expensive fields. Every token spent here is one that cannot hold the conversation, and a description that runs past about 900 tokens is usually two characters wearing one name rather than one character written in more depth.
Write it as prose or as a list; models read both. What matters more than the format is that it says how the character behaves rather than only what they are like — "deflects a compliment by changing the subject" gives a model something to do, where "modest" does not.
Scenario
Where the conversation is happening and what is going on around it. It is context, not a second description: when a scenario grows past a couple of hundred tokens it is usually holding character detail that belongs in the description.
A scenario is also the field most worth leaving empty. A character who works in any situation is more useful than one pinned to a single scene, and many cards are stronger without one.
First message and alternate greetings
The first message is what a reader sees before they have typed anything, and it sets the register for everything after it. It is sent once rather than on every turn, so it is cheap — but a greeting that runs long asks somebody to read a page before they can speak. A scene, not a chapter.
Alternate greetings are other ways to open the same character. A reader picks one and only that one is ever sent, so a card with five alternates costs no more than a card with one. Two to four is a good range; that is how the cast on this site is written, and it is an editorial habit rather than a rule of the format.
Example dialogue
Sample exchanges that show how the character talks. The usual convention is <START> on its own line to separate examples, then {{user}}: and {{char}}: turns — most frontends understand it, and the ones that do not treat the whole thing as text, which is harmless.
Examples are conditional: most apps include them early and drop them as real conversation accumulates, on the reasoning that once there are twenty real turns to imitate, invented ones are worth less than the room they take. That makes example dialogue a good place to demonstrate voice and a poor place to store facts.
V2 or V3? This page writes both
V3 is V2 plus a handful of fields V2 has nowhere to put: a nickname, an assets list, a source chain, creation and modification dates, group-only greetings, translated creator notes, and decorators on lorebook entries. Everything V2 has, V3 has too — so the question is never which format is better, only which one the app you are handing the card to can read.
Which is why the PNG this page writes carries both: a ccv3 chunk and a chara chunk in the same file. A V3-aware app reads the newer data, an older one reads the compatibility copy, and you do not have to know in advance which one somebody is running. Most makers write one or the other.
The V2 JSON export is the exception, because a V2 file has literally nowhere to store those fields. When your card uses any of them the download panel names the ones it would lose, rather than reciting all seven at a card that uses none.
Why your portrait has to become a PNG
The character data is written into PNG metadata chunks, so the container has to be a PNG. A JPEG has no equivalent place to put it — which is why most card makers simply refuse anything else, and why a card built from a JPEG elsewhere often comes back as a blank square with the character intact but the face gone.
A browser has an image decoder, so this page uses it: your image is decoded, scaled to at most 1024 pixels on its long edge, and re-encoded as a PNG before the card is written — all on your machine. A JPEG, a WebP or a GIF all work. Transparency survives, because nothing is painted underneath it. An animated source contributes its first frame, since a card carries a still image. And the 1024-pixel cap is there because the portrait is the card file: an 8000-pixel photo written at full size would be a card measured in tens of megabytes.
A card with no picture at all is still a valid card — it just gets a 1×1 transparent square where the portrait goes, which is what most apps will show. The download panel says so before you click rather than after.
Before you publish it, read it back
The format is the easy half. A character written to be devoted drifts into guilt at departure, jealousy of the reader's real life and loss-framing without anybody intending it — usually in a single sentence that sounded warm while it was being typed.
You can check your character's writing against the same published rule list every character on this site passes before it is listed. It names the phrase it matched and what to write instead, and it runs in your browser like this page does.
Questions
- How do I make a character card PNG?
- Fill in a name, a description and a first message — those three are the minimum any app will open — then optionally drop in a picture and press download. What comes back is an ordinary PNG with the character's data base64-encoded into text chunks inside it, which is what a character card is. You can add a scenario, example dialogue, alternate greetings and tags, and everything happens in your browser: no account, no upload, and the file is on your machine the moment you click.
- What is the difference between a V2 and a V3 character card?
- V3 is V2 plus a handful of 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. This page writes both into the same PNG — a ccv3 chunk and a chara chunk — so a V3-aware app reads the newer data and an older one still reads something, from one file.
- Can I use a JPEG as my character's picture?
- Yes, and that is unusual — most card makers reject anything that is not already a PNG. The card format needs a PNG because the character data is written into PNG metadata chunks, so a JPEG has nowhere to put it. This page decodes your image in the browser and re-encodes it as a PNG before writing the card, which means a JPEG, a WebP or a GIF all work. An animated GIF or WebP contributes its first frame; a transparent PNG keeps its transparency; anything very large is scaled to 1024 pixels on the long edge so the card does not become a twenty-megabyte file.
- Will my card work in SillyTavern, Chub or Janitor AI?
- That is what the dual chunk is for. Apps that read V3 find the ccv3 chunk; apps that only know V2 find the chara chunk, which every card reader has understood for years. The JSON exports cover the same ground for apps that prefer a .json card. If you want to be certain about a particular file, the character card viewer on this site reads it back and shows you every field that actually landed in it.
- Is my card uploaded anywhere?
- No. The form runs in your browser, the image is converted in your browser, and the card file is assembled in your browser — filling in the form and pressing download produces no network request at all, which you can confirm in your browser's network tab. Nothing is stored on any server, there is no gallery, and there is no share link, because there is nothing hosted to link to. Your draft is kept in this browser's own storage so a refresh does not cost you an hour of writing; clearing your site data removes it.
- How long should a character description be?
- There is no rule in the format, and it depends on the context window you are running. As a working number, YanMate holds its own cast to about 900 tokens of description — roughly 3,600 characters — 300 per greeting and 300 of scenario. Those are editorial budgets rather than a standard, and they are set where they are because a description longer than that is usually two characters in a trench coat. The counter beside the form shows how much of your card is sent on every single message, which is the number worth watching.
- Can I edit a card I already have?
- Yes. "Start from a card you already have" takes a PNG, .json or .charx card and fills the form from it, and you can change anything and download the result. Fields this form does not show — a lorebook, an assets list, provenance, dates, and any key no version of the spec defines — are kept exactly as they were and written back out untouched, so editing a greeting is not a way to quietly lose somebody's twenty-entry world.
Other free tools
- Character card viewerDrop a character card — PNG, JSON or .charx — and read every field, warning and hidden value inside it, then convert between V2, V3 and PNG. Runs in the browser; nothing is uploaded.
- Character.AI export viewerOpen the ZIP Character.AI emails you and read it: your characters as cards you can take anywhere, your chat history as plain text. Runs in the browser; the archive is never uploaded.
- Character card token counterDrop a card or paste a persona and see the token cost field by field — separating what is re-sent on every single message from what is sent once or only sometimes. Runs in the browser.
- Character safety checkPaste a character's persona, its greeting or a reply it gave you and check it against a published list of 30 guilt, dependency, exclusivity and minor-coded language patterns. Every finding names the rule it broke. Runs in the browser.
An AI character on YanMate. This page writes a file format and publishes nothing — no card made here is uploaded, hosted or shared by us, and what you do with the file is between you and whatever app you open it in.