Writing Your Character
Turn a blank Instructions file into a vivid, consistent character the model stays in.
- The Instructions Tab
- Using Generate and Polish
- The System Prompt Tab
- The Description Tab
- The Intro Tab
- The Photos Tab
- Saving and History
The Instructions Tab
The Instructions tab is the heart of your project. It maps directly to instructions.txt in your project folder, and its content is the single most important factor in determining how your character behaves. Personality, backstory, speech patterns, behavioral rules, knowledge boundaries, emotional range, character quirks — everything that makes your character feel like a distinct person rather than a generic assistant belongs here.
Character Studio injects this file's content wherever the %%CHARACTER_INSTRUCTIONS%% macro appears in your system prompt. This happens at runtime, just before each API call, so changes you make in the Instructions tab take effect the next time you send a message — no restart required.
There's no enforced format. Some authors write in dense prose paragraphs. Others use Markdown headers to organize sections like ## Personality, ## Background, ## Speech Style, and ## Rules. Others write as if filling out a character sheet. All of these work. The model doesn't need a particular structure — it needs clear, specific, unambiguous information. A well-organized file is easier for you to maintain, but the organization is for your benefit as much as the model's.
The editor you're writing in is Monaco Editor — the same editor that powers VS Code. This means you get real undo/redo history (Ctrl+Z / Ctrl+Y), find and replace (Ctrl+H), multi-cursor editing, and spell-check underlining for common misspellings. For a plain text file, it's a surprisingly capable writing environment.
What makes good character instructions
Vagueness is the enemy. "Be warm and friendly" is less useful than "You speak with genuine enthusiasm and often ask follow-up questions because you're genuinely curious, not just performing interest." The more specific and behavioral your instructions are — rooted in what the character actually says and does rather than abstract adjectives — the more consistently the model will stay in character under pressure.
Think about the edge cases your character will face. What happens when a user asks something your character wouldn't know? What does your character do when they're uncomfortable? How do they handle rudeness? How do they talk about topics they care deeply about versus topics they find boring? Writing explicit answers to these questions in the Instructions produces a character that handles the unexpected gracefully instead of collapsing into generic AI assistant behavior.
If your character exists in a fictional world, the Instructions should establish what they personally know and believe — not the full world lore (that goes in Context files, covered in Chapter 3), but the character's subjective relationship to that world. Where they grew up, what they've seen, who they trust, what they fear. The model builds a character from the inside out.
If you're staring at a blank file and not sure where to begin, the Generate button at the bottom of the left pane can draft a full starting structure from a brief description. It's a fast way to get past the blank page — covered in the next section.
Using Generate and Polish
Character Studio gives you two distinct AI-assisted writing tools. They serve different stages of the writing process and are designed to be used together.
Generate — for starting from scratch
The Generate button is the right tool when you are starting a new character from nothing. Give it a name, a role, and a handful of personality traits, and it drafts a complete structured definition for that character. It works one element at a time — one character, one location, one section — so it's best suited for bootstrapping individual pieces of a larger document.
When you click Generate on the Instructions tab, a dialog appears. Describe what you want — the more specific, the better. "A gruff dwarven blacksmith who has seen too much war and keeps his emotions buried under biting sarcasm, but has a deep protective instinct toward his apprentices" will produce much more useful output than "a blacksmith."
The generated text is inserted at the cursor position. This means you can generate into the middle of an existing document — position your cursor under a ## Background header, describe just the backstory you want, and insert only that section. You don't have to generate a whole character at once.
Use Ctrl+Z to undo any generated text you don't like. The insertion is a single undoable edit.
Generate is the blank-page solution. Once you have something written — even rough notes — switch to Polish instead. Polish understands the full document and works with what's already there rather than inserting new blocks.
Polish — for improving existing content
The Polish… button is the right tool when you already have content and want to improve it. Unlike Generate, Polish reads the entire file (or your current selection) as a whole and transforms it in place. It handles documents with multiple characters, multiple locations, world notes, and gameplay rules all at once — things that would be tedious to feed to Generate one section at a time.
Clicking Polish opens a dialog listing available cleanup actions, each with a checkbox. An All checkbox at the top selects or clears the whole list, and goes indeterminate when only some actions are checked. Selected actions run sequentially, each feeding its output into the next. The final result is applied as a single undoable edit — one Ctrl+Z reverts the entire run. If you click Cancel while Polish is running, the in-flight API call is aborted immediately and your text is left untouched.
When you have a selection in the editor, a Use full file as context option appears at the top of the dialog. With this checked, the AI receives the entire file for reference but only rewrites the selected passage. This is particularly useful with Flesh Out — select a thin section, enable context, and the model will fill it in consistently with everything else already written in the file rather than inventing details in a vacuum.
Three actions ship with the app:
| Action | What it does | Use when |
|---|---|---|
| Restructure Character Definition | Reorganizes content into the canonical section order: appearance, personality & demeanor, unconscious drives, backstory, key events, locations, play notes. Does not invent or remove any content. Sections with no source material get an explicit (none) placeholder. |
Your document is messy, imported from another format, or has sections in the wrong order. |
| Fix English & Punctuation | Corrects spelling, grammar, punctuation, and broken Markdown. Preserves intentional stylistic choices so it won't flatten your character's voice. | Final cleanup pass before testing or publishing. |
| Flesh Out Character Definition | Fills in gaps — missing dialog samples, thin backstory, underdescribed locations, absent behavioral edge cases, missing personality sub-sections, undeveloped relationship dynamics. Leaves everything already written intact. Also replaces explicit placeholders like (none), (fill this out), and (todo: more detail needed). |
Your document has the right structure but sections are sparse, placeholder-filled, or underdeveloped. |
The natural workflow is Restructure → Fix English → Flesh Out. Restructure first to put everything in the right place and surface gaps as (none) placeholders. Fix English cleans up anything the previous passes introduced. Flesh Out then fills those placeholders and thins sections. You can run all three in a single Polish session by checking all three boxes — they chain automatically. You can obviously run flesh out over and over to iteratively add more information, putting comments in where you specifically want it to concentrate (like "(todo: add details about education)").
The System Prompt Tab
The System Prompt tab maps to system-prompt.txt. This is the complete text that gets sent to the language model as the system role message at the start of every conversation turn. It's the full framing document that tells the model what it's supposed to be doing — not just your character definition, but the structural rules that govern the conversation.
The default template that Character Studio provides is carefully written to do the right thing automatically. It includes a %%CHARACTER_INSTRUCTIONS%% placeholder where your Instructions content gets injected, and your context files are woven in automatically as well. For most characters, you won't need to touch this tab at all, pick one of the standard system prompts and keep your changes in the instructions.
The three standard system prompts
The Load Standard Prompt button in the System Prompt tab replaces the current template with one of three community-authored prompts. Each represents a different philosophy for how characters should behave:
| Prompt | Style | Best for |
|---|---|---|
| Roy Cardigan | Multi-character ensemble roleplay written as a collaborative novel. Strict formatting rules: dialog in bold, thoughts in italics, third-person omniscient narration, second-person for the user. Includes character state markers, a scene start macro, and slash commands like /summary and /moreinfo. |
Complex stories with multiple active characters, ensemble casts, narrator-style immersive fiction. |
| Omnius | Single-character roleplay with a strong emphasis on balanced storytelling. Response length is proportional to the user's message. Very strict "never speak for the user" and "never describe the user's actions" rules. Keeps the narrative reactive rather than driving the story itself. | Single-character roleplay where you want the character to react and respond, not take over the story. |
| Venice.AI | A practical, no-frills single-character foundation. Short answers by default, direct, treats the user as an adult, no disclaimers, not repetitive. Closer to a high-quality conversational assistant than a narrative system. | General-purpose characters, assistants, companions — anything where clean, direct responses matter more than narrative structure. |
Loading a standard prompt replaces the entire system prompt template. Your instructions.txt content is untouched — the prompt just changes the wrapper it lives in. Try each one with the same character instructions and compare how the model responds; the right choice often depends on which model you're using as much as what kind of character you're building.
There are situations where editing the System Prompt directly makes sense. If you want to add global directives that apply to the conversation regardless of character — "Always respond in under 200 words", "Never break the fourth wall", "Format your responses with the character's internal thoughts in italics before speaking" — these belong in the System Prompt, outside the %%CHARACTER_INSTRUCTIONS%% block. Putting them in the System Prompt means they're always present, always first in the system message, and can't be accidentally overridden by character instruction content.
If you remove or accidentally delete the %%CHARACTER_INSTRUCTIONS%% macro from the system prompt, Character Studio shows a red warning indicator on the System Prompt tab. This is one of the most common mistakes when editing the system prompt — the character definition becomes completely disconnected from the conversation. If you see the warning, go to the System Prompt tab and restore the macro.
The Preview Prompt button in the toolbar shows you the fully assembled system prompt — all macros resolved, instructions and context files interpolated — rendered as formatted Markdown. This is exactly what the model receives at the start of each turn. It's invaluable for debugging: if the model is behaving strangely, check the Preview Prompt first to make sure the assembled text is what you expect.
Don't put world-building lore directly in the System Prompt. It belongs in the Instructions (if it's part of who your character is) or, better, in a Context file (Chapter 3). The System Prompt is for structural and behavioral directives. Mixing lore directly into the template makes it harder to maintain and can push the character definition further down in the system message than is ideal.
The Description Tab
The Description tab maps to description.txt. This is a short paragraph — typically three to six sentences — that appears on your character's card on Venice.AI when people browse the character catalog. Think of it as marketing copy: its job is to communicate the character's appeal to a human reader in a few seconds.
This file is explicitly not sent to the model during conversations. It has no effect on how your character behaves. It's purely for humans discovering your character on Venice. Write it in the third person, lead with what makes the character interesting, and give the reader a clear picture of what kind of conversation they'll be having.
The Generate button on the Description tab creates a description automatically. It assembles your system prompt (with instructions and context), sends it to the model with a description-writing task, and populates the editor with the result. You can provide optional guidance in the input field — "emphasize the mystery angle" or "keep it under 100 words" — and the generator incorporates that direction. Generated descriptions often need light editing to sound natural, but they're a solid starting point, especially for getting the right details from a long instructions file.
The Intro Tab
The Intro tab maps to intro.txt. This is the opening message that Venice.AI displays to users when they start a fresh conversation with your character — it appears before the user has typed anything, as if the character is initiating.
Like the Description, the Intro is displayed to the user but does not appear in the model's conversation context. The AI won't see or remember what the intro said. This means the Intro is purely about first impressions: it sets tone, establishes the conversational register, and invites the user to engage. A great intro makes the character's personality immediately apparent and gives the user a natural entry point — a hook, a question, a situation that makes responding feel easy and appealing.
Keep intros relatively short. A paragraph or two is ideal. Long intros front-load so much content that the user feels read-at rather than invited in. The best intros are ones that end with an implicit or explicit question that the user can't help answering.
The Photos Tab
The Photos tab lets you associate images with your project, both for in-app display and for Venice publishing. There are three distinct photo slots:
| Slot | Used For |
|---|---|
| You | Your avatar. Appears in your chat bubbles on the right side of the conversation, representing the person talking to the character. Cropped to a circle. |
| Character Avatar | The character's headshot. Appears in the character's chat bubbles on the left side. Makes conversations feel like a real exchange between two people. Cropped to a circle. |
| Character Portrait | A full-size portrait image used for publishing on Venice.AI. This becomes the character's profile image in the Venice character catalog. |
To set a photo, click the drop zone for that slot or drag an image file onto it. The character avatar and your avatar are displayed as circles in the chat interface. The portrait is displayed at full size and should be at least 512×512 pixels for Venice publishing quality.
All photos are stored inside the project folder (in a photos/ subdirectory). When you export a project zip or move it between storage modes, the photos travel with it.
You're not required to set any photos. Without a character avatar, chat bubbles show a default icon. But even a simple AI-generated portrait makes conversations noticeably more immersive, and a good portrait is worth the effort if you plan to publish on Venice.
Saving and History
Character Studio includes built-in version control for your project files. Every time you save, Git records a snapshot of your current instructions, system prompt, context files, and configuration. This means you have a full undo history not just at the editor level, but at the project level — you can revert to any previous state of your character definition, not just the last few keystrokes.
To save and record a history entry, click Save Changes in the left pane header or press Ctrl+S from anywhere in the app. The Save button glows gold when any tab has unsaved edits. The commit message is generated automatically by the AI — it analyzes a line diff of your changes and writes a brief summary. You don't need to write commit messages yourself.
To browse history, click the History button in the top toolbar. This opens a panel showing all your saved states in reverse chronological order, with the AI-generated commit messages. Clicking any entry shows you a diff of what changed. Clicking Revert on an entry rolls your project back to that state — a new commit is created for the revert, so you can always undo the revert too.
Conversation files (conversation_01.json, etc.) are excluded from history by default via the project's .gitignore. This is intentional: test conversations are transient, and including them would create enormous, noisy history entries. If you want to archive a specific conversation, export it explicitly from the conversation management panel.
Save often — each save is a restore point. The history panel makes it safe to experiment aggressively. Write a completely different version of your character, see if it works better in testing, and if it doesn't, roll back to the version from this morning. You can always undo anything.