Skip to main content
ScreenJSON supports confidentiality without sacrificing structural introspection: only text runs are encrypted. UUIDs, timestamps, scene counts, character lists, revision labels, and meta stay in plain text.

The encrypt block

{
  "encrypt": {
    "cipher":   "aes-256-ctr",
    "hash":     "sha256",
    "encoding": "hex"
  }
}
FieldDefaultValues
cipheraes-256-ctrAny symmetric cipher string the tooling supports.
hashsha256Hash used for key derivation.
encodinghexhex · base16 · base32 · base64 · ascii85.
meta{}Free-form extension.

Key derivation

The encryption key is derived from a shared secret via a single pass of the declared hash (default SHA-256). The key must be at least 10 characters long.

Scope

  • Document-level encrypt (on the document root) applies to every element that doesn’t set its own.
  • Element-level encrypt on an individual element overrides the root.

What gets encrypted

  • Every value in a text language map on every element.
  • Every value in note.text, logline, cover extra, character desc, slugline desc, scene-level summary text.

What does not

  • UUIDs (document, scene, element, character, note, revision, bookmark).
  • Timestamps (created, modified).
  • Tag arrays (props, sfx, locations, genre, themes, etc.).
  • Character canonical name and aliases.
  • meta maps.
  • Everything under analysis (embeddings, passages, summaries).

CLI entry points