About

About TropeLang

TropeLang is a descriptive language for writing a story down as facts, and a live engine that recognizes the tropes those facts satisfy.

Who built this?

Kelvin Nishikawa

I'm Kelvin Nishikawa, a software engineer and language enthusiast. TropeLang is my personal project — a programming language for narrative development. You can follow the work and reach me on GitHub.

Philosophy

Prose for people, structure for machines. A story should stay readable while its shape becomes explicit enough to query, check, and recognize — the prose is for the reader, the structure is for everything else.

// the build-your-own-language archetype, as a TropeLang vignette
// every line is a fact; the engine reads the shape, not the words

char dev      [+Protagonist] [+Maker]
char writer     [+Newcomer]
obj  language [+Tool] [+Structure] [+Meaning] [+Concealed]
set  world    [+Open]
concept stories
concept structure
concept authorship

// idea to MVP: a maker makes the thing, the thing works, the thing ships
rule Zero_to_One {
  when:
    char $m [+Maker]
    evt  $e [&Creates(agent=$m, target=$t)]
    $t -> $out
  then:
    $t [+Shipped]
}

arc the_maker {

  // ===== ACT I — the itch =====
  // prose can hold a story, but you can't run a query against a paragraph
  act the_itch {
    beat 1 { dev -- stories : "loves them, wants to reason about them" }
    // # = a state of mind
    beat 2 { dev [#Restless] }
    // ? = a seed: planted now, surfaced later
    beat 3 { ?dev [~Pursues(goal=structure)]? }
    // concealed from the reader: this "tool" is really a work of authorship
    beat 4 { ?language [+Authored]? }
  }

  // ===== ACT II — the build =====
  // idea becomes MVP: a means quietly turns into the medium
  act the_build {
    beat 1 { evt forge [&Creates(agent=dev, target=language)] }
    // > = holds
    beat 2 { dev > language : "holds the thing they made" }
    // -> = causes
    beat 3 { language -> stories : "lets a machine read twriter shape" }
    beat 4 { dev -- language : "starts to think in it" }
    // the reveal fires Tomato_Surprise — the concealed work, surfaced
    beat 5 {
      evt admits [&Reveals(agent=dev, subject=language, fact=authorship)]
      !language [+Authored]!
    }
  }

  // ===== ACT III — a life of its own =====
  // out in the world now, ripe with potential
  act a_life_of_its_own {
    // Zero_to_One commits — the thing actually ships
    beat 1 { language [+Shipped] }
    // @ = located-at
    beat 2 { language @ world : "out in the open; anyone can pick it up" }
    // a newcomer takes it up — Chekhov's Gunman, in-flight: twriter decisive act is still unwritten
    beat 3 { evt arrives [&Introduces(person=writer)] }
    beat 4 { writer -- language : "takes it up" }
    // * = contingent: potential, not yet spent
    beat 5 { *language [+Generative]* }
    // ? = latent: the rest isn't written yet
    beat 6 { ?language [+Unwritten]? }
    // ...and the vignette trails off here. who knows where it goes.
  }
}

Rationale

A language needn't target a computer. Any domain with a settled vocabulary can be given a grammar and made interpretable; literary theory is one of them, and TropeLang is that idea applied to narrative.

Explore the guide →