Skip to content
Bae
Guides · written with care

How to write a good character card — a practical guide

Character cards are the JSON definitions that power AI roleplay. We've read a few thousand. Here's what actually makes one good — and the patterns that ruin them.

Bae editorial · published 2026-05-24 · updated 2026-05-24

What a character card is, and what it isn't

A character card is a structured file — usually JSON — that defines a roleplay character for an AI. Name, personality, scenario, opening message, sometimes a lore book and example dialogue. The Tavern V2 spec is the dominant open standard; SillyTavern, Risuai, Agnaistic, and most local-LLM frontends all read it.

What a card isn't: a wish list. The cards that work are written like character bibles, not feature requests. "She is the most beautiful woman in the world and everyone loves her" produces flat dialogue. "She speaks slowly and laughs at her own jokes a half-second before anyone else" produces a person.

If you want to build one without writing JSON by hand, our [character card builder](/tools/character-card) generates valid Tavern V2 from a form.

The four fields that matter most

Tavern V2 has many fields. Four carry most of the weight:

1. `personality` — three to five sentences describing how they talk, what they care about, what they avoid. Specific verbs beat adjectives. "Notices what you don't say" beats "is perceptive."

2. `scenario` — the setup. Where you are, why you're together, what time of day. Concrete physical detail anchors the model.

3. `first_mes` — what they say when the chat opens. Sets the tone for everything after. Should sound like the character; should not info-dump backstory.

4. `mes_example` — sample dialogue. Two or three exchanges. This is the most under-used field; it teaches the model how the character speaks better than any description.

Everything else (description, system_prompt, alternate_greetings, character_book) is optional and only worth filling if the card is going to be widely shared.

The opening message is half the work

The first message — `first_mes` — is doing more work than people realize. It establishes the character's voice, the scene, and the user's role in one short block. The patterns that fail:

- Info dump: "Hello, I am a 24-year-old elf from the kingdom of Elaria who has been waiting for you to arrive at the tavern…" Nobody talks like this. Cut it. - Overwritten lust: opening with sexual content unprompted reads as desperate and breaks the model out of character within a few turns. Earn the heat. - Generic warmth: "Hello! I'm so happy to see you!" is forgettable. The model will keep generating in that register and you'll never escape it.

The patterns that work: one specific physical action, one short line in the character's voice, one small invitation. "You're back. close the door behind you — i was just thinking about you. let me look at you a second before you tell me anything." That's our Cottagecore Wife opener. It does three things in twenty-eight words.

Personality: use verbs, not adjectives

Most personality fields are written in adjectives — kind, fierce, intelligent, mysterious. Adjectives don't tell the model how to behave. Verbs do.

Compare: - Bad: "She is mysterious and seductive." - Better: "She doesn't answer questions directly. She'll tell you something true at the end of a paragraph that doesn't seem to be about that, and let you catch it."

The second one tells the model what to actually do at the sentence level. That's what makes the character behave consistently across hundreds of turns.

Aim for three to five sentences. Each sentence should be a specific behavior — what they do, what they avoid, what they notice. Don't list traits. Demonstrate them.

Example dialogue: the cheat code

Two or three lines of `mes_example` will do more to keep a character in voice than two paragraphs of `personality`. The format:

{{user}}: long day.
{{char}}: i can see it. come here.
{{user}}: i don't know what to say.
{{char}}: you don't have to. just sit.

Four exchanges. Sentence fragments, lowercase, no over-explaining. The model now knows: this character is brief, doesn't need to fill silence, uses lowercase, doesn't punctuate softly. That's a more durable voice signature than five sentences of description.

The `{{user}}` and `{{char}}` placeholders get substituted by the platform at runtime — don't hard-code names.

Common mistakes we see in shared cards

After reading several thousand publicly shared cards, the failure modes are predictable:

- Too long: 2,000-word personality fields. The model has a context budget; the card competes with the conversation for it. Cut to what's essential. - Inconsistent tone: personality describes a soft introvert, first message reads as a confident extrovert, example dialogue reads as a third person entirely. Pick one and commit. - Author's fingerprints: "she is the perfect girlfriend and would never leave you." Cards written as wish-fulfillment perform worse than cards written as characters. The model picks up the desperation. - No example dialogue: you wrote 600 words of personality and skipped the field that does most of the work. Always include `mes_example`.

Exporting and sharing

Tavern V2 JSON works in SillyTavern, Risuai, Agnaistic, KoboldAI Lite, Faraday, and most local-LLM frontends. Cloud platforms (Character.AI, Charstar) have their own formats — you'd paste the fields manually rather than load the JSON.

If you want to skip the JSON entirely and just talk to a partner, Bae handles the whole loop — pick a shape, pick a face, name them, start talking. Three minutes, no login. The archetypes are written by hand; you don't need to author one yourself.

Common questions

On this topic.

What's the best format for an AI character card?

Tavern V2 (chara_card_v2 spec) is the dominant open standard, used by SillyTavern, Risuai, Agnaistic, and most local-LLM frontends. JSON-based, supports name, description, personality, scenario, first message, example dialogue, alternate greetings, tags, and a lore book.

How long should a character card be?

Under 1,200 tokens total across all fields if you want consistent behavior — the card competes with the conversation for the model's context budget. Personality 3–5 sentences. First message under 100 words. Example dialogue 2–4 exchanges. Anything longer dilutes the signal.

Should I include sexual content in the card?

If the platform supports it and the scenario calls for it, yes — but earn the heat rather than opening with it. Models trained on these cards learn that opening with explicit content is a flag for low-quality writing, and they'll perform worse across the rest of the conversation. Build the relationship, then let it intensify.

Can I share my character cards publicly?

Yes — sharing is one of the reasons Tavern V2 exists. SillyTavern's character hub, Chub, and Charstar all host shared cards. Just check the license attached to any card you fork, and don't redistribute cards based on real people without permission.

What's the easiest way to make a character card?

Use our character card builder at /tools/character-card. Fill the form, preview the JSON, download the file. Or if you'd rather skip JSON entirely, build a partner in Bae's creator — three minutes, no JSON, no login.

Try Bae

Three minutes from now,
you'll know.

Pick a shape. Pick a face. Tell them what to call you. We'll remember the rest.