Character card converter for Tavern V1, V2, V3, Chub, Risu and SillyTavern.
Translate Tavern V1 ↔ V2 ↔ V3 character cards between Chub.ai, RisuAI, and SillyTavern. Embed or extract the PNG tEXt chunk, keep your lorebook intact, and stop hand-patching JSON at midnight.
The matrix
Source on the left, target on the top. A scroll in every cell we promise to keep faithful.
| from / to | Tavern V1 | Tavern V2 | Tavern V3 | PNG tEXt |
|---|---|---|---|---|
| Tavern V1 JSON | — | upgrade | upgrade | embed |
| Tavern V2 JSON | downgrade | — | upgrade | embed |
| Tavern V3 JSON | downgrade* | downgrade* | — | embed |
| Chub.ai export | lossy | convert | convert | embed |
| RisuAI .charx | lossy | convert | convert | embed |
| SillyTavern card.png | extract | extract | extract | — |
* V3-only fields (assets, character_book groups, decorators) are preserved as side-car metadata when downgrading, so a future re-upgrade is lossless.
Not yet open
The converter rides with the main workbench, which is currently in closed beta. Leave a sealed scroll below and you'll be among the first to convert a card without opening a JSON editor.
One scroll, sealed in wax. No spam — one letter when the gates open.
Already on the list? Read the field guide on V2 vs V3 differences while you wait.
Common pitfalls
Five places hand-rolled converters quietly bleed your card.
- png tEXt order
The tEXt chunk before IDAT
The Tavern PNG spec requires the chara tEXt chunk before the first IDAT. Many naive encoders append it after, and SillyTavern silently refuses to load the card.
- base64 boundary
UTF-16 vs base64 in tEXt
V1 cards base64-encode a JSON string; V2 / V3 keep the keyword chara but switch the payload shape. Re-encoding without re-base64ing yields a corrupt scroll.
- character_book
Lorebook entry shape drift
V2 stores entries as a numbered object; V3 promotes character_book into a first-class scroll with groups. A naïve copy loses position, depth and selective keys.
- alternate_greetings
Greeting arrays vs first_mes
V1 had a single first_mes; V2 added alternate_greetings; V3 keeps both plus group_greetings. Flattening these into one string strips half your opening lines.
- assets[]
Asset URIs that point at nothing
V3 introduces an assets array with URIs (embedded:// or external). Converting back to V2 must inline or drop these — silent dropping is what loses voice samples.