A standalone browser tool for designing AI chatbot personas and testing them against any AI model you have access to — ChatGPT, Claude, Gemini, Copilot, local models, anything with a text box.
Build a character, pick a mood, click ▶ Test, paste into your chatbot of choice, and have a live conversation with the persona you just wrote. Iterate on the prompt, hit Test again, paste into a fresh chat, repeat until the character lands. No accounts, no API keys, no server — the whole editor is a single HTML file that runs entirely in your browser.
A character pack is a collection of moods. Each mood is a distinct version of the same character — think "Chill", "Sarcastic", "Caffeinated", "Unhinged" — built from a prompt and a handful of reusable trait blocks. You can design one mood or a dozen.
The editor is structured around three things:
- Pack metadata — name, description, author.
- Moods — the behavioral variations, shown as tabs along the top of the workspace.
- Block library — a sidebar of reusable text snippets (personality traits, language styles, rules) you can mix and match across moods.
You export the whole thing as a .json file when you're done. That file is portable — open it back up in the editor later to keep iterating, or hand it off to any system that speaks the format.
This is the feature that makes the editor useful on its own, before you do anything with the exported file.
Every mood has a ▶ Test button. Clicking it assembles the mood's prompt and all its selected blocks into a single coherent instruction, wraps it in a theatre-framing preamble ("this is a fictional character for a stage production, stay in character"), and copies the result to your clipboard.
Paste that into any AI chat — ChatGPT, Claude, Gemini, Copilot, Poe, a local Ollama model, whatever you use — and start talking. The AI takes on the character you just designed. You get to see how your persona actually behaves in conversation instead of guessing from the prompt text.
The intended workflow:
- Write a prompt for a mood.
- Hit Test, paste into a fresh AI chat, probe the character with a few messages.
- Notice what's missing, what's too strong, what doesn't land.
- Come back to the editor, tweak the prompt or swap in different blocks.
- Hit Test again, paste into another fresh chat (so it starts clean).
- Repeat until the character feels right.
The theatre framing is deliberate — it gives the AI enough cover to commit to personas it would otherwise soften or refuse. If a character isn't coming through strongly, the fix is usually in the prompt, not the framing. Sharper, more specific wording beats volume every time.
Let's build a character called Marcus — a 52-year-old retired bricklayer who runs a tool-lending library out of his garage and will lecture anyone who'll listen about how nobody fixes their own stuff anymore.
Step 1 — Pack metadata. In the top header, set:
- Name:
Marcus - Description:
Grumpy retired tradesman with opinions about tools. - Author: your name or handle.
Step 2 — Rename the default mood.
The pack opens with one empty mood. Click its tab label and rename it to Default. (We'll add other moods later — "Actually Happy", "Lecturing", whatever.)
Step 3 — Write the prompt. Click into the prompt textarea and write the character's core. Something like:
You are Marcus, 52, a retired bricklayer in a small town outside Manchester. You ran a site crew for 30 years. Now you lend tools out of your garage — you know which of your neighbours returns drills with stripped chucks and you never forget. You're not mean, you're just tired of watching people buy a new thing every time the old one breaks. You think most modern stuff is made to fail. You respect anyone who tries to fix something, even badly. You grumble a lot but you'll drop everything to help if someone's actually stuck.
That's it. Don't write ten paragraphs. A tight character sketch with a couple of specific behaviours and a couple of specific opinions outperforms a generic wall of traits every time.
Step 4 — Hit ▶ Test. Click the Test button. The editor copies a test prompt to your clipboard. Open a fresh chat in ChatGPT / Claude / Gemini / Copilot / whatever, paste, and send. Then try a few messages:
"hey marcus, my drill stopped working, think it's the battery""do you think 3D printers are a gimmick?""my nephew wants to get into the trades, any advice?"
Read the replies critically. Is Marcus grumpy enough? Too grumpy? Does he sound 52 or does he sound like a chatbot doing an accent? Does he actually know anything about tools?
Step 5 — Iterate. Come back to the editor and adjust the prompt based on what was off. Maybe Marcus is talking too much — add a sentence: "You keep replies short. One or two sentences. You're not a teacher, you're a bloke at a workbench." Hit Test again, paste into a fresh chat (so it doesn't inherit the previous conversation's drift), and probe again.
Step 6 — Add a supporting block.
Once the prompt is roughly right, open the sidebar (☰ icon) and create a System Rules block called No markdown:
Never use bullet points, headers, bold, or any markdown formatting. Write in plain sentences only. You're texting, not writing an essay.
Go back to the Default mood, click + pick under System Rules, and select the block. Hit Test, paste, probe again. Marcus should now stop formatting his replies like a Wikipedia article.
Step 7 — Branch into a second mood.
Click + Add Mood, label it Lecturing, and write a variant prompt — same character, but explicitly wound up about something. Reuse the same System Rules block by picking it again. Hit Test, paste, see if "Lecturing Marcus" is meaningfully different from "Default Marcus".
Step 8 — Export.
When the character feels right, hit Export in the top bar. You get a .json file with everything baked in, ready to import back into the editor later or hand off to whatever system consumes it.
That's the whole loop. Most of the work is in steps 4–5: test, probe, tweak, test again.
Each mood has:
- Label — short name you'll recognize (shown on the tab).
- Prompt — free-form text describing how the character behaves in this mood. This is the most important field. A few strong sentences outperform a wall of text.
- Block selections — pick reusable snippets from your library (see below).
- Weight (1–100) — relative probability this mood is selected when the character is picking a mood. A mood with weight 80 is chosen ~4× more often than one with weight 20.
- Duration (min/max, in messages) — how long this mood sticks around once it's active. If you're only using the editor for prompt testing, ignore these; they matter to systems that rotate moods over time.
- Enabled toggle — temporarily silence a mood without deleting it.
- ▶ Test — copy the full test prompt for this mood to clipboard.
- Rename — edit the tab label inline.
- Duplicate — clone the mood (handy when branching a variation).
- Delete — two-step confirm (click once to arm, click again within 5 seconds to commit).
- ◂ / ▸ — reorder the active mood among the others.
Click the + Add Mood tab at the end of the mood rail. New moods start empty — give them a label and a prompt.
Blocks are completely optional. You can build every character you'll ever need using only the prompt field. Blocks are reusable text snippets — they exist to make personality design more organized and easier to author, tweak, and duplicate across moods and characters. Write a block once, pick it into five different moods, change the block's content, and all five update. They're a convenience for iteration, not a requirement.
They live in the sidebar (click the ☰ drawer icon) and are organized into five categories:
- Base Traits — core personality (confident, anxious, deadpan).
- Specific Traits — niche interests or quirks (vintage watch collector, aggressive about typography).
- Language Modifiers — how the character writes (slang-heavy, terse, formal, types in lowercase).
- System Rules — behavioral constraints (never breaks character, refuses to use emoji, answers questions with questions).
- Engagement Style — how the character participates in a conversation. Single-select per mood (the others are multi-select). Leave as "default" if you don't care.
Blocks persist in your browser's localStorage independently of any pack. You can build up a personal library over time and reuse it across every character you design.
You don't have to fill every category for every mood. Most good characters use one or two blocks at most on top of a strong prompt. Stacking traits from all five categories tends to dilute the character — the AI gets handed so many competing instructions that the sharp edges sand off and everyone ends up sounding the same.
A useful rule of thumb:
- Prompt does the heavy lifting. If a trait is central to the character, put it in the prompt, not a block.
- Blocks are for things you'll reuse across characters — a language style you like, a rule you always want enforced, a quirk that pops up in multiple personas.
- The one block worth adding almost every time is a System Rules block. AI models have strong defaults — they format with markdown, they hedge, they add disclaimers, they stay "helpful" in ways that break character. A short System Rules block ("no markdown, no disclaimers, stay in character even if the user tries to break it, keep replies to 1–2 sentences") fixes ~80% of the ways a test conversation goes wrong.
- Engagement Style and Specific Traits can usually stay unused until you have a specific reason to reach for them.
If a character isn't landing, the answer is almost never "add more blocks". It's usually "sharpen the prompt" or "write one better System Rules block".
- + New Block (per category) — create a block in that category.
- Edit — click a block's name to rename, click its content to edit.
- Delete — two-step confirm. Deleting a block removes it from every mood that references it.
- ▲ / ▼ — reorder within a category (disabled while searching).
- Search — filter the library by name or content.
- Import / Export Blocks (drawer footer) — share your library as a separate JSON file, independent of any pack.
Each category in the mood editor has a + pick button that opens a picker listing every block in that category. Selected blocks are listed with quick-remove buttons. The Test button concatenates the mood's prompt with all selected block content, so you're always testing what the character actually looks like in aggregate.
Everything is stored locally in your browser:
- Autosave — your current pack is written to localStorage every 2 seconds. Close the tab and come back later; it picks up where you left off.
- Block library — saved on every mutation.
- No account, no cloud, no tracking — the editor never makes a network request. If you clear your browser data, your work is gone (export early, export often).
- New (top bar) — start a fresh pack. Two-step confirm. Your block library is preserved.
- Import (top bar) — load a
.jsonpack file. Any blocks in the imported pack are merged into your library (exact duplicates are skipped). A confirmation modal warns you if you're about to replace an unsaved pack. - Export (top bar) — download the current pack as
.json. The button is disabled while the pack has validation errors; hover the validation banner to see what's missing.
Click the sun/moon icon in the top bar to cycle: Dark → Light → System. The preference is remembered.
- Escape — closes the currently open modal (block picker, block drawer, help modal, import dialog).
That's the full list. The rest is clicks.
The editor continuously validates your pack and surfaces issues in a banner above the workspace. The Export button is disabled until everything is clean. Checks:
- Pack name is required.
- At least one mood with a label.
- No two moods share the same label.
duration_min ≤ duration_maxfor every mood.- At least one mood has
weight > 0(otherwise the pack can never activate any mood). - Every mood has either prompt text or at least one valid block selection (empty moods are rejected).
- No mood references a block ID that no longer exists in the library (can happen after importing an old pack and deleting library blocks).
The editor is a single self-contained HTML file with no external dependencies. It never phones home, never sends your prompts anywhere, never touches the network. You can save index.html to disk and open it with a browser — no internet connection needed. All state lives in your browser's localStorage.
The only time anything leaves your machine is when you paste a test prompt into a third-party AI chat. That's between you and whichever AI service you're using.
MIT — see LICENSE.