Hex Version Hex Docs CI Coverage Status License

Domain-specific diagram builders and graph analyzers on top of Yog.

Choreo is a family of Elixir libraries that let you model, analyze, and render complex systems as graphs. Instead of drawing boxes and arrows by hand, you write code. Instead of static pictures, you get live analysis — reachability, cycles, bottlenecks, threat generation, and more.

alias Choreo.Dataflow

# A dataflow pipeline with one line of analysis
pipeline =
  Dataflow.new()
  |> Dataflow.add_source(:sensor, label: "IoT Sensor")
  |> Dataflow.add_transform(:parse, label: "JSON Parser")
  |> Dataflow.add_sink(:db, label: "TimescaleDB")
  |> Dataflow.connect(:sensor, :parse, data_type: "raw bytes")
  |> Dataflow.connect(:parse, :db, data_type: "event")

Dataflow.Analysis.cyclic?(pipeline)      #=> false
Dataflow.to_mermaid(pipeline)            #=> Mermaid diagram
graph TD
  classDef default color:white
  parse[["JSON Parser"]]
  db["TimescaleDB"]
  sensor(["IoT Sensor"])
  style parse fill:#3b82f6
  style db fill:#f43f5e
  style sensor fill:#10b981
  sensor -->|raw bytes| parse
  parse -->|event| db

Installation

Add choreo to your mix.exs:

def deps do
  [
    {:choreo, "~> 0.10"}
  ]
end

Detailed Guides

Choreo supports 13 different artifact modeling vocabularies. They are categorized and detailed in the following guides:

  1. Architecture & Design Modeling

  2. Behavior & Flow Modeling

  3. Data & Structure Modeling


Interactive Notebooks

The livebooks/ directory contains interactive walkthroughs and integration examples that you can run directly in Livebook:

  • livebooks/guides/ — step-by-step introductions to each Choreo module and diagram type.
  • livebooks/integrations/ — notebooks that bridge Choreo with third-party tools and data sources:
    • Finitomata — design FSMs in Choreo, run them with Finitomata, and analyze them back in Choreo.
    • GitHub Issues — turn a public repo's issues into a Planner and Mind Map.
    • Hex Dependencies — crawl any Hex package's dependency tree.
    • Mix Xref — visualize and analyze internal Elixir project dependencies.
    • Ecto Schema ERD — introspect Ecto schemas and render them as an interactive ERD.
  • livebooks/extending_choreo/ — tutorials that walk through adding new diagram types, analysis vocabularies, and protocol implementations to Choreo:
    • Git Graph — extend Choreo with a Mermaid gitGraph renderer, from builder to real git log adapter.
    • Call Graph Analysis — extend Choreo with an analysis-first call graph: dead functions, cycles, hotspots, and impact analysis.
    • FSM Viewable — add Choreo.Viewable support to Choreo.FSM so it can be zoomed, focused, and filtered.

Graph Analysis & Heatmaps

Choreo provides graph analysis tools to identify "hotspots" in your architecture, workflows, and pipelines. Use heatmap/2 to automatically color nodes based on importance or performance metrics.

MetricMeasureQuestionBest for
Structural ImportanceBetweenness Centrality"Which nodes are critical bridges/connectors?"Choreo, Dependency
ConnectivityDegree Centrality"Which nodes have the most connections?"MindMap, Dependency
SPOF DetectionArticulation Points"Which nodes would disconnect the system if they failed?"Choreo, Dataflow
Nucleus DetectionK-Core Decomposition"Which nodes form the most tightly-coupled core?"Choreo, Dependency
Dependency ReductionTransitive Reduction"What is the minimal set of dependencies that preserve reachability?"Dependency
Path AnalysisDijkstra / Widest Path"What is the fastest or highest-throughput path between two points?"Workflow, Dataflow
Execution HotspotsLatency Heatmap"Which tasks slow down the entire workflow?"Workflow
Volume HotspotsThroughput Heatmap"Which stages handle the most data volume?"Dataflow
Security HotspotsRisk Heatmap"Which components have the most security threats?"ThreatModel

Themes & Rendering

All modules render to DOT (Graphviz) and Mermaid.js via a shared theming pipeline.

# DOT output (Graphviz)
Choreo.to_dot(system, theme: :default)
Choreo.to_dot(system, theme: :dark)

# Mermaid.js output (GitHub, GitLab, Notion, Livebook)
Choreo.to_mermaid(system, theme: :default)
Choreo.to_mermaid(system, theme: :ocean)

# Custom theme
theme = Choreo.Theme.custom(
  colors: %{database: "#ff0000", service: "#00ff00"},
  graph_bgcolor: "#0f172a",
  node_fontcolor: "white"
)
Choreo.to_dot(system, theme: theme)
Choreo.to_mermaid(system, theme: theme)

Interactive Livebook Widgets (Experimental)

Choreo provides two custom Livebook widgets for rich, interactive diagram visualizations. They are compile-time optional and load automatically when kino is present:

  1. Choreo.Lab.Siren: An enhanced Mermaid.js renderer (Mermaid v11.x) with hardware-accelerated pan/zoom controls, floating zoom toolbar, dynamic fit-to-screen scaling, and automatic dark/light theme detection.

    mermaid_code = Choreo.to_mermaid(system)
    Choreo.Lab.Siren.new(mermaid_code, height: "600px")
  2. Choreo.Lab.Sketch: Renders any Mermaid flowchart inside an interactive Excalidraw whiteboard. The diagram is converted to sketch elements on the fly, allowing you to double-click, draw notes, and scribble ideas directly on top of your Choreo models.

    Choreo.Lab.Sketch.new(mermaid_code, height: "600px")

Testing

mix test

All modules ship with comprehensive ExUnit test suites covering builders, analysis, rendering, and doctests.


License

MIT