Now in early access

Your Characters.
Their Stories.

Living NPCs that ship inside your game. No cloud. No latency. No monthly bills.

voxlore-demo - npc_dialogue.py
> player_input = "I heard there's trouble at the northern mines."
> response = npc.generate(captain_aldric, player_input)
Response
{
"dialogue": "Aye, trouble's a gentle word for it. The miners struck
something deep — something that doesn't want to stay
buried. I've lost three scouts already. If you're
heading north, you'd best go armed and wary.",
"emotion": "worried_resolve",
"face": "brow_furrowed, jaw_tight, eye_contact_direct",
"body": "arms_crossed, weight_shifted_forward",
"gesture": "glances_north_briefly"
}
dialogue → Subtitle systememotion → Voice toneface → Blend shapesbody → Animation state
The problem

Every NPC in your game
says the same 5 lines.

Traditional NPCs
"I used to be an adventurer like you..."
"I used to be an adventurer like you..."
"I used to be an adventurer like you..."
"I used to be an adventurer like you..."

Pre-written. Static. Players stop listening after 2 minutes.

VoxLore NPCs
"The northern pass has been treacherous since the thaw..."
"Wait - you helped my brother in Millhaven? Then I owe you a debt."
"I don't trust mages. Not after what happened at Thornkeep."
"You again? Last time you cost me three gold and a headache."

Dynamic. Context-aware. Every conversation is unique.

37K+

Dialogue examples from books & screenplays

20+

Character archetypes built in

400MB

Smallest model - fits in any game

A new paradigm

For decades, they were Non-Playing Characters.
Scripted. Static. Forgettable.

VoxLore changes that. Your characters remember. They react. They feel. They gossip, argue, and form opinions. They are no longer NPCs.

They are Playing Characters.

How it works

Three steps to living characters

1

Build Your World

Describe your setting, factions, history, and lore. The model uses this as ground truth so every NPC stays consistent with your world.

world: {
name: "Ashenmoor"
era: "post-collapse"
factions: ["Iron Covenant", ...]
}
2

Create Characters

Define personality via OCEAN traits, speech patterns, knowledge boundaries, and relationships. Each character feels distinct and memorable.

character: {
archetype: "grizzled_veteran"
openness: 0.3,
neuroticism: 0.7
knows: ["northern_mines"]
}
3

Ship It

Drop the model into Godot, Unity, or Unreal. Runs locally via llama.cpp or ONNX. No server, no API keys, no internet required.

// your_game/assets/
voxlore-model.gguf ........ 770MB
characters.json ......... 12KB
world.json ............ 8KB
World Events

One event. Every NPC reacts differently.

Push world events into the SDK and watch your characters respond naturally - each filtered through their own personality, fears, and ambitions. The world feels alive because it is.

Push a world event
# One line - every NPC gets the news
voxlore.push_world_event("The old bridge collapsed during the storm")
Captain Aldric
Warrior - High Conscientiousness

"That bridge was the only route for supply wagons. I need to send scouts east to find an alternate path before the garrison runs out of provisions."

worried_resolvearms_crossed
Sister Maeve
Healer - High Agreeableness

"Were there travelers on the bridge when it fell? Please, if anyone is hurt, bring them to the chapel. I have herbs enough for a dozen wounded."

anxious_concernhands_clasped
Wren the Quick
Rogue - Low Conscientiousness

"Collapsed, you say? That means the merchant caravans will detour through the forest road. Less guards, more confusion... could be profitable."

sly_interestleans_forward

Personality-Filtered Reactions

Events are filtered through each NPC's OCEAN traits. A high-neuroticism character panics while a low-neuroticism one shrugs it off. Same event, completely different reactions.

Works in Every Conversation

Events flow into both player-NPC and NPC-to-NPC conversations. Your world's background chatter evolves alongside the main story without any extra scripting.

Features

Everything NPCs need to feel real

Not just better dialogue. A complete system for characters that see the world, react to events, talk to each other, and animate with purpose.

Animation Constraints

Define your animation vocabulary per character. The model outputs machine-readable flags your engine maps to clips - not English descriptions you have to parse.

animations: {
emotions: ["happy", "angry", "sad"]
gestures: ["wave", "point", "shrug"]
faces: ["smile", "frown", "smirk"]
}
// Model only outputs flags from YOUR list
// Works with 5 animations or 500

NPC-to-NPC Conversations

NPCs talk to each other autonomously. Define conversation pairs, set a timer, and watch your world come alive with background chatter that responds to events. Player requests always take priority.

# NPCs chat on their own
voxlore.start_npc_conversation(
"guard_marcus", "merchant_orin"
)
# Each NPC keeps their distinct voice
# World events give them things to discuss

Game State Awareness

NPCs reference inventory, quests, location, time, and reputation. They notice the broken sword you carry, remember favors you did, and warn you about dangers in the area.

voxlore.set_game_state("aldric", {
inventory: ["broken_sword"],
quest: "find_merchant",
location: "market_district",
reputation: 0.7
})

World Events System

Push events into NPC context with a single API call. The model filters each event through personality traits - warriors worry about threats, healers worry about safety, rogues see opportunity.

# Godot (GDScript)
voxlore.push_world_event("A dragon was spotted")
// Unity (C#)
VoxLore.PushWorldEvent("A dragon was spotted");
// Unreal (C++)
VoxLore::PushWorldEvent("A dragon was spotted");
Structured output

Every field drives your game engine

Not just dialogue text. Every response includes emotion, facial expression, body language, and gesture data your engine can parse directly into animations.

npc_response.json
{
"dialogue": "The mines have been
sealed since the collapse. Whatever
your business, tread carefully.",
"emotion": "cautious_concern",// audio tone
"face": {
"brow": "slightly_raised",
"eyes": "narrowed",
"mouth": "tight_line"
},// blend shapes
"body": "arms_folded, stance_guarded",
"gesture": "nods_toward_mine_entrance"
}
Captain Aldric
grizzled_veteran archetype
emotion → Voice System

Maps to audio tone parameters. Your TTS or bark system uses this to adjust pitch, speed, and timbre.

face → Blend Shapes

Direct mapping to facial rig blend shapes. Brow, eyes, and mouth values drive your character's expression in real-time.

body + gesture → Animation

Body maps to animation state machine states. Gesture triggers one-shot animations layered on top.

Production-grade SDK

Ship-ready engineering

Four battle-tested techniques stolen from production LLM infrastructure and embedded directly into every SDK. No cloud required - your game handles everything locally.

Stream Cancellation

Player skips dialogue mid-sentence? The SDK cancels generation instantly and frees the GPU slot in under 50ms. No wasted compute, no stale responses blocking the next conversation.

// Player hits skip
npc.cancelDialogue()
// GPU slot freed in <50ms

Tool Calling for Game State

Stop cramming inventory, quests, and world state into the system prompt. NPCs request only what they need via structured tool calls. Cleaner prompts, smaller context, better responses.

client.registerTool(
"check_inventory",
callback
)

Emergency Fallback

If the local model crashes, stalls, or runs out of memory, the SDK downgrades gracefully through tiered quality modes. At the lowest tier, pre-written character-banked lines keep the scene playable. Your game never breaks.

client.registerFallbacks(
"grimjaw", bankDict
)

Custom Schema Extensions

Bolt on your own fields - relationship deltas, knowledge reveals, quest hints, combat intent - without forking the SDK. Extensions are enforced at the schema level so the model always produces valid, typed data.

character.setSchemaExtensions({
relationship_delta: {
type: "integer"
}
})
Pricing

One model. Three sizes.

Pay once, ship forever. No subscriptions, no per-player fees, no usage limits.

Standard
1.9 GB

Full narrative model - unlimited archetypes

  • Highest dialogue quality and coherence
  • Full OCEAN personality expression
  • Long-term conversation memory
  • All 20+ archetypes included
  • Recommended: 8 GB+ RAM
$499one-time
Get Standard
Best for PC / Console
Most Popular
Lite
770 MB

Perfect for indie games

  • High dialogue quality
  • Personality-aware responses
  • Shorter context window
  • 15 archetypes included
  • Recommended: 4 GB+ RAM
$199one-time
Get Lite
Best balance of quality & size
Ultra-Lite
400 MB

Per-archetype models for mobile & Steam Deck

  • Functional dialogue generation
  • Basic personality traits
  • Fastest inference speed
  • Pick individual archetypes
  • Recommended: 2 GB+ RAM
$99one-time
Get Ultra-Lite
Best for mobile / Steam Deck

Enterprise - Need custom archetypes, fine-tuning on your own lore, or volume licensing? Let's talk.

Engine support

Same JSON. Every engine.

One character definition works across all supported engines. Write once, ship everywhere.

Godot
Godot
Unity
Unity
Unreal
Unreal
Phaser
Phaser
npc_controller.gdGDScript
var response = voxlore.generate(
character_id, player_input
)
# Drive your animations directly
dialogue_box.show(response.dialogue)
anim_tree.set("body", response.body)
face_rig.apply(response.face)
NPCController.csC#
var response = await VoxLore.Generate(
characterId, playerInput
);
// Drive your animations directly
dialogueUI.Show(response.Dialogue);
animator.SetState(response.Body);
faceRig.Apply(response.Face);
NPCController.cppC++
auto Response = VoxLore::Generate(
CharacterId, PlayerInput
);
// Drive your animations directly
DialogueWidget->Show(Response.Dialogue);
AnimInstance->SetBody(Response.Body);
FaceRig->Apply(Response.Face);
NPCController.tsTypeScript
const response = await voxlore.generate(
characterId, playerInput
);
// Drive your animations directly
dialogueBox.show(response.dialogue);
npcSprite.play(response.body);
faceSprite.setFrame(response.face);

Ready to build living characters?

Start defining your first character in minutes. No sign-up required during early access.