SimTerm v0.1

Open source · MIT licensed

Build terminal-native
experiences as data

SimTerm is a Rust framework for structured, command-driven terminal games and interactive experiences.

The runtime provides campaign loading, state management, logs, objectives, branching outcomes, achievements, and validation tools. Campaign data defines the experience.

cargo run -p simterm
simterm — sample_campaign

operator@console:~$ start

campaign loaded: sample_terminal_experience

operator@console:~$ inspect node-01

signal detected: incomplete route map

operator@console:~$ analyze signal

confidence updated: 74%

operator@console:~$ connect relay

session established

relay:/archive$ cat manifest.log

objective clue unlocked

relay:/archive$ choose 2

branch selected: silent extraction

Rust · edition 2021 ratatui + crossterm RON campaign data Data-driven achievements Zero-UI runtime crate MIT

Why SimTerm

A clean boundary between engine and content

Create new experiences as campaign data without changing the runtime. The framework handles reusable mechanics so authors can focus on content and structure.

External campaigns

A campaign is a directory with campaign.ron or a single .ron file. Load it without recompiling. Campaign-specific achievements live there too.

Stateful runtime

Model progress, uncertainty, logs, rewards, trace pressure, and repeatable command flows with deterministic state transitions. Use visible autoplay to test end-to-end routes.

Composable scenarios

Build scenes and connected spaces with entry points, links, objectives, and persistent campaign state.

Virtual filesystem

Author notes, clues, protected files, and reward paths the player explores with ls, cat, and find.

Reusable engine crate

simterm-engine has no terminal-UI dependency, so the runtime is embeddable beyond the bundled frontend.

Validate before you ship

Run --check for data invariants, --autoplay for a visible playthrough, and --autoplay-deterministic for a route without probabilistic exploits or privilege escalation.

Architecture

Three layers, one responsibility each

SimTerm separates generic mechanics, presentation, and content. Changes can be made at the layer that matches their scope.

Content is stored in RON. Reusable behavior belongs in the runtime, while presentation changes belong in the frontend.

engine

simterm-engine Data loading, mutable state, command effects, progression, outcomes, validation. No UI.

frontend

simterm CLI parsing, terminal setup, rendering, input, dispatch, logs, and status views.

campaign.ron

your content Name, intro, missions, targets, files, objectives, endings, theme, achievements, and flavor text.

How it works

Combine the framework with data to create a playable experience

1 Define the experience

Write scenes, missions, entities, files, objectives, and text.

2 Load the data

simterm-engine parses the RON campaign and validates basics.

3 Run the loop

The terminal frontend renders state and routes player commands.

Quickstart

Run the bundled campaign

Install Rust stable, clone the repository, and launch the sample. When no campaign path is provided, SimTerm loads examples/sample_campaign.

# run the default sample campaign
cargo run -p simterm

# validate a campaign without the TUI
cargo run -p simterm -- --check --campaign ./examples/sample_campaign

# run a specific campaign
cargo run -p simterm -- --campaign ./examples/sample_campaign

# watch a visible automated playthrough
cargo run -p simterm -- --campaign ./examples/sample_campaign --autoplay

# validate a deterministic route
cargo run -p simterm -- --campaign ./examples/sample_campaign --autoplay-deterministic

Create a custom campaign

Use the sample as a baseline, make incremental data changes, validate them, and run the campaign from the terminal.