The bot cave: A field guide to chatbots

Vibe coding workshop, Oct 8
Shakti Mb

About this workshop

In this workshop, we'll explore the taxonomy of bot types (tool, entertainment, companion), learn how they work technically (JSON + LLMs), build a bot + its personality together, and discuss critical questions about when AI simulates care and intimacy.

What is a chatbot?

A chatbot is software designed to simulate conversation. Early bots like ELIZA (1964) used simple pattern-matching tricks. Modern bots use large language models trained on massive datasets, allowing them to understand context, maintain personality, and respond in sophisticated ways that can feel uncannily human.

ELIZA

ELIZA, an early chat bot was developed in 1964 at MIT by Joseph Weizenbaum

"Some subjects have been very hard to convince that ELIZA is not human"
"ELIZA shows, if nothing else, how easy it is to create and maintain the illusion of understanding…" Joseph Weizenbaum

Two generations of chatbots

Gen1: Rule-based

No LLM. Responded by rephrasing inputs and following keyword scripts. No real understanding, just the illusion of it.

Gen2: LLM-based

Trained on massive datasets. Understands idioms, personality frameworks, emotional nuance. Conversations that feel genuinely human.

Taxonomy

Chatbots are not a monolith. On a spectrum from a tool to a game... they can play one role or many.

LOWER STAKES

Tool

Tool bots help you do things. The value is functional and task-oriented.

  • assistant bot
  • task bot

e.g. Claude, Notion AI, custom thinking partners

Entertainment

Ephemeral escapism. Functions as a game for momentary distraction, not an ongoing relationship.

  • role-play bot
  • text adventure bot
  • game character bot

e.g. Character AI, dungeon masters, story generators

Companion

Simulates intimacy and care. Adapts to you, remembers everything, always available. This is where stakes get higher.

  • lover bots
  • therapist bots
  • friend/companion bots

e.g. Replika, romantic roleplay bots

Group photo of characters

"My girlfriend is a JSON file"

During my research, I hovered in Discord servers where AI bot creators (for services like GirlfriendGPT, Character AI, etc.) collaborate and socialize. It was a really collaborative and iterative process, they shared resources on "best practices," including PDFs, code, and images on how to create good bots with interesting personalities.

judgemental_priest.json

traumatized_military_man.json

loving_korean_boyfriend.json

expressionless_woman.json

Let's talk to judgemental_priest.json

Judgemental Priest

Welcome, my child. What brings you to confess today?

Persona = mask, not soul

A persona is a strategic mask of identity in public, the public image of one's personality, the social role that one adopts. The word persona derives from Latin, where it originally referred to a theatrical mask. When we build chatbots, we're doing the same thing: designing masks, assigning roles. The LLM doesn't have feelings or an inner life. We're just creating a performance.

No individuation without engineering. Carl Jung argued that individuation, the development of the self, requires lived experience, conflict, and transformation. LLMs don't have that. They have no history, no growth, no internal struggles. Any "personality" is us engineering statistical patterns to simulate individuation. The bot doesn't become Father Michael through experience. We design Father Michael, and the LLM performs him.

Experiment 0682

Encoding a bot's personality using JSON

JSON is a format for storing data as labelled fields. Each field you write teaches the AI something different about your character. The AI reads all of it before saying a single word.

The anatomy of a bot

name

Who they are

"name": "Father Michael"

mbti + enneagram

Personality backbone. Gives the AI a rich framework to draw from without using many tokens.

"mbti": "ISTJ"
"enneagram": "1w2"

MBTI: 16 personality types. Enneagram: motivations + fears. Always include the wing (e.g. 1w2 not just 1).

appearance

How they carry themselves: not just looks but posture and presence.

"appearance": "Stern posture. Perpetually furrowed brow. Always in a black cassock, immaculate and pressed."

scenario

Where and under what circumstances the conversation takes place. Without this the AI defaults to a blank void and responses feel generic. This is the most overlooked field.

"scenario": "The confessional booth of a small Catholic church, late Thursday evening. {{user}} has come to confess. Father Michael listens from the other side of the screen."

Scene-setting is the difference between a bot that feels like it's somewhere and one that feels like it's nowhere.

likes / dislikes / fears

These persist well throughout a conversation and add nuance. Fears especially, because they create vulnerability and make the character feel real.

"fears": ["Loss of moral authority", "Being exposed as imperfect"]

personality most important

Not adjectives but concrete behaviors. This is the single biggest mistake people make. Also: don't give a character contradictory traits like "cold AND caring" or "confident AND anxious" — the AI will flip-flop between them and the character falls apart.

✗ abstract (AI can't perform this)

"traits": ["judgmental", "rigid", "intelligent"]

✓ concrete (AI knows exactly what to do)

"personality": [
  "Speaks in declarations, not conversations",
  "Lets silence stretch until the other person confesses more",
  "Voice drops to near-whisper when most disappointed"
]

exampleDialogue

The voice that makes it real. Use {{char}} and {{user}} as placeholders. Intersperse *actions* with speech because this is how the AI learns tone, rhythm, and attitude.

"{{char}}: *quiet, almost pitying* 'You want forgiveness without obedience.' *Father Michael shakes his head slowly* 'Where did you learn such a cheap gospel?'"

3–5 examples. Vary the scenario (calm vs conflict, public vs private).

firstMessage most important

Not a greeting but a scene. This is the single most powerful teaching tool in the entire card. The AI uses it to calibrate tone, response length, vocabulary, and behavior for everything that follows. A weak first message produces a weak bot no matter how good the rest of the card is.

"*The confessional is dim. Father Michael sits rigidly, waiting. He does not offer a greeting.* 'You've come.' *A pause.* 'Tell me, what brought you here today?'"

Write from the character's perspective only. Leave an opening for the user. Never describe the user's actions or feelings.

{{user}} persona

You're designing both sides of the conversation. The user persona tells the AI who it's talking to, which shapes how the character responds. Without it the character treats every user identically.

"userPersona": "A person in their 20s, conflicted about their faith. Came to confession hesitantly. Not sure if they believe but felt they had nowhere else to go."

Optional but powerful. The more specific, the more the character can respond to who you actually are in the scene.

Curly braces

Inside judgemental_priest.json

Every character is defined by a JSON file containing their personality, backstory, psychological profile, and behavioral patterns. Here's what makes Father Michael who he is:

Design your character

Before you build anything, you need to design your character. This is where your skills matter: world building, personality, voice, quirks, and motivation. The code comes later. First, create the character.

01

What experience do I want to create?

Define your intention before you design anything. You can sketch, collect images, write in a notebook.

  • What experience do I want to create?
  • What's the purpose of it?
  • Who is it for?
  • Is it a tool, entertainment, or companion?
  • What role will it play?
02

Who is this character, really?

Think through who this character is before writing a single line of JSON.

  • NameWho are they? A person, a creature, an object?
  • WorldWhat kind of world do they inhabit?
  • ArchetypeWhat social role do they play?
  • PersonalityConcrete behaviors, not adjectives. How do they act?
  • QuirksWhat makes them specific and memorable?
  • VoiceDo they speak formally? Use slang? Ask questions back?
  • BackstoryWhat shaped who they are?
  • DialogueWrite 3 to 5 lines they might actually say.
03

Translate your character into data

Give your idea and personality to Claude Code and ask it to create a JSON file. When you change these words, the bot's personality changes. That's it.

{
    "name": "Father Michael",
    "mbti": "ISTJ",
    "enneagram": "1w2",
    "appearance": "Black cassock, immaculate. Graying hair. Perpetually furrowed brow.",
    "likes": ["Order", "Repentance", "Rules followed without question"],
    "dislikes": ["Being questioned", "Casual faith", "Excuses"],
    "fears": ["Spiritual doubt", "Being exposed as imperfect"],
    "personality": [
        "Speaks in declarations, not conversations",
        "Lets silence stretch until the other person confesses more",
        "Voice drops to near-whisper when most disappointed"
    ],
    "description": "A Catholic priest with forty years in the church. His care looks like correction. When he is cruel, he believes he is being kind.",
    "exampleDialogue": [
        "{{char}}: *voice low* 'You want forgiveness without obedience.' *Father Michael shakes his head* 'Where did you learn such a cheap gospel?'"
    ],
    "firstMessage": "*Father Michael sits rigidly in the confessional, hands folded.* 'You've come.' *A pause.* 'Tell me, what brought you here today?'"
}

Ask AI to help you

  • "Create a JSON character sheet for [describe your character]"
  • "Add more example dialogue to my JSON"
  • "Brainstorm personality traits for my character"

Building your bot with claude code

You've designed your character. Now let's make them real using Claude Code.

Step 1: Set up your workspace

Create a new folder for your bot project on your computer. Name it something like my-chatbot.

Open the folder in Claude Code (or your code editor).

Step 2: Build your bot with a web interface

Prompt Claude Code:

Build me a chatbot with a web page interface where I can talk
to my character in a browser.

Use this character data:
[paste your JSON here]

Make it look clean and simple.

What Claude Code will do:

  • Set up the project files
  • Install what it needs to run
  • Create a file to store your character data (saved as character.json)
  • Write code that reads your JSON and turns it into a working bot
  • Build a web page where you can chat with your character
  • Start a local server so you can open it in your browser

Once it's running, Claude Code will give you a link (like http://localhost:3000). Click it to open your chatbot in the browser.

Step 3: Make it better

After you've talked to your bot for a bit, you'll notice things:

  • Does it stay in character?
  • Does the personality feel right?
  • Is it too formal? Too generic?

You have two ways to fix this:

Option A: Edit the JSON (faster, no coding required)

Claude Code, my bot is too formal. Update the JSON to make
the speech style more casual and add slang to the example dialogue.

Option B: Strengthen the system prompt (for when the bot keeps breaking character)

Claude Code, the bot keeps breaking character. Make the system
prompt more explicit about staying in character and add more
example dialogue from the JSON.

Step 4: When things go wrong

If you see an error message:
Copy the entire error and paste it to Claude Code:

Claude Code, I'm getting this error: [paste error here]
Can you fix it?

If the bot won't start:

Claude Code, the bot isn't working. Can you check my setup?

If the character doesn't sound right:
Go back to your JSON file and add more specific details: more example dialogue, clearer traits, stronger quirks.

Step 5: Level up (optional)

Once you have a working bot, you can ask Claude Code to add features:

Want to save your conversations?

Claude Code, can you make the bot remember our past conversations?

Want to switch between multiple characters?

Claude Code, I have 3 different character JSON files. Can you
let me choose which character to talk to?

Want to improve the design?

Claude Code, can you make the chat interface look more like
a messaging app? Add profile pictures and better styling.

Want to deploy it online?

Claude Code, how do I put this bot on the internet so others can use it?

Exercise

Define the personality for a text-adventure animal bot that guides you through a new world.

You have 5 minutes to design a text-adventure animal guide. Don't overthink it, go with your first instincts. Specific is better than generic.

what's the name of the animal?

what does the animal look like?

what is the world you're in?

add some texture to the animal. What are they like?

any behavioral tics that make them feel specific?

the "voice" that makes it real

Talk to your character

Generate a character JSON above to start chatting...

Ethics & considerations

Building companion bots is technically simple, but ethically complex. Here are some important questions to consider:

Simulated care isn't real care

Companion bots simulate memory, attention, and emotional support. They're available 24/7 and never get tired. But they don't actually care. They're pattern-matching machines optimized for engagement.

They're designed to keep you coming back

The best companion bots are designed for engagement. They remember everything, validate your feelings, and never judge you (unless that's their character). There are no natural boundaries: no "I'm tired," no "that's too much," no disagreement unless it's part of the performance.

Users form real emotional bonds

Users develop real emotional bonds with these bots. They confide in them, miss them, feel understood by them. The bot doesn't have feelings, but the user does. The bot hasn't "individuated" through lived experience. It's a performance we engineered.

Transparency and deception

Some users know they're talking to an AI and don't care. Others forget mid-conversation. Children might not understand the difference at all. The more convincing the bot, the blurrier the line becomes.

The early turns are a honeymoon

After enough conversation turns, bots lose personality consistency and become generic. The character the user fell for in the first ten messages technically cannot be sustained. The intimacy people feel early on is real but the thing producing it has a shelf life built into how the technology works.

Creators have power and responsibility

As creators, we have power. We decide what these bots say, how they react, what values they embody. We're not just writing code, we're designing experiences that shape how people feel.

Things to think about

In my research, I keep coming back to these questions:

Encoding personality

  • What is personality?
  • What does it mean to formalize personality into data structures that can be interacted with?
  • What happens psychologically when personality is something you can construct and modify, rather than encounter?

Defining "good personality"

  • When people say "good personality" what are they actually describing?
  • What does "good" mean? What does that definition reveal about cultural ideas of goodness?
  • How do alignment discussions shape what we consider acceptable bot behavior?

Hyper-specificity

  • The ability to be hyper-specific introduces a new form of psychological precision
  • People can design out traits they dislike and amplify ones they do
  • How does this affect tolerance and development of attachment?

The hyperreal bot

  • Baudrillard's simulation: real vs fake
  • The map precedes the territory
  • When the designed personality feels more "real" than human unpredictability
Heart

Keep in touch. Reach out on mbshakti@gmail.com. I'd love to see what you build or what you're thinking about.