Bring your NPCs to life.

A Rust runtime for game NPCs — conversations, quests, and inventory — exposed through a stable C ABI that works with any engine.

🌐

Universal C ABI

One shared library. Unity, Unreal, Godot, custom engines — if it can call C functions, it can use Animist.

🧱

Memory Safe

Built in Rust with panic catching at the FFI boundary. No undefined behavior leaking into your game.

📦

Zero Dependencies

Link a single static or dynamic library. No runtime to install, no package manager, no framework lock-in.

🛡

Clean Handle API

Opaque handles with status codes. Familiar patterns for anyone who's integrated a C library before.

A conversation in 10 lines of C

AnimistRuntimeHandle* runtime = NULL;
animist_runtime_create(&runtime);

uint64_t conv_id;
animist_conversation_begin(runtime, player_id, char_id, &conv_id);

AnimistResponseHandle* response = NULL;
animist_conversation_send_message(
    runtime, conv_id, char_id, "Merchant",
    player_id, "Do you sell potions?", &response);

char* text = NULL;
animist_response_get_text(response, &text);
printf("%s\n", text);

animist_string_free(text);
animist_response_destroy(response);
animist_runtime_destroy(runtime);

That's the entire integration. Create a runtime, start a conversation, send messages, read responses. Same pattern in C#, C++, Python, or any FFI-capable language.

See it running right now

This site is itself a consumer of the Animist C ABI, loaded via Node.js FFI. The demo page talks to a real AnimistRuntime through the same shared library your game would link.

Open the Demo