Skip to content

Writing Great Entries

Entries are the single most important thing you'll create. Every world on the platform uses them. The #1 world (Battle Royale, with nearly 2,000 play sessions) has 27 entries and zero rules... its entire game runs on well-crafted entries and nothing else.

This guide teaches the craft of writing entries that make worlds come alive. For the basics of entries and sections, see Get Started: Entries.


What separates good entries from great ones

Look at the most-played worlds on the platform and you'll notice a pattern. The creators who build hit worlds aren't using more features than everyone else. They're writing better entries.

A mediocre character entry says: "Alicia is an elf mage. She's sarcastic and likes plants."

A great character entry says: "Alicia speaks in gentle tones but weaponizes plant metaphors when irritated. She's secretly fascinated by humans but will never admit it. When cornered emotionally, she deflects with botanical trivia. She is terrified of centipedes — her biggest secret."

The difference? The first tells the AI what the character IS. The second teaches the AI how the character BEHAVES. Behavior is what makes a character feel alive.


Writing characters that feel alive

The best worlds on the platform invest more in character entries than anything else. Here's what works.

Personality as behavior, not labels

Don't just list traits. Describe how those traits show up in action.

Instead of this:

Rin is shy, intelligent, and kind.

Write this:

Rin avoids eye contact during first meetings and speaks to the floor. But when the conversation touches something she's studied, her posture changes completely... she leans forward, makes direct eye contact, and speaks in rapid full sentences. She is kind in a way that's almost compulsive: she can't walk past someone struggling without offering help, even when it costs her.

The AI can't act out "shy" in a consistent way. But it can act out "avoids eye contact and speaks to the floor."

Relationship stages

The most immersive worlds change how characters behave based on how well the player knows them. Sakura Season does this brilliantly: each of its three heroines has behavioral descriptions at four affinity levels (0-25, 26-50, 51-75, 76-100).

You can achieve this with conditional entries — entries that only activate when a variable reaches a threshold:

  • Early stage (affinity 0-25): Formal, guarded, surface-level conversation
  • Growing trust (affinity 26-50): Starts sharing opinions, occasional vulnerability
  • Close (affinity 51-75): Inside jokes, comfortable silence, asks for help
  • Deep bond (affinity 76+): Full vulnerability, unique speech patterns, protective

Each stage is a separate entry with conditions. As the relationship variable changes, the AI's guidance shifts automatically.

How to set this up

Create one entry per relationship stage. Each entry goes in Chat History with conditions:

Entry: "Rin — Early Stage"

  • Condition: rin_affinity less than 26
  • Keywords: Rin, her, she (or leave empty and use conditions only)
  • Content: Rin's guarded behavior, how she speaks at this stage

Entry: "Rin — Growing Trust"

  • Condition: rin_affinity greater than or equal to 26 AND less than 51
  • Keywords: same as above
  • Content: How Rin opens up at this stage

And so on for each stage. The engine checks conditions every turn and only sends the matching stage.

Full schema reference → World Spec: Entries

The character sheet formula

After studying dozens of successful worlds, here's the pattern that works:

  1. Identity (1-2 sentences): Name, role, core trait
  2. Appearance (2-3 sentences): What the player sees. Specific details, not generic descriptions
  3. Behavioral patterns (the bulk): How they talk, what they do when nervous/angry/happy, their habits, contradictions
  4. Relationship to the player: How they see the player initially, what changes their opinion
  5. Secrets: Things the AI knows but the character doesn't reveal easily

The behavioral patterns section is where most creators under-invest. It's also where the magic happens.


The lorebook: context on demand

The lorebook is the keyword-triggered entry system. It's the reason you can build a world with 50,000 words of lore and still have a fast, focused AI.

Designing good keyword lists

The engine scans the last few messages for your keywords. Any single keyword match triggers the entry (OR logic). Think about all the ways a player might reference something:

For an entry about a tavern:

  • tavern, inn, bar, drink, bartender, pub

For an entry about a character named Sakurai Kimika:

  • Kimika, Sakurai, class rep, class representative

Whole word matching: Turn this on when short keywords would cause false triggers. Without it, the keyword "art" would match "start", "heart", and "apart."

Secondary keywords for precision

Sometimes one keyword isn't enough to know if an entry is relevant. Secondary keywords let you add a second filter:

ModeMeaningExample use case
AND_ANYPrimary matches AND at least one secondary"forest" + any of ["elf", "danger", "ruins"]
AND_ALLPrimary matches AND all secondaries match"forest" + both "night" AND "danger"
NOT_ANYPrimary matches AND none of the secondaries"forest" but NOT "safe" or "peaceful"
NOT_ALLPrimary matches AND not all secondaries"forest" but not both "safe" AND "day" together

The most common use: AND_ANY for topic intersection. You want the "dark forest lore" entry to trigger when the player mentions both forests AND something ominous, not just any mention of trees.

Depth injection: where the entry appears in chat

Keyword-triggered entries don't go at the top of the prompt with System Presets. They're injected into the chat history at a specific position. The depth setting controls where.

depth: 4 means the entry appears 4 messages from the end of chat. This makes it feel like a natural part of the recent conversation rather than a system instruction from above.

Lower depth numbers (closer to the end) get more AI attention. Higher numbers (further back) feel more like background context.

Technical detail: how depth works

If the chat history is:

[1] User: Hello
[2] AI:   Hi there
[3] User: Where's the forest?
[4] AI:   Head north
[5] User: Alright, let's go

An entry with depth 2 inserts before message [4]:

[1] User: Hello
[2] AI:   Hi there
[3] User: Where's the forest?
--- [Entry content inserted here] ---
[4] AI:   Head north
[5] User: Alright, let's go

depth 0 places the entry at the very end (similar to Post Instructions).

Full reference → World Spec: Entries


State-driven entries

The most powerful entries don't wait for keywords. They respond to the state of the world itself.

Conditions let you gate entries on variable values. This is more reliable than keyword triggering because you're not hoping the player says the right word, the system reads the actual game state.

Real-world example: companion attitudes

Wandering Diary uses conditions to change how companions behave toward the player. Each companion has entries gated on affinity thresholds:

  • When xiaoyue_affinity < 30: entry describes Xiaoyue as cautious and distant
  • When xiaoyue_affinity >= 30 AND < 60: entry describes growing warmth and trust
  • When xiaoyue_affinity >= 60: entry describes deep loyalty and vulnerability

The player never sees this machinery. They just experience a companion who gradually opens up as the relationship deepens.

Conditions + keywords together

You can combine both. When an entry has keywords AND conditions, both must pass for the entry to activate. This creates precise contextual triggers:

  • Keywords: Kimika, class rep
  • Condition: day_count > 3
  • Effect: NPC backstory only reveals after Day 3, when the player mentions her

This prevents information from appearing too early in the story.

Seven comparison operators

OperatorMeaningBest for
eqEqualsExact state checks ("location equals cave")
neqNot equalExclusions ("not in the tutorial zone")
gtGreater thanThresholds ("affinity above 50")
gteGreater or equalInclusive thresholds
ltLess thanLow-state triggers ("health below 20")
lteLess or equalInclusive low-state
containsString containsPartial text matching

Multiple conditions combine with All (every condition must pass) or Any (one is enough).


Advanced techniques

Recursion: chained context

When entry A triggers and its content mentions a keyword from entry B, should B also trigger? That's recursion. It's off by default (recursion depth = 0 in settings) but can be turned on for worlds with interconnected lore.

Use carefully. Deep recursion chains can consume a lot of context. Most worlds keep it at 0 or 1.

Two safety controls:

  • Prevent Recursion: This entry can trigger, but its content won't scan for other entries. "I can be woken up, but I won't wake anyone else."
  • Exclude Recursion: Only the player's actual words can trigger this entry. Invisible to recursive scans entirely.

API role override

By default, all entries are sent as system messages. But you can change how the AI interprets them:

  • Instruction (system): The default. The AI treats it as a rule to follow.
  • User: The AI thinks a player said this. Some models weigh user messages more heavily.
  • Assistant: The AI thinks it said this itself. Useful for "pre-filling" a response style.

Example dialogue

Entries tagged as examples get special treatment. The engine parses them into user/assistant message pairs, so the AI sees actual conversation samples rather than a block of text.

Format:

<START>
{{user}}: Can you heal this wound?
{{char}}: *examines the wound, frowning* This isn't a normal knife wound.
There's a curse residue. I need moonflower pollen... but it's daytime.
<START>
{{user}}: So what do we do?
{{char}}: *shrugs* Either wait for nightfall, or you endure it.
I recommend the latter — pain is the best teacher.

Use <START> to separate different conversation examples. {{user}} and {{char}} are macros that get replaced with the actual player and character names.

A few good examples beat many. 2-3 dialogue samples that capture the character's voice are more effective than 10 that make the AI mimic them rigidly.

Regex keywords

Keywords also support regular expressions. Write your keyword in /pattern/flags format (e.g. /dark\s*forest/i) and the engine treats it as a regex instead of a literal string. Useful when you need to match flexible phrasing that simple keywords can't cover.

Scan depth and token budget

The engine doesn't scan all of chat history for keywords — that would be wasteful. The world setting lorebookScanDepth (default 2) controls how many recent messages to check. You can change this in the editor under Entry Settings in the Lorebook section. Higher values catch more references but cost more processing.

There's also a token budget: lorebookBudgetPercent (default 100%) and lorebookBudgetCap (default unlimited) limit how many total tokens triggered entries can consume. When the budget is exceeded, entries with higher match scores take priority.

Folder organization

When your world has dozens or hundreds of entries, the sidebar list gets unwieldy. The editor supports folders — drag entries into logical groupings (all NPCs in one folder, all location lore in another). Folders are purely organizational; they have no effect on runtime behavior, matching, or injection order.

Position ordering

Within each section, entries are ordered by their position number (lower = earlier). Supports decimals, so you can slot an entry between positions 2 and 3 by giving it position 2.5.

Earlier entries in System Presets get cached more efficiently, so put your most stable content (character descriptions, world rules) at lower positions, and content that might change (dynamic instructions) at higher positions.


Common mistakes

Keyword entries with no keywords or conditions. If you put an entry in Chat History but forget to add keywords or conditions, it will never trigger. Always-on entries belong in System Presets.

Overlapping conditional entry ranges. If "Rin — Early Stage" covers affinity < 30 and "Rin — Growing Trust" covers affinity > 25, both activate between 26-29. Use non-overlapping ranges: < 26 and >= 26 AND < 51.

Too-specific keywords that never match. If your entry about the "Crystalline Sanctum" only triggers on crystalline sanctum, players who type "crystal place" or "that temple" will never see it. Think about how players actually refer to things, not just the canonical name.

Depth injection too deep for important context. An entry with depth 8 gets buried so far back in chat history that the AI barely weighs it. Keep important context at depth 2-4. Reserve higher depths for background flavor.


See also

Full schema reference → World Spec: Entries & Sections