diff options
| -rw-r--r-- | requirements/architecture/arch-v1.drawio | 185 | ||||
| -rw-r--r-- | requirements/architecture/arch-v1.md | 29 | ||||
| -rw-r--r-- | requirements/architecture/arch-v1.png | bin | 0 -> 92795 bytes | |||
| -rw-r--r-- | requirements/tasks/task-007.md | 5 |
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="<div>Backups</div><div>store<br></div>" 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; 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="<div>Web app</div><div>server<br></div>" 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="<div>CRDT</div><div>sync</div><div>server<br></div>" 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="<div align="right">Server</div>" 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="<div align="right">Bucket</div>" 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 + + + +- 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 Binary files differnew file mode 100644 index 0000000..d70ae86 --- /dev/null +++ b/requirements/architecture/arch-v1.png 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. |
