summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--requirements/architecture/arch-v1.drawio185
-rw-r--r--requirements/architecture/arch-v1.md29
-rw-r--r--requirements/architecture/arch-v1.pngbin0 -> 92795 bytes
-rw-r--r--requirements/tasks/task-007.md5
4 files changed, 219 insertions, 0 deletions
diff --git a/requirements/architecture/arch-v1.drawio b/requirements/architecture/arch-v1.drawio
new file mode 100644
index 0000000..d6c1d3f
--- /dev/null
+++ b/requirements/architecture/arch-v1.drawio
@@ -0,0 +1,185 @@
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0" version="28.0.5">
+ <diagram name="Page-1" id="6m57RrOSv_l6LAzb3A26">
+ <mxGraphModel dx="1400" dy="722" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="VnadkFMIBufCHQUFMUWp-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="100" y="160" width="420" height="320" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="100" y="560" width="290" height="160" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-5" target="VnadkFMIBufCHQUFMUWp-6">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-5" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="110" y="550" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-6" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="110" y="470" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-8" target="VnadkFMIBufCHQUFMUWp-5">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-8" value="&lt;div&gt;Backups&lt;/div&gt;&lt;div&gt;store&lt;br&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
+ <mxGeometry x="192.5" y="595" width="105" height="90" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-11" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="600" y="160" width="320" height="160" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-12" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="600" y="360" width="320" height="160" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-13" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="600" y="560" width="320" height="160" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-15" target="VnadkFMIBufCHQUFMUWp-22">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-15" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
+ <mxGeometry x="540" y="230" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-16" target="VnadkFMIBufCHQUFMUWp-22">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="570" y="440" />
+ <mxPoint x="570" y="270" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-16" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
+ <mxGeometry x="540" y="430" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-17" target="VnadkFMIBufCHQUFMUWp-21">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="550" y="640" />
+ <mxPoint x="550" y="400" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-17" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
+ <mxGeometry x="540" y="630" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-17">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-30">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-18" target="VnadkFMIBufCHQUFMUWp-29">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-18" value="Texting app" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="630" y="580" width="110" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-21" value="SMS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
+ <mxGeometry x="460" y="390" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-22" value="HTTPS" style="rounded=0;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="1">
+ <mxGeometry x="460" y="230" width="120" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-26">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-27">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-25" target="VnadkFMIBufCHQUFMUWp-16">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-25" value="Web GUI" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="630" y="380" width="110" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-26" value="IndexedDB" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="380" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-27" value="Local Storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="450" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-29" value="Phone storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="580" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-30" value="SIM storage" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="650" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-39" target="VnadkFMIBufCHQUFMUWp-15">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-39" value="Desktop GUI" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="630" y="180" width="110" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-40" target="VnadkFMIBufCHQUFMUWp-39">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-40" value="SQLite file" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="180" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-42" target="VnadkFMIBufCHQUFMUWp-39">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-42" value="Config &amp;amp; cache files" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="760" y="250" width="130" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-45" value="REST API" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="370" y="180" width="110" height="80" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-46" target="VnadkFMIBufCHQUFMUWp-22">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-46" value="&lt;div&gt;Web app&lt;/div&gt;&lt;div&gt;server&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="370" y="280" width="110" height="80" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-21">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-47" value="SMS API" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="370" y="380" width="110" height="80" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-48" value="&lt;div&gt;CRDT&lt;/div&gt;&lt;div&gt;sync&lt;/div&gt;&lt;div&gt;server&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="270" y="180" width="80" height="280" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.143;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-48">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.004;entryY=0.86;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-47" target="VnadkFMIBufCHQUFMUWp-48">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.315;entryY=0.957;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-45" target="VnadkFMIBufCHQUFMUWp-22">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=none;startFill=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-58">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-57" value="NoSQL DB" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="130" y="230" width="110" height="80" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=none;startFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-58" target="VnadkFMIBufCHQUFMUWp-6">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-58" value="Backup service" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="130" y="330" width="110" height="80" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.011;entryY=0.327;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;" edge="1" parent="1" source="VnadkFMIBufCHQUFMUWp-57" target="VnadkFMIBufCHQUFMUWp-48">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-64" value="&lt;div align=&quot;right&quot;&gt;Server&lt;/div&gt;" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+ <mxGeometry x="460" y="130" width="60" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-65" value="&lt;div align=&quot;right&quot;&gt;Bucket&lt;/div&gt;" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+ <mxGeometry x="300" y="530" width="90" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-66" value="Desktop computer" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+ <mxGeometry x="800" y="130" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-68" value="Web browser" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+ <mxGeometry x="800" y="330" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="VnadkFMIBufCHQUFMUWp-69" value="Mobile phone" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+ <mxGeometry x="800" y="530" width="120" height="30" as="geometry" />
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/requirements/architecture/arch-v1.md b/requirements/architecture/arch-v1.md
new file mode 100644
index 0000000..a8b8b13
--- /dev/null
+++ b/requirements/architecture/arch-v1.md
@@ -0,0 +1,29 @@
+# Architecture
+
+![architecture diagram](./architecture.png)
+
+- There must be a desktop GUI
+- The desktop GUI must persist domain entities to an SQLite file
+- The desktop GUI must persist config and caches to files
+- The desktop GUI must send and receive messages to the REST API via HTTPS
+- There must be a REST API
+- The REST API must send and receive messages to the CRDT sync server via Unix
+ sockets
+- There must be a CRDT sync server
+- The CRDT sync server must send and receive messages to the NoSQL database via
+ Unix sockets
+- There must be a backup service
+- The backup service must communicate to the backups bucket via HTTPS
+- There must be a backups bucket
+- The backups bucket and the server must live on different machines
+- There must be a Web app server, which serves a Web GUI over HTTPS
+- The Web GUI must save domain entities to IndexedDB
+- The Web GUI must persist config and caches to Local Storage
+- The Web GUI must send and receive messages to the REST API via HTTPS
+- There must be an SMS API
+- The SMS API must send and receive messages to the CRDT sync server via Unix
+ sockets
+
+## TBC
+
+- What kind of NoSQL database should be used on the server?
diff --git a/requirements/architecture/arch-v1.png b/requirements/architecture/arch-v1.png
new file mode 100644
index 0000000..d70ae86
--- /dev/null
+++ b/requirements/architecture/arch-v1.png
Binary files differ
diff --git a/requirements/tasks/task-007.md b/requirements/tasks/task-007.md
index 571167f..a8f27b2 100644
--- a/requirements/tasks/task-007.md
+++ b/requirements/tasks/task-007.md
@@ -16,3 +16,8 @@ Desiderata:
- There should be a Web interface
Sources: req-046
+
+## Notes
+
+I have documented the architecture (arch-v1). Now I just need to create some
+tasks.