Choreographic Programming
Write a whole distributed system as one script, and let the compiler split it up.
A distributed system is normally written as many separate programs, one per participant, which have to agree on a protocol that exists nowhere in the code. Choreographic programming writes the interaction once, as a single program that names every participant, and a compiler projects it onto the individual endpoints. Protocol mismatches and whole classes of deadlock become programs you cannot write in the first place.
- Foundations: how choreographic and multitier languages relate (ECOOP'21).
- Applications: enforcing contract-client protocols in decentralized apps (TOPLAS'23).
- Mechanized metatheory in Lean, with Timon Böhler and Simon Daniel: choreographies without variable binding, without “impossible” branches, and with deadlock freedom independent of the compiler (TyDe'26, preprint).
- 🏅 Distinguished Paper Multiparty Languages: the Choreographic and Multitier Cases, ECOOP 2021
Timeline
Multiparty Languages: the Choreographic and Multitier Cases
Choreographic and multitier languages grew out of different theories (process calculi vs. lambda calculus) in two communities with little contact. We show they differ in exactly two respects, perspective (objective vs. subjective) and whether communication is written down or implied, and give translations in both directions between minimal versions of each, so results can carry over.


Fig. 1/2 from the paper.
Links: ECOOP 2021 · paper · video 🏅 Distinguished Paper
Prisma: A Tierless Language for Contract-Client Protocols
In a decentralized app, contract and client are separate programs, so their protocol is only a convention, and a client that acts out of order can drive the contract off-protocol. Prisma writes both as one program and compiles it into a smart contract plus client, with a proof that no attacker-controlled client can force the contract off the source-level control flow.
Links: TOPLAS 2023 · ECOOP 2022 · extended abstract · artifact · github · arxiv
Mechanizing Choreographic Programs and Hoare Logic
In machine-checked proofs about choreographies, variable binding and substitution usually dominate the effort. Modelling “receive a message” as a state transformer on the participant’s local state removes the binder altogether, yielding a Lean mechanization of sound and complete endpoint projection, deadlock freedom, confluence, and a Hoare logic for choreographies.
Links: arxiv
On Eliminating the Impossible with Dependent Types
Embedded choreographic libraries model a value that a role may or may not own
as an option type, so unwrapping it always leaves a dead “impossible” branch.
In Lean, ownership becomes a machine-checked proof carried in the value’s
type, giving a library with no error/undefined in its core, without losing
expressivity relative to prior, partial libraries.
Links: arxiv
2026Unpublished draft (click to expand)Choreographies First, Session Types Later
Choreographies First, Session Types Later
Classically, deadlock freedom of a choreography is proved for one specific compiler, so hand-editing a generated process voids the guarantee. Inferring a global type from the choreography and projecting one local type per role moves the proof onto the types: any process checked against its local type keeps the system deadlock-free, whether it was generated or written by hand.



Fig. 1 from the paper.
Links: preprint
Open questions
Directions that come out of the work above, from thesis-sized (BSc/MSc) to PhD-scale:
- Finer-grained choice. The Lean mechanization broadcasts every choice to the whole network. Supporting knowledge of choice, multiply-located values or enclaves would bring it closer to practical choreographic languages.
- Realistic communication. Asynchronous messages, failures, and roles created at run time, while keeping global types inferable.
- Composition. Assembling larger systems from independently verified choreographies and protocols.
- Tooling. Making inferred global and local types useful to programmers, e.g. as protocol documentation or as a guide for safe refactoring.
Useful background is functional programming and some Lean or Scala; my Type Systems lecture covers the foundations. If one of these interests you, write me an email.