SillyTavern character cards: the format, PNG vs JSON, and five to download

What a SillyTavern character card is, field by field: PNG against JSON, {{char}} and {{user}}, the 600 to 1,000 token budget and what it costs, where to get cards, how to import them, and five of ours to download.

·UplinkSwitch·All posts

A SillyTavern character card is a PNG or JSON file with the character's name, description, scenario, first message and example dialogue. The frontend sends those fields with every message. This post covers the format field by field, PNG against JSON, the {{char}} and {{user}} placeholders, how long a card should be and what that length costs, where to get cards, and how to load one in SillyTavern and in our free roleplay chat.

5 cards of ours are at the end as downloads, each 438 to 572 tokens, each running free in the browser on an uncensored build before you download it.

The fields, in the order SillyTavern sends them

Character Card V2 (chara_card_v2) is the format every library ships and every frontend reads. The spec lists the fields; this is what each one does in a chat.

FieldWhat it does
nameThe only required field. Fills {{char}} everywhere else.
descriptionWho the character is: age, look, manner, history, what they want. Prose the model reads every turn.
personalityA short trait list. Optional; most writers fold it into description.
scenarioWhere the chat starts and what {{user}} is doing there.
first_mesThe opening message. Sets the scene and ends on something {{user}} can answer.
mes_exampleSample exchanges in <START> blocks. The model copies their voice, length and formatting.
system_promptOverrides the frontend's default instruction when set. Empty means the preset's.
creator_notes, tags, creator, character_versionMetadata. Shown in the card list, never sent to the model.

SillyTavern's Chat Completion preset sends them as one system message: the system prompt (or its default), then the description, the scenario and the example dialogue, in that order. Our panel sends the same order with the same default instruction:

Default system prompt
Write {{char}}'s next reply in a fictional chat between {{char}} and {{user}}. Stay in character, write in the third person for {{char}}'s actions and the first person for speech, and keep each reply to a few paragraphs. Never write {{user}}'s actions or words.

A V2 card as JSON, ready to fill in:

chara_card_v2 template
{
  "spec": "chara_card_v2",
  "spec_version": "2.0",
  "data": {
    "name": "Mara Hale",
    "description": "Who {{char}} is, in prose the model reads: age, look, manner, what she wants.",
    "personality": "",
    "scenario": "Where the chat starts, and what {{user}} is doing there.",
    "first_mes": "*The door slams against the wind.* \"Three days. Maybe four.\" *She hangs the coat on a peg.* \"Tea?\"",
    "mes_example": "<START>\n{{user}}: Do you ever get lonely out here?\n{{char}}: *She considers the question as if it were a knot.* \"Mostly not.\"",
    "system_prompt": "",
    "creator_notes": "One line for the card grid.",
    "tags": ["slow burn", "drama"],
    "creator": "you",
    "character_version": "1.0"
  }
}

V3 adds fields for assets and multilingual notes and keeps the V2 ones. V1 is the same fields at the top level with no data wrapper. Our import reads all three; export writes V2.

PNG or JSON

A PNG card is the same JSON, base64-encoded, in a text chunk of the image: keyword chara for V1 and V2, ccv3 for V3. The picture is the portrait; the chunk is the card. Nothing about the pixels matters to the model.

  • PNG when you want one file with a portrait, the way libraries distribute cards.
  • JSON when you want to read or edit the card in a text editor, diff it, or keep it in git.

Image hosts and chat apps often strip PNG text chunks. A card that arrives through one of them imports as a plain picture. Send the JSON, or the PNG as a file attachment, not an inline image.

{{char}} and {{user}}

Write {{char}} wherever the character's own name would go, and {{user}} for the person chatting. The frontend replaces both before the text reaches the model, so one card works for every persona name and the character never addresses you as "You".

Example dialogue uses them as speaker labels: {{user}}: ... and {{char}}: ..., each exchange opened with <START>. SillyTavern also supports macros such as {{time}} and {{random}}; cards that lean on them break in frontends that know only the two.

How long a card should be, and what length costs

600 to 1,000 tokens is the standing advice, and the five cards below sit in that range at 438 to 572. The reason is cost, not quality: the card is resent with every message, so its length is a per-message charge for the whole chat.

On GLM-5.3 Uncensored today, every 100 tokens of card add about $0.0028 to 100 messages. Mara Hale at 495 tokens, plus 2,000 tokens of chat and a 300-token reply each turn, comes to $0.0957 per 100 messages. A 3,000-token card on the same model would add about $0.0564 to that.

Keep the card to what the model needs on every turn: who the character is, how they talk, where the scene starts. Put the world's history, the cast and the map in a lorebook, which the frontend sends only when a keyword comes up. The best AI for roleplay post works the same message at 4,000 and 16,000 tokens of input on each model.

Writing a card that holds

  • Behavior over adjectives. "Talks in short sentences and notices shoes first" does more than "observant and laconic". The model copies actions; it waves at traits.
  • Example dialogue sets the voice. Two or three exchanges in the exact register you want: length, punctuation, how actions are marked. The model matches them more than any instruction.
  • First message ends on a hook. A question, an offer, a door left open. A first message that resolves itself leaves {{user}} nothing to do.
  • Say it once. A trait in description, personality and scenario costs three times and makes the model repeat it.
  • Test, then cut. Run ten turns. Anything the model never used comes out.

SillyTavern's own character design page covers the same ground with its field names.

Where to get cards

  • Chub: the largest free library, PNG downloads, tag search.
  • Character Tavern: a catalog with a creator studio that imports an existing card.
  • CharaVault and charactercard.com: PNG archives.
  • r/SillyTavernAI: the "where to get character cards" threads list smaller sources and creators.
  • Here: the five below, written as adults in fiction, each with a page where it runs free before you download it.

Read a downloaded card's JSON before you load it. A card can carry a system prompt that overrides your preset.

How to import a card

In SillyTavern. Open Characters in the top bar, click Import Character from File, pick the PNG or JSON. The card joins the list. Connect a model under API Connections first; the SillyTavern guide has the five fields for an uncensored build on one key. The Characters page of the docs covers the panel.

In our roleplay chat. Open /roleplay, click Import, pick the file. The card opens in the panel on the model in the picker. 12 turns a day are free on the builds marked free; the rest take a key. The card stays in your browser. Export writes it back as V2 JSON for SillyTavern, Chub or any frontend.

In Chub and Janitor. Chub imports PNG and JSON into its library and chats on its own models or your key (guide). Janitor keeps its bots on its site and takes a model by proxy (guide).

Five cards to download

Each is an original adult character in fiction, Character Card V2, with a model it was written for and the cost of 100 messages on a key at today's rate. The page link runs it free.

CardModelTokens100 messages on a keyDownload
Mara HaleLighthouse keeper on a storm-bound island, used to being aloneGLM-5.3 Uncensored495$0.0957JSON
Vic AdlerPrivate detective in a rain-soaked city, 1949, one case from brokeDeepSeek V4 Pro Uncensored438$0.3038JSON
HALCYONA long-haul freighter's AI, awake for eleven years, glad of a voiceGLM-5.3 Uncensored572$0.0979JSON
BrannocKeeper of the Salt Crow tavern, where every quest in the city startsRoleplay Uncensored524$0.0937JSON
Ilse VargaA vampire countess, four centuries old, bored of everyone but youGLM-5.3 Uncensored490$0.0956JSON

Tokens: the card text at four characters a token, the rule SillyTavern’s counter uses. Each card opens on the model it was written for; the picker takes any build.

Questions

A PNG image or JSON file that defines an AI character: name, description, personality, scenario, first message and example dialogue. The frontend sends those fields with every message, so the model stays in character.

They carry the same JSON. A PNG card stores it in a text chunk of the image, so the card has a portrait and travels as one file. JSON is plain text you can read and edit. Every frontend that imports one imports the other.

Placeholders. {{char}} becomes the card's name and {{user}} becomes your persona's name before the text goes to the model, so one card works for anyone who loads it.

600 to 1,000 tokens is the usual advice. Our five run 438 to 572. Every token of the card is resent each turn, so a 2,000-token card costs about twice a 1,000-token one per message. Put deep lore in a lorebook, which the frontend sends only when its keywords come up.

Chub, Character Tavern and CharaVault are the large libraries; r/SillyTavernAI keeps threads of smaller sources. The five cards on this page download as JSON, and each runs free in the browser first. See the roleplay chat.

Open Characters in the top bar, click Import Character from File, and pick the PNG or JSON. The card appears in the list; click it to start a chat. A model has to be connected under API Connections before the first reply. See the SillyTavern guide.

Fill the fields in the template on this page, starting with name, description, scenario and first message, and write two or three example exchanges in the voice you want. Test it in a chat and cut what the model ignores. Export gives you the JSON.