Skip to main content

Welcome to React Text Game

React Text Game is a powerful, reactive text-based game engine built for React applications. Create interactive narrative experiences with support for story passages, interactive maps, and comprehensive state management.

Key Features

  • 🔄 Reactive State Management - Built on Valtio for automatic UI updates
  • 📖 Multiple Passage Types - Story, Interactive Map, and Widget passages
  • 📝 MDX Support - Write narratives in Markdown with embedded React components
  • 💾 Flexible Save System - IndexedDB-based storage with encryption and migrations
  • 🎮 Entity Registry - Automatic registration and proxying of game objects
  • 🏭 Factory-Based Entities - Plain-object factories for beginners with class-based escape hatches
  • 🔒 Type-Safe - Full TypeScript support with comprehensive types
  • ⚛️ React Hooks - Built-in hooks for seamless React integration

Packages

React Text Game consists of three packages:

@react-text-game/core

The core game engine that handles state management, entity registration, passage navigation, and save/load functionality.

bun add @react-text-game/core

View Core API Documentation →

@react-text-game/ui

Ready-to-use React components with Tailwind CSS v4 and a semantic theming system.

bun add @react-text-game/core @react-text-game/ui

View UI API Documentation →

@react-text-game/mdx

MDX integration for writing game passages in Markdown with embedded React components. Perfect for narrative-focused games.

bun add @react-text-game/mdx @react-text-game/core @mdx-js/mdx @mdx-js/react

Example MDX passage:

---
passageId: intro
---
import { Action, Actions } from "@react-text-game/mdx";
import { player } from "../entities/player";

# Welcome, {player.name}!

Your adventure begins in a dark forest...

<Actions>
<Action onPerform={() => Game.jumpTo("forest")}>
Enter the forest
</Action>
</Actions>

Quick Example

import { Game, createEntity, newStory } from '@react-text-game/core';

// Initialize the game first (required!)
await Game.init({
gameName: 'My Text Adventure',
isDevMode: true,
});

// Create a game entity
const player = createEntity('player', {
name: 'Hero',
health: 100,
});

// Create a story passage
const intro = newStory('intro', () => [
{
type: 'header',
content: 'Welcome to the Game',
props: { level: 1 }
},
{
type: 'text',
content: `Hello, ${player.name}!`
},
{
type: 'actions',
content: [
{
label: 'Start Adventure',
action: () => Game.jumpTo('adventure')
}
]
}
]);

// Navigate to passage
Game.jumpTo(intro);

Next Steps

Resources

License

MIT © laruss