rototo
DocsStart
Start

rototo introduction

rototo is a control plane for runtime configuration in application code.

Runtime configuration is production control. A value can change which code path runs, what limit applies, which account class receives different handling, which model an agent uses, or what operational message a user sees. Those decisions often need to change after an application is deployed, but they still need review, validation, rollback discipline, and an explanation when production behavior is questioned.

rototo puts that control plane in a Git-versioned workspace. The workspace is the reviewed boundary for runtime behavior, and Git remains the source of truth. Applications do not embed the final values in the binary. They load a workspace source, resolve named variables at runtime, and can refresh from that same source as reviewed configuration changes are released.

Why runtime configuration needs a control plane

A configuration value is rarely just a string or number. It usually answers an operational question:

When those answers live in environment variables, application branches, feature flag rules, and one-off exceptions, the production behavior becomes hard to audit. The value may be visible, but the reason it was selected is scattered. The validation may happen too late. The rollback path may depend on who remembers where the value came from.

rototo addresses that failure mode by making runtime configuration a workspace that can be inspected, linted, tested, reviewed, loaded, refreshed, and resolved with an explanation.

The smallest model

A rototo workspace contains the files that define runtime configuration behavior:

Those nouns are deliberately narrow. A workspace is the control-plane boundary. An environment names the deployment lane. Context is request-time input from the application. A qualifier is a reviewed condition. A variable is the value the application asks for.

The runtime loop

The production loop is:

review workspace change in Git
  |
  v
lint and test representative resolutions
  |
  v
release the workspace source
  |
  v
application loads the workspace at startup
  |
  v
application resolves variables with environment + runtime context
  |
  v
long-running service refreshes the workspace source

Successful refreshes affect future resolutions. Failed refreshes keep the last successfully loaded workspace active, so a transient source failure does not erase known-good configuration. Immutable commit refs are reproducible, but they do not produce new refresh results because the ref itself does not move.

One concrete resolution

Suppose an application asks for llm-agent-config in prod.

The application supplies runtime context:

{
  "account": {
    "plan": "enterprise",
    "seats": 250
  },
  "request": {
    "country": "DE"
  }
}

rototo validates that context, evaluates qualifiers such as enterprise-accounts, checks the prod rules for llm-agent-config, selects the matching value, validates the selected JSON shape, and returns the value to the application.

The important part is not only that a value was returned. The workspace records where the value came from, which condition matched, which environment was used, and what schema protected the application boundary.

What this lets you do

With this model, teams can:

Where to go next

Read Why rototo for the production failure modes that led to this model.

Read Quickstart to create a small local workspace, lint it, and resolve one variable.

Read Production workflow for the Git-backed workflow: schemas, qualifiers, variables, tests, application loading, refresh, and observability.

Read The rototo model when you need the full vocabulary and resolution flow.

Use the bundled CLI docs when working from a terminal:

rototo docs
rototo docs -p quickstart
rototo docs -p production-workflow
rototo docs -s refresh