arachnutron's Botmakie Tips
What's this then?
Just in case you stumbled across this somehow: hi, I'm arachnutron! I make AI chatbots compatible with software that takes the V2 character card format, and certain sites like chub.ai and janitorai.com. You can learn more about me here.
This page is just a collection of tips for other people who want to make AI chatbots. There are plenty of other guides out there, so I won't cover all that ground again, but I will add stuff here that I think you generally won't find in other guides.
General
Good Resources
- Japanese Name Generator - if you're like me and like using Japanese names for your characters
- Text Compare - Also, if you're like me, and sometimes forget whether you edited your character defs doc before applying the edits to the card.
- Bold & Italics Generator - I use this for the start of my tagline text ([𝟱 𝗜𝗡𝗧𝗥𝗢𝗦, 𝗔𝗻𝘆𝗣𝗢𝗩], etc.)
- Tokenizer - If you want to know roughly how many tokens something takes. I don't use this very often, but it's useful now and then. Advice: always assume it's low by a few percent, and round up.
- Catbox - A great resource for hosting alt images and MP3s (assuming you aren't using chub's Gallery to host images, see below)
- TinyPNG - Use this to shrink alt images only. Don't use it on card images if you're putting them up on chub, because they'll look like absolute ass when rendered on the site for some reason.
Methodology
A lot of folks start with the character, and then make the scenarios and intros, but I do it a bit... differently.
- The Experience - This is sometimes where I start, most of the time I skip it because I already have step 2 in mind. Do I want angsty? Sexy? Both? Do I want a long buildup? Or should this have a quick resolution and a long aftermath? Is this a healing card, a wallow in pain card, a redemption card? Some of the cards I make are really for me
- The Scenario - I usually start here. But if I don't, the question I answer is "what kind of scenario do I need to create the experience I'm looking for?" Does it require having characters in the same space most of the time? Does it require having them separated? What's the backdrop?
- The Character(s) - Then the question becomes "what character(s) do I need to create the scenario?" Will they hate {{user}}, love them, be indifferent to them? Do they need to be aggressive, shy, protective, mean, etc.
- Character Backstory - Easily the single most important part of the card. I've found that this, more than anything else, drives character behavior and story progression. Answering the question "why does the character have this personality?" can make Personality (as a definition) almost completely redundant. I haven't actually tried this yet, but I've been thinking about an experiment...
- Card Image - I try to nail down the character looks in the card image before going further. I want to get a visual sense of who these characters are. Sometimes I'll do it earlier, sometimes later, but it's usually around here.
- Default Intro & Testing/Tweaking - I start with a one-line intro and give a one-line input. If Sonnet 3.5 doesn't fill up the max tokens with stuff in the response, I go back to the backstory and scenario, because there's not enough there for the model to grab onto. The testing takes a long time, and I usually go back and tweak defs/backstory a good dozen times or more. I'd say a good 8-16 hours of just this step, depending on how complex the scenario is.
- Intros & Testing - Probably pretty intuitive... what kind of intros will drive the scenario to get the kinds of experiences people will want?
- Intro Images - Assuming I'm making them. Time consuming but usually pretty straightforward.
- Intro Music - Same. This is ridiculously time consuming and difficult, even moreso than genning images imo. Trying to find something that fits the theme, and the vibe, and will be appreciated by the audience. Oof.
There are two things I avoid in my defs as much as possible:
- any kind of prescriptive direction on how the bot will behave in the future in any specific circumstance. I will avoid this now at pretty much all costs. If I have to do this to get a desired result, imo I've failed in my backstory. Having goals is good, having "if {{user}} does this, {{char}} does this" is the opposite of good.
- how the bot is behaving right now. Sometimes this is necessary, but backstory should include nothing but previous behavior.
- long story short, "show don't tell" whenever possible. It's what models are trained on, because it's what authors strive for. It's how we're able to get specific things to happen without explicitly stating them in the card definitions, because sometimes implying something actually works far better than outright stating it.
Two Cakes Theory
I subscribe to the two cakes theory of content creation, as presented to me by the chubcord mods: people always like more cake. So if you have an idea, and you see that somebody out there has done a great execution on the idea, don't let that stop you from creating it! Worst-case scenario: you practice your craft and get a little better at it. Best-case scenario: you totally nail it and make a bunch of people (including yourself) happy with your creation. Refer to this handy guide:
Definition Formatting
Some people are very opinionated about definition formatting, but the only things that really matter are:
- Can humans read and understand it?
- Does the card perform as expected on target models?
- Does it do the above without excessive waste of tokens?
If the answers to all of the above are "yes", then the format is just fine. The main reason why W++ sucked so bad was because it wasted tokens like a motherfucker, mainly because of the quotes (which also caused model confusion). Pluses are fine. Brackets are fine. Parentheses are fine. Stop overthinking it.
The main benefit of a good format template is not that it makes the card perform better in and of itself, but that it provides you with a way to remember the important bits to include.
Understand how {{char}} works
{{char}} is not a magic code for models, it is only a macro, and gets replaced by whatever is in In-Chat Name before your prompt gets sent to the model, so if In-Chat Name is Biff, something like "{{char}} is Biff" gets sent to the model as "Biff is Biff", which is just a waste of tokens! Don't do this! "{{char}} is Biff Henderson" isn't wasted, though, because it establishes the character's last name. If In-Chat Name is something long, consider not using {{char}} at all, ever. Understanding this one thing will make your characters more efficient and less likely to break because of model confusion.
Only use {{char}} for Example Dialogs
So first off, why use it for Example Dialogs? Because a certain format is required for example dialogs to work in SillyTavern (for some goddamn reason), and that format includes the {{char}} macro. Example dialogs must be formatted like this (although you don't necessarily need a {{user}} line):
<START>
{{user}}: "But I really like you, Sachiko!"
{{char}}: *Sachiko's eyes bulge comically, and she makes a sound like a dying penguin.* "You... like me? Like... *like* like me?" *she asks, incredulous.* "But... but you're so cool, and smart, and... h-hot. And I'm just... this."
The use of {{char}} is widely considered to be best practice everywhere else, too, but I disagree for several reasons:
- It provides no real benefit. Yes, it does mean that if you want to change the in-chat name of the bot, you can change it in one place. But it's not really a variable like {{user}} is. If your bot name is 'Myra', it's gonna be Myra no matter who plays your bot and when. If somebody else wants to fork your card and change Myra to Masumi or something (which is something they'd HAVE TO DO on chub, since chub doesn't allow changing in-chat names in Character Settings), they can use Ctrl-H. Botmaking is not programming, the same best practices do not apply.
- Some interfaces may not process it consistently. Chub Venus, for example, had a bug for a long time that made it send {{char}} in intros as '{{char}}' (on OpenRouter, anyway) to the model instead of evaluating the macro, which led to model confusion. I've had characters ask me who [[name]] is, despite that being their name. It's quite jarring! And it means they may not be following defs correctly. The bug has been fixed, thankfully, but the point still stands: proper handling of {{char}} is interface-dependent, and IMO is just a point of failure that can be easily avoided by just not using it.
- It obscures token count. If you're token-conscious (which, saying this even as a serial token abuser myself, you should be), you won't get an accurate count of tokens when using {{char}} over the actual name. Granted, this difference should be quite small in most cases, but it's important in lorebook entries and the like, when we're talking about token budgets.
- It's super easy to type out wrong and miss. {{char]} can blend in really easy, and which do you think the average model is going to handle better: "{{char]}" when you meant "Myra", or "Myrs"?
- It can lead to dramatic token waste in some circumstances. Chub has another rather annoying bug where in-chat names when importing a card image or forking a card become the card name, which can also be easily missed. If your card name is "godzilla, the mother of all monsters", that can have a dramatic affect on token usage over dozens of {{char}}s, not to mention lead to model confusion.
In short, {{char}} sucks as a macro and IMO shouldn't even exist. Thanks for coming to my TED talk.
Audio Player
Use this code block in your intro: <audio controls=""><source type="audio/mpeg" src="file path"></audio>
Replace file path with the URL of your completely legal and copyright-free MP3. Catbox works as a host for these. This works on both web and mobile chub, I have no idea about ST because I haven't tried it, but at least it's easy to edit them out.
NOTE!: This can screw up intro selection for koboldai users if you don't have enough text in the intro before the audio player code block. I don't know how much text you need specifically, but it needs to be more than 12 characters (the number I had when I saw the problem). 26 total characters was enough to solve the problem. I always put in a youtube link before the audio player anyway, and as long as you have a reasonable length for artist/song name, you should be fine.
Capitalize {{user}}
Wrap {{user}} in a bit of html: <span style=text-transform:uppercase;>{{user}}</span>
Embed info in image markdown
The image name portion of image markdown can be used to embed information (I learned this trick from Lunny12), like so:

CHUB
Better Thumbnails
CHUB's thumbnailing of wide or tall images can be unfortunate, depending on where the focal point of a card image is compared to its center. This is thankfully really easily fixed. Just make a square thumbnail image and edit your card on characterhub.org. There's a little icon in the upper-right corner of the thumbnail image you can use to change the thumbnail to your square image.
Rearrange Tags
You can rearrange tags on characterhub.org, by editing your card, deleting the tags, and readding them in the order you want them. It's a bit of a pain, but otherwise your tags get reordered on editing. I don't bother with this, but some folks are (understandably) particular about which tags are immediately visible on the card thumbnails.
Alt Image Hosting
Chub's Gallery is one of the nicer features on the site IMO, and you can use it to host your alt images. Upload the images to the Gallery, open the image in a new tab, grab the URL, and throw it in image markdown. It even works for people using your cards in SillyTavern! You should at least shrink the images in TinyPNG or something if you're gonna do this.
Floating Images on Card/Profile
You can use straight-up HTML in both Creator's Notes and your Profile, which allows you to do some really neat things, like put a chibi sticker of Sachiko in the lower-right corner of your card detail page and/or your profile page. All it takes is a small block of code (using Aunt Myra (WARNING: NSFW) as an example):
<div style="z-index: 1; position: fixed; bottom: 10px; right: 5px; pointer-events: none;"><img src="https://avatars.charhub.io/avatars/uploads/images/gallery/file/5b4c47d1-7f8e-42af-b385-aa47adc80d69/8381199b-baa8-4734-a876-54efd9fbbd98.png" alt="Myra" style="width: 170px; height: auto;"></div>
User Tips
Adding this section because somebody asked about something and I couldn't find a good other guide for this.
How to Use Chat Memory
Chat Memory is an often-overlooked, but very powerful tool that can add just a ton of stuff to your RP. In chub, it's one of the items in the chat hamburger menu. You can open it up and just... add stuff (up to approx. 1000 characters before it gets truncated on chub) that will get added to every input. They effectively act as permanent tokens that you can easily change as the chat progresses. Ostensibly, it was made as a way to persist important facts in chat history as the chat dropped off on a low-context model. However, you can do almost anything you can imagine with it. Here are ways I've used Chat Memory:
- The intended use case, storing important facts either from earlier in the chat, across intros, or even from before the start of the card scenario:
Hikaru has been in love with Shiori for years, but he has never treated Shiori inappropriately, and has not confessed his feelings to her.
Nobuko knows that Hikaru is in love with Shiori. On the day Nobuko issued her warning, she found and tore a couple of pages of poetry, written about Shiori, out of Hikaru's notebook as "insurance". Later that day, she made Hikaru kiss her feet while she [REDACTED].
After Nobuko's phone call with her mom, Hikaru texted Shiori to let her know Nobuko was upset, and Shiori picked her up from school.
- Storing facts about my Persona that tend to change from card to card, so I don't need to update my Persona every friggin time I switch chats:
Hikaru is 18 years old. He's a kissless virgin, and Nobuko knows it. He's an A student, and is trusted by school staff. He has no friends other than Nobuko and Shiori. He has a brown belt in karate. He likes anime, video games, heavy metal music, cooking, philosophy, and psychology.
- Modifying a character's behavior, usually tied to history:
Nobuko and Hikaru have reconciled, and Nobuko is now Hikaru's friend.
- Adding a whole-ass character to the chat. I sometimes play cards where your parent is likely to enter scope, so I have a mom character I can throw in if I want:
[Nako, Hikaru's mother, is blunt, straightforward, kind, nurturing, smart, affectionate, and teasing. She's 38, short and curvy, and has short blond hair and amber eyes. She wears practical, comfortable clothing. She's a partner at a law firm. Her husband Ichigo died when Hikaru was very young. Nako is an SA victim, abused when she was a teen. She has fully recovered from the trauma and leads a happy life with Hikaru.]
I'm sure there are other interesting ways you could use Chat Memory that I've just never thought of. You could probably even inject base prompt stuff in there if you really wanted to, but you're almost certainly better off modifying Character Settings instead.