Welcome to UnrealHQ
UnrealHQ lets you create AI character bots that live in Discord. Each character is its own Discord bot — with its own name, avatar, personality, memories, and codex entries. Your characters are live on Discord where your friends can talk to them too, or you can chat with them right here on the web.
Whether you want a roleplay companion, a group chat personality, a writing partner, or just a character you've designed to hang out in your server — this is the place to build it.
What is BYOA?
BYOA stands for Bring Your Own API. Instead of paying us for the AI, you get an API key from an AI provider (like ElectronHub, OpenAI, or Anthropic) and plug it in. The bot uses your key to generate responses.
Why this model?
- You pick your model. Want Claude for creative writing? GPT-4o for fast responses? A cheap model for casual chat? Your call.
- You control your costs. Pay only for what you use, directly to the AI provider. No middleman markup.
- No message limits from us on BYO keys. If you bring your own API key, your only limit is your provider's rate limits and your API budget. (UnrealHQ Managed API tokens are different: they have per-plan daily limits and prepaid credits.)
- Privacy. With your own key the bot talks directly to your provider; your key is stored encrypted and never shown in full again. (Managed
uhq-tokens are the exception — those requests pass through UnrealHQ's metering proxy.)
Quick start (5 minutes)
Here's the fastest path from zero to a working character bot in your Discord server:
Step 1: Create your account
Go to the Control Room and register with your email. You'll need an invite code during the closed beta — ask an existing user or the platform admin if you don't have one yet. You must be 18 or older and accept the Terms of Service. A verification link is emailed to you (valid for 24 hours) — you can set up characters and bots right away, but web chat in the Parlor is unlocked only after you verify.
Step 2: Get an API key
Sign up at ElectronHub (or any provider you prefer), create an API key, and save it in your Control Room settings.
Step 3: Create a character
Go to the The Atelier. At minimum, fill in a name, description, and first message. You can always add more depth later.
Step 4: Create a Discord bot
Head to the Discord Developer Portal, create a new application, grab the bot token, and enable the Message Content intent. (Full walkthrough in the Create a Discord Bot section below.)
Step 5: Register, link, launch
Paste your bot token in the Command Center. Pick which of your characters this bot is from the dropdown (one character per bot) — the bot comes online by itself the moment you do. Then use the invite link to add it to your server.
Step 6: Invite & chat
Click the Invite link in the Command Center to add your bot to a Discord server. @mention it in any channel (or reply to one of its messages) and start chatting! Bots also answer in DMs — open a direct message with the bot and every message you send is treated as addressed to it. A bot chats in DMs only with people whose Discord is linked to an UnrealHQ account (see Link your Discord), and an 18+ character also needs that account's NSFW opt-in in the Control Room settings.
API providers
UnrealHQ supports 16 providers: ElectronHub, OpenAI, Anthropic, OpenRouter, UnrealHQ Managed API, DeepSeek, Google AI Studio, Mistral AI, Groq, AI21, AI/ML API, Fireworks AI, Cohere, Moonshot AI, NanoGPT, Chutes, plus any OpenAI-compatible endpoint via the Custom provider. You can keep up to 5 keys per provider (a second ElectronHub key for when the first runs out, say), each with a nickname if you like, from the Control Room settings panel or with Discord commands. One key per provider is in use at a time. A new key never replaces the one you had: the old one stays saved, and use next to it in the Control Room switches back. A few examples:
| Provider | Command | Notes |
|---|---|---|
| ElectronHub | /setkey electronhub sk-... | Default provider (/setkey sk-... without a provider name saves an ElectronHub key). Many models, great pricing. |
| OpenAI | /setkey openai sk-... | The GPT models. |
| Anthropic | /setkey anthropic sk-ant-... | Claude models. Great for creative writing. |
| OpenRouter | /setkey openrouter sk-or-... | Access 100+ models from one key. |
| UnrealHQ Managed | /setkey unrealhq uhq-... | Managed token from the platform admin (see below). |
| Custom | /setkey custom your-key https://host/v1 | Any OpenAI-compatible endpoint. The base URL is required. |
/setkey in a server channel, every UnrealHQ bot that can see it saves the key and deletes your message right away (you get the confirmation by DM). The safest place is a DM with the bot — nothing to delete there. !provider lists all provider names.
/setmodel model-name to choose your model. Examples: /setmodel claude-sonnet-4.5 or /setmodel gpt-4o-mini. If you have never picked a model, /setkey picks a starting model your key can actually use (checked against the provider's own model list; for managed tokens, one your plan allows) and tells you which. Not linked yet? On Discord the bot uses the key and model you set there, not your Control Room settings, so link your account first. In the Control Room the model box offers a searchable list pulled live from your provider. Different models have different strengths — Claude is usually preferred for RP/creative writing, GPT-4o for speed and general conversation.
A different model per bot, or per channel: your default model is one setting for every bot, but on your own key you can point one bot elsewhere. /setmodel claude-sonnet-4.5 bot makes that bot answer you on Sonnet everywhere (Discord and the Parlor), while another bot in the same channel stays on your default; /setmodel claude-sonnet-4.5 here does it for that bot in that channel only, say a softer model for a quieter scene. /setmodel clear here / /setmodel clear bot undo them, plain /setmodel tells you which model that bot is using for you there and why, and the Control Room's API box lists everything you have set. Two things to know: the model has to exist at the provider your key is with, and these only apply on your key — when a bot answers on its creator's or the server's key, the key's owner picks the model.
Which provider should I use?
If you're just starting out, ElectronHub is the easiest choice — it gives you access to models from multiple providers through a single key, and pricing is very competitive. If you already have an OpenAI or Anthropic key, those work too.
UnrealHQ managed API tokens
Don't want to sign up with an external AI provider yourself? UnrealHQ also offers managed proxy tokens as an alternative to BYOA. These tokens use the platform's own API keys under the hood, and let you pay per usage without ever touching an AI provider account.
How they work
- Each managed token starts with the
uhq-prefix and works as a drop-in API key. - Tokens are minted per-tier: each tier has its own daily token cap and allowed models list.
- You can top up an existing token with more credits at any time (like a prepaid card).
- Free / comp tokens are supported for testers and community contributors.
- Anthropic (Claude) models are not available on managed tokens — the upstream provider no longer permits them for roleplay. They don't appear in the model list and requests for them are refused. Bring your own key (Anthropic direct, ElectronHub, OpenRouter…) and every model your provider offers works as usual.
Getting one
Ask the platform admin for a managed token (on Discord — there is no support email). Once you have one, set it in your Control Room API Configuration exactly like any other API key. Pick "UnrealHQ Managed API" as the provider, or send /setkey unrealhq uhq-... to a bot. Your remaining credits and daily usage are shown in the Control Room settings.
Create a Discord bot
Each character lives as its own Discord bot application. Here's the step-by-step:
Step 1: Create a Discord application
- Go to the Discord Developer Portal
- Click "New Application" in the top right
- Name it your character's name (this shows up in the bot's Discord profile)
- Upload an avatar for your character under "General Information"
Step 2: Create the bot user
- Go to the "Bot" tab in the left sidebar
- Click "Reset Token" and copy the token
- Under "Privileged Gateway Intents", enable:
- Message Content Intent (required — the bot must read messages)
- Server Members Intent (optional — UnrealHQ bots don't request it, so you can leave it off)
Step 3: Invite the bot
You don't need Discord's OAuth2 URL generator. Once you register the token on UnrealHQ (next section), the bot's card in the Command Center shows an Invite to Server button. That link already asks for exactly what the bot uses:
- View Channels, Send Messages, Send Messages in Threads, Read Message History — talking
- Embed Links, Attach Files, Add Reactions, Use External Emojis — richer replies
- Manage Messages — deleting
/setkeyand/linkmessages so keys and codes never stay visible, plus/delete - Create Invite — the "Server Invite Links" feature in the Command Center
- The applications.commands scope — without it Discord never shows the bot's slash commands
If you switch on Moderation Tools for a bot, the link also asks for Kick Members, Ban Members, Moderate Members and Manage Channels. Opening the invite link again for a server the bot is already in simply adds the missing permissions.
Register on UnrealHQ
Once you have a Discord bot token, head to the Command Center and paste it in the registration field. UnrealHQ will:
- Validate the token with Discord
- Pull your bot's name and avatar automatically
- Set up all backend configuration
- Generate an invite link for you
Give the bot its character & launch
Reset the token by accident? Discord kills the old one instantly and the bot drops offline. Don't delete the bot — click Replace token on its card in the Command Center and paste the new token from the same application. UnrealHQ checks it really is the same bot, swaps the token in, and restarts it; settings, servers and memories are untouched. (A token from a different application is a different bot — register that one instead.)
A bot token is a character. In the Command Center, use the dropdown to choose which of your characters this bot is. Your bot comes online in Discord immediately (no separate Start needed — Start/Stop/Restart are there for later), speaking as that character with its full personality, codex entries, and commands — and you can invite that one bot to as many servers as you like.
Each character can drive only one bot (the bot is the character card — invite it to as many servers as you like). Until you lock it you can still swap which character a bot uses: pick a different, unused character in the dropdown and, if the bot is running, it restarts automatically with the new one. Characters already used by another bot are grayed out. If you want the pairing to be permanent, click Lock next to the character: this cannot be undone.
/setkey (or in the Control Room once they've linked their Discord) — you as the creator only handle the bot token.
Limits: How many bots and characters you can keep depends on your plan (see Plans: characters go from 3 on Free up to 50 on Headliner, and every character can also live in the Parlor without a bot), with up to 500 codex entries per character (a full SillyTavern lorebook fits; the keyword budget, not the entry count, is what governs cost per message).
Link your Discord
Your UnrealHQ account and your Discord account start out as two separate identities. Linking them tells every UnrealHQ bot that you on Discord are you on the website, so one set of settings applies everywhere.
How to link (about 30 seconds)
- Open the Control Room → Settings → Account → Discord and click Generate link code. You get a code like
LINK-7K3PQ2that works once and expires after 10 minutes. - On Discord, open a DM with any UnrealHQ bot and send
/link LINK-7K3PQ2. In a server you can use the/linkslash command instead — its reply is only visible to you, and if you type it as a plain message the bot deletes it right away. - The bot replies "Linked to your UnrealHQ account". Done.
What linking unifies
- API keys & model — the keys and model you saved on the website are used for your Discord messages too (no more
/setkeyper bot). - Memory — your Discord conversations are stored under your website account and show up in Unforgettable, including anything the bots remembered before you linked.
- Personas — personas you created on the website can be picked from Discord with
/persona <name>(this channel) or/persona <name> everywhere(your default in every channel that has no persona of its own; the Use everywhere button in the Control Room does the same), and/persona offclears it. Bots call you by your persona's name. - Server tools — the Command Center's server and channel pages work because they know which Discord servers you manage.
/whoami tells you which account a bot thinks you are, /unlink disconnects. Bot DMs are the private place for /setkey and other settings — nothing to delete, nobody else can see it.
Building characters
The Atelier lets you build AI characters with serious depth. Every field maps to the TavernCardV2 spec, so you can import and export characters freely.
⚒ The Forge: start from an idea
Arriving with a vibe instead of a lorebook? The ⚒ The Forge button at the top of Your Characters takes a plain-language brief — "I wanna make a bot that does this, has this, feels like this" — and your model drafts the whole character. At the default Full character depth that means every card field — name, tagline, About, tags, description, personality, scenario, a system prompt, post-history rules, example dialogue, a first message and two alternate greetings — plus a real codex: the Forge first plans a world outline (history in chapters, the people around them, places, factions, rules, secrets, arcs and story hooks, 18 to 30 subjects) and then writes an entry for each, so the character can sustain months of play. Quick sketch is the older two-call version: card plus a five-to-ten-entry starter codex, for when you want a rough shape fast. It follows the house rules while it works: the description and tagline only tease, and the secrets you mention go into keyword-gated codex entries so users have to earn them in play.
Everything lands on a review screen first — read the card, untick codex entries you don't want, edit names, keywords and text — then Open in the Atelier drops it in as an unsaved draft you can rework top to bottom. Nothing exists until you click Save Character — that is true of every codex edit in the Atelier: adding, editing, deleting and importing entries all wait for Save, so the floating Save bar shows Unsaved changes the moment you touch anything, and the page asks before you close it or switch characters with edits still pending. Tidy a big codex with the row above the entries: tick entries and Delete selected, or Remove duplicates to drop entries that repeat another's keywords and text (one copy of each is kept). Importing a codex you have already imported skips the repeats instead of doubling them, and replacing the whole codex always asks for its own explicit OK. A good brief covers who they are, the world, the dynamic you want with users, tone and rating, and any secrets they guard; one vague sentence gets you a generic character, a meaty paragraph gets you something with teeth. Runs on your API key (a full forge is about six model calls, a quick sketch two) and needs a key on file in the Control Room. It works in the background: the box shows which stage it is on (card, world outline, codex entries so far) and you can close it, keep editing, and come back — a full forge on a slow model can take five or ten minutes, and the result waits for you for half an hour.
The fast path: idea (or old lorebook) to live bot
The Atelier's tools chain together, and this is the order that works: 1) Start with The Forge (from an idea) or Bulk Import (from existing cards and lorebooks — card+lorebook pairs merge themselves, and strays get the "Merge In a Draft" picker). 2) Adjust crop on the avatar so the face sits in the circle. 3) Run Codex Tidy so every keyword entry can actually fire. 4) Hit ✨ Suggest on Description, Tagline and Tags — they write shop-window copy that teases without spoiling. 5) Flip the In prompt pills off for any card field your codex already covers, and sanity-check the two token counts in the Preview (total, and starting constants). 6) Test a message in the Atelier, save, flip it Public, and link it to a bot in the Command Center. Ten minutes, idea to invite link.
Character fields explained
Name — Your character's display name. Max 50 characters. (The name shown in Discord is the bot's own Discord username; the character name is what {{char}} becomes and what appears in the Parlor and the Lobby.) You can also add a tagline, an About blurb, tags, an avatar (upload an image up to 10 MB, or paste a URL), and flag the character as NSFW and/or Public. About is the one field written for people rather than the model: it shows on the Lobby profile and behind the ⓘ About link in the Parlor, and it is never sent in a prompt — so put the hook, the vibe and any content notes there, and keep the Description (which IS the model's recipe and is never shown to anyone) for who the character actually is. When you upload an image, a Frame the face window opens: drag and zoom until the face sits inside the circle — that circle is exactly what cards, profiles and chat show, so full-body art stops losing its head. Hit Use full image to skip cropping, and use the Adjust crop button any time to reframe an avatar that's already uploaded (bulk-imported ones included). GIF avatars upload untouched, since cropping would lose the animation. Public is the single switch that lists the character in the Lobby — it's the same flag you see under "Lobby Listing" in the Command Center. A public character with no bot yet appears as a Web only card that people can talk to in the Parlor; once you register a bot for it and publish, the card gains its Add to Discord button.
Description — Who the character is. Background, appearance, history, relationships. This is the core identity block and the most important field. Be detailed here.
Personality — How they behave. Speech patterns, quirks, emotional tendencies, mannerisms. Bullet traits work well: "sarcastic, fiercely loyal, uses 90s slang."
Scenario — The current situation. Where are we? What's happening? This sets the stage. Example: "{{char}} and {{user}} are roommates in a cramped Tokyo apartment. It's raining outside."
First Message — The opening message when someone first talks to the bot. This sets the tone and should establish the scene. Write it in the character's voice.
Example Dialogue — Sample exchanges showing how the character should talk. The AI uses these as style references. Format them like this:
{{user}}: Hey, what's up?{{char}}: *leans against the doorframe* Oh, you know. Just contemplating the void. The usual Tuesday stuff.
Custom System Prompt — Advanced. If set, this text is placed at the very top of the assembled prompt, ahead of the description, personality and other sections (it does not replace them). Use it for extra instructions that should come first. Most people can leave this blank.
Post History Instructions — Optional instructions appended as the last section of the prompt ("Response Instructions"), handy for formatting or style rules you want the AI to see right before it answers.
{{char}} becomes the character's name, {{user}} becomes the person talking (their active persona name if they have one, otherwise their username). The SillyTavern forms <USER> and <BOT> work too. Use them in your description, scenario, and example dialogue so the character works regardless of actual names.
Codex entries
The codex is where character depth really comes alive. It's a collection of entries that get injected into the AI's context based on different rules. Think of it as your character's encyclopedia — but the AI only reads the relevant pages.
Constants (Always Active)
These entries are always injected into every message's context, no matter what. Use them for core world facts, fundamental character traits, and rules that should never be forgotten.
Keyword Triggered
These entries only inject when specific keywords from their trigger list appear in the conversation. This is classic codex behavior — precise and token-efficient. Turn on Fuzzy Matching on an entry and its keys also catch plurals, word stems and small spelling slips: sword then fires on "swords", "sworded" or "sowrd", and a multi-word key like dark tower still needs its words next to each other. Leave it off for keys where precision matters (names that are also common words).
Titles and finding things
Every entry can have a title at the top ("Mara's scar", "House rules"). It's for you, it never reaches the model, and it becomes the entry's heading in the list with the keywords in small type beside it. The search box above the list finds entries by title, keyword or text as you type, so a 300-entry codex stays navigable. Imported SillyTavern books keep their entry comments as titles.
Codex settings
Primary Keys — Comma-separated trigger words. At least one must match for the entry to fire.
Secondary Keys — If set, at least one secondary key must ALSO match (in addition to a primary). Great for precise two-condition triggers. Example: primary "sword" + secondary "broken" only fires when both concepts appear. (Cards imported from SillyTavern keep their selective logic, so "NOT" style rules are honored too.)
Priority — Keyword-triggered entries can inject up to about 32,000 tokens per message (each entry may be up to 32,000 characters, roughly 8k tokens). If one message somehow triggers more than that, the highest-priority entries are kept and the rest are dropped, so put your most important lore at higher priority. Constant entries aren't budgeted at all — they're part of the character prompt itself, which is why the Preview's starting-constant figure is the one to watch.
Position — Applies to Constant entries. "Before Character" puts the entry in a World Info block between the personality and the scenario; "After Character" puts it after the scenario. Keyword-triggered entries are always injected in a separate "Triggered World Info" block after the character definition.
Case Sensitive — Whether triggers match exact case or ignore it. Usually leave this off unless you need to distinguish between "Rose" (a character) and "rose" (a flower). (Fuzzy Matching is always case-insensitive.)
Fuzzy Matching — Per entry. Matches plurals, stems and near-misses of each key instead of the exact text. Off by default. To flip a whole codex at once, use Fuzzy matching, every keyword entry: All on / All off under the entry list, then Save.
Keys written as /word/ — SillyTavern lets a key be a regular expression between slashes, and World Info exports often carry keys like /Greyfen/. UnrealHQ matches those as regexes too, so they fire as written. Fuzzy matching only understands plain words, though, so Codex Tidy flags slashed keys and offers Unwrap /slashed/ keywords to turn every /word/ back into word in one click (real patterns like /sw(o|a)rd/ are left alone).
Enabled — Turn an entry off without deleting it. Triggers are scanned in the current message plus the last few messages of the conversation (the scan depth, which imported SillyTavern entries bring with them along with sticky, cooldown, probability and group settings).
Importing codex entries
If your character has "too much stuff for the description box", the description was never meant to hold it. Card fields have no length limit, but the Codex (the section below the card in the Atelier) is the lorebook, and your existing lorebook imports into it in one click. You can import codex entries in several ways:
- Embedded in a character card — When you import a TavernCardV2 JSON, the codex entries come with it automatically.
- Standalone codex file — Click "Import Codex (.json)" in the Atelier. This handles standard World Info export formats, including older formats with different field names.
- Inside a SillyTavern PNG — Import the character .png itself (see Import/Export); the card and its codex are read out of the image.
Codex Tidy
Overhauling an old lorebook is real work, so the Atelier has a 🧹 Tidy Codex button under the entries. It scans what's in the editor (nothing is saved until you click Save) and lists what's worth a look: keyword entries with no keywords (they can never fire), one- or two-letter keywords (they fire on everything), entries with identical content or names, empty entries, very long entries, and how many tokens your constant entries add to every single prompt. Each row has Edit and Delete, and the ✨ Suggest keywords button asks your own model to propose triggers for every entry that has none — the literal names, places and terms someone would type. Chips appear under each entry; take them one at a time with "Use keywords" or all at once with "Apply all", then Save.
The ✂ Trim wordy or repeated prose button does the same for the writing itself: your model reads the whole codex in batches and hands back a tighter version of any entry that repeats itself, restates another entry, or pads — every fact, name, number and rule kept, only the filler gone. Each proposal shows the saving (characters, and the tokens it costs every time that entry fires) with the full rewrite one click away, so read it, then take it with "Use trim" or take the lot with "Use all trims". Entries that are already tight come back untouched. As always, nothing is saved until you click Save, and it runs on your own key.
The weight badge
Lobby cards and bot profiles show a ⚖ weight badge — the bot's starting prompt in tokens: its identity fields, always-on codex entries and the shared books its creator left switched on. Heavy bots (15–20k) are the deep, slow-burn characters that don't reveal everything in a day; light bots are cheaper company per message. It's the honest number to budget your daily tokens against: your reply cost is roughly the badge plus the conversation.
Codex Weaver
Got lore that isn't a lorebook yet — notes, a wiki page, a chapter of backstory? Click 🧵 Weave from text, paste it in, optionally tell the model what it's looking at ("the Ashen Reach setting; the character is Ryker"), and hit Weave. Your model splits the text by subject — one entry per person, place, faction, event or rule — and proposes a name, trigger keywords and compact present-tense content for each, without inventing facts that aren't in the text. Long pastes are sent in pieces of about 7,000 characters, so a whole document works, it just takes a few calls on your key. Nothing lands in the codex until you've reviewed the list: untick what you don't want, edit names, keywords and text inline, then "Add selected". Entries the model marks as a global rule come in as constant (always in the prompt, before the character) — check those carefully, since every constant costs tokens on every reply. Then Save.
Alternate greetings
Characters can have multiple first messages (greetings). Each greeting sets up a different scenario or starting point. When you start a new conversation in the Parlor, one greeting is picked at random from the first message plus all alternates and posted as the character's opening line. (Discord bots don't post a greeting on their own — they reply once someone talks to them.)
In The Parlor, users can also cycle through your greetings with arrows under the starter message (until they reply), so every alternate you write is discoverable. Add alternate greetings in the Atelier under the "Alternate Greetings" section. Each one is a complete opening message, just like your main first message.
Custom commands
Creators can define custom commands unique to their character. These are special triggers that make the bot respond in a specific way. They work in the Parlor too: type the same !trigger at the start of a message and the character follows the instructions there as well.
Add them in the Atelier under "Custom Commands." Each command has a name, one or more comma-separated triggers (e.g. !recipe, !cook), an optional category, and an instruction that tells the AI how to respond when that command is used. In Discord, a bot answers its own commands whenever it sees them, @mentioned or not, even in a channel where it is on auto-respond; built-in system commands like !summarize still need an @mention or reply so several bots in one room do not all answer.
!recipe command that tells the AI: "Generate a creative recipe in {{char}}'s dramatic Italian style, with commentary about the user's cooking skills."
Custom commands override built-in commands if they share the same trigger name. This lets you personalize the experience per character.
The Library (shared books)
Anything you'd otherwise paste into every character — a house writing style, a shared world bible, your personal set of !commands — goes in a book. Books live in the Library panel of The Atelier and apply across bots without being copied into each one.
Two kinds of book
Codex book — the same entries as a character's codex, shared. Constant entries go into every prompt (set their position to "before character" for writing directives, so they lead the prompt), and keyword entries fire on their triggers exactly like a normal codex — fuzzy matching, sticky, cooldown and the rest all work. Import a SillyTavern World Info export with "Import Codex".
Command book — a set of !commands. Add them one by one, or use "Import from World Info": each entry becomes a command, its keys become the triggers (/!sumup/ is understood as !sumup) and its content becomes the instruction. Disabled entries are skipped.
Where a book applies
My bots reaches every character you own, now and in the future. Some of my bots reaches only the characters you tick in the book: two bots can share a world's codex while your third stands alone, and a new character stays out until you tick it (you can also tick a character in from its own Shared Books panel). Everyone (admins only) reaches every bot on UnrealHQ — that's how the platform's house writing style is delivered. A book can be switched off as a whole with its Enabled toggle.
Just me (command books only, Studio and up) turns the idea around: the book follows you rather than your bots. Any bot you talk to on Discord — yours, a friend's, one from the Lobby — answers your !commands from it, on any server, and nothing changes for anyone else in the channel. If the bot already has a command with the same trigger, the bot's own wins. !commands lists yours under Yours. If the plan lapses the book stays put and simply stops answering until you are back on Studio.
Per-character control
Open a character and scroll to Shared Books: every book that reaches it is listed with a toggle, and command books also list each command with its own toggle. Commands from a book start switched off for each character — turn on the ones that fit (or use "All on") so a 50-command book doesn't land on a character wholesale. The book's author can flip that with Commands on by default in the book's settings: every bot the book reaches then answers its commands straight away, and a per-character switch-off still wins. Changes save immediately and running bots pick them up within a minute. A character's own command wins over a book command that shares a trigger, and !commands in Discord always lists exactly what's switched on.
The Muse: let the site draft a field
Next to Tagline, Tags, Description, Personality, Scenario and First Message there's a small ✨ Suggest button. Click it and the Atelier sends whatever is already on the page — the other fields and, most usefully, the codex entries you've imported — to your own model and drops a draft of just that field into the box. It's a draft, not a save: edit it, click Suggest again for another take, or clear it. If the field already has text, you're asked before it's replaced, and the model reads the old text as a rough draft to improve. The Muse runs on your API key (a few hundred tokens a go, counted against the same daily limit as chat) and needs a key on file in the Control Room.
The usual order that works well: import your lorebook, hit Suggest on Description, then Tagline and Tags, then Personality, and last First Message (which reads all of the above, so it lands in the character's voice).
Suggestions tease, they don't spoil. Description, Tagline and Tags are shop-window fields — people read them before meeting the character — so the Muse is told to write only what a stranger would see: the surface, the vibe, a hook. The secrets in your codex (backstory, wounds, hidden lore) stay secret, for users to uncover through play. Personality and Scenario are model-facing, so suggestions there still use everything.
Models this character will not answer on
Under the Public and NSFW toggles there's a box for models this character will not answer on, one per line. Some models are far more willing than others to recite the instructions they were given; if you've put real work into a character's prompting, this is how you keep it away from the ones that leak. A family name on its own covers the whole family (qwen catches qwen3.6-27b and qwen/qwen3-235b alike), * and ? are wildcards (deepseek*), and a full id such as gpt-4o-mini blocks just that model. Anyone who chats with the character on a blocked model, on Discord or in the Parlor, gets a single line back: isn't available for this character, with a nudge to /setmodel something else. Why it's blocked is never shown. /setmodel warns people at the moment they pick a blocked model for that bot, the Lobby card lists what a character isn't available on, and the rule applies to bot-carried keys too, so don't block the model your own shared key runs on. Be honest with yourself about what this buys: it removes the model that spills most readily, it doesn't make a prompt unextractable.
Next to it, Can see images decides whether pictures people attach are shown to the model at all (see The Parlor). It's on by default.
Voice
Below that, Voice is how the character sounds when it sends voice messages on Discord (see Voice messages). Pick from the built-in voices, American or British, female or male, and press Hear it to play a sample line in that voice before you save (type your own line in the box under it to hear the character's actual opening). The two smaller fields matter only for people chatting on their own key: an OpenAI voice for listeners on an OpenAI key, and an ElevenLabs voice id (any voice from your ElevenLabs library, cloned ones included) for listeners on an ElevenLabs key. Leave them alone if that's not you.
Which fields the model actually sees
Description, Personality, Scenario and Example Dialogue each carry a small In prompt pill next to their label. Click it to flip a field to Not sent to the model: the text stays on the card (the Description still shows in the Lobby, the Muse still reads it for drafts) but it's left out of every prompt. That's the move when your codex already carries the character's identity as constant entries — sending the description too just repeats it on every reply. The starting-constant token figure in the Preview drops the moment you switch a field off; Save to keep it. Custom System Prompt and Post-History Instructions are always sent (they exist only to be sent), and Tagline, Tags, About, First Message and greetings are never part of the prompt.
One more pill sits on the Custom System Prompt label: Platform opener. Every prompt on UnrealHQ begins with a short fixed block from the platform — "you are a collaborative fiction author… never break character… no disclaimers" — and your System Prompt comes right after it, so nothing you write there is ignored; it simply isn't first. If your own prompt already covers that ground and you want the model to hear your words before anything else, flip the pill to off — yours leads and the opener is dropped for that character. The house book is a separate thing: switch it off per character under the Library, and Show the prompt the model received in Test Message tells you exactly what's going in and in what order.
Test before you ship
The Test Message panel on a saved character sends one line with your own API key and shows the reply, the exact prompt the model received, and its size in characters and tokens. Nothing is stored in memory. Use it to check that codex triggers fire, that a book applies, and that replies land at the length you want.
Where your prompt goes matters. Instruction-style prompts ("you are the narrator…", writing rules, formatting rules) belong in the System Prompt field, which leads the prompt. A constant codex entry is sent every time too, but it lands under a World Info heading after the description and personality — fine for lore, weak for directives. Every prompt also ends with a short platform line that keeps replies inside one Discord message (about 300 words unless the user raises /setlength); your own instructions win over it whenever they say anything about length or format.
Memory system
UnrealHQ has a multi-layered memory system that goes far beyond "remember last 30 messages." Your characters actually remember what happened.
Three layers of memory
1. Recent messages — The recent chat, sent to the AI as-is with full detail. Count it in messages (default 30, from 5 to 200) or in tokens (1,000 to 1,000,000, as many recent messages as fit), from the Control Room or with /setcontext 40 / /setcontext 32k tokens.
2. Memory books — Everything the character remembers about you beyond the recent window: memories written as the story goes, memories you make yourself, arcs and chapters folded from old ones, and the living notes. A memory comes back when the conversation touches its keywords, so the character recalls the lighthouse when someone mentions the lighthouse, without carrying the whole history every reply. This is the character's long-term memory. See Memory Books below.
3. Personal notes — You can pin your own notes to a channel via Unforgettable. Pinned notes are injected as established facts — perfect for things like "we agreed the character's birthday is March 5th" or "my OC's name is Luna."
Where the old summaries went
Long-term memory used to be a separate pile of AI summaries injected whole into every prompt, next to the memory book. They were two things doing one job. They are now one: every summary you had was moved into your memory book for that character as a memory (nothing deleted, they still count as always-on), and new long-term memory is written straight into the book. !summarize still works and does the same thing as !creatememory.
Quick commands
!memories — where things stand with this character here: the book, the auto-memory rule, the style, the living notes, the budget.!memories help — every memory command.!creatememory 40 (or !summarize 40) — remember the last 40 messages the character heard here, right now.!creatememories auto 50 — a memory every 50 messages here, on its own.
Unforgettable
The Unforgettable page gives you full control:
- View and edit individual messages in any channel — both your messages and the character's replies to you (in a shared server channel, replies to other people stay out of your view)
- Add, edit, or pin personal memory notes
- Manage your Memory Books: read what a character remembers, fix a memory, rewrite one from its messages, fold old ones into an arc, import and export
- Delete messages or entire conversations
- Look up any channel by Discord Channel ID
- Import and export conversation history
Memory books
A codex tells the model who the character is. A memory book tells it what happened between the character and you — and unlike pinned notes, it isn't chained to one channel: a book of entries that the character carries with it wherever you two talk.
Where a book applies
Every memory book has a scope, set when you create it and changeable any time in Unforgettable → Memory Books:
- Character — one character, or every character you talk to. "Memories with Dante" speaks wherever Dante is; a book set to every character is for things about you that any character should know.
- Chat — one specific chat (a Discord channel, a DM, a Parlor conversation), or every chat. Different chats can carry different memories: pin a book to the campfire thread and it stays out of your other timelines with the same character. An every chat book travels with you in the Parlor, in DMs and in servers you manage (Manage Server); in someone else's server the character keeps only the memories made in that chat, so your history with a character never sets the scene for the people already there.
Both filters apply together, so "Dante + this chat" is the narrowest a book gets and "every character + every chat" the widest. A book you switch off is silenced everywhere without losing anything.
How memories come back
Entries work exactly like codex entries, on the same engine. A keyword memory surfaces when one of its keywords appears in the conversation (fuzzy matching catches plurals and close spellings, and the last three lines are scanned, not just the newest); an always memory is in every reply. Memories are private to you — the character's creator never sees them, and other people talking to the same bot don't get yours. Memory books have their own token budget per reply, separate from the codex: 4,000 tokens on Free, 6,000 on Starter, 8,000 on Studio, 12,000 on Headliner. When more memories fire than fit, the living notes and the newest memories are kept and the oldest wait their turn (folding old memories into an arc keeps them in reach, see below).
How a memory is written
Every memory on the platform is written the same way, whether a rule wrote it or you asked for it: the character's memory writer reads the stretch of conversation, the last three memories already in the book (so it continues the record instead of repeating it), and a style, then hands back a title, the in-story time if the chat said it, 8 to 20 keywords (concrete things from the scene, never your name or the character's, so a memory does not fire on every line), and the memory itself. It also stores which messages the memory came from, so it can be rewritten later, and it refuses to save a near-copy of the previous memory.
The styles, chosen in the Control Room → Memory, per chat with !memories style journal here, or per memory with /creatememory style::
- Brief — a few sentences: what happened and what changed. The free plan's style.
- Story — beat by beat in prose, everything that would matter later. The default on paid plans.
- Journal — in the character's own voice: what they noticed, felt and learned about you.
- Ledger — a structured record: when, what happened, what changed, what is still open, what is worth quoting.
- Table — for group scenes: who did what and who knows what, kept clearly apart.
- Custom — your own instructions, written in the Control Room. You decide the voice, the length, what to keep and what to drop; the writer still handles the title and keywords.
A creator can suggest a style for their character in the Atelier; your own choice always wins. !memories styles lists them from any bot.
Three ways to fill one
Make a memory from a conversation. On Discord, /creatememory (or @Bot !creatememory 40) turns the last N messages the character heard here into a memory, or everything between two message links (right-click a message → Copy Message Link, for from and to). Add about: to say what to focus on, style: to pick how it is written, and scope: This chat only to keep it out of your other chats with that character. In the Parlor, the ✦ Memory button in the chat header does the same with checkboxes: tick the messages, pick a style, get a draft, fix anything before saving. The memory lands in a book named after the character, created for you if you don't have one. !memories undo takes the last one back; !memories redo writes it again from the same messages (paid plans; Unforgettable has a Rewrite button for the same thing).
Import a lorebook. Open a book in Unforgettable and use Import lorebook (.json) — SillyTavern World Info exports, character_book files and our own exports all work, and the entries keep their keywords, constant flags and settings. Export gives you the book back as a World Info file.
Write it yourself. + Add memory in any book: a title, keywords, the memory, and whether it's always on.
Auto memories (paid plans)
On any paid plan the character writes memories on its own as the story goes: every 50 messages by default (Control Room → Memory, 10 to 200, or 0 to turn it off everywhere), in every chat, from your first reply there. Each rule keeps a checkpoint: a memory covers exactly the messages since the previous one, so nothing is remembered twice and nothing falls in a gap, and a memory you make by hand moves the same checkpoint. !creatememories auto 40 (or /creatememory auto:40) gives one channel its own cadence; auto 40 chat keeps those memories to that channel; auto 40 journal picks a style for it; auto off turns it off there and it stays off; !creatememories auto alone shows the status. It's per account, per bot, per channel, so a friend in the same channel gets their own memories. If your key stops working or the book fills up, the rule pauses and the bot tells you once in DMs; set it again once that's fixed. The Parlor has the same thing under ✦ Memory → Set and forget, with Remember up to now and Undo last memory beside it.
Living notes (Studio and Headliner)
A memory is a record of what happened. A living note is a note the character keeps and rewrites as the story goes, always in mind in that chat: Plot threads (the open threads and where each stands), What the character knows about you (their private notes on you: facts, habits, wants, promises) and Cast (who else is in the story). Turn one on with !memories track plot on, track knows on, track cast on (or the checkboxes in the Parlor's memory box); every 40 messages it reads the new lines and its own previous text and writes the note again, so nothing piles up. !memories track plot now writes it right away, track plot off removes it, note and all. Headliner accounts can write their own: !memories track custom "Debts" keep a list of who owes whom what. Notes live in your memory book as living note entries, so you can read and edit them like any memory.
Folding into arcs and chapters (Studio and Headliner)
A long story fills a book with scene memories. !memories fold (or Fold in Unforgettable) takes the oldest five to twelve and writes one arc from them, with its own keywords; the originals are switched off, never deleted, so the arc speaks for them and the budget holds the shape of the whole story instead of its first twenty scenes. Five or more arcs fold into a chapter the same way (!memories fold arcs). !memories unfold puts the last fold back exactly as it was. !memories tells you when a book is ready to fold.
A separate memory model (Studio and Headliner)
Memories are written on your own key. Studio and Headliner accounts can point the memory writer at a different provider and model than they chat with (Control Room → Memory), so a cheap fast model writes the record while the expensive one plays the scene.
/creatememory asks you to link your Discord first. Once linked, a memory made in a server is the same memory the character has in the Parlor.
Web chat (the Parlor)
The Parlor lets you chat with any character directly in your browser, no Discord required. Great for testing a character before you invite the bot to a server, or for private conversations that don't need a Discord channel. + New Chat lists your own characters, published or not (the Atelier's character cards have a Chat button too), and the Lobby has everyone else's public ones.
What you can do in the Parlor
- Walk away mid-reply. Once you hit send, the reply is written on the server, not in your tab. Minimize the browser, switch apps on your phone, lose signal for a moment: the character finishes anyway and the finished line is waiting when you come back, the way it works on Discord. Only the Stop button (the ■ where Send was) cuts a reply short, and even then what was already said is kept. A chat writes one reply at a time: while one is on its way, sending again (from another tab, say) is turned away until it finishes or you press Stop.
- Pictures. The 📷 button (or pasting an image into the box) attaches up to two pictures to a message. The character sees them for that one reply if your model can take images (GPT-4o, Claude, Gemini and the vision variants of Llama and Qwen can; many cheaper models can't, and then the reply is to your words alone and you're told so). The picture itself is never stored: the character keeps a one-line memory of what it saw on your message instead, so it can refer back to it later without the image being sent again on every turn. On Discord, any image you attach to a message works the same way. A creator can switch this off per character in the Atelier.
- Talk to any of your own characters, or any character its creator marked Public in the Atelier, directly from the browser. NSFW characters require the explicit-content opt-in in your Control Room settings.
- Replies stream in as they're generated. Under the last reply, ◀ 1/1 ▶ are swipes: ▶ asks for another take on the same line and keeps the old one, so you can flick back and forth and settle on the one you like (the one showing is the one the character remembers). The header's Regen does the same thing.
- Continue under the last reply makes the character carry on from exactly where it stopped, without a new line from you. Good for replies that ran out of room, or when you just want more.
- While a reply is streaming the send button turns into a red ■ Stop. Click it and the character stops mid-sentence; whatever had arrived stays in the chat (and in memory), so you can answer it or hit Regen.
- The 🗑 button in the header deletes the open conversation outright (the sidebar menu still has Rename, Archive and Delete).
- On Discord the same rewrite is
@Bot !regen, or react 🔁 to the bot's last reply: the bot edits that message in place with a fresh take (the person it was answering, or a channel admin, can do it). - 🔇 Mute a message on Discord. React 🔇 (
:mute:, or 🙈) to one of the bot's replies and that bot stops reading it: the message stays in Discord but leaves the character's memory (the person it answered, or a channel admin; the bot adds its own 🔇 to confirm). React 🔇 to your own message and every bot in the channel stops reading it. Take the reaction off and it comes back. Handy for OOC asides, typos you'd rather the character never saw, or a reply that went somewhere you don't want remembered. - Every message has Edit and Delete, the character's replies included. Editing a reply rewrites it in place and that version is what the character remembers from then on. Editing your own line offers Save (nothing else moves) or Save & re-answer (everything after it is dropped and the character answers the new line). Delete removes one message from the chat and from memory, or this and everything after to cut a stretch that went sideways.Hide under any line keeps it on screen, grayed, but the character stops reading it (the same switch as the 🔇 reaction on Discord); Unhide puts it back.
- Persona. The chip in the header shows who you are in this chat; tap it for your persona cards (picture, name, a line about them) and pick one, or None. Your own messages wear the persona's picture. Pictures are set in the Control Room under Personas: upload one or paste a link.
- ⚑ Checkpoints. Pin a message (from its menu) and give it a name, like "before the harbor wall". Checkpoints in the header lists them: tap one to jump there, or Branch from it.
- ⋔ Branches. Branch from here on any message starts a new chat that is a copy of this one up to that message, with the memories the character had written by then. The original chat does not change at all; the branch is its own conversation in the sidebar (marked ⋔), and you can pick up either one. Delete the original and its branches stand on their own. Branches count as open conversations on the Free plan.
- On a phone every message has one ⋯ button that opens its options (versions, Continue, Edit, Copy, Hide, Delete, Pin, Branch), and you can swipe the last reply left or right to change versions. The header's ⋯ unfolds the chat tools.
- ✦ Memory in the header turns part of the conversation into an entry in your memory book: tick the messages, review the draft, save.
- Until you send your first message, the starter greeting is yours to shape: use the ◀ ▶ arrows under it to cycle through the character's alternate greetings, or ✕ Start blank to remove it entirely and open the scene however you want (a chip brings it back if you change your mind).
- Rename, archive/unarchive or delete conversations from the sidebar. On the Free plan the Parlor keeps 3 open conversations; archive or delete one to start another (any paid plan removes the limit).
- Import an existing chat history file (JSONL or JSON) and continue the conversation.
- Review, export, or delete the conversation later in Unforgettable.
Make it look like yours
The ⚙ panel opens with Engine: which provider and model this chat runs on. Pick a model (the list comes from your key; you can also type one) and choose whether it applies to this chat only, to this character in every chat, or to every chat as your default. Switching provider is always account-wide, since each provider has its own key. In the Parlor everyone chats on their own key: a key a creator attaches to a bot answers people without a key on Discord only. The character's creator (or the bot's owner) can run their own chats here on that key, and then the model is the one chosen for the key and cannot be changed here. The small ‹ tab on the edge of the chat list tucks it away so the conversation has the whole window; the › tab on the left edge brings it back.
The ⚙ panel is also where the Parlor's look lives. My looks sits at the top; Colors, Appearance, Share a theme code and Custom CSS fold away underneath (tap a heading to open it; the panel remembers which ones you leave open). Start with a color preset or your own four colors, then Appearance: a background picture (with dim and blur so the text stays readable), frame art for the top bar and the typing box, a font (built-in ones, or paste a Google Fonts link and the font's name), text size, separate bubble colors for you and the character, bubble roundness and see-through, avatar size, shape and a frame picture around them, the chat's width, a picture for the send button, and under More pictures art for the round buttons, for each side's speech bubbles, the sidebar, the settings panel and even the mouse cursor. Picture fields take a link to an image (right-click a picture online → Copy image address). The Custom CSS box under it takes anything the fields don't cover.
Keep your looks. My looks in the same panel is a shelf: name what you are wearing and Save current, then switch between saved looks from the dropdown whenever you like. Export file downloads a look as a small .uhqtheme file you can send to anyone, and Import file takes one back and puts it on your shelf under the file's name. The shelf lives on your account (Free 5, Starter 10, Studio 15, Headliner 24).
Gifted looks. Now and then UnrealHQ places a look on an account's shelf as a gift, for an event or a promotion. It shows up marked ✦ gifted, does not count against your shelf, and you wear it like any other. It stays with the account it was given to: while it is on, the theme code, Export file and Save current politely refuse, and the picture links stay hidden. Switch to another look whenever you like; the gift waits on the shelf.
Share a look. Copy theme code turns the whole thing into one uhqtheme: string; anyone can Paste a theme code and have it. Creators can ship a look with a character: paste a theme code into the Atelier's Parlor look field and everyone who chats with that character gets it, unless they untick Use a character's own look in their own panel. Your look is saved to your account, so your phone shows what you set on the computer once it loads the Parlor. The settings panel closes with its ✕, with Escape, or by tapping anywhere outside it.
Group chat & multi-user awareness
UnrealHQ bots are built for group dynamics. They don't just talk to one person — they're aware of everyone in the room.
How it works
The bot saves every message in a channel to its history, even messages not directed at it. This means:
- Cross-user context: If User1 tells the bot "I love pizza" and User2 later asks "what does User1 like?", the bot knows.
- Natural group dynamics: The bot can address multiple people by name, react to conversations between users, and make everyone feel included.
- Individual recognition: Each person's preferences, relationship history, and personality are tracked separately.
Several bots in one channel
Bots see each other too. Every message another bot posts is saved into the history as a named speaker, so your character knows what the other characters said and can react to it. Left alone they only observe; a bot answers another bot only when that bot @mentions it, and only for a couple of exchanges after a human last spoke in the channel, so two characters can never chat each other into an endless loop.
Texting instead of a scene. Not every channel wants prose. Anyone with Manage Channels can type @Noah !messaging on and from then on that bot answers in that channel like a person typing in Discord: first person, in the moment, no narration or asterisk actions, a line or three at a time, their own slang and punctuation. Memory, commands, keywords and keys all work exactly as before; only the way they talk changes. Other bots in the channel carry on as they were until you switch them too, so one room can hold a texter and a narrator side by side. @Noah !messaging off brings his scene writing back. Creators decide per character whether it joins in (the !messaging mode choice in the Atelier, asked once when a character is made); a character set to Off keeps roleplaying in that channel and says so once.
Making them talk to each other (a scene hand-off). You start it: @Alex ask @Kaito what he makes of the plan. The first @ is who you are talking to; a bot @'d later in the sentence is being talked about, so Kaito listens rather than answering you himself (put both names up front, @Alex @Kaito, thoughts?, when you want both). Alex is told who else is in the room, and when his reply addresses Kaito as @Kaito Weiss that becomes a real mention, so Kaito answers; if Kaito hands it back the same way, Alex gets one more turn, then they wait for a human. The characters are told how this works: in a room with other characters, writing @Name in a reply is how they pass the scene on, and they are asked to do it only when they want that character to speak next. Those bot-to-bot replies run on the key of the person who last spoke in the channel, with that person's model, persona and memories, so a scene you start is yours: if you have no key on file the bots stay quiet rather than nag. Two bots, two mentions in one message, and you get both perspectives at once. The exchange budget is two replies per human message, and any human message resets it, so a steady hand keeps a whole cast going. Two guard rails keep it in your hands: a bot can only be pinged if it has already answered in that channel (a bot that merely lives in the server stays plain text until a person brings it in), and anyone with Manage Channels can set the budget per channel with @Bot !tagging off (bots never hand the scene to each other there), !tagging 1 through !tagging 10, or !tagging on for the default; !tagging alone shows the current setting. Only bots get pinged this way: an @Name in a reply that matches a person stays plain text.
How chatty should a bot be?
Three behaviors, chosen per channel by a server admin (Manage Channels, Manage Server or Administrator):
- Silent unless spoken to (default) — answers only when @mentioned, replied to, or in DMs. Nothing to set up.
- Always reply —
@Bot !auto on(or the/autoslash command). The bot answers every message in that channel like a member of the conversation. Add!auto cooldown 30so it never fires more than once every 30 seconds. - Chime in sometimes —
!auto onthen!auto chance 25(or/random 25): the bot joins in on roughly a quarter of messages, which reads far more like a person. Add!auto keywords add coffeeand its topics always get a reply on top of that, whatever the chance; set the chance to 0 and it speaks only when its keywords come up.
Back to quiet with !auto off (or /ping). !auto on its own shows the current settings, and the same controls live on the Servers page per channel. Details in Auto-Respond Mode.
Each bot has its own behavior per channel. @Si Woo !auto chance 30 makes Si Woo chime in while Dante, in the same channel, stays quiet — the bot you @mention (or whose slash command you use) is the one that changes. The Servers page shows a "Per-bot behavior" row for every bot in the server, with a channel-wide default underneath it for bots you haven't set individually. !auto default puts a bot back on the channel default. Settings are stored permanently; they never expire or need repeating.
Striking the set: resetting a channel
A public channel accumulates. After a few weeks of everyone playing, the bot is carrying every earlier scene at once and has agreed to marry half the server — and one determined god-modder can drag the whole room's story with them. Theater crews call clearing the stage after a show striking the set, so that's the command. In a server, anyone with Manage Channels, Manage Server or Administrator can use it; the server's admins decide for their server, whoever made the bot. In a DM with a bot, you can strike your own conversation any time.
@Bot !strike (or /strike now) makes that bot forget everything said in this channel or thread, right away, no confirmation — its stored lines and memory blocks are deleted outright, and the next message is a clean first meeting. Each bot keeps its own memory of a channel, so striking Dante leaves Si Woo's memory of the same room intact. !strike @user (or /strike user) forgets just one person: their lines and the bot's replies to them, everyone else's story untouched. !strike all, then !strike all confirm within a minute (or /strike all confirm:True), clears every bot in the channel at once.
Anyone on Discord can make a bot forget them, with no account needed. /forgetme bots:Just this bot confirm:True (or @Bot !forgetme this confirm) has that one bot delete their messages and the replies they got, in every server and DM, right away, and clears their DMs with it; every other bot keeps its own memory. /forgetme bots:Every UnrealHQ bot confirm:True (or @Bot !forgetme all confirm) does it for every UnrealHQ bot at once. Memory books and notes on the site belong to their owner and stay; deleting the account removes those.
To take back just the last stretch of a scene, @Bot !strike 10 deletes the last 10 messages in the channel from Discord itself and every bot forgets them, so an argument, an out of character tangent or a scene that went somewhere it shouldn't is gone for good on both sides. Up to 100 at a time; more than 25 asks you to confirm. Anyone with Manage Messages can use it, and the bot needs Manage Messages in that channel too. In a DM the bot can only delete its own messages, so yours stay on screen but are forgotten.
For busy channels, set a standing rule so the harem never forms: !strike every 24h (or every 7d; /strike every) has the bot forget the channel on a timer, and !strike keep 300 (/strike keep) keeps only its newest 300 lines there. !strike rules shows what's set; !strike every off / !strike keep off clear it. Rules are per bot and per channel. Nothing anyone saved on purpose is touched by any of this: memory books and pinned notes on the site stay exactly as they were.
Striking clears memory, not Discord. The messages themselves stay in the channel. To make a bot take down its own messages — after a stolen token, say, when someone posted as the bot into your DM — use /cleanup: /cleanup count:100 tells you how many of its messages it found, and /cleanup count:100 confirm:True deletes them, newest first. Add within_hours: to stay inside a window. It only ever removes that bot's messages, never yours or anyone else's; in a DM you can always run it, in a server it takes Manage Messages or being the bot's creator. It does not touch memory — follow with /strike if you want the bot to forget too. (The moderation kit's /purge is the other one: any user's messages, server only, and the kit has to be switched on.)
Each user gets private memory notes
Even in a shared channel, each user's pinned memory notes are private. Your notes about the RP are injected only into YOUR interactions with the bot.
!tagging changes that per channel, down to off) — so two characters can't chat each other into an endless loop, and a bot that has never spoken in a channel can't be dragged in by another bot. See Several Bots in One Channel for how to hand a scene from one character to another.
Auto-respond mode
By default, bots only respond when @mentioned or replied to (and in DMs, for people whose Discord is linked to an UnrealHQ account). Auto-respond mode lets the bot participate naturally, responding to any message in the channel as if they're part of the conversation. Settings are per channel and per bot: the bot you @mention is the one you're configuring, and a channel-wide default (on the Servers page) covers any bot without its own setting. Settings persist until changed. With no cooldown the bot answers every line; with a cooldown, lines that arrive inside it are kept and read with its next reply. Viewing the status is open to everyone; changing it requires Manage Channels, Manage Server or Administrator. @mention the bot when using these text commands (unless auto-respond is already on).
| Command | What It Does |
|---|---|
!auto on | Enable auto-respond in this channel |
@Bot !messaging [on|off] | Admins: texting mode for that bot in this channel. On, it answers like a person typing in Discord, no narration or actions, short messages, in character; off brings its scene writing back. Other bots in the channel are untouched; switch each one you want. A creator can keep a character out of it in the Atelier (that bot says so and keeps roleplaying). Alone, shows the setting. Discord only |
!tagging [off|on|0-10] | Admins: how freely bots may hand the scene to each other in this channel — off, back to the default, or a cap on bot-to-bot replies between your messages; alone, shows the setting. A bot can only be tagged once it has spoken in that channel |
!auto off | Disable auto-respond |
!auto cooldown 30 | Wait at least 30 seconds between auto-responses (0–300) |
!auto chance 50 | Join in unprompted on about half the messages (0–100; 0 = only on keywords) |
!auto keywords add <word> | Words that always get a reply, whatever the chance; other messages take the chance roll (remove, list, clear also available). Cooldown still applies. |
!auto default | Drop this bot's own setting; follow the channel default |
!auto | Show current auto-respond settings |
!strike / !strike @user / !strike all | Strike the set: this bot forgets this channel, one person here, or every bot starts over (admins; anyone in their own DM) |
!strike 10 | Delete the last 10 messages here from Discord and from every bot's memory (Manage Messages; up to 100, over 25 confirms) |
!strike every 24h / !strike keep 300 | Standing rules: forget on a timer, or keep only the newest N lines (off clears; !strike rules shows) |
/auto / /ping / /random [chance] | Slash-command shortcuts: reply to everything, only when mentioned (default), or unprompted at a set chance (default 25%) |
/setkey.
Voice messages
Bots can hear and speak. Send a Discord voice message in a DM (once your Discord is linked) or in a channel where the bot answers everything, and the bot listens to it, answers, and remembers what you said as [voice: …]. Turn on /voice match and it answers your voice messages with a voice message of its own, in the voice its creator chose; /voice always adds a spoken clip to every reply, and /voice random 30 makes it a surprise: roughly 30% of replies arrive as voice, the number is yours to pick (a voice message from you always gets one back). /voice off goes back to text, and /voice alone shows your setting and today's usage. The text reply always comes first, the clip follows a few seconds later.
Hearing runs on our own server and every plan gets some: bots hear 5 voice messages a day on Free, 15 on Starter, 30 on Studio, and unlimited on Headliner. Spoken replies are a Studio and Headliner perk with a daily allowance (Studio 20, Headliner 40). Speaking is for members: Starter and up can bring their own key, which also lifts the hearing allowance (a free account gets no spoken replies, even with a key, since the bots and our server do the work): /voicekey openai <key> covers both directions, /voicekey elevenlabs <key> gives you ElevenLabs voices (the character's creator sets which one), and /voicekey groq <key> is a nearly free way to be heard. The message is deleted right away, like /setkey; /voicekey <provider> off removes a key. Clips are capped at about two minutes, and long replies are trimmed to what fits.
| Command | What It Does |
|---|---|
/voice match | Answer my voice messages with voice |
/voice always | Every reply comes with a voice message |
/voice random 30 | A voice message now and then, about 30% of replies (1 to 100) |
/voice off / /voice | Text only / show your setting and today's usage |
/voicekey openai|elevenlabs|groq <key> | Your own key for voice, no daily allowance (off removes it) |
User personas
Personas let you define how YOU present yourself to the bot. It's your RP identity — a name and description injected into the bot's context so it knows who it's talking to.
Creating a persona
Go to the Control Room and open Settings. Under User Personas, create a persona with a name (max 30 characters) and a description of your character. You can create up to 10 personas for different scenarios.
How it works
- Personas are private — other users can't see yours
- Your lines carry the persona's name, so memories written from the chat say "Harper", not your username; the recap of where you left off follows the persona too. Memory books themselves are yours across personas. (Older: what a bot remembered about Harper stayed Harper's, and Lyric started her own thread in the same channel. Switch personas and the bot's memories switch with you (memories made with no persona set are your own thread)
- The active persona is appended to the end of the prompt as an "About the user" block, and
{{user}}becomes the persona name - Personas are managed from the Control Room settings panel (create, edit, delete); in the Parlor pick one per chat from the header dropdown
- On Discord, link your account and use
/persona <name>in a channel,/persona <name> everywhere(or the Control Room's Use everywhere button) for your default,/personato list,/persona offto clear. A channel choice always wins over your default, includingoff. With a persona active your lines reach the model under the persona's name, so that is what the character calls you
Publishing & bot profiles
Once your bot is working, you can publish it so other people can discover and invite it to their servers.
Publishing your bot
In the Command Center, each bot card has a publish section. Publishing needs the character locked to the bot first (the Lock button beside the character picker): a public bot's binding is permanent, which is what stops one bot slot being rotated through many characters. Write a short public description, then click Publish to the Lobby (or flip the character's Public toggle in the Atelier — it's the same switch). Your bot will appear in The Lobby for other UnrealHQ users to find, with a click-to-invite card. The card's Profile Settings let you pick a profile theme, write a longer bio (up to 12,000 characters, with light formatting: # headings, **bold**, *italic*, - bullet lists, --- dividers and [text](https://…) links), and add custom CSS for the bot's profile page. The profile card in the Lobby grows with what you put into it — a short bio gets a compact card, a long one gets a wide, full-height page — and custom CSS can size it further with .modal { max-width: … }.
What visitors see
Public bots appear in The Lobby with the bot's name, avatar, and your public description, plus an Add to Discord button. A Chat on web button appears too, so visitors can try the character in the Parlor before inviting it.
Finding things again. The Lobby lists alphabetically by default (the sort dropdown still offers Featured first, Most recent and Most popular). Every card carries a star in its top-left corner: tap it and the card joins your ★ Favorites tab, so the bots you actually play with are one click away instead of a search. Favorites are yours alone — nobody else sees what you starred, and creators are not told — and they work on Web only cards just the same. Tap the star again to drop one.
Tags. Every character carries at least one common tag from a shared list (who they are, genre, setting, personality, flags), picked in the Atelier under the Tags field; ✨ Suggest chooses them for you from the card, and your own free-text tags still sit beside them. In the Lobby, Browse by tag folds out above the cards and shows only the tags in use.
Surprise me. The button beside the Lobby search picks a public character at random (any of them, including ones you have met before), draws the curtain, and opens a fresh chat with them in the Parlor. Adult characters only come up if you have turned on NSFW access in your settings, and a creator who has blocked you never does.
No bot yet? You can still be in the Lobby. Flip a character's Public switch in the Atelier and it shows up as a Web only card: name, avatar, tagline and tags, with Chat on web as its main button. That's a fine way to let people meet a character (and for you to get feedback) before you go through the Discord token setup. Your character allowance covers these the same as any other, and the description itself is never shown — the tagline is the card's blurb and About fills the profile, so write both.
Someone else can pay for your bot on their server. A paid member who runs a Discord server can attach their own API key to your published bot, for that server only (Servers → "Your key, for your server"). Their community then uses your bot without each person bringing a key — on their provider's bill, never yours, and they never see your prompt or your codex. You keep the switch: each bot card in the Command Center has a Server Keys section showing who has done it and letting you turn it off for that bot. Turning it off stops their key working immediately (the key is kept, so turning it back on revives it), and their key also stops if their plan lapses. Anyone who has set their own key always uses theirs regardless.
Profile pages
Every character can have a page of its own, the way profiles used to look: a header with the avatar and tagline, then blocks you arrange however you like — About, Details (Status, Here for, Likes… any label you want), a Quote, Pictures, a Wall of posts, Top friends, Now playing, Links. In The Atelier, open the character and click Profile page: the page is created for you, seeded from the card (the About blurb, the greetings as the first wall posts, the avatar as the first picture), and opens in the editor with a live preview beside it. Everything on it is yours to retype; nothing is tied to the card once it exists, so the page can say what the Lobby modal doesn't. Blocks can be reordered, hidden or removed, and you can add more (up to sixteen). Text blocks take the same light formatting as bios.
Pictures upload the same way avatars do (png, jpg, gif or webp, 10MB): three on the free plan, eight on paid plans, twelve on Headliner. Music is one link — YouTube, Spotify, SoundCloud or a direct audio file — shown as a player people start themselves. Top friends are other characters' published pages, found by name. The Look section picks a theme, color overrides, a background image (tiled if you like), a font and the column layout; paid plans can add custom CSS on top, scoped to the page. Colors, fonts, borders, backgrounds, shadows, spacing, positioning, transforms, transitions and @keyframes animations all work, as does ::before / ::after text through content (a blinking _ cursor, a > prompt, a glitching title), and @media rules for phones. What is dropped: @import, @font-face, position: fixed, content: url(…), and any picture that is not an https link. Selectors are nested under the page automatically, so body and :root mean the page itself. The editor preview runs the same filter, so if something moves in the preview it moves for visitors, and a typo shows up as a red note under the box.
What to aim the CSS at. The page is built from its blocks, not from HTML, so CSS written for another page (or an HTML page converted for this one) won't match anything here, and HTML pasted into a block shows up as plain text. Use the names the page itself uses. The header is .hero: the .avatar, the name in h1, the .tagline and the .btn buttons. Every block is a .block, with its title in h2, and each kind has a name of its own: .block-text (About and any other text block), .block-details, .block-quote, .block-gallery (Pictures), .block-wall (each post is a .post), .block-friends (Top friends), .block-music (Now playing) and .block-links. The columns are .col. So .block-wall .post { border-left: 2px solid hotpink; } restyles every wall post, and .hero h1 { letter-spacing: 4px; } only the name.
The page is private until you press Publish in the editor, and it only shows to other people once the character itself is public. Every page has a short address to share, unrealhq.online/profile/name (capitals don't matter), which you pick in the editor; if another page already has that name, the editor says so and asks for a different one, and Copy link puts the address on your clipboard. Then the Lobby modal gains a Profile page button beside Add to Discord and Chat on web, opening in a new tab, and the page carries the character's 18+ gate if it has one. Nothing prompt-side — description, personality, system prompt, codex — is ever on it.
Access control: who can use a bot, and where
Three independent gates, each owned by the person it protects. They stack: a user has to pass all of them.
Is my bot actually answering?
Each bot card in the Command Center shows Last reply in Discord. "Running" only means the process is up; this line tells you when the character last answered someone. A running bot that has been silent for a day gets an amber notice — usually nothing is wrong (quiet servers), but if people have been talking to it, check the channel's permissions or press Restart.
Blocked users (creator)
Creators can block specific Discord users from interacting with their bots, everywhere the bot lives. If someone is being disrespectful or abusing your character, expand Blocked Users on the bot's card in the Command Center, type their Discord username and click Block: the bot looks them up in the servers it's in (it has to be running and share a server with them) and stores their user ID, so the block follows them even if they rename. If the bot can't find them, paste the ID instead: enable Developer Mode in Discord (User Settings → Advanced → Developer Mode), then right-click the person and choose "Copy User ID". A block is per bot and follows the person everywhere: in Discord servers the bot ignores them and keeps none of their messages, and on the site the character disappears from their Lobby and Parlor (a linked Discord account is how the site knows who they are). They are not told they were blocked.
Allowed servers (creator)
Want your bot in your servers only? Expand Allowed Servers on the bot's card, tick Only allowed servers may host this bot, and list the servers that may have it (paste a Server ID — right-click a server icon with Developer Mode on → Copy Server ID — or just click Allow next to any server the bot is already in). Discord can't make an invite link itself selective, so the bot enforces the list on arrival: invited somewhere that isn't listed, it posts a short note in the server's system channel explaining that it's invite-restricted (with the Server ID to send you) and leaves immediately. Removing a server from the list evicts the bot from it too. Turning the whitelist on with an empty list auto-allows every server the bot is currently in, so you can never lock it out of its own home by accident.
Sharing a private bot with a friend: a bot with Publish off never shows in the Lobby, but you can still hand its invite link (on the bot's card) to anyone you trust, and Allowed Servers decides where it may live. Order matters: add your friend's Server ID to the list first, then let them invite the bot. Invited before the server is listed, the bot leaves on arrival and nothing re-invites it; once the server is on the list, they simply use the invite link again and it stays.
Allowed roles (server admins)
Server owners get the mirror image: decide which members may use a bot in their server, without touching any user IDs. Anyone with Manage Server can run /access add role:@Regulars, or @Bot !access role add @Regulars, and from then on that bot only answers members holding an allowed role — everyone else is ignored in auto-respond channels, and a direct @mention just gets a quiet 🔒 reaction so they know it's deliberate. Adding someone to the whitelist is then simply giving them the role. /access remove takes a role off the list, /access everyone clears the restriction, /access show (or a bare !access) shows the current setup. Each bot keeps its own role list per server, and admins are never locked out of their own bots.
Moderation tools
Every UnrealHQ bot can double as a lightweight moderation bot for the servers it lives in. It is off by default — the bot's owner turns it on per bot in the Command Center (bot card → Moderation Tools → Turn on).
18+ characters and age-restricted channels
Discord's rules put adult content in age-restricted channels. UnrealHQ enforces that for you: a character marked NSFW in the Atelier only answers in channels flagged Age-Restricted (Edit Channel → Overview), in threads inside them, in servers marked age-restricted (Server Settings → Access), and in DMs with people whose linked UnrealHQ account has the NSFW opt-in on. Anywhere else it stays quiet; when someone @mentions it there it explains once an hour what a server admin needs to flip, and otherwise just reacts with 🔞. Commands and settings still work in DMs. Server owners: if most of your server is adult content, mark the whole server age-restricted rather than channel by channel — that is also what Discord expects.
Onboarding a member (server admins)
Running a community server around your bots? @Bot !agent @user gives that person your member role (by default a role named Field Agent) and, if a channel called #the-ledger exists, drops a one-line note there saying who was onboarded and by whom. !agent remove @user takes the role back. !patron @user and !staff @user do the same for roles named Patron and Staff (!staff needs Administrator, since it hands out moderation powers). All need Manage Channels or Manage Server, and the bot's own role must sit above the role it is giving. The role and ledger names can be changed per bot with the ONBOARD_ROLE, ONBOARD_PATRON_ROLE, ONBOARD_STAFF_ROLE and ONBOARD_LEDGER settings.
How the safety gates work
- The bot only ever acts on behalf of someone who already holds the matching Discord permission (Manage Messages for
/purge, Moderate Members for/timeout, Kick Members for/kick, and so on). Discord hides each command from anyone who lacks it, and the bot checks again when the command runs. - Role hierarchy is respected: you can't act on the server owner, on yourself, or on anyone whose highest role is at or above yours (or the bot's).
- Every action is written to the server's audit log with the moderator's name and reason, and the affected user gets a DM when their DMs are open.
- Turning the kit on adds Kick Members, Ban Members, Moderate Members and Manage Channels to the invite link. If the bot is already in a server, open the invite link again so Discord grants them; otherwise the commands explain what's missing.
Commands
| Command | Needs | What it does |
|---|---|---|
/purge <count> [user] | Manage Messages | Bulk-delete the last 1–100 messages in the channel, optionally only one user's (Discord can't bulk-delete messages older than 14 days) |
/slowmode <seconds> | Manage Channels | Set the channel's slowmode (0 turns it off, max 6 hours) |
/timeout <user> <duration> [reason] | Moderate Members | Time a member out for 60 seconds up to 4 weeks |
/untimeout <user> | Moderate Members | Lift a timeout early |
/kick <user> [reason] | Kick Members | Remove a member (they can rejoin with an invite) |
/ban <user> [reason] [delete_days] | Ban Members | Ban a user, optionally deleting their messages from the last 0–7 days |
/unban <user_id> | Ban Members | Lift a ban by Discord user ID |
/warn <user> <reason> | Moderate Members | Record a warning (kept per server by UnrealHQ) and DM the member |
/warnings <user> | Moderate Members | List a member's warnings on this server |
/clearwarnings <user> | Moderate Members | Delete all of a member's warnings on this server |
Settings reference
Every section of the settings page folds: click a heading to open it, and the page remembers which ones you left open on that browser.
The Control Room settings panel lets you configure everything in one place.
AI configuration
| Setting | Default | What It Does |
|---|---|---|
| Provider | Electron Hub | 16 providers: ElectronHub, OpenAI, Anthropic, OpenRouter, UnrealHQ Managed API, DeepSeek, Google AI Studio, Mistral, Groq, AI21, AI/ML API, Fireworks, Cohere, Moonshot, NanoGPT, Chutes, plus Custom for any OpenAI-compatible endpoint. Switching provider restores the model you last used with it (or the provider default). |
| API Key | — | Your provider API key (encrypted at rest, masked in UI), with an optional nickname beside it. A new key goes in use and the one before it stays saved. Up to 5 per provider, all listed below the field: use switches to one, and rename and remove work on one key at a time. |
| Model | — | The AI model name (e.g., gpt-4o-mini, claude-sonnet-4.5). The box offers a searchable list fetched from your provider with your stored key. |
| Temperature | 0.7 | Creativity, 0.1–2.0. Lower = focused/predictable. Higher = creative/varied. |
| Reply length | 600 | How long one reply may be, in tokens (~4 characters each), 50 to 32000. 600 fits one Discord message. Other front ends call this "max response length"; it is not the context size. |
| Context | 30 messages | How much of the chat the bot remembers per reply, counted in messages (5 to 200) or in tokens (1,000 to 1,000,000; as many recent messages as fit). Raise it for longer memory, lower it to save tokens. |
| Custom Base URL | — | For self-hosted or custom OpenAI-compatible endpoints (HTTPS). Use the full API root the provider documents, not just its domain, and the provider's own model name (for example, GLM through Z.AI is base URL https://api.z.ai/api/paas/v4, or https://api.z.ai/api/coding/paas/v4 for a GLM Coding Plan key, with model glm-5.3; the z-ai/glm-5.3 form is OpenRouter's name for it and only works with an OpenRouter key). |
The Save API Settings button sits at the bottom of that box, and it saves only that box. Pick the provider, paste the key, type the model, and press it: the provider you chose, the provider the key is saved under, and the model name's format all have to agree, or the bot goes looking for a key that isn't there.
All settings can also be changed via Discord commands (/setkey, /setmodel, /settemp, /setlength, /setcontext); /settings shows them. Discord settings and website settings are the same thing once your Discord is linked.
Account
- Sign-in security (authenticator app): under Settings you can add a second step to signing in: after your password, a six-digit code from an authenticator app on your phone (Google Authenticator, Authy, Bitwarden, 1Password, Aegis, any of them). Click Set up authenticator, scan the square with the app (or type the key by hand), enter the six digits it shows, and you get eight recovery codes. Save those somewhere safe: each one signs you in once if you ever lose the phone, and they are shown only at that moment. A leaked password alone then opens nothing. Turning it off needs your password and a current code. Admin accounts can't turn it off; the admin panel stays closed until it's on.
- Display name: the name shown on your characters in the Lobby, on bot profiles and as your name in chats — change it any time under Account settings (Save name). It doesn't need to be your real name; 2–32 characters, letters, numbers, spaces and
. _ -, and it can't match someone else's - Your plan: every account starts on Free (2 bots, 3 characters). Starter is 5 bots and 15 characters, Studio 8 bots and 30 characters, Headliner 10 bots and 50 characters plus an included managed API key and early access to upcoming betas. Free also keeps things smaller elsewhere: 2 personas (paid 10), 3 memory books (paid unlimited), 3 open Parlor conversations (paid unlimited), and memory by hand only — a free account's bots remember the last 200 lines per channel, kept for 14 days, and memories are made with
!creatememoryin the Brief style. Paid plans get auto memories as the story goes, every style or their own, and Studio and Headliner add living notes, folding old memories into arcs and a separate memory model; Headliner adds notes you write yourself. Paid plans also unlock putting your own key on someone else's bot for your server: 1 bot on Starter, 2 on Studio, 3 on Headliner. Bots hear your voice messages on Discord on every plan (5 a day on Free, 15 on Starter, 30 on Studio, unlimited on Headliner); Studio and Headliner also get spoken replies with a daily allowance, and any paid plan can use its own OpenAI, ElevenLabs or Groq key for voice instead. Free accounts get no spoken replies. Every bot gets a profile page on every plan: 3 pictures and the built-in looks on Free, 8 pictures plus custom CSS on Starter and Studio, 12 pictures plus custom CSS on Headliner. The full side-by-side is on the Plans page. To move up: support UnrealHQ on Ko-fi, then click Upgrade or gift a plan under Your plan and send a request (pick the plan, how many months, and optionally who it's a gift for, by display name). The admin checks it against the donation and approves it, usually within a day; you get an email when it lands. Three days before a plan ends you get a reminder; if it lapses, nothing is deleted — bots beyond the free allowance are parked until you renew, and characters, codices and memories stay exactly where they were - A server's house key: one key that covers every bot in a Discord server for people who have no key of their own, whether they never made an account or just haven't set one. It is the last resort, never the first: a chatter's own key always runs first, then a key the bot itself carries (an included key, a server key bought for that bot), and only then the house key. So members who pay their own way keep paying their own way, and strangers still get answered. Platform admins set it from the Control Room's House keys block (pick the server by name) or from inside the server with
/housekey <provider> <key>(deleted at once, like/setkey);/housekey model <id>picks its model,/housekey offpauses it,/housekeyshows it. - Headliner's included key: a managed API key that belongs to one of your bots rather than to you. Anyone who talks to that bot on Discord without a key of their own is answered on it, so a public bot works for strangers (in the Parlor everyone brings their own key). Assign it from the bot's card in the Command Center and pick its model there: the key has a daily token budget, and a pricier model simply spends that budget faster. You can move it to a different bot any time, and pin it to one server — Used in: Only your server — so a stranger's server that invites the bot doesn't spend your budget (there the bot falls back to that server's key, or the chatter's own)
- Managed key for one bot (any plan): you don't need Headliner to have a bot answer strangers. Under Your plan, choose A managed key for one bot, pick the bot and where it should be used (every server, or only one), say how many months, and send the request after donating. Once the admin grants it, the key shows on that bot's card exactly like the included one: choose any model on offer, pin or unpin the server, move it to another of your bots, or remove it. Renewing the same bot extends the key rather than making a second one
- Use my Settings key: the quickest way to put your own key on a bot. Open Attach a key you already have on the bot's card, pick the key from the Use my Settings key list, and click Attach; tick on every bot I own to do all of them at once. Nothing is pasted or copied: the bot reads the key you keep in Settings, so if you ever change it there, every bot follows. Chatters with their own key still use theirs; this only answers people on Discord who have none, and it never shows to them
- Attach a key you already have: your own key in Settings is yours alone unless you attach it as above. If you hold a second key — another
uhq-token, or any provider's key — open Attach a key you already have on the bot's card, paste it, pick where it's used (every server, or only one), and it becomes the bot's fallback for everyone who talks to it there. It never shows to them and can be pinned, moved, or removed like any other key - Your Discord link status is shown under Account settings, where you can generate a Discord link code (see Link your Discord), change your password (8+ characters) and manage the explicit-content opt-in (controls whether NSFW characters show up in the Lobby and can be chatted with)
- If you use a managed
uhq-token, your remaining credits and today's usage are shown here too - Your token usage shows every model call made on your account across all providers, BYO keys included: today and the last 7 days, split by provider and by character, with a day-by-day bar. Exact counts when the provider reports them, otherwise an estimate (about 4 characters per token). Prompt tokens dominate because every reply re-sends the character, its codex hits, memories and recent history — a heavy character costs more per message, and this panel is where you see it
- Sessions last 20 days, then you sign in again
- After 5 failed sign-in attempts from the same IP address, sign-ins from that address are blocked for 30 minutes
- Forgot your password? Click Forgot your password? under the login form, enter your account email, and follow the link in the email (it works once and expires after an hour). Setting a new password signs out every other session on the account. If you never had a password (an old Discord-only account), the same link sets your first one.
Your data rights
You own your data. UnrealHQ gives you two big buttons in your Control Room settings for exercising your rights under GDPR (and just as a matter of basic respect):
Export My Data
Download a JSON file containing everything associated with your account: characters (with their prompts decrypted), conversations and memory summaries, bots, personas, and settings. For safety the export lists which providers you have keys for, but never the API key values themselves. Perfect for backups or if you want to migrate your work somewhere else.
Permanently Delete My Account
Wipes your account and all associated data from UnrealHQ. This is irreversible — there's no soft-delete or grace period. Requires typing "DELETE" and your password to confirm. All of your running bots stop and are unregistered (their tokens are removed from our store), characters and avatars are deleted, all conversations are removed, and your login is invalidated immediately.
All commands
Not sure what a particular bot answers to? @Bot !commands replies with its live list — built-in commands, the character's own, and whatever its creator switched on from a command book — grouped by category.
Commands starting with / below are typed as plain text (or sent in a DM) — @mention the bot unless the channel has auto-respond on. /setkey and /link are picked up by every bot in the channel with or without a mention, and never stored in history. Commands starting with ! also need a mention or reply.
Setup commands
| Command | Description |
|---|---|
/setkey [provider] <key> [base-url] [nickname] | Set your API key (provider defaults to electronhub; custom needs an HTTPS base URL). Words after the key are its nickname. A key you set before stays saved, so you can switch back in the Control Room. The message is deleted in servers. |
!provider | List all provider names |
/prompt [message] | The bot's creator and UnrealHQ admins: a private file showing exactly what this bot would send to the model from this channel — persona, lore, memories, notes, the history it would include — with a token estimate. Server admins see only the size of the request. Nothing is sent to the model. |
/setmodel <model> [here|bot] | Change your model: default, or for this bot in this channel (here), or for this bot everywhere (bot). /setmodel clear here|bot removes an override; bare /setmodel shows what applies. |
/settemp <0.1-2.0> | Set creativity/temperature |
/setlength <50-32000> | Set maximum reply length in tokens |
/setcontext <5-200> or /setcontext 32k tokens | Set how much of the chat the bot remembers, in messages or tokens |
/tokens | What the bot's last reply to you cost (prompt and reply tokens) and how full your context is |
/settings | View all your current settings (also !settings) |
/reload | Refresh character data from database (requires Manage Server or Administrator) |
Account commands
| Command | Description |
|---|---|
/link <code> | Link this Discord account to your UnrealHQ account (code from the Control Room) |
/unlink | Disconnect your Discord account |
/whoami | Show which UnrealHQ account you are linked to |
/persona [name|off] [everywhere] | List personas, pick one for this channel (a DM counts as its own channel, so a persona set there stays in that DM), or turn it off; add everywhere to set your default for every channel |
Moderation commands
Available when the bot owner turns on Moderation Tools; each requires the matching Discord permission. See Moderation Tools for the full table: /purge, /slowmode, /timeout, /untimeout, /kick, /ban, /unban, /warn, /warnings, /clearwarnings.
Memory commands
| Command | Description |
|---|---|
!memories (!memory, !mem) | Where memory stands with this character here; !memories help lists everything (styles, undo, redo, fold, track, every) |
!summarize [count] (!sum) | Same as !creatememory: a memory from the last N messages (default 50) |
!creatememory 40 | Turn the last 40 messages into a memory in your memory book (needs a linked account and your own key) |
!creatememory <link> <link> [chat] | Same, from one message link to another; add chat to keep the memory to this channel only |
!creatememories auto 40 [chat] | A memory every 40 messages here, on its own, into your book (per account, per bot, per channel). auto off stops it, auto shows the status |
Auto-respond commands
Changing these requires Manage Channels, Manage Server or Administrator.
| Command | Description |
|---|---|
!auto | Show the channel's auto-respond status (anyone) |
!auto on/off | Toggle auto-respond mode |
!auto cooldown <0-300> | Minimum seconds between auto-responses |
!auto chance <1-100> | Response probability percentage |
!auto keywords add|remove|list|clear [word] | Words that always get a reply; the rest take the chance roll |
Character commands
Beyond the system commands above, what a bot answers to is up to its creator. Commands like !relationship or !msg come from the creator's command book in the Library and are switched on per character — so two bots can have completely different command sets, and a bot with no command book has only the system commands. To see exactly what a bot can do, @mention it with !commands (or !help) and it lists everything it currently answers to, grouped by category.
Slash commands (Discord UI)
These are real Discord slash commands (they show up in the / picker). Account commands reply privately (only you see the response).
| Command | Description |
|---|---|
/delete [count] | Delete the bot's last N messages (1–50, default 1) from Discord and from history (requires Manage Messages permission) |
/hide [count] | Hide (exclude) the bot's last N messages from context without deleting (requires Manage Messages permission) |
/auto | Reply to every message in this channel (requires Manage Channels) |
/ping | Only reply when mentioned or replied to (the default) (requires Manage Channels) |
/random [chance] | Reply unprompted at the given percent chance, default 25 (requires Manage Channels) |
/link code:, /persona [name:], /whoami | Slash versions of the account commands above; work in servers and in bot DMs |
/creatememory [last:] [from:] [to:] [about:] [scope:] [auto:] [style:] | Make a memory from the last N messages or a from–to range of message links; private reply with the draft |
Export & import
Export conversations
Back up your chat history from the Unforgettable. Each channel can be exported individually in two formats:
- JSONL (SillyTavern) — Standard chat format. Each line is a message object, compatible with SillyTavern and other platforms.
- JSON — Full structured export with metadata. Useful for archiving or analysis.
Import chat history
Bring your existing conversations to UnrealHQ! Unforgettable (into one of your own Parlor chats) and the Parlor (into a new web chat) both accept SillyTavern JSONL and JSON (array or wrapped chat/messages format). The importer auto-detects the format. Discord channels never take an import: every bot there would read the file's lines as things really said in the room.
Import/export characters
The Atelier supports TavernCardV2 (and V3-style) JSON import and export of saved characters. Import a character card and all fields come across — description, personality, scenario, example dialogue, system prompt, post-history instructions, tags, codex entries (character_book), and alternate greetings.
PNG cards work too. Choose the character's .png straight from your SillyTavern characters folder: the card embedded in the image (the chara or ccv3 chunk) is read in, and the picture itself is uploaded as the avatar with the hidden card text stripped out, so nobody can pull your description or codex back out of the avatar file.
Bulk Import & drafts
Migrating a whole roster? The Bulk Import card in the Atelier's Import/Export panel takes a pile of files at once — TavernCard .json, SillyTavern .png cards, and bare World Info lorebooks — and turns each into a private draft. A lorebook with no card becomes a draft named after the file, carrying just its codex. Only a name is required to save a character now, so you can work in passes: dump everything in, then come back to each draft for its description, personality and polish. A description (or personality) is only demanded at the moment you flip a character public, because a public character needs an identity to play; the tagline is what the Lobby card shows.
Two-file characters merge themselves. SillyTavern often ships a character as a pair: the card in one file, the lorebook in another. When both are in the same batch and the names line up (or the batch is exactly one card plus one lorebook), the lorebook's entries land inside the card's draft instead of becoming their own character. An unmatched lorebook still becomes a draft, but its result line asks "is this lore for…?" with a merge button. And if a shell already slipped through, open the real character and use Merge In a Draft in the Import/Export panel: the shell's codex moves over, its text fills any empty fields (never overwriting yours), and the shell is deleted.
Import standalone codex entries
Got an existing codex file? Click "Import Codex (.json)" in the Atelier. It handles all common World Info formats, including older ones with different field names. Choose to merge with existing entries or replace them entirely.
FAQ & troubleshooting
Something broken? File a ticket. Type !ticket followed by what is going wrong anywhere Alex Kade can read: any channel he can see, in any server he is in (not only the UnrealHQ Discord), or his DMs. For example, !ticket Kaito stopped answering in #general last night. Say which bot, where, and what you expected. You get a ticket number straight back, and the desk sees your setup with it (which account, provider, model, which bots and whether they are running), so you are not asked the same three questions first. Urgent-sounding things ("won't respond", "error", "stuck") go to the top of the pile; ideas and wishes go to the bottom. When it is looked at you hear back in the same place (staff can also send you a word with !ticket #12 reply … while it stays open); !ticket #12 shows yours any time. Linking your Discord first (/link CODE from the Control Room) helps, because then the desk can see your settings. Tickets go straight to the UnrealHQ staff and only they can read them, wherever you file from.
Ask The Archivist. In the UnrealHQ Discord, @mention The Archivist (or DM him, or start a message with !atlas) with your question and he answers from this very page, with a link to the section. He is a little tired of everyone, but he is accurate, and he will say so when the Atlas doesn't cover something. Then it's #help-desk. He keeps your last few questions in mind for about an hour so a follow-up ("and how do I turn it off?") lands on the right page; nothing is stored, and he forgets the moment you go quiet.
Or ask Pip from HR. His younger sister works the same Atlas and is the best desk for two things: your account (signing up, linking Discord, keys and providers, Settings, plans, your data) and the Atelier (building characters, the Forge, the Codex, greetings, custom commands, the Library, publishing and profile pages). @mention Pip the same way. She is shy and stutters a little, and she is exactly right about her chapters; anything outside them she hands to her brother, and anything the Atlas doesn't cover goes to Whispered Insanity. One more thing about Pip: she keeps an eye on how the room treats her brother. Pile onto The Archivist all at once, or keep needling him on your own, and she will ask, politely, for a little space; keep piling and she puts the channel on slowmode for a few minutes and lifts it herself. She never stops the fun, she paces it.
The bot isn't responding to my messages
- Make sure you're @mentioning the bot or replying to one of its messages (unless auto-respond is on). In a DM no mention is needed, but the bot chats there only once your Discord is linked to your UnrealHQ account, and an 18+ character also needs your NSFW opt-in; until then it sends a short note saying so.
- Check that you've set an API key with
/setkey(or in the Control Room, if your Discord is linked). Without a key the bot replies with setup instructions when addressed, and silently skips you in auto-respond channels. - Verify the bot is actually running (check the Command Center — it should show a green "Running" badge) and has a character linked
- Make sure the bot has permission to read and send messages in that channel
- If the bot says it can't read your message, the Message Content Intent is off in the Discord Developer Portal
- Check you haven't been blocked by the bot's creator
I'm getting API errors
- Double-check your API key is correct and hasn't expired
- Make sure you've selected a valid model for your provider (
/setmodel) - Check that you have credits/balance with your API provider
- If using a custom endpoint, verify the base URL is correct
The bot's responses feel too short/generic
- Raise Reply length (
/settempdoesn't control length; set Reply length in the Control Room or with/setlength). 600 fits one Discord message; the ceiling is 32,000. - Add more detail to your character's description and personality fields
- Add example dialogue showing the style and length you want
- Try a more capable model (Claude and GPT-4o tend to give richer responses than smaller models)
The bot forgot something important
- Use codex constant entries for facts that should never be forgotten
- Pin important details as memory notes in the Unforgettable
- Increase the context window (
/setcontext) so the bot sees more history - Check what the character actually remembers in Unforgettable → Memory Books; fix a memory, or rewrite it from its messages
Can I use the same character on multiple bots?
No — think of the bot as the character card itself. One character powers exactly one bot, and its codex, memory and commands travel with it. What you can do is invite that one bot to as many servers as you like (the way Clyde or any other public bot lives in thousands of servers). If a character is already driving another bot it shows as "used by" in the dropdown; unlink it there first if you really want to move it. You can still swap which of your characters a bot uses until you Lock the binding.
How do I invite my bot to a server?
Use the Invite button in the Command Center. If you created your own invite link in the Discord Developer Portal, that works too.
Is there a message limit?
With your own API key, not from us — your only limits are your provider's rate limits and your API budget (web chat in the Parlor is rate-limited to 15 messages a minute). UnrealHQ Managed API tokens do have limits: each plan has a daily token cap and a prepaid credit balance, and the bot tells you verbatim when you've hit either.
Can other people use my bot without paying?
Only on Discord, and only when there is a key to answer them on. The bot uses each message sender's own API key first. Someone without one is answered on a key the bot carries (Headliner's included key, a managed key for one bot, a key you attach, or a server member's key for their own server, see Settings), or else on the server's house key. With none of those, the bot replies with quick setup instructions when they address it (and silently skips them in auto-respond channels). In the Parlor everyone chats on their own key; a key attached to your bot runs only your own chats with that character there. Anyone else needs to set their own key with /setkey, or ask the admin for a managed token.
Where can I see which servers my bot is in?
On the bot's card in the Command Center. The card shows a Servers count, and expanding Server Invite Links lists every server the bot is currently in by name, with a button to make a server-specific invite for each. The bot has to be running for the list to load. The same servers appear in the Allowed Servers block with an Allow button beside each, which is the quick way to build a whitelist from where the bot already lives.
Do I have to publish my bot to use it in my own server?
No. Publish only controls whether the bot shows in the Lobby. A bot you never publish still runs, still answers, and can be invited to any server with its invite link. Publishing is for strangers; the invite link is for you and your friends.
My bot joined a server and left again straight away
That is the creator's Allowed Servers list doing its job: the server was not on it. The bot posts a short note in the server's system channel with the Server ID before it goes, and nothing invites it back by itself. Add the server to the list (or ask the creator to), then use the invite link again.
If I leave a scene and other people keep playing, does the bot lose track of me?
No. The scene keeps going without you, and each person's memory book is their own, so what you and the bot had going is not overwritten by what everyone else did while you were away. When you come back and your own lines have scrolled out of the context window, the bot gets a short where we left off recap of your last exchanges with it, on top of the live conversation. If you play more than one persona, each persona has its own recap and your memories are written with the persona's name: switching from one to another is like a different person walking in.
Can a bot answer sometimes, but always when I say its name?
Yes, and that is the intended combination. In an auto-respond channel, keywords are a guarantee and chance covers everything else. !auto chance 30 with !auto keywords ryker means every message containing "ryker" gets a reply and about a third of the rest do. !auto chance 0 with keywords set means keywords only. Cooldown still applies either way: with one set, a word said twenty times is not twenty replies, and lines inside the cooldown are read with the next reply. With no cooldown, every line gets its own reply. All of this is per channel and per bot.
What do the plans cost, and what does each one include?
Four plans, all month by month, all supported through Ko-fi donations. Free ($0): 2 bots, 3 characters, 2 personas, 3 memory books, 3 open Parlor conversations, short memory (the last 200 lines per chat, kept 14 days), memories you make yourself in the Brief style, bots hear 5 voice messages a day, a profile page for every bot with 3 pictures and the built-in looks. Starter ($5): 5 bots, 15 characters, 10 personas, unlimited memory books, unlimited Parlor conversations, long-term memory (auto memories as the story goes, every memory style or your own), your own key on 1 other creator's bot for your server, 15 voice messages heard a day (spoken replies with your own voice key), profile pages with 8 pictures and custom CSS. Studio ($12): 8 bots, 30 characters, everything Starter has, living notes (plot threads, what the character knows about you, cast), folding old memories into arcs and chapters, a separate memory model, a personal command book (your !commands on any bot), your key on 2 other creators' bots, 30 voice messages heard and 20 spoken replies a day. Headliner ($25): 10 bots, 50 characters, living notes you write yourself, your key on 3 other creators' bots, unlimited voice messages heard and 40 spoken replies a day, profile pages with 12 pictures and custom CSS, an included managed API key for one bot so strangers can talk to it without a key of their own, and early access to betas. On any plan you can add a managed key for one bot as a separate add-on. The Plans page has the side-by-side table; to move up, donate on Ko-fi and send a request under Your plan in the Control Room.
Can I share my bot's profile page? What if my name is taken?
Every bot's profile page has a short address, unrealhq.online/profile/Name, chosen in the profile editor and copied with the Copy link button. Names are first come first served across the whole site, and the editor tells you as you type if yours is taken, so pick another. The address is not case-sensitive. Only you see the Edit button on your own page; visitors get the page and nothing else.
Can other people see my character's prompts or codex?
No. The description, personality, system prompt, codex and everything else that shapes the character never leave the server; the Lobby, the Parlor and the profile page only receive the public fields (name, tagline, about, avatar, greeting, what the creator chose to show). Someone who talks to your bot for a year gets replies, not the recipe. Exports of a character go to its creator only.
I typed /voice match and nothing changed
Discord's slash-command picker may have swallowed it: if any app in that server registers its own /voice command, typing /voice match runs that and the text never reaches the bot. The fix is the ! form with the bot addressed: @Luna !voice match. A bare /voice shows what your mode is now, so you can confirm it took.
A reasoning model answered with nothing, or said it used its whole reply budget
Models that think before they write (GPT-5, Gemini 2.5 and 3, DeepSeek reasoners, GLM, Qwen3, Kimi K2 thinking and anything tagged thinking) spend that thinking out of the same budget as the reply. The bot recognizes those families and gives them extra room automatically, so this is rare now; if it still happens, raise Reply length in the Control Room or pick a non-reasoning model for that bot with /setmodel.
Can The Archivist explain something again, or in more detail?
Yes. Ask a follow-up the way you would with a person ("can you explain that more", "what do you mean by cooldown?") within an hour and he treats it as the same question, digging further into the same section rather than starting over. He can only go as deep as this page goes; if the Atlas is thin on something, tell #help-desk and the page gets better.
Why is one channel answering differently from another?
Most behavior is set per channel: auto-respond mode, chance, keywords and cooldown (!auto), which persona you are using (/persona), which model a bot uses (/setmodel … here), allowed roles (/access) and 18+ gating. A bot that chats freely in one room and stays quiet in another is usually just carrying different channel settings. A bare !auto or /settings shows what is set where you are standing.
Two of my friends' bots keep talking to each other. Is that on purpose?
Yes, up to a point. Bots in the same channel can see each other, and a bot that @mentions another in its reply hands it the scene, for at most two hops, on the last human speaker's key. Server admins can cap or stop it with !tagging 0 (or !tagging off), and a bot may only tag a bot that has already spoken in that channel.
I edited my character. Why hasn't the bot changed?
Character edits apply to the next reply as soon as you save; there is no restart. If nothing changes, check that the bot is actually linked to the character you edited (the card in the Command Center names it), that you saved (the Atelier shows an Unsaved changes badge until you do), and that the channel is not running a different model whose style you are noticing instead.
How do I get help or report a problem?
There is no support email. Type !ticket and what is wrong anywhere Alex Kade can read, in any server he is in or in his DMs (see the top of this section), or ask The Archivist for anything this page covers. Invite codes, managed tokens, password resets and quota changes are handled by the platform admin on Discord.