Files
libnovel/docs/architecture.svg
Admin 29d0eeb7e8
All checks were successful
CI / Scraper / Test (pull_request) Successful in 10s
CI / UI / Build (pull_request) Successful in 28s
CI / UI / Docker Push (pull_request) Has been skipped
CI / Scraper / Lint (pull_request) Successful in 1m5s
CI / Scraper / Docker Push (pull_request) Has been skipped
iOS CI / Build (pull_request) Successful in 8m7s
iOS CI / Test (pull_request) Successful in 16m14s
docs: add architecture diagrams (D2 + Mermaid)
Adds docs/architecture.d2 and docs/architecture.mermaid.md showing the
docker-compose-new.yml service topology — storage, application, init
containers, and external dependencies with annotated connections.

Also includes the rendered docs/architecture.svg (D2 output).

View live: d2 --watch docs/architecture.d2
View in Gitea: navigate to docs/architecture.mermaid.md in the web UI.
2026-03-21 20:35:03 +05:00

120 lines
43 KiB
XML

<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 2551 1374"><svg class="d2-1368901215 d2-svg" width="2551" height="1374" viewBox="-101 -101 2551 1374"><rect x="-101.000000" y="-101.000000" width="2551.000000" height="1374.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1368901215 .text {
font-family: "d2-1368901215-font-regular";
}
@font-face {
font-family: d2-1368901215-font-regular;
src: url("data:application/font-woff;base64,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");
}
.d2-1368901215 .text-bold {
font-family: "d2-1368901215-font-bold";
}
@font-face {
font-family: d2-1368901215-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-1368901215 .text-italic {
font-family: "d2-1368901215-font-italic";
}
@font-face {
font-family: d2-1368901215-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-1368901215 .fill-N1{fill:#0A0F25;}
.d2-1368901215 .fill-N2{fill:#676C7E;}
.d2-1368901215 .fill-N3{fill:#9499AB;}
.d2-1368901215 .fill-N4{fill:#CFD2DD;}
.d2-1368901215 .fill-N5{fill:#DEE1EB;}
.d2-1368901215 .fill-N6{fill:#EEF1F8;}
.d2-1368901215 .fill-N7{fill:#FFFFFF;}
.d2-1368901215 .fill-B1{fill:#0D32B2;}
.d2-1368901215 .fill-B2{fill:#0D32B2;}
.d2-1368901215 .fill-B3{fill:#E3E9FD;}
.d2-1368901215 .fill-B4{fill:#E3E9FD;}
.d2-1368901215 .fill-B5{fill:#EDF0FD;}
.d2-1368901215 .fill-B6{fill:#F7F8FE;}
.d2-1368901215 .fill-AA2{fill:#4A6FF3;}
.d2-1368901215 .fill-AA4{fill:#EDF0FD;}
.d2-1368901215 .fill-AA5{fill:#F7F8FE;}
.d2-1368901215 .fill-AB4{fill:#EDF0FD;}
.d2-1368901215 .fill-AB5{fill:#F7F8FE;}
.d2-1368901215 .stroke-N1{stroke:#0A0F25;}
.d2-1368901215 .stroke-N2{stroke:#676C7E;}
.d2-1368901215 .stroke-N3{stroke:#9499AB;}
.d2-1368901215 .stroke-N4{stroke:#CFD2DD;}
.d2-1368901215 .stroke-N5{stroke:#DEE1EB;}
.d2-1368901215 .stroke-N6{stroke:#EEF1F8;}
.d2-1368901215 .stroke-N7{stroke:#FFFFFF;}
.d2-1368901215 .stroke-B1{stroke:#0D32B2;}
.d2-1368901215 .stroke-B2{stroke:#0D32B2;}
.d2-1368901215 .stroke-B3{stroke:#E3E9FD;}
.d2-1368901215 .stroke-B4{stroke:#E3E9FD;}
.d2-1368901215 .stroke-B5{stroke:#EDF0FD;}
.d2-1368901215 .stroke-B6{stroke:#F7F8FE;}
.d2-1368901215 .stroke-AA2{stroke:#4A6FF3;}
.d2-1368901215 .stroke-AA4{stroke:#EDF0FD;}
.d2-1368901215 .stroke-AA5{stroke:#F7F8FE;}
.d2-1368901215 .stroke-AB4{stroke:#EDF0FD;}
.d2-1368901215 .stroke-AB5{stroke:#F7F8FE;}
.d2-1368901215 .background-color-N1{background-color:#0A0F25;}
.d2-1368901215 .background-color-N2{background-color:#676C7E;}
.d2-1368901215 .background-color-N3{background-color:#9499AB;}
.d2-1368901215 .background-color-N4{background-color:#CFD2DD;}
.d2-1368901215 .background-color-N5{background-color:#DEE1EB;}
.d2-1368901215 .background-color-N6{background-color:#EEF1F8;}
.d2-1368901215 .background-color-N7{background-color:#FFFFFF;}
.d2-1368901215 .background-color-B1{background-color:#0D32B2;}
.d2-1368901215 .background-color-B2{background-color:#0D32B2;}
.d2-1368901215 .background-color-B3{background-color:#E3E9FD;}
.d2-1368901215 .background-color-B4{background-color:#E3E9FD;}
.d2-1368901215 .background-color-B5{background-color:#EDF0FD;}
.d2-1368901215 .background-color-B6{background-color:#F7F8FE;}
.d2-1368901215 .background-color-AA2{background-color:#4A6FF3;}
.d2-1368901215 .background-color-AA4{background-color:#EDF0FD;}
.d2-1368901215 .background-color-AA5{background-color:#F7F8FE;}
.d2-1368901215 .background-color-AB4{background-color:#EDF0FD;}
.d2-1368901215 .background-color-AB5{background-color:#F7F8FE;}
.d2-1368901215 .color-N1{color:#0A0F25;}
.d2-1368901215 .color-N2{color:#676C7E;}
.d2-1368901215 .color-N3{color:#9499AB;}
.d2-1368901215 .color-N4{color:#CFD2DD;}
.d2-1368901215 .color-N5{color:#DEE1EB;}
.d2-1368901215 .color-N6{color:#EEF1F8;}
.d2-1368901215 .color-N7{color:#FFFFFF;}
.d2-1368901215 .color-B1{color:#0D32B2;}
.d2-1368901215 .color-B2{color:#0D32B2;}
.d2-1368901215 .color-B3{color:#E3E9FD;}
.d2-1368901215 .color-B4{color:#E3E9FD;}
.d2-1368901215 .color-B5{color:#EDF0FD;}
.d2-1368901215 .color-B6{color:#F7F8FE;}
.d2-1368901215 .color-AA2{color:#4A6FF3;}
.d2-1368901215 .color-AA4{color:#EDF0FD;}
.d2-1368901215 .color-AA5{color:#F7F8FE;}
.d2-1368901215 .color-AB4{color:#EDF0FD;}
.d2-1368901215 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-1368901215);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-1368901215);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-1368901215);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-1368901215);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-1368901215);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-1368901215);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-1368901215);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-1368901215);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="bm92ZWxmaXJl"><g class="shape" ><path d="M 2155 29 C 2155 30 2154 31 2153 31 C 2139 32 2128 43 2128 57 C 2128 72 2141 84 2157 84 H 2265 C 2282 84 2296 71 2296 56 C 2296 41 2283 29 2267 28 C 2266 28 2265 27 2264 26 C 2260 11 2244 0 2224 0 C 2211 0 2200 5 2192 12 C 2191 13 2190 13 2189 13 C 2186 12 2183 12 2180 12 C 2167 12 2156 19 2155 29 Z" stroke="#0D32B2" fill="#f0f4ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2210.796000" y="63.516000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">novelfire.net</text></g><g class="a29rb3Jv"><g class="shape" ><path d="M 2135 219 C 2135 220 2133 221 2132 221 C 2113 222 2098 233 2098 247 C 2098 262 2115 274 2136 274 H 2282 C 2305 274 2324 261 2324 246 C 2324 231 2307 219 2285 218 C 2283 218 2282 217 2282 216 C 2277 201 2255 190 2228 190 C 2211 190 2195 195 2185 202 C 2184 203 2182 203 2181 203 C 2177 202 2173 202 2169 202 C 2151 202 2137 209 2135 219 Z" stroke="#0D32B2" fill="#f0f4ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2210.547000" y="253.516000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Kokoro-FastAPI TTS</text></g><g class="YnJvd3Nlcg=="><g class="shape" ><path d="M 140 548 H 0 V 547 C 0 531 15 517 40 510 C 26 504 18 495 18 485 C 18 469 41 455 70 455 C 98 455 122 469 122 485 C 122 495 114 504 101 510 C 125 517 141 531 141 547 V 548 H 140 Z" stroke="#0D32B2" fill="#fff9e6" class=" stroke-B1" style="stroke-width:2;" /></g><text x="70.000000" y="569.000000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Browser / iOS App</text></g><g class="aW5pdA=="><g class="shape" ><rect x="1238.000000" y="881.000000" width="265.000000" height="291.000000" stroke="#0D32B2" fill="#f5f5f5" class=" stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" /></g><text x="1370.500000" y="868.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Init containers</text></g><g class="c3RvcmFnZQ=="><g class="shape" ><rect x="2074.000000" y="451.000000" width="275.000000" height="681.000000" stroke="#0D32B2" fill="#eaf7ea" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2211.500000" y="438.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Storage</text></g><g class="YXBw"><g class="shape" ><rect x="531.000000" y="367.000000" width="983.000000" height="428.000000" stroke="#0D32B2" fill="#eef3ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1022.500000" y="354.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Application</text></g><g class="aW5pdC5taW5pby1pbml0"><g class="shape" ><rect x="1276.000000" y="911.000000" width="188.000000" height="82.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1370.000000" y="949.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1370.000000" dy="0.000000">minio-init</tspan><tspan x="1370.000000" dy="18.500000">(mc: create buckets)</tspan></text></g><g class="aW5pdC5wYi1pbml0"><g class="shape" ><rect x="1268.000000" y="1060.000000" width="205.000000" height="82.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1370.500000" y="1098.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1370.500000" dy="0.000000">pb-init</tspan><tspan x="1370.500000" dy="18.500000">(bootstrap collections)</tspan></text></g><g class="c3RvcmFnZS5taW5pbw=="><g class="shape" ><path d="M 2123 505 C 2123 481 2203 481 2212 481 C 2220 481 2300 481 2300 505 V 671 C 2300 695 2220 695 2212 695 C 2203 695 2123 695 2123 671 V 505 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2123 505 C 2123 529 2203 529 2212 529 C 2220 529 2300 529 2300 505" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2211.500000" y="557.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2211.500000" dy="0.000000">MinIO :9000</tspan><tspan x="2211.500000" dy="16.714286"> </tspan><tspan x="2211.500000" dy="16.714286">buckets:</tspan><tspan x="2211.500000" dy="16.714286"> libnovel-chapters</tspan><tspan x="2211.500000" dy="16.714286"> libnovel-audio</tspan><tspan x="2211.500000" dy="16.714286"> libnovel-avatars</tspan><tspan x="2211.500000" dy="16.714286"> libnovel-browse</tspan></text></g><g class="c3RvcmFnZS5wb2NrZXRiYXNl"><g class="shape" ><path d="M 2104 912 C 2104 888 2201 888 2212 888 C 2222 888 2319 888 2319 912 V 1078 C 2319 1102 2222 1102 2212 1102 C 2201 1102 2104 1102 2104 1078 V 912 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2104 912 C 2104 936 2201 936 2212 936 C 2222 936 2319 936 2319 912" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2211.500000" y="964.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2211.500000" dy="0.000000">PocketBase :8090</tspan><tspan x="2211.500000" dy="16.714286"> </tspan><tspan x="2211.500000" dy="16.714286">collections:</tspan><tspan x="2211.500000" dy="16.714286"> books chapters_idx</tspan><tspan x="2211.500000" dy="16.714286"> audio_cache progress</tspan><tspan x="2211.500000" dy="16.714286"> scrape_jobs app_users</tspan><tspan x="2211.500000" dy="16.714286"> ranking</tspan></text></g><g class="YXBwLmJhY2tlbmQ="><g class="shape" ><rect x="1268.000000" y="683.000000" width="204.000000" height="82.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1370.000000" y="721.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1370.000000" dy="0.000000">Backend API :8080</tspan><tspan x="1370.000000" dy="18.500000">(Go — HTTP API server)</tspan></text></g><g class="YXBwLnJ1bm5lcg=="><g class="shape" ><rect x="1256.000000" y="397.000000" width="228.000000" height="98.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1370.000000" y="435.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1370.000000" dy="0.000000">Runner</tspan><tspan x="1370.000000" dy="17.666667">(Go — background worker</tspan><tspan x="1370.000000" dy="17.666667">scraping + TTS jobs)</tspan></text></g><g class="YXBwLnVp"><g class="shape" ><rect x="561.000000" y="683.000000" width="170.000000" height="82.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="646.000000" y="721.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="646.000000" dy="0.000000">SvelteKit UI :5252</tspan><tspan x="646.000000" dy="18.500000">(adapter-node)</tspan></text></g><g class="KGluaXQubWluaW8taW5pdCAtJmd0OyBzdG9yYWdlLm1pbmlvKVswXQ=="><marker id="mk-d2-1368901215-2177206569" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B2" stroke-width="2" /> </marker><path d="M 1466.000000 952.000000 C 1570.400024 952.000000 1635.800049 919.000000 1694.000000 869.500000 C 1752.199951 820.000000 2012.599976 762.799988 2119.992395 668.637102" stroke="#0D32B2" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" marker-end="url(#mk-d2-1368901215-2177206569)" mask="url(#d2-1368901215)" /><text x="1791.500000" y="817.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">create buckets</text></g><g class="KGluaXQucGItaW5pdCAtJmd0OyBzdG9yYWdlLnBvY2tldGJhc2UpWzBd"><path d="M 1475.000000 1100.500000 C 1572.199951 1100.500000 1635.800049 1100.500000 1694.000000 1100.500000 C 1752.199951 1100.500000 2008.800049 1089.400024 2100.374879 1046.690709" stroke="#0D32B2" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" marker-end="url(#mk-d2-1368901215-2177206569)" mask="url(#d2-1368901215)" /><text x="1793.500000" y="1104.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">bootstrap schema</text></g><g class="KGFwcC5iYWNrZW5kIC0mZ3Q7IHN0b3JhZ2UubWluaW8pWzBd"><marker id="mk-d2-1368901215-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 1439.712129 681.966262 C 1565.199951 606.200012 1635.800049 587.000000 1694.000000 587.000000 C 1752.199951 587.000000 2012.599976 587.200012 2119.000105 587.971016" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1768.500000" y="585.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1768.500000" dy="0.000000">blobs (chapters, audio,</tspan><tspan x="1768.500000" dy="18.500000">avatars, browse)</tspan></text></g><g class="KGFwcC5iYWNrZW5kIC0mZ3Q7IHN0b3JhZ2UucG9ja2V0YmFzZSlbMF0="><path d="M 1473.981757 737.769518 C 1572.000000 751.099976 1635.800049 791.400024 1694.000000 846.750000 C 1752.199951 902.099976 2008.800049 944.799988 2100.113736 967.052926" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1762.500000" y="901.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1762.500000" dy="0.000000">structured records</tspan><tspan x="1762.500000" dy="18.500000">(books, progress, jobs…)</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgc3RvcmFnZS5taW5pbylbMF0="><path d="M 1485.949073 473.448459 C 1574.400024 493.799988 1635.800049 499.000000 1694.000000 499.000000 C 1752.199951 499.000000 2012.599976 506.200012 2119.129531 533.990313" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1804.000000" y="498.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1804.000000" dy="0.000000">write chapter markdown</tspan><tspan x="1804.000000" dy="18.500000">&amp; audio MP3s</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgc3RvcmFnZS5wb2NrZXRiYXNlKVswXQ=="><path d="M 1433.427128 495.901180 C 1564.000000 624.099976 1635.800049 701.599976 1694.000000 769.250000 C 1752.199951 836.900024 2008.800049 893.799988 2100.416289 939.223201" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1719.500000" y="796.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1719.500000" dy="0.000000">read/update scrape jobs</tspan><tspan x="1719.500000" dy="18.500000">write book records</tspan></text></g><g class="YXBwLih1aSAtJmd0OyBiYWNrZW5kKVswXQ=="><path d="M 733.000000 724.000000 C 895.799988 724.000000 1168.000000 724.000000 1264.000000 724.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1000.000000" y="722.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1000.000000" dy="0.000000">REST API calls</tspan><tspan x="1000.000000" dy="18.500000">(server-side)</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgbm92ZWxmaXJlKVswXQ=="><path d="M 1443.655837 396.378304 C 1566.000000 313.500000 1635.800049 242.399994 1694.000000 167.250000 C 1752.199951 92.099998 2014.599976 42.000000 2129.000000 42.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1736.000000" y="111.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1736.000000" dy="0.000000">scrape</tspan><tspan x="1736.000000" dy="18.500000">(HTTP GET)</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsga29rb3JvKVswXQ=="><path d="M 1485.905630 409.892897 C 1574.400024 381.700012 1635.800049 346.000000 1694.000000 303.250000 C 1752.199951 260.500000 2009.000000 232.000000 2101.000000 232.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1774.500000" y="256.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1774.500000" dy="0.000000">TTS generation</tspan><tspan x="1774.500000" dy="18.500000">(HTTP POST)</tspan></text></g><g class="KGJyb3dzZXIgLSZndDsgYXBwLnVpKVswXQ=="><path d="M 89.520596 549.299149 C 252.800003 688.799988 470.600006 724.000000 557.000000 724.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="299.000000" y="702.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">HTTPS :5252</text></g><g class="KGJyb3dzZXIgLSZndDsgc3RvcmFnZS5taW5pbylbMF0="><path d="M 102.038869 459.290980 C 255.399994 207.000000 324.799988 143.500000 371.000000 143.500000 C 417.200012 143.500000 487.600006 143.500000 547.000000 143.500000 C 606.400024 143.500000 704.200012 143.500000 791.500000 143.500000 C 878.799988 143.500000 978.200012 143.500000 1040.000000 143.500000 C 1101.800049 143.500000 1188.400024 143.500000 1256.500000 143.500000 C 1324.599976 143.500000 1415.400024 143.500000 1483.500000 143.500000 C 1551.599976 143.500000 1635.800049 196.300003 1694.000000 275.500000 C 1752.199951 354.700012 2012.800049 426.000000 2120.669958 497.783964" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1368901215-3488378134)" mask="url(#d2-1368901215)" /><text x="1092.000000" y="141.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1092.000000" dy="0.000000">presigned URLs</tspan><tspan x="1092.000000" dy="18.500000">(audio / chapter downloads)</tspan></text></g><mask id="d2-1368901215" maskUnits="userSpaceOnUse" x="-101" y="-101" width="2551" height="1374">
<rect x="-101" y="-101" width="2551" height="1374" fill="white"></rect>
<rect x="1741.000000" y="801.000000" width="101" height="21" fill="black"></rect>
<rect x="1732.000000" y="1088.000000" width="123" height="21" fill="black"></rect>
<rect x="1692.000000" y="569.000000" width="153" height="37" fill="black"></rect>
<rect x="1682.000000" y="885.000000" width="161" height="37" fill="black"></rect>
<rect x="1721.000000" y="482.000000" width="166" height="37" fill="black"></rect>
<rect x="1637.000000" y="780.000000" width="165" height="37" fill="black"></rect>
<rect x="952.000000" y="706.000000" width="96" height="37" fill="black"></rect>
<rect x="1697.000000" y="95.000000" width="78" height="37" fill="black"></rect>
<rect x="1723.000000" y="240.000000" width="103" height="37" fill="black"></rect>
<rect x="256.000000" y="686.000000" width="86" height="21" fill="black"></rect>
<rect x="997.000000" y="125.000000" width="190" height="37" fill="black"></rect>
</mask></svg></svg>