digraph architecture { rankdir=LR; pad="0.3"; fontname="Helvetica"; node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=12, margin="0.15,0.1"]; edge [fontname="Helvetica", fontsize=10]; labelloc="t"; label="Deck in a Dash — component architecture"; fontsize=16; subgraph cluster_res { label="res/ (source assets)"; style="dashed"; color=gray40; fontsize=11; images [label="22 RWS Major Arcana\nJPEGs (res/img/)", fillcolor="#fdf3d0"]; pdf [label="Waite's \"Pictorial Key\nto the Tarot\" (PDF,\npublic domain)", fillcolor="#fdf3d0"]; { rank=same; images; pdf; } } subgraph cluster_thirdparty { label="engine/third_party/astronomy/"; style="dashed"; color=gray40; fontsize=11; astronomy [label="Astronomy Engine\n(vendored, MIT,\npinned commit)", fillcolor="#fdf3d0"]; } subgraph cluster_i18nsrc { label="engine/i18n/ (translation sources)"; style="dashed"; color=gray40; fontsize=11; langfiles [label="en.lang, de.lang, ...\nkey=value per language", fillcolor="#fdf3d0"]; } subgraph cluster_engine { label="engine/src/ (core engine — plain C, no I/O assumptions except reading_print_*/main.c/i18n_load)"; style="solid"; color=black; fontsize=11; rng [label="rng.c\nstring-seeded PRNG\n(FNV-1a + splitmix64)", fillcolor="#cfe8fb"]; tarot [label="tarot.c\nCeltic Cross draw", fillcolor="#cfe8fb"]; tarot_data [label="tarot_data.c\ncard + position text", fillcolor="#cfe8fb"]; astro [label="astro.c\nnatal chart + transits", fillcolor="#cfe8fb"]; i18n [label="i18n.c\ntranslation catalog\n+ English fallback", fillcolor="#cfe8fb"]; reading [label="reading.c\nDailyReading\norchestration + text/HTML", fillcolor="#c8f0c8"]; main [label="main.c\nCLI arg parsing", fillcolor="#e3e3e3"]; { rank=same; main; reading; } { rank=same; tarot; astro; i18n; } } subgraph cluster_dist { label="dist/ (build output, generated by `make`)"; style="dashed"; color=gray40; fontsize=11; binary [label="deck-engine", fillcolor="#fde0d0"]; distimg [label="img/\n(copied JPEGs)", fillcolor="#fde0d0"]; disti18n [label="i18n/\n(copied .lang files)", fillcolor="#fde0d0"]; runsh [label="run.sh", fillcolor="#fde0d0"]; props [label="user.properties\n(birth data + lang)", fillcolor="#fde0d0"]; { rank=same; binary; distimg; disti18n; runsh; props; } } pdf -> tarot_data [label="sourced from", style=dotted, color=gray40]; tarot -> rng; tarot -> tarot_data; astro -> astronomy; tarot_data -> i18n [label="looks up\ntranslated text", style=dotted, color=gray40]; astro -> i18n [label="looks up\ntranslated text", style=dotted, color=gray40]; reading -> i18n [label="looks up\nUI labels", style=dotted, color=gray40]; reading -> tarot; reading -> astro; main -> reading [label="CLI only"]; main -> i18n [label="i18n_load(\n--lang, --i18n-dir)"]; main -> binary [label="`make` builds", style=dotted, color=gray40]; images -> distimg [label="`make images`\ncopies", style=dotted, color=gray40]; langfiles -> disti18n [label="`make i18n`\ncopies", style=dotted, color=gray40]; runsh -> props [label="reads at\nrun time", style=dotted, color=gray40]; }