penrose/penrose
{ "createdAt": "2016-09-22T04:47:19Z", "defaultBranch": "main", "description": "Create beautiful diagrams just by typing notation in plain text.", "fullName": "penrose/penrose", "homepage": "https://penrose.cs.cmu.edu", "language": "TypeScript", "name": "penrose", "pushedAt": "2025-11-26T22:11:22Z", "stargazersCount": 7880, "topics": [ "diagrams", "domain-specific-language", "mathematics", "programming-language", "visualization" ], "updatedAt": "2025-11-26T09:28:35Z", "url": "https://github.com/penrose/penrose"}Penrose
[
]!(LICENSE)

Section titled “Penrose []!(LICENSE) ”Penrose is a platform that enables people to create beautiful diagrams just by typing notation in plain text. The goal is to make it easy for non-experts to create and explore high-quality diagrams and provide deeper insight into challenging technical concepts. We aim to democratize the process of creating visual intuition.
You can try Penrose in your browser without any installation. For a more detailed step-by-step introduction, check out our tutorials. Or, for more reference-style information, take a look at our documentation.
Example
Section titled “Example”Here’s a simple Penrose visualization in the domain of set theory.
It’s specified by the following trio of Domain, Substance, and Style programs
(with variation MonsoonCaterpillar95943):
-
setTheory.domain:type Setpredicate Disjoint(Set s1, Set s2)predicate Intersecting(Set s1, Set s2)predicate Subset(Set s1, Set s2) -
tree.substance:Set A, B, C, D, E, F, GSubset(B, A)Subset(C, A)Subset(D, B)Subset(E, B)Subset(F, C)Subset(G, C)Disjoint(E, D)Disjoint(F, G)Disjoint(B, C)AutoLabel All -
euler.style:canvas {width = 800height = 700}forall Set x {shape x.icon = Circle { }shape x.text = Equation {string : x.labelfontSize : "32px"}ensure contains(x.icon, x.text)encourage norm(x.text.center - x.icon.center) == 0layer x.text above x.icon}forall Set x; Set ywhere Subset(x, y) {ensure disjoint(y.text, x.icon, 10)ensure contains(y.icon, x.icon, 5)layer x.icon above y.icon}forall Set x; Set ywhere Disjoint(x, y) {ensure disjoint(x.icon, y.icon)}forall Set x; Set ywhere Intersecting(x, y) {ensure overlapping(x.icon, y.icon)ensure disjoint(y.text, x.icon)ensure disjoint(x.text, y.icon)}
Contributing
Section titled “Contributing”See [CONTRIBUTING.md]!(CONTRIBUTING.md).
License
Section titled “License”This repository is licensed under the [MIT License]!(LICENSE).