docs: add architecture and veins documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

- System overview, artery hierarchy, build flow, room config diagrams
- Veins docs: Jira, Slack, Google OAuth
- Shunts docs: MercadoPago mock
- DOT source files with generated SVGs
- HTML viewers with navigation and full-screen mode

Solves:
- Freelance work standardization
- Missing infrastructure replication (shunts)
- Reliable testing environment (BDD -> Gherkin -> Tests)
This commit is contained in:
buenosairesam
2026-01-02 22:09:13 -03:00
parent 05e7ead081
commit 22356fed66
22 changed files with 2887 additions and 0 deletions

View File

@@ -0,0 +1,244 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.1 (0)
-->
<!-- Title: SystemOverview Pages: 1 -->
<svg width="968pt" height="448pt"
viewBox="0.00 0.00 968.00 448.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 444.38)">
<title>SystemOverview</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-444.38 964,-444.38 964,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="480" y="-421.18" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint &#45; System Overview</text>
<g id="clust1" class="cluster">
<title>cluster_soleprint</title>
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="258,-325.38 258,-404.88 493,-404.88 493,-325.38 258,-325.38"/>
<text xml:space="preserve" text-anchor="middle" x="375.5" y="-385.68" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint Hub (port 12000)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_artery</title>
<polygon fill="#ffebee" stroke="#ffebee" points="8,-8 8,-294.62 304,-294.62 304,-8 8,-8"/>
<text xml:space="preserve" text-anchor="middle" x="156" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Artery &#45; Todo lo vital</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_atlas</title>
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="312,-215.12 312,-294.62 647,-294.62 647,-215.12 312,-215.12"/>
<text xml:space="preserve" text-anchor="middle" x="479.5" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Atlas &#45; Documentacion accionable</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_station</title>
<polygon fill="#fff8e1" stroke="#fff8e1" points="655,-215.12 655,-294.62 951,-294.62 951,-215.12 655,-215.12"/>
<text xml:space="preserve" text-anchor="middle" x="803" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Station &#45; Centro de control</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_external</title>
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="312,-98.81 312,-178.31 634,-178.31 634,-98.81 312,-98.81"/>
<text xml:space="preserve" text-anchor="middle" x="473" y="-159.11" font-family="Helvetica,sans-Serif" font-size="16.00">External Services</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_room</title>
<polygon fill="none" stroke="#7b1fa2" stroke-dasharray="5,2" points="642,-92.75 642,-184.38 952,-184.38 952,-92.75 642,-92.75"/>
<text xml:space="preserve" text-anchor="middle" x="797" y="-165.18" font-family="Helvetica,sans-Serif" font-size="16.00">Managed Room (e.g., AMAR)</text>
</g>
<!-- hub -->
<g id="node1" class="node">
<title>hub</title>
<path fill="#c8e6c9" stroke="black" d="M417.88,-369.38C417.88,-369.38 332.12,-369.38 332.12,-369.38 326.12,-369.38 320.12,-363.38 320.12,-357.38 320.12,-357.38 320.12,-345.38 320.12,-345.38 320.12,-339.38 326.12,-333.38 332.12,-333.38 332.12,-333.38 417.88,-333.38 417.88,-333.38 423.88,-333.38 429.88,-339.38 429.88,-345.38 429.88,-345.38 429.88,-357.38 429.88,-357.38 429.88,-363.38 423.88,-369.38 417.88,-369.38"/>
<text xml:space="preserve" text-anchor="middle" x="375" y="-354.43" font-family="Helvetica,sans-Serif" font-size="11.00">Soleprint</text>
<text xml:space="preserve" text-anchor="middle" x="375" y="-340.93" font-family="Helvetica,sans-Serif" font-size="11.00">Core Coordinator</text>
</g>
<!-- veins -->
<g id="node2" class="node">
<title>veins</title>
<path fill="#ffcdd2" stroke="black" d="M146,-259.12C146,-259.12 28,-259.12 28,-259.12 22,-259.12 16,-253.12 16,-247.12 16,-247.12 16,-235.12 16,-235.12 16,-229.12 22,-223.12 28,-223.12 28,-223.12 146,-223.12 146,-223.12 152,-223.12 158,-229.12 158,-235.12 158,-235.12 158,-247.12 158,-247.12 158,-253.12 152,-259.12 146,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="87" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Veins</text>
<text xml:space="preserve" text-anchor="middle" x="87" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Stateless Connectors)</text>
</g>
<!-- hub&#45;&gt;veins -->
<g id="edge1" class="edge">
<title>hub&#45;&gt;veins</title>
<path fill="none" stroke="black" d="M319.94,-340.62C277.04,-331.84 216.64,-316.87 167,-294.62 150.13,-287.06 132.8,-276.15 118.61,-266.23"/>
<polygon fill="black" stroke="black" points="120.72,-263.44 110.56,-260.46 116.64,-269.13 120.72,-263.44"/>
<text xml:space="preserve" text-anchor="middle" x="231.88" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
</g>
<!-- books -->
<g id="node6" class="node">
<title>books</title>
<path fill="#bbdefb" stroke="black" d="M417.5,-259.12C417.5,-259.12 332.5,-259.12 332.5,-259.12 326.5,-259.12 320.5,-253.12 320.5,-247.12 320.5,-247.12 320.5,-235.12 320.5,-235.12 320.5,-229.12 326.5,-223.12 332.5,-223.12 332.5,-223.12 417.5,-223.12 417.5,-223.12 423.5,-223.12 429.5,-229.12 429.5,-235.12 429.5,-235.12 429.5,-247.12 429.5,-247.12 429.5,-253.12 423.5,-259.12 417.5,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="375" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Books</text>
<text xml:space="preserve" text-anchor="middle" x="375" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Documentation)</text>
</g>
<!-- hub&#45;&gt;books -->
<g id="edge2" class="edge">
<title>hub&#45;&gt;books</title>
<path fill="none" stroke="black" d="M375,-332.98C375,-316.25 375,-290.66 375,-270.9"/>
<polygon fill="black" stroke="black" points="378.5,-270.99 375,-260.99 371.5,-270.99 378.5,-270.99"/>
<text xml:space="preserve" text-anchor="middle" x="390.38" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
</g>
<!-- tools -->
<g id="node9" class="node">
<title>tools</title>
<path fill="#ffecb3" stroke="black" d="M823,-259.12C823,-259.12 675,-259.12 675,-259.12 669,-259.12 663,-253.12 663,-247.12 663,-247.12 663,-235.12 663,-235.12 663,-229.12 669,-223.12 675,-223.12 675,-223.12 823,-223.12 823,-223.12 829,-223.12 835,-229.12 835,-235.12 835,-235.12 835,-247.12 835,-247.12 835,-253.12 829,-259.12 823,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="749" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Tools</text>
<text xml:space="preserve" text-anchor="middle" x="749" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(modelgen, tester, datagen)</text>
</g>
<!-- hub&#45;&gt;tools -->
<g id="edge3" class="edge">
<title>hub&#45;&gt;tools</title>
<path fill="none" stroke="black" d="M430.22,-344.05C486.88,-336.46 576.95,-321.28 651,-294.62 672.05,-287.05 694.12,-275.57 711.98,-265.28"/>
<polygon fill="black" stroke="black" points="713.56,-268.41 720.4,-260.32 710.01,-262.38 713.56,-268.41"/>
<text xml:space="preserve" text-anchor="middle" x="637.44" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
</g>
<!-- pulses -->
<g id="node4" class="node">
<title>pulses</title>
<path fill="#ef9a9a" stroke="black" d="M133.62,-142.81C133.62,-142.81 40.38,-142.81 40.38,-142.81 34.38,-142.81 28.38,-136.81 28.38,-130.81 28.38,-130.81 28.38,-118.81 28.38,-118.81 28.38,-112.81 34.38,-106.81 40.38,-106.81 40.38,-106.81 133.62,-106.81 133.62,-106.81 139.62,-106.81 145.62,-112.81 145.62,-118.81 145.62,-118.81 145.62,-130.81 145.62,-130.81 145.62,-136.81 139.62,-142.81 133.62,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="87" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Pulses</text>
<text xml:space="preserve" text-anchor="middle" x="87" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Composed Flows)</text>
</g>
<!-- veins&#45;&gt;pulses -->
<g id="edge8" class="edge">
<title>veins&#45;&gt;pulses</title>
<path fill="none" stroke="black" d="M87,-222.76C87,-204.61 87,-175.84 87,-154.34"/>
<polygon fill="black" stroke="black" points="90.5,-154.48 87,-144.48 83.5,-154.48 90.5,-154.48"/>
<text xml:space="preserve" text-anchor="middle" x="109.12" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">compose</text>
</g>
<!-- jira -->
<g id="node11" class="node">
<title>jira</title>
<path fill="#e8eaf6" stroke="black" d="M362,-142.81C362,-142.81 332,-142.81 332,-142.81 326,-142.81 320,-136.81 320,-130.81 320,-130.81 320,-118.81 320,-118.81 320,-112.81 326,-106.81 332,-106.81 332,-106.81 362,-106.81 362,-106.81 368,-106.81 374,-112.81 374,-118.81 374,-118.81 374,-130.81 374,-130.81 374,-136.81 368,-142.81 362,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="347" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Jira</text>
</g>
<!-- veins&#45;&gt;jira -->
<g id="edge4" class="edge">
<title>veins&#45;&gt;jira</title>
<path fill="none" stroke="black" d="M140.6,-222.66C149.39,-220.01 158.42,-217.4 167,-215.12 229,-198.71 255.03,-220.54 308,-184.38 319.35,-176.62 328.26,-164.37 334.68,-153.07"/>
<polygon fill="black" stroke="black" points="337.65,-154.94 339.18,-144.46 331.45,-151.7 337.65,-154.94"/>
<text xml:space="preserve" text-anchor="middle" x="300.73" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
</g>
<!-- slack -->
<g id="node12" class="node">
<title>slack</title>
<path fill="#e8eaf6" stroke="black" d="M434,-142.81C434,-142.81 404,-142.81 404,-142.81 398,-142.81 392,-136.81 392,-130.81 392,-130.81 392,-118.81 392,-118.81 392,-112.81 398,-106.81 404,-106.81 404,-106.81 434,-106.81 434,-106.81 440,-106.81 446,-112.81 446,-118.81 446,-118.81 446,-130.81 446,-130.81 446,-136.81 440,-142.81 434,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="419" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Slack</text>
</g>
<!-- veins&#45;&gt;slack -->
<g id="edge5" class="edge">
<title>veins&#45;&gt;slack</title>
<path fill="none" stroke="black" d="M136.47,-222.69C146.47,-219.73 156.99,-217.01 167,-215.12 230.92,-203.12 248.99,-216.66 313,-205.12 344.93,-199.37 357.24,-204.11 383,-184.38 393.48,-176.34 401.63,-164.31 407.5,-153.25"/>
<polygon fill="black" stroke="black" points="410.55,-154.97 411.77,-144.45 404.25,-151.91 410.55,-154.97"/>
<text xml:space="preserve" text-anchor="middle" x="378.08" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
</g>
<!-- google -->
<g id="node13" class="node">
<title>google</title>
<path fill="#e8eaf6" stroke="black" d="M506.12,-142.81C506.12,-142.81 475.88,-142.81 475.88,-142.81 469.88,-142.81 463.88,-136.81 463.88,-130.81 463.88,-130.81 463.88,-118.81 463.88,-118.81 463.88,-112.81 469.88,-106.81 475.88,-106.81 475.88,-106.81 506.12,-106.81 506.12,-106.81 512.12,-106.81 518.12,-112.81 518.12,-118.81 518.12,-118.81 518.12,-130.81 518.12,-130.81 518.12,-136.81 512.12,-142.81 506.12,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="491" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Google</text>
</g>
<!-- veins&#45;&gt;google -->
<g id="edge6" class="edge">
<title>veins&#45;&gt;google</title>
<path fill="none" stroke="black" d="M136.01,-222.63C146.14,-219.63 156.82,-216.91 167,-215.12 264.72,-197.96 292.34,-222.58 390,-205.12 419.85,-199.79 431.12,-203.07 455,-184.38 465.33,-176.29 473.42,-164.36 479.3,-153.37"/>
<polygon fill="black" stroke="black" points="482.32,-155.15 483.58,-144.64 476.03,-152.07 482.32,-155.15"/>
<text xml:space="preserve" text-anchor="middle" x="458.15" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">OAuth</text>
</g>
<!-- shunts -->
<g id="node3" class="node">
<title>shunts</title>
<path fill="#ffcdd2" stroke="black" d="M283.75,-259.12C283.75,-259.12 188.25,-259.12 188.25,-259.12 182.25,-259.12 176.25,-253.12 176.25,-247.12 176.25,-247.12 176.25,-235.12 176.25,-235.12 176.25,-229.12 182.25,-223.12 188.25,-223.12 188.25,-223.12 283.75,-223.12 283.75,-223.12 289.75,-223.12 295.75,-229.12 295.75,-235.12 295.75,-235.12 295.75,-247.12 295.75,-247.12 295.75,-253.12 289.75,-259.12 283.75,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="236" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Shunts</text>
<text xml:space="preserve" text-anchor="middle" x="236" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Mock Connectors)</text>
</g>
<!-- mercadopago -->
<g id="node14" class="node">
<title>mercadopago</title>
<path fill="#e8eaf6" stroke="black" d="M613.75,-142.81C613.75,-142.81 548.25,-142.81 548.25,-142.81 542.25,-142.81 536.25,-136.81 536.25,-130.81 536.25,-130.81 536.25,-118.81 536.25,-118.81 536.25,-112.81 542.25,-106.81 548.25,-106.81 548.25,-106.81 613.75,-106.81 613.75,-106.81 619.75,-106.81 625.75,-112.81 625.75,-118.81 625.75,-118.81 625.75,-130.81 625.75,-130.81 625.75,-136.81 619.75,-142.81 613.75,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="581" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">MercadoPago</text>
</g>
<!-- shunts&#45;&gt;mercadopago -->
<g id="edge7" class="edge">
<title>shunts&#45;&gt;mercadopago</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M280.02,-222.71C289.15,-219.71 298.79,-216.97 308,-215.12 404.38,-195.85 445.68,-239.58 527,-184.38 539.87,-175.64 551.86,-163.27 561.25,-152.15"/>
<polygon fill="black" stroke="black" points="563.97,-154.36 567.54,-144.39 558.53,-149.95 563.97,-154.36"/>
<text xml:space="preserve" text-anchor="middle" x="526.27" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">mock</text>
</g>
<!-- plexus -->
<g id="node5" class="node">
<title>plexus</title>
<path fill="#e57373" stroke="black" d="M112.25,-52C112.25,-52 61.75,-52 61.75,-52 55.75,-52 49.75,-46 49.75,-40 49.75,-40 49.75,-28 49.75,-28 49.75,-22 55.75,-16 61.75,-16 61.75,-16 112.25,-16 112.25,-16 118.25,-16 124.25,-22 124.25,-28 124.25,-28 124.25,-40 124.25,-40 124.25,-46 118.25,-52 112.25,-52"/>
<text xml:space="preserve" text-anchor="middle" x="87" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
<text xml:space="preserve" text-anchor="middle" x="87" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Full Apps)</text>
</g>
<!-- pulses&#45;&gt;plexus -->
<g id="edge9" class="edge">
<title>pulses&#45;&gt;plexus</title>
<path fill="none" stroke="black" d="M87,-106.69C87,-94.48 87,-77.78 87,-63.57"/>
<polygon fill="black" stroke="black" points="90.5,-63.89 87,-53.89 83.5,-63.89 90.5,-63.89"/>
<text xml:space="preserve" text-anchor="middle" x="103.88" y="-73.25" font-family="Helvetica,sans-Serif" font-size="10.00">extend</text>
</g>
<!-- templates -->
<g id="node7" class="node">
<title>templates</title>
<path fill="#bbdefb" stroke="black" d="M506.75,-259.12C506.75,-259.12 459.25,-259.12 459.25,-259.12 453.25,-259.12 447.25,-253.12 447.25,-247.12 447.25,-247.12 447.25,-235.12 447.25,-235.12 447.25,-229.12 453.25,-223.12 459.25,-223.12 459.25,-223.12 506.75,-223.12 506.75,-223.12 512.75,-223.12 518.75,-229.12 518.75,-235.12 518.75,-235.12 518.75,-247.12 518.75,-247.12 518.75,-253.12 512.75,-259.12 506.75,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="483" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Templates</text>
<text xml:space="preserve" text-anchor="middle" x="483" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Patterns)</text>
</g>
<!-- depots -->
<g id="node8" class="node">
<title>depots</title>
<path fill="#90caf9" stroke="black" d="M626.75,-259.12C626.75,-259.12 549.25,-259.12 549.25,-259.12 543.25,-259.12 537.25,-253.12 537.25,-247.12 537.25,-247.12 537.25,-235.12 537.25,-235.12 537.25,-229.12 543.25,-223.12 549.25,-223.12 549.25,-223.12 626.75,-223.12 626.75,-223.12 632.75,-223.12 638.75,-229.12 638.75,-235.12 638.75,-235.12 638.75,-247.12 638.75,-247.12 638.75,-253.12 632.75,-259.12 626.75,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="588" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Depots</text>
<text xml:space="preserve" text-anchor="middle" x="588" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(External Docs)</text>
</g>
<!-- room_backend -->
<g id="node15" class="node">
<title>room_backend</title>
<path fill="#e1bee7" stroke="black" d="M744.38,-142.81C744.38,-142.81 661.62,-142.81 661.62,-142.81 655.62,-142.81 649.62,-136.81 649.62,-130.81 649.62,-130.81 649.62,-118.81 649.62,-118.81 649.62,-112.81 655.62,-106.81 661.62,-106.81 661.62,-106.81 744.38,-106.81 744.38,-106.81 750.38,-106.81 756.38,-112.81 756.38,-118.81 756.38,-118.81 756.38,-130.81 756.38,-130.81 756.38,-136.81 750.38,-142.81 744.38,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="703" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Backend</text>
<text xml:space="preserve" text-anchor="middle" x="703" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Django/FastAPI)</text>
</g>
<!-- depots&#45;&gt;room_backend -->
<g id="edge12" class="edge">
<title>depots&#45;&gt;room_backend</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M605.47,-222.76C624.74,-203.6 655.94,-172.59 677.85,-150.81"/>
<polygon fill="black" stroke="black" points="680.05,-153.56 684.67,-144.03 675.11,-148.6 680.05,-153.56"/>
<text xml:space="preserve" text-anchor="middle" x="646.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">docs</text>
</g>
<!-- tools&#45;&gt;room_backend -->
<g id="edge10" class="edge">
<title>tools&#45;&gt;room_backend</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M742.01,-222.76C734.61,-204.36 722.81,-175.03 714.12,-153.45"/>
<polygon fill="black" stroke="black" points="717.45,-152.34 710.47,-144.37 710.95,-154.95 717.45,-152.34"/>
<text xml:space="preserve" text-anchor="middle" x="743.5" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">test</text>
</g>
<!-- monitors -->
<g id="node10" class="node">
<title>monitors</title>
<path fill="#ffecb3" stroke="black" d="M930.75,-259.12C930.75,-259.12 865.25,-259.12 865.25,-259.12 859.25,-259.12 853.25,-253.12 853.25,-247.12 853.25,-247.12 853.25,-235.12 853.25,-235.12 853.25,-229.12 859.25,-223.12 865.25,-223.12 865.25,-223.12 930.75,-223.12 930.75,-223.12 936.75,-223.12 942.75,-229.12 942.75,-235.12 942.75,-235.12 942.75,-247.12 942.75,-247.12 942.75,-253.12 936.75,-259.12 930.75,-259.12"/>
<text xml:space="preserve" text-anchor="middle" x="898" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Monitors</text>
<text xml:space="preserve" text-anchor="middle" x="898" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(databrowse)</text>
</g>
<!-- room_db -->
<g id="node17" class="node">
<title>room_db</title>
<path fill="#ce93d8" stroke="black" d="M944,-144.5C944,-146.91 924.28,-148.88 900,-148.88 875.72,-148.88 856,-146.91 856,-144.5 856,-144.5 856,-105.12 856,-105.12 856,-102.71 875.72,-100.75 900,-100.75 924.28,-100.75 944,-102.71 944,-105.12 944,-105.12 944,-144.5 944,-144.5"/>
<path fill="none" stroke="black" d="M944,-144.5C944,-142.09 924.28,-140.12 900,-140.12 875.72,-140.12 856,-142.09 856,-144.5"/>
<text xml:space="preserve" text-anchor="middle" x="900" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Database</text>
<text xml:space="preserve" text-anchor="middle" x="900" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(PostgreSQL)</text>
</g>
<!-- monitors&#45;&gt;room_db -->
<g id="edge11" class="edge">
<title>monitors&#45;&gt;room_db</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M898.3,-222.76C898.59,-206.37 899.03,-181.3 899.39,-160.77"/>
<polygon fill="black" stroke="black" points="902.89,-160.87 899.56,-150.81 895.89,-160.75 902.89,-160.87"/>
<text xml:space="preserve" text-anchor="middle" x="916.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">browse</text>
</g>
<!-- room_frontend -->
<g id="node16" class="node">
<title>room_frontend</title>
<path fill="#e1bee7" stroke="black" d="M826,-142.81C826,-142.81 786,-142.81 786,-142.81 780,-142.81 774,-136.81 774,-130.81 774,-130.81 774,-118.81 774,-118.81 774,-112.81 780,-106.81 786,-106.81 786,-106.81 826,-106.81 826,-106.81 832,-106.81 838,-112.81 838,-118.81 838,-118.81 838,-130.81 838,-130.81 838,-136.81 832,-142.81 826,-142.81"/>
<text xml:space="preserve" text-anchor="middle" x="806" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Frontend</text>
<text xml:space="preserve" text-anchor="middle" x="806" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Next.js)</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB