digraph SlackVein { rankdir=LR; compound=true; fontname="Helvetica"; node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"]; edge [fontname="Helvetica", fontsize=10]; labelloc="t"; label="Slack Vein - API Flow"; fontsize=16; // Client subgraph cluster_client { label="Soleprint"; style=filled; color="#E8F5E9"; fillcolor="#E8F5E9"; app [label="Application", fillcolor="#C8E6C9"]; vein [label="Slack Vein\n(artery/veins/slack)", fillcolor="#A5D6A7"]; } // Auth subgraph cluster_auth { label="Authentication"; style=filled; color="#FFF8E1"; fillcolor="#FFF8E1"; token [label="Bot Token\n(Bearer)", fillcolor="#FFECB3"]; } // Slack API subgraph cluster_slack { label="Slack API"; style=filled; color="#E3F2FD"; fillcolor="#E3F2FD"; chat [label="chat.postMessage", fillcolor="#BBDEFB"]; channels [label="conversations.list", fillcolor="#BBDEFB"]; users [label="users.list", fillcolor="#BBDEFB"]; files [label="files.upload", fillcolor="#BBDEFB"]; } // Webhooks subgraph cluster_webhooks { label="Incoming"; style=dashed; color=gray; webhook [label="Webhook URL", fillcolor="#F5F5F5"]; } // Flow app -> vein [label="send_message()"]; vein -> token [label="auth"]; token -> chat [label="POST"]; token -> channels [label="GET"]; token -> users [label="GET"]; token -> files [label="POST"]; vein -> webhook [label="simple post", style=dashed]; }