corpus

self-hosted listenbrainz and last.fm proxy
Log | Files | Refs | README | LICENSE

architecture.svg (17756B)


      1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
      3  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
      4 <!-- Generated by graphviz version 12.2.1 (0)
      5  -->
      6 <!-- Title: corpus Pages: 1 -->
      7 <svg width="784pt" height="615pt"
      8  viewBox="0.00 0.00 783.75 615.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
      9 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 611)">
     10 <title>corpus</title>
     11 <g id="clust1" class="cluster">
     12 <title>cluster_frontend</title>
     13 <path fill="#1e1533" stroke="#9b7de8" d="M20,-395C20,-395 129.25,-395 129.25,-395 135.25,-395 141.25,-401 141.25,-407 141.25,-407 141.25,-544 141.25,-544 141.25,-550 135.25,-556 129.25,-556 129.25,-556 20,-556 20,-556 14,-556 8,-550 8,-544 8,-544 8,-407 8,-407 8,-401 14,-395 20,-395"/>
     14 <text text-anchor="middle" x="74.62" y="-538.7" font-family="Atkinson Hyperlegible Mono" font-size="14.00" fill="white">Frontend</text>
     15 </g>
     16 <g id="clust2" class="cluster">
     17 <title>cluster_server</title>
     18 <path fill="#112611" stroke="#5aaa5a" d="M385.25,-180C385.25,-180 508,-180 508,-180 514,-180 520,-186 520,-192 520,-192 520,-587 520,-587 520,-593 514,-599 508,-599 508,-599 385.25,-599 385.25,-599 379.25,-599 373.25,-593 373.25,-587 373.25,-587 373.25,-192 373.25,-192 373.25,-186 379.25,-180 385.25,-180"/>
     19 <text text-anchor="middle" x="446.62" y="-581.7" font-family="Atkinson Hyperlegible Mono" font-size="14.00" fill="white">Corpus Server</text>
     20 </g>
     21 <g id="clust3" class="cluster">
     22 <title>cluster_storage</title>
     23 <path fill="#272000" stroke="#d4a80c" d="M660,-438C660,-438 728.75,-438 728.75,-438 734.75,-438 740.75,-444 740.75,-450 740.75,-450 740.75,-587 740.75,-587 740.75,-593 734.75,-599 728.75,-599 728.75,-599 660,-599 660,-599 654,-599 648,-593 648,-587 648,-587 648,-450 648,-450 648,-444 654,-438 660,-438"/>
     24 <text text-anchor="middle" x="694.38" y="-581.7" font-family="Atkinson Hyperlegible Mono" font-size="14.00" fill="white">Storage</text>
     25 </g>
     26 <g id="clust4" class="cluster">
     27 <title>cluster_external</title>
     28 <path fill="#0e1e38" stroke="#5a8de0" d="M633,-8C633,-8 755.75,-8 755.75,-8 761.75,-8 767.75,-14 767.75,-20 767.75,-20 767.75,-415 767.75,-415 767.75,-421 761.75,-427 755.75,-427 755.75,-427 633,-427 633,-427 627,-427 621,-421 621,-415 621,-415 621,-20 621,-20 621,-14 627,-8 633,-8"/>
     29 <text text-anchor="middle" x="694.38" y="-409.7" font-family="Atkinson Hyperlegible Mono" font-size="14.00" fill="white">External APIs</text>
     30 </g>
     31 <!-- UI -->
     32 <g id="node1" class="node">
     33 <title>UI</title>
     34 <path fill="#2d2050" stroke="black" d="M104.38,-439C104.38,-439 44.88,-439 44.88,-439 38.88,-439 32.88,-433 32.88,-427 32.88,-427 32.88,-415 32.88,-415 32.88,-409 38.88,-403 44.88,-403 44.88,-403 104.38,-403 104.38,-403 110.38,-403 116.38,-409 116.38,-415 116.38,-415 116.38,-427 116.38,-427 116.38,-433 110.38,-439 104.38,-439"/>
     35 <text text-anchor="middle" x="74.62" y="-422.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Elm SPA</text>
     36 <text text-anchor="middle" x="74.62" y="-410.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">?user=slug</text>
     37 </g>
     38 <!-- API -->
     39 <g id="node3" class="node">
     40 <title>API</title>
     41 <path fill="#1c3e1c" stroke="black" d="M466.25,-482C466.25,-482 427,-482 427,-482 421,-482 415,-476 415,-470 415,-470 415,-458 415,-458 415,-452 421,-446 427,-446 427,-446 466.25,-446 466.25,-446 472.25,-446 478.25,-452 478.25,-458 478.25,-458 478.25,-470 478.25,-470 478.25,-476 472.25,-482 466.25,-482"/>
     42 <text text-anchor="middle" x="446.62" y="-459.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Web API</text>
     43 </g>
     44 <!-- UI&#45;&gt;API -->
     45 <g id="edge12" class="edge">
     46 <title>UI&#45;&gt;API</title>
     47 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M116.59,-421C213.91,-421 446.75,-421 446.75,-421 446.75,-421 446.75,-435.81 446.75,-435.81"/>
     48 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="446.75,-443.81 443.15,-435.81 446.55,-441.51 446.55,-435.81 446.75,-435.81 446.95,-435.81 446.95,-441.51 450.35,-435.81 446.75,-443.81"/>
     49 </g>
     50 <!-- Proxy -->
     51 <g id="node4" class="node">
     52 <title>Proxy</title>
     53 <path fill="#1c3e1c" stroke="black" d="M479.75,-310C479.75,-310 413.5,-310 413.5,-310 407.5,-310 401.5,-304 401.5,-298 401.5,-298 401.5,-286 401.5,-286 401.5,-280 407.5,-274 413.5,-274 413.5,-274 479.75,-274 479.75,-274 485.75,-274 491.75,-280 491.75,-286 491.75,-286 491.75,-298 491.75,-298 491.75,-304 485.75,-310 479.75,-310"/>
     54 <text text-anchor="middle" x="446.62" y="-287.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Cover Proxy</text>
     55 </g>
     56 <!-- UI&#45;&gt;Proxy -->
     57 <g id="edge14" class="edge">
     58 <title>UI&#45;&gt;Proxy</title>
     59 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M74.75,-402.52C74.75,-366.85 74.75,-292 74.75,-292 74.75,-292 391.32,-292 391.32,-292"/>
     60 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="399.32,-292 391.32,-295.6 397.03,-292.2 391.32,-292.2 391.32,-292 391.32,-291.8 397.03,-291.8 391.32,-288.4 399.32,-292"/>
     61 </g>
     62 <!-- Client -->
     63 <g id="node2" class="node">
     64 <title>Client</title>
     65 <path fill="#2d2050" stroke="black" d="M121.25,-525C121.25,-525 28,-525 28,-525 22,-525 16,-519 16,-513 16,-513 16,-501 16,-501 16,-495 22,-489 28,-489 28,-489 121.25,-489 121.25,-489 127.25,-489 133.25,-495 133.25,-501 133.25,-501 133.25,-513 133.25,-513 133.25,-519 127.25,-525 121.25,-525"/>
     66 <text text-anchor="middle" x="74.62" y="-508.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Scrobble Client</text>
     67 <text text-anchor="middle" x="74.62" y="-496.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">(LB&#45;compatible)</text>
     68 </g>
     69 <!-- Client&#45;&gt;API -->
     70 <g id="edge10" class="edge">
     71 <title>Client&#45;&gt;API</title>
     72 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M124.75,-488.51C124.75,-476.86 124.75,-464 124.75,-464 124.75,-464 404.88,-464 404.88,-464"/>
     73 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="412.88,-464 404.88,-467.6 410.59,-464.2 404.88,-464.2 404.88,-464 404.88,-463.8 410.59,-463.8 404.88,-460.4 412.88,-464"/>
     74 <text text-anchor="middle" x="257.25" y="-517.45" font-family="Atkinson Hyperlegible Mono" font-size="9.00" fill="#aaaaaa">POST /1/submit&#45;listens</text>
     75 <text text-anchor="middle" x="257.25" y="-506.95" font-family="Atkinson Hyperlegible Mono" font-size="9.00" fill="#aaaaaa">(token auth)</text>
     76 </g>
     77 <!-- DB -->
     78 <g id="node8" class="node">
     79 <title>DB</title>
     80 <path fill="#3d3100" stroke="black" d="M722.62,-564.73C722.62,-566.53 709.96,-568 694.38,-568 678.79,-568 666.12,-566.53 666.12,-564.73 666.12,-564.73 666.12,-535.27 666.12,-535.27 666.12,-533.47 678.79,-532 694.38,-532 709.96,-532 722.62,-533.47 722.62,-535.27 722.62,-535.27 722.62,-564.73 722.62,-564.73"/>
     81 <path fill="none" stroke="black" d="M722.62,-564.73C722.62,-562.92 709.96,-561.45 694.38,-561.45 678.79,-561.45 666.12,-562.92 666.12,-564.73"/>
     82 <text text-anchor="middle" x="694.38" y="-545.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">DuckDB</text>
     83 </g>
     84 <!-- API&#45;&gt;DB -->
     85 <g id="edge11" class="edge">
     86 <title>API&#45;&gt;DB</title>
     87 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M478.75,-470C520.94,-470 589.75,-470 589.75,-470 589.75,-470 589.75,-550 589.75,-550 589.75,-550 656.08,-550 656.08,-550"/>
     88 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="664.08,-550 656.08,-553.6 661.79,-550.2 656.08,-550.2 656.08,-550 656.08,-549.8 661.79,-549.8 656.08,-546.4 664.08,-550"/>
     89 </g>
     90 <!-- S3 -->
     91 <g id="node9" class="node">
     92 <title>S3</title>
     93 <polygon fill="#3d3100" stroke="black" points="732.75,-482 660,-482 656,-478 656,-446 728.75,-446 732.75,-450 732.75,-482"/>
     94 <polyline fill="none" stroke="black" points="728.75,-478 656,-478"/>
     95 <polyline fill="none" stroke="black" points="728.75,-478 728.75,-446"/>
     96 <polyline fill="none" stroke="black" points="728.75,-478 732.75,-482"/>
     97 <text text-anchor="middle" x="694.38" y="-459.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">S3 Bucket</text>
     98 </g>
     99 <!-- Proxy&#45;&gt;S3 -->
    100 <g id="edge15" class="edge">
    101 <title>Proxy&#45;&gt;S3</title>
    102 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M492.06,-302.8C540.33,-302.8 609.75,-302.8 609.75,-302.8 609.75,-302.8 609.75,-458 609.75,-458 609.75,-458 645.82,-458 645.82,-458"/>
    103 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="653.82,-458 645.82,-461.6 651.53,-458.2 645.82,-458.2 645.82,-458 645.82,-457.8 651.53,-457.8 645.82,-454.4 653.82,-458"/>
    104 </g>
    105 <!-- LF -->
    106 <g id="node11" class="node">
    107 <title>LF</title>
    108 <path fill="#162d52" stroke="black" d="M714,-224C714,-224 674.75,-224 674.75,-224 668.75,-224 662.75,-218 662.75,-212 662.75,-212 662.75,-200 662.75,-200 662.75,-194 668.75,-188 674.75,-188 674.75,-188 714,-188 714,-188 720,-188 726,-194 726,-200 726,-200 726,-212 726,-212 726,-218 720,-224 714,-224"/>
    109 <text text-anchor="middle" x="694.38" y="-201.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Last.fm</text>
    110 </g>
    111 <!-- Proxy&#45;&gt;LF -->
    112 <g id="edge17" class="edge">
    113 <title>Proxy&#45;&gt;LF</title>
    114 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M491.99,-288.4C520.05,-288.4 550.75,-288.4 550.75,-288.4 550.75,-288.4 550.75,-209.6 550.75,-209.6 550.75,-209.6 652.79,-209.6 652.79,-209.6"/>
    115 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="660.79,-209.6 652.79,-213.2 658.5,-209.8 652.79,-209.8 652.79,-209.6 652.79,-209.4 658.5,-209.4 652.79,-206 660.79,-209.6"/>
    116 </g>
    117 <!-- DC -->
    118 <g id="node13" class="node">
    119 <title>DC</title>
    120 <path fill="#162d52" stroke="black" d="M714,-138C714,-138 674.75,-138 674.75,-138 668.75,-138 662.75,-132 662.75,-126 662.75,-126 662.75,-114 662.75,-114 662.75,-108 668.75,-102 674.75,-102 674.75,-102 714,-102 714,-102 720,-102 726,-108 726,-114 726,-114 726,-126 726,-126 726,-132 720,-138 714,-138"/>
    121 <text text-anchor="middle" x="694.38" y="-115.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Discogs</text>
    122 </g>
    123 <!-- Proxy&#45;&gt;DC -->
    124 <g id="edge18" class="edge">
    125 <title>Proxy&#45;&gt;DC</title>
    126 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M492.18,-281.2C512.42,-281.2 531.75,-281.2 531.75,-281.2 531.75,-281.2 531.75,-126 531.75,-126 531.75,-126 652.93,-126 652.93,-126"/>
    127 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="660.93,-126 652.93,-129.6 658.63,-126.2 652.93,-126.2 652.93,-126 652.93,-125.8 658.63,-125.8 652.93,-122.4 660.93,-126"/>
    128 </g>
    129 <!-- CAA -->
    130 <g id="node14" class="node">
    131 <title>CAA</title>
    132 <path fill="#162d52" stroke="black" d="M747.75,-310C747.75,-310 641,-310 641,-310 635,-310 629,-304 629,-298 629,-298 629,-286 629,-286 629,-280 635,-274 641,-274 641,-274 747.75,-274 747.75,-274 753.75,-274 759.75,-280 759.75,-286 759.75,-286 759.75,-298 759.75,-298 759.75,-304 753.75,-310 747.75,-310"/>
    133 <text text-anchor="middle" x="694.38" y="-287.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Cover Art Archive</text>
    134 </g>
    135 <!-- Proxy&#45;&gt;CAA -->
    136 <g id="edge16" class="edge">
    137 <title>Proxy&#45;&gt;CAA</title>
    138 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M492.07,-295.6C492.07,-295.6 618.98,-295.6 618.98,-295.6"/>
    139 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="626.98,-295.6 618.98,-299.2 624.68,-295.8 618.98,-295.8 618.98,-295.6 618.98,-295.4 624.68,-295.4 618.98,-292 626.98,-295.6"/>
    140 </g>
    141 <!-- LBSync -->
    142 <g id="node5" class="node">
    143 <title>LBSync</title>
    144 <path fill="#1c3e1c" stroke="black" d="M500,-568C500,-568 393.25,-568 393.25,-568 387.25,-568 381.25,-562 381.25,-556 381.25,-556 381.25,-544 381.25,-544 381.25,-538 387.25,-532 393.25,-532 393.25,-532 500,-532 500,-532 506,-532 512,-538 512,-544 512,-544 512,-556 512,-556 512,-562 506,-568 500,-568"/>
    145 <text text-anchor="middle" x="446.62" y="-545.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">ListenBrainz Sync</text>
    146 </g>
    147 <!-- LBSync&#45;&gt;DB -->
    148 <g id="edge3" class="edge">
    149 <title>LBSync&#45;&gt;DB</title>
    150 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M512.37,-559C512.37,-559 655.97,-559 655.97,-559"/>
    151 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="663.97,-559 655.97,-562.6 661.67,-559.2 655.97,-559.2 655.97,-559 655.97,-558.8 661.67,-558.8 655.97,-555.4 663.97,-559"/>
    152 </g>
    153 <!-- LFSync -->
    154 <g id="node6" class="node">
    155 <title>LFSync</title>
    156 <path fill="#1c3e1c" stroke="black" d="M483.12,-396C483.12,-396 410.12,-396 410.12,-396 404.12,-396 398.12,-390 398.12,-384 398.12,-384 398.12,-372 398.12,-372 398.12,-366 404.12,-360 410.12,-360 410.12,-360 483.12,-360 483.12,-360 489.12,-360 495.12,-366 495.12,-372 495.12,-372 495.12,-384 495.12,-384 495.12,-390 489.12,-396 483.12,-396"/>
    157 <text text-anchor="middle" x="446.62" y="-373.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Last.fm Sync</text>
    158 </g>
    159 <!-- LFSync&#45;&gt;DB -->
    160 <g id="edge4" class="edge">
    161 <title>LFSync&#45;&gt;DB</title>
    162 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M486.75,-396.43C486.75,-427.44 486.75,-486.67 486.75,-486.67 486.75,-486.67 684.75,-486.67 684.75,-486.67 684.75,-486.67 684.75,-521.98 684.75,-521.98"/>
    163 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="684.75,-529.98 681.15,-521.98 684.55,-527.68 684.55,-521.98 684.75,-521.98 684.95,-521.98 684.95,-527.68 688.35,-521.98 684.75,-529.98"/>
    164 </g>
    165 <!-- Enrich -->
    166 <g id="node7" class="node">
    167 <title>Enrich</title>
    168 <path fill="#1c3e1c" stroke="black" d="M493.25,-224C493.25,-224 400,-224 400,-224 394,-224 388,-218 388,-212 388,-212 388,-200 388,-200 388,-194 394,-188 400,-188 400,-188 493.25,-188 493.25,-188 499.25,-188 505.25,-194 505.25,-200 505.25,-200 505.25,-212 505.25,-212 505.25,-218 499.25,-224 493.25,-224"/>
    169 <text text-anchor="middle" x="446.62" y="-201.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">Enrichment Task</text>
    170 </g>
    171 <!-- Enrich&#45;&gt;DB -->
    172 <g id="edge9" class="edge">
    173 <title>Enrich&#45;&gt;DB</title>
    174 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M499.75,-224.26C499.75,-286.18 499.75,-484.33 499.75,-484.33 499.75,-484.33 703.75,-484.33 703.75,-484.33 703.75,-484.33 703.75,-522 703.75,-522"/>
    175 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="703.75,-530 700.15,-522 703.55,-527.71 703.55,-522 703.75,-522 703.95,-522 703.95,-527.71 707.35,-522 703.75,-530"/>
    176 </g>
    177 <!-- Enrich&#45;&gt;LF -->
    178 <g id="edge7" class="edge">
    179 <title>Enrich&#45;&gt;LF</title>
    180 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M505.65,-202.4C505.65,-202.4 652.6,-202.4 652.6,-202.4"/>
    181 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="660.6,-202.4 652.6,-206 658.31,-202.6 652.6,-202.6 652.6,-202.4 652.6,-202.2 658.31,-202.2 652.6,-198.8 660.6,-202.4"/>
    182 </g>
    183 <!-- MB -->
    184 <g id="node12" class="node">
    185 <title>MB</title>
    186 <path fill="#162d52" stroke="black" d="M727.5,-52C727.5,-52 661.25,-52 661.25,-52 655.25,-52 649.25,-46 649.25,-40 649.25,-40 649.25,-28 649.25,-28 649.25,-22 655.25,-16 661.25,-16 661.25,-16 727.5,-16 727.5,-16 733.5,-16 739.5,-22 739.5,-28 739.5,-28 739.5,-40 739.5,-40 739.5,-46 733.5,-52 727.5,-52"/>
    187 <text text-anchor="middle" x="694.38" y="-29.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">MusicBrainz</text>
    188 </g>
    189 <!-- Enrich&#45;&gt;MB -->
    190 <g id="edge6" class="edge">
    191 <title>Enrich&#45;&gt;MB</title>
    192 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M505.71,-195.2C567.55,-195.2 655.75,-195.2 655.75,-195.2 655.75,-195.2 655.75,-62.2 655.75,-62.2"/>
    193 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="655.75,-54.2 659.35,-62.2 655.95,-56.49 655.95,-62.2 655.75,-62.2 655.55,-62.2 655.55,-56.49 652.15,-62.2 655.75,-54.2"/>
    194 </g>
    195 <!-- Enrich&#45;&gt;DC -->
    196 <g id="edge8" class="edge">
    197 <title>Enrich&#45;&gt;DC</title>
    198 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M446.75,-187.82C446.75,-161.01 446.75,-114 446.75,-114 446.75,-114 652.55,-114 652.55,-114"/>
    199 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="660.55,-114 652.55,-117.6 658.26,-114.2 652.55,-114.2 652.55,-114 652.55,-113.8 658.26,-113.8 652.55,-110.4 660.55,-114"/>
    200 </g>
    201 <!-- LB -->
    202 <g id="node10" class="node">
    203 <title>LB</title>
    204 <path fill="#162d52" stroke="black" d="M730.88,-396C730.88,-396 657.88,-396 657.88,-396 651.88,-396 645.88,-390 645.88,-384 645.88,-384 645.88,-372 645.88,-372 645.88,-366 651.88,-360 657.88,-360 657.88,-360 730.88,-360 730.88,-360 736.88,-360 742.88,-366 742.88,-372 742.88,-372 742.88,-384 742.88,-384 742.88,-390 736.88,-396 730.88,-396"/>
    205 <text text-anchor="middle" x="694.38" y="-373.55" font-family="Atkinson Hyperlegible Mono" font-size="11.00" fill="white">ListenBrainz</text>
    206 </g>
    207 <!-- LB&#45;&gt;LBSync -->
    208 <g id="edge1" class="edge">
    209 <title>LB&#45;&gt;LBSync</title>
    210 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M650.75,-396.38C650.75,-439.01 650.75,-541 650.75,-541 650.75,-541 522.04,-541 522.04,-541"/>
    211 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="514.04,-541 522.04,-537.4 516.34,-540.8 522.04,-540.8 522.04,-541 522.04,-541.2 516.34,-541.2 522.04,-544.6 514.04,-541"/>
    212 </g>
    213 <!-- LF&#45;&gt;LFSync -->
    214 <g id="edge2" class="edge">
    215 <title>LF&#45;&gt;LFSync</title>
    216 <path fill="none" stroke="#aaaaaa" stroke-width="1.4" d="M662.54,-216.8C625.91,-216.8 570.75,-216.8 570.75,-216.8 570.75,-216.8 570.75,-378 570.75,-378 570.75,-378 505.03,-378 505.03,-378"/>
    217 <polygon fill="#aaaaaa" stroke="#aaaaaa" stroke-width="1.4" points="497.03,-378 505.03,-374.4 499.33,-377.8 505.03,-377.8 505.03,-378 505.03,-378.2 499.33,-378.2 505.03,-381.6 497.03,-378"/>
    218 </g>
    219 </g>
    220 </svg>