aboutsummaryrefslogtreecommitdiffstats
path: root/doc/source
diff options
context:
space:
mode:
authorMatthias Baumgartner <dev@igsor.net>2023-03-05 19:25:17 +0100
committerMatthias Baumgartner <dev@igsor.net>2023-03-05 19:25:17 +0100
commite4845c627e97a6d125bf33d9e7a4a8d373d7fc4a (patch)
tree634198c34aae3c0306ce30ac7452abd7b53a14e8 /doc/source
parent9b490d19dcebc0fc24cb2ab89a783f1f7d6147f7 (diff)
parent3ae93a405724ca6b5ddeb0b458fcc95685f83f09 (diff)
downloadbsfs-e4845c627e97a6d125bf33d9e7a4a8d373d7fc4a.tar.gz
bsfs-e4845c627e97a6d125bf33d9e7a4a8d373d7fc4a.tar.bz2
bsfs-e4845c627e97a6d125bf33d9e7a4a8d373d7fc4a.zip
Merge branch 'mb/diogenes' into develop
Diffstat (limited to 'doc/source')
-rw-r--r--doc/source/_static/arch_dark.pngbin0 -> 27346 bytes
-rw-r--r--doc/source/_static/arch_dark.svg500
-rw-r--r--doc/source/_static/arch_light.pngbin0 -> 17509 bytes
-rw-r--r--doc/source/_static/arch_light.svg499
-rw-r--r--doc/source/architecture.rst87
-rw-r--r--doc/source/concepts.rst98
-rw-r--r--doc/source/conf.py37
-rw-r--r--doc/source/index.rst75
-rw-r--r--doc/source/installation.rst43
9 files changed, 1339 insertions, 0 deletions
diff --git a/doc/source/_static/arch_dark.png b/doc/source/_static/arch_dark.png
new file mode 100644
index 0000000..b5ea1b3
--- /dev/null
+++ b/doc/source/_static/arch_dark.png
Binary files differ
diff --git a/doc/source/_static/arch_dark.svg b/doc/source/_static/arch_dark.svg
new file mode 100644
index 0000000..22de237
--- /dev/null
+++ b/doc/source/_static/arch_dark.svg
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="226.45284mm"
+ height="347.16772mm"
+ viewBox="0 0 226.45283 347.16772"
+ version="1.1"
+ id="svg8"
+ inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+ sodipodi:docname="architecture.svg"
+ inkscape:export-filename="/home/matthias/projects/black_star/modules/bsfs/doc/source/_static/architecture.png"
+ inkscape:export-xdpi="36.581741"
+ inkscape:export-ydpi="36.581741"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker5768"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.6) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round"
+ id="path5499" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path5502" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5490" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5484" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Mstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mstart"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.4) translate(10,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5481" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2003"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path2001"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1943"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1941"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1883"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1881"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:path-effect
+ effect="bspline"
+ id="path-effect1392"
+ is_visible="true"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath1104">
+ <rect
+ ry="1.9402644e-06"
+ y="299.74707"
+ x="38.425957"
+ height="39.287846"
+ width="72.863937"
+ id="rect1106"
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.99141636;stroke:#ab0000;stroke-width:1.50988853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.48410751"
+ inkscape:cx="549.46473"
+ inkscape:cy="378.01521"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:snap-text-baseline="true"
+ inkscape:snap-page="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1920"
+ inkscape:window-height="1147"
+ inkscape:window-x="0"
+ inkscape:window-y="29"
+ inkscape:window-maximized="1"
+ inkscape:pagecheckerboard="0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(62.276606,-425.46216)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="32.604725"
+ y="629.79327"
+ id="text858"><tspan
+ sodipodi:role="line"
+ id="tspan856"
+ x="32.604725"
+ y="629.79327"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Graph</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="31.855417"
+ y="653.12"
+ id="text862"><tspan
+ sodipodi:role="line"
+ id="tspan860"
+ x="31.855417"
+ y="653.12"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Nodes</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="41.7075"
+ y="675.25732"
+ id="text866"><tspan
+ sodipodi:role="line"
+ id="tspan864"
+ x="41.7075"
+ y="675.25732"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">AC</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-6"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="615.82233" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="26.010805"
+ y="742.52582"
+ id="text870"><tspan
+ sodipodi:role="line"
+ id="tspan868"
+ x="26.010805"
+ y="742.52582"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Backend</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-7"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="705.22809" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="38.606937"
+ y="541.41333"
+ id="text874"><tspan
+ sodipodi:role="line"
+ id="tspan872"
+ x="38.606937"
+ y="541.41333"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">App</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="40.692081"
+ y="563.71997"
+ id="text878"><tspan
+ sodipodi:role="line"
+ id="tspan876"
+ x="40.692081"
+ y="563.71997"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Lib</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-9"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="526.41656" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="31.886417"
+ y="585.92139"
+ id="text882"><tspan
+ sodipodi:role="line"
+ id="tspan880"
+ x="31.886417"
+ y="585.92139"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Config</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-34.720181"
+ x="-772.12939"
+ height="14.9375"
+ width="230.69272"
+ id="rect815"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="rotate(-90)"
+ id="text819"
+ y="-23.857788"
+ x="-677.57135"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1"
+ y="-23.857788"
+ x="-677.57135"
+ id="tspan817"
+ sodipodi:role="line">Query AST</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-61.77615"
+ x="-772.12897"
+ height="15.004211"
+ width="230.69226"
+ id="rect815-3"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1.00091;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="rotate(-90)"
+ id="text819-6"
+ y="-50.361935"
+ x="-670.42908"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1"
+ y="-50.361935"
+ x="-670.42908"
+ id="tspan817-7"
+ sodipodi:role="line">Schema</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-7.7468448"
+ x="-772.1449"
+ height="15.036049"
+ width="230.70819"
+ id="rect815-3-7"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:0.969072;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="matrix(0,-0.96614119,1.0350454,0,0,0)"
+ id="text819-6-5"
+ y="3.5665975"
+ x="-691.72668"
+ style="font-style:normal;font-weight:normal;font-size:10.2467px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.256167"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.256167;fill:#c5c9c7;fill-opacity:1"
+ y="3.5665975"
+ x="-691.72668"
+ id="tspan817-7-9"
+ sodipodi:role="line">Utils</tspan></text>
+ <g
+ id="g1066-2"
+ transform="translate(79.507472,180.86615)" />
+ <path
+ style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,771.63946 c 23.866256,0 0,-33.21047 23.866256,-33.21047 -23.866256,0 0,-33.2105 -23.866256,-33.2105"
+ id="path1406-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.08542"
+ y="563.90021"
+ id="text1481"><tspan
+ sodipodi:role="line"
+ id="tspan1479"
+ x="128.08542"
+ y="563.90021"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Front</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.52983"
+ y="653.37573"
+ id="text1481-1"><tspan
+ sodipodi:role="line"
+ id="tspan1479-5"
+ x="128.52983"
+ y="653.37573"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Center</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.08542"
+ y="742.37445"
+ id="text1481-5"><tspan
+ sodipodi:role="line"
+ id="tspan1479-4"
+ x="128.08542"
+ y="742.37445"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Back</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="-51.901089"
+ y="536.83838"
+ id="text1481-7"><tspan
+ sodipodi:role="line"
+ id="tspan1479-6"
+ x="-51.901089"
+ y="536.83838"
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Envelope</tspan></text>
+ <path
+ style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,682.73371 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105"
+ id="path1406-3-2-6-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,593.32795 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105"
+ id="path1406-3-2-6-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ id="text1593"
+ y="491.35275"
+ x="-4.7864752"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1"
+ y="491.35275"
+ x="-4.7864752"
+ id="tspan1591"
+ sodipodi:role="line">Client</tspan></text>
+ <g
+ transform="translate(-64.429786,152.46769)"
+ style="stroke:#c5c9c7;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="g1110">
+ <circle
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#c5c9c7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="path1089"
+ cx="75.138489"
+ cy="287.25885"
+ r="13.76438" />
+ <ellipse
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#c5c9c7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="path1091"
+ cx="75.138489"
+ cy="352.85028"
+ rx="30.794813"
+ ry="49.827057"
+ clip-path="url(#clipPath1104)" />
+ </g>
+ <path
+ style="mix-blend-mode:normal;fill:none;fill-opacity:0.101961;stroke:#c5c9c7;stroke-width:0.718;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5768);marker-end:url(#Arrow2Mend);paint-order:normal"
+ d="m -26.95943,522.5725 c 0,-0.24385 0.07083,-4.09079 0.07878,-4.32466 0.761115,-22.40679 37.602027,0.47268 37.602027,-22.88944 0,23.36145 36.838813,0.48396 37.601969,22.88752 0.008,0.23448 0.0397,4.10164 0.0397,4.34615"
+ id="path1406-3-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsc" />
+ <rect
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:0.96907479;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect815-3-7-7"
+ width="69.081276"
+ height="15.036072"
+ x="-61.792068"
+ y="526.40063" />
+ </g>
+</svg>
diff --git a/doc/source/_static/arch_light.png b/doc/source/_static/arch_light.png
new file mode 100644
index 0000000..c210ecf
--- /dev/null
+++ b/doc/source/_static/arch_light.png
Binary files differ
diff --git a/doc/source/_static/arch_light.svg b/doc/source/_static/arch_light.svg
new file mode 100644
index 0000000..e93694c
--- /dev/null
+++ b/doc/source/_static/arch_light.svg
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="226.45284mm"
+ height="347.16772mm"
+ viewBox="0 0 226.45283 347.16772"
+ version="1.1"
+ id="svg8"
+ inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+ sodipodi:docname="arch_light.svg"
+ inkscape:export-filename="/home/matthias/projects/black_star/modules/bsfs/doc/source/_static/arch_light.png"
+ inkscape:export-xdpi="36.581741"
+ inkscape:export-ydpi="36.581741"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker5768"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.6) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round"
+ id="path5499" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path5502" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5490" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5484" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Mstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mstart"
+ inkscape:isstock="true">
+ <path
+ transform="scale(0.4) translate(10,0)"
+ style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5481" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2003"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path2001"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1943"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1941"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1883"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1881"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:path-effect
+ effect="bspline"
+ id="path-effect1392"
+ is_visible="true"
+ weight="33.333333"
+ steps="2"
+ helper_size="0"
+ apply_no_weight="true"
+ apply_with_weight="true"
+ only_selected="false" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath1104">
+ <rect
+ ry="1.9402644e-06"
+ y="299.74707"
+ x="38.425957"
+ height="39.287846"
+ width="72.863937"
+ id="rect1106"
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.99141636;stroke:#ab0000;stroke-width:1.50988853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.48410751"
+ inkscape:cx="532.93947"
+ inkscape:cy="378.01521"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:snap-text-baseline="true"
+ inkscape:snap-page="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1920"
+ inkscape:window-height="1147"
+ inkscape:window-x="0"
+ inkscape:window-y="29"
+ inkscape:window-maximized="1"
+ inkscape:pagecheckerboard="0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(62.276606,-425.46216)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="32.604725"
+ y="629.79327"
+ id="text858"><tspan
+ sodipodi:role="line"
+ id="tspan856"
+ x="32.604725"
+ y="629.79327"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Graph</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="31.855417"
+ y="653.12"
+ id="text862"><tspan
+ sodipodi:role="line"
+ id="tspan860"
+ x="31.855417"
+ y="653.12"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Nodes</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="41.7075"
+ y="675.25732"
+ id="text866"><tspan
+ sodipodi:role="line"
+ id="tspan864"
+ x="41.7075"
+ y="675.25732"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">AC</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-6"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="615.82233" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="26.010805"
+ y="742.52582"
+ id="text870"><tspan
+ sodipodi:role="line"
+ id="tspan868"
+ x="26.010805"
+ y="742.52582"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Backend</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-7"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="705.22809" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="38.606937"
+ y="541.41333"
+ id="text874"><tspan
+ sodipodi:role="line"
+ id="tspan872"
+ x="38.606937"
+ y="541.41333"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">App</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="40.692081"
+ y="563.71997"
+ id="text878"><tspan
+ sodipodi:role="line"
+ id="tspan876"
+ x="40.692081"
+ y="563.71997"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Lib</tspan></text>
+ <rect
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect854-9-9"
+ width="58.738262"
+ height="66.901787"
+ x="19.325045"
+ y="526.41656" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="31.886417"
+ y="585.92139"
+ id="text882"><tspan
+ sodipodi:role="line"
+ id="tspan880"
+ x="31.886417"
+ y="585.92139"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Config</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-34.720181"
+ x="-772.12939"
+ height="14.9375"
+ width="230.69272"
+ id="rect815"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="rotate(-90)"
+ id="text819"
+ y="-23.857788"
+ x="-677.57135"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1"
+ y="-23.857788"
+ x="-677.57135"
+ id="tspan817"
+ sodipodi:role="line">Query AST</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-61.77615"
+ x="-772.12897"
+ height="15.004211"
+ width="230.69226"
+ id="rect815-3"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00091;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="rotate(-90)"
+ id="text819-6"
+ y="-50.361935"
+ x="-670.42908"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1"
+ y="-50.361935"
+ x="-670.42908"
+ id="tspan817-7"
+ sodipodi:role="line">Schema</tspan></text>
+ <rect
+ transform="rotate(-90)"
+ y="-7.7468448"
+ x="-772.1449"
+ height="15.036049"
+ width="230.70819"
+ id="rect815-3-7"
+ style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.969072;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <text
+ transform="matrix(0,-0.96614119,1.0350454,0,0,0)"
+ id="text819-6-5"
+ y="3.5665975"
+ x="-691.72668"
+ style="font-style:normal;font-weight:normal;font-size:10.2467px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.256167"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.256167;fill:#000000;fill-opacity:1"
+ y="3.5665975"
+ x="-691.72668"
+ id="tspan817-7-9"
+ sodipodi:role="line">Utils</tspan></text>
+ <g
+ id="g1066-2"
+ transform="translate(79.507472,180.86615)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,771.63946 c 23.866256,0 0,-33.21047 23.866256,-33.21047 -23.866256,0 0,-33.2105 -23.866256,-33.2105"
+ id="path1406-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.08542"
+ y="563.90021"
+ id="text1481"><tspan
+ sodipodi:role="line"
+ id="tspan1479"
+ x="128.08542"
+ y="563.90021"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Front</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.52983"
+ y="653.37573"
+ id="text1481-1"><tspan
+ sodipodi:role="line"
+ id="tspan1479-5"
+ x="128.52983"
+ y="653.37573"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Center</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="128.08542"
+ y="742.37445"
+ id="text1481-5"><tspan
+ sodipodi:role="line"
+ id="tspan1479-4"
+ x="128.08542"
+ y="742.37445"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Back</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="-51.901089"
+ y="536.83838"
+ id="text1481-7"><tspan
+ sodipodi:role="line"
+ id="tspan1479-6"
+ x="-51.901089"
+ y="536.83838"
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Envelope</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,682.73371 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105"
+ id="path1406-3-2-6-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 97.390174,593.32795 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105"
+ id="path1406-3-2-6-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ id="text1593"
+ y="491.35275"
+ x="-4.7864752"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.264583;fill:#000000;fill-opacity:1"
+ y="491.35275"
+ x="-4.7864752"
+ id="tspan1591"
+ sodipodi:role="line">Client</tspan></text>
+ <g
+ transform="translate(-64.429786,152.46769)"
+ style="stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="g1110">
+ <circle
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="path1089"
+ cx="75.138489"
+ cy="287.25885"
+ r="13.76438" />
+ <ellipse
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="path1091"
+ cx="75.138489"
+ cy="352.85028"
+ rx="30.794813"
+ ry="49.827057"
+ clip-path="url(#clipPath1104)" />
+ </g>
+ <path
+ style="mix-blend-mode:normal;fill:none;fill-opacity:0.101961;stroke:#000000;stroke-width:0.718;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5768);marker-end:url(#Arrow2Mend);paint-order:normal"
+ d="m -26.95943,522.5725 c 0,-0.24385 0.07083,-4.09079 0.07878,-4.32466 0.761115,-22.40679 37.602027,0.47268 37.602027,-22.88944 0,23.36145 36.838813,0.48396 37.601969,22.88752 0.008,0.23448 0.0397,4.10164 0.0397,4.34615"
+ id="path1406-3-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsc" />
+ <rect
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.96907479;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
+ id="rect815-3-7-7"
+ width="69.081276"
+ height="15.036072"
+ x="-61.792068"
+ y="526.40063" />
+ </g>
+</svg>
diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst
new file mode 100644
index 0000000..4cca49a
--- /dev/null
+++ b/doc/source/architecture.rst
@@ -0,0 +1,87 @@
+
+Architecture
+============
+
+The BSFS stack can be coarsely divided into four parts (see the image below).
+
+* Envelope: Essentials and utils used throughout the whole codebase.
+* Front: End-user applications and APIs.
+* Center: The core interfaces and functionality.
+* Back: The triple store backends.
+
+Details of these components are given in the sections below.
+
+
+.. image:: _static/arch_light.png
+ :class: only-light
+
+.. image:: _static/arch_dark.png
+ :class: only-dark
+
+
+Envelope
+--------
+
+Most notably, the envelope covers the :class:`Schema <bsfs.schema.schema.Schema>` and the :mod:`Query syntax trees (AST) <bsfs.query.ast>`.
+Both of them essential for all parts of the BSFS stack.
+For example, the schema is specified by the user via the :func:`Migrate <bsfs.apps.migrate.main>` command, checked and extended by the :class:`Graph <bsfs.graph.graph.Graph>`, and ultimately stored by a :class:`Triple Store backend <bsfs.triple_store.base.TripleStoreBase>`.
+Similarly, the Query AST may be provided by a caller and is translated to a database query by a backend.
+In addition, the envelope also contains some classes to handle URIs:
+:class:`URI <bsfs.utils.uri.URI>` defines the URI base class,
+:class:`Namespace <bsfs.namespace.Namespace>` provides shortcuts to generate URIs, and
+:mod:`UUID <bsfs.utils.uuid>` is used to generate unique URIs.
+
+
+Front
+-----
+
+The front consists of exposed interfaces such as end-user applications or APIs,
+and all utils needed to offer this functionality.
+See :mod:`bsfs.apps` and :mod:`bsfs.front`.
+
+
+Center
+------
+
+The heart of BSFS is grouped around the :mod:`bsfs.graph` module.
+These classes provide the interface to navigate and manipulate the file graph
+in a safe and programmer friendly manner.
+Some of them are indirectly exposed through the higher-level APIs.
+
+The two core design principles of BSFS are the focus on nodes and batch processing.
+They are realized in the the Graph and Nodes classes.
+The :class:`Graph class <bsfs.graph.graph.Graph>` manages the graph as a whole,
+and offers methods to get a specific set of Nodes.
+In turn, the :class:`Nodes class <bsfs.graph.nodes.Nodes>` represents such a set of nodes,
+and performs operations on the whole node set at once.
+Besides, the :mod:`bsfs.graph` module also comes with some syntactic sugar.
+
+Example::
+
+ # Open a file graph.
+ from bsfs import Open, ns
+ graph = Open(...)
+ # Get all nodes of type File.
+ nodes = graph.all(ns.bsfs.File)
+ # Set the author of all nodes at once.
+ nodes.set(ns.bse.author, 'Myself')
+ # Retrieve the author of all nodes at once.
+ set(nodes.get(ns.bse.author, node=False))
+ # Same as above, but shorter.
+ set(nodes.comment(node=False))
+
+
+Back
+----
+
+There are various graph databases (e.g., `RDFLib`_, `Blazegraph`_, `Titan`_, etc.)
+and it would be foolish to replicate the work that others have done.
+Instead, we use third-party stores that take care of how to store and manage the data.
+The :class:`Backend base class <bsfs.triple_store.base.TripleStoreBase>` defines the
+interface to integrate any such third-party store to BSFS.
+Besides storing the data, a triple store backend also need to track the current schema.
+
+
+.. _RDFLib: https://rdflib.readthedocs.io/en/stable/index.html
+.. _Blazegraph: https://blazegraph.com/
+.. _Titan: http://titan.thinkaurelius.com/
diff --git a/doc/source/concepts.rst b/doc/source/concepts.rst
new file mode 100644
index 0000000..9c2ed43
--- /dev/null
+++ b/doc/source/concepts.rst
@@ -0,0 +1,98 @@
+
+Core concepts
+=============
+
+In the following, we present a few core concepts that should help in understanding the BSFS operations and codebase.
+
+
+Graph storage
+-------------
+
+`RDF`_ describes a network or graph like the file graph as a set of
+*(subject, predicate, object)* triples.
+*Subject* is the identifier of the source node,
+*object* is the identifier of the target node (or a literal value),
+and *predicate* is the type of relation between the source node and the target.
+As suggested by `RDF`_, we use URIs to identify nodes and predicates.
+For example, a triple that assigns me as the author of a file could look like this::
+
+ <http://example.com/file#1234> <https://bsfs.io/schema/Entity#author> <http://example.com/me>
+
+Note that alternatively, the *object* could also be a literal value ("me")::
+
+ <http://example.com/file#1234> <https://bsfs.io/schema/Entity#author> "me"
+
+There are a number of graph databases that support this or an analoguous paradigm,
+such as `RDFLib`_, `Blazegraph`_, `TypeDB`_, `Titan`_,
+and `many more <https://en.wikipedia.org/wiki/Graph_database#List_of_graph_databases>`_.
+BSFS uses such a third-party graph database to store its file graph.
+
+As usual in database systems,
+we have to distinguish schema data (that coverns the structure of the storage)
+from instance data (the actual database content).
+Similar to relational database systems,
+both kinds of data can be represented as triples,
+and subsequently stored within the same graph storage
+(although one might need to separate them logically).
+In BSFS, we employ an explicit schema (see next section) that is managed alongside the data.
+
+
+
+Schema
+------
+
+BSFS ensures consistency across multiple distributed client applications
+by maintaining an explicit schema that governs node types and predicates.
+Furthermore, exposing the schema allows client to run a number of compatibility and validity checks
+locally, and a graph database may use the schema to optimize its storage or operations.
+
+In BSFS, the schema is initially provided by the system administrator
+(usually in the `Turtle`_ format)
+and subsequently stored by the backend.
+The default schema defines three root types
+(``bsfs:Node``, ``bsfs:Predicate``, and ``bsfs:Literal``),
+and BSFS expects any node, literal, or predicate to be derived from these roots.
+
+For example, a new predicate can be defined like so::
+
+ # define some abbreviations
+ prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+ prefix bsfs: <http://schema.bsfs.io/>
+ prefix bse: <http://schema.bsfs.io/Entity#>
+
+ # define a node type
+ bsfs:Entity rdfs:subClassOf bsfs:Node .
+
+ # define a literal type
+ xsd:string rdfs:subClassOf bsfs:Literal .
+
+ # define a predicate ("author of a node")
+ bse:author rdfs:subClassOf bsfs:Predicate ;
+ rdfs:domain bsfs:Entity ;
+ rdfs:range xsd:string .
+
+BSFS checks all requests and rejects queries or operations that violate the schema.
+
+
+Querying
+--------
+
+BSFS at its core is not much more than a translator from a user query into a graph database query.
+It operates directly on three abstract syntax trees (AST),
+to run fetch, search, or sort, queries respectively.
+By not using an existing query language,
+we avoid an unnecessary and possibly expensive parsing step.
+Some routines create an AST internally (e.g., :func:`bsfs.graph.graph.Graph.all`),
+others accept an user-defined AST (e.g., :func:`bsfs.graph.graph.Graph.get`).
+One way or another, the AST is validated against the schema,
+and access control conditions are added.
+
+
+.. _RDF: https://www.w3.org/RDF/
+.. _RDFLib: https://rdflib.readthedocs.io/en/stable/index.html
+.. _Blazegraph: https://blazegraph.com/
+.. _Titan: http://titan.thinkaurelius.com/
+.. _TypeDB: https://vaticle.com/
+.. _Turtle: https://www.w3.org/TR/turtle/
+
+
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100644
index 0000000..6de4993
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,37 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = 'Black Star File System'
+copyright = '2023, Matthias Baumgartner'
+author = 'Matthias Baumgartner'
+release = '0.5'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+ 'sphinx_copybutton',
+ 'sphinx.ext.autodoc',
+ ]
+
+templates_path = ['_templates']
+exclude_patterns = []
+
+
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'furo'
+html_static_path = ['_static']
+
+html_title = 'bsfs'
+html_theme_options = {
+ 'announcement': '<em>This project is under heavy development and subject to rapid changes. Use at your own discretion.</em>',
+ }
+
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 0000000..91d53f6
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,75 @@
+
+The Black Star File System
+==========================
+
+A file system has two roles: It has to specify how to write files to a medium, and it has to define how a user can access files.
+Most file systems focus on the first role and adopt the standard directory tree approach for the second role.
+It is of course necessary to solve the challenges of medium access, but we should not neglect the user's perspective.
+As a user, I mostly care about how how conveniently I can organize my data, and quickly I can access relevant information.
+The hierarchical approach is rather restrictive in this regard:
+You can only organize files in a directory tree [#f1]_, and search tasks often require third-party tools like `find`_ or `locate`_.
+
+Tagging file systems proposed an alternative file organization model.
+Instead of a placing files in directories, they assign one or more (user-defined) tags to each file.
+This increases the flexibility over a hierarchical data model,
+because you can group any combination of files, and each file can be a part of various groups.
+Semantic file systems push this idea one step further by trying to understand
+the data they're dealing with.
+For example, files can be grouped by their data type (documents), file format (odt),
+author (yourself), topic (information management), etc.
+The benefit for the user is that they can browse their files by association rather than by location --- similar to how we nagivate the Web.
+
+Clearly, the hierarchical approach is insufficient to organize this variety of information.
+Instead, we need a network of files,
+where they can be connected to each other, their properties, or to auxiliary nodes
+(such as tags, collections, etc.) under a given relationship.
+We call this the file graph.
+With the *Black Star File System (BSFS)*, you can store, manage, and query such a file graph.
+
+..
+ TODO: Clarify
+ * Different relationships
+ * Properties and auxiliary nodes
+
+ TODO: File graph image
+ TODO: SFS/TFS references
+
+ TODO: BSFS features
+ Within BSFS, you can store the file content, file metadata,
+ and content-derived information (e.g., features) alike.
+
+ Within the file graph, we link files directly,
+ through properties, or through intermediate nodes.
+
+The Black Star File System is designed with three query patterns in mind:
+navigation, search, and browsing.
+
+The **navigation** pattern describes the case when the user knows exactly what they want,
+and they already have an address or id of the target file.
+BSFS identifies each file with a unique URI,
+or you can quickly navigate to a file via its name or other file properties.
+
+A **search** occurs when the user lacks the specific address or identifier to a target file,
+but they have relatively clear and narrow search criteria.
+With BSFS, you can search by file properties (name, size), content (keywords, features),
+or associations to other files and auxiliary nodes (tags, collections).
+
+**Browsing** takes place when the user has only vague query criteria but wants to quickly scan and compare many files.
+In BSFS, you can browse along file associations and rank results by a variety of similarity metrics.
+
+.. toctree::
+ :maxdepth: 1
+
+ installation
+ concepts
+ architecture
+ api/modules
+
+
+.. [#f1] although links and similar techniques allow some deviation from this principle
+
+.. _find: https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-find.html#Invoking-find
+
+.. _locate: https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-locate.html
+
+
diff --git a/doc/source/installation.rst b/doc/source/installation.rst
new file mode 100644
index 0000000..4316136
--- /dev/null
+++ b/doc/source/installation.rst
@@ -0,0 +1,43 @@
+
+Installation
+============
+
+Install *BSFS* via pip::
+
+ pip install --extra-index-url https://pip.bsfs.io bsfs
+
+This installs the `bsfs` python package as well as the `bsfs.app` command.
+It is recommended to install *bsfs* in a virtual environment (via `virtualenv`).
+
+
+License
+-------
+
+This project is released under the terms of the 3-clause BSD License.
+By downloading or using the application you agree to the license's terms and conditions.
+
+.. literalinclude:: ../../LICENSE
+
+
+Source
+------
+
+Check out our git repository::
+
+ git clone https://git.bsfs.io/bsfs.git
+
+You can further install *bsfs* via the ususal `setuptools <https://setuptools.pypa.io/en/latest/index.html>`_ commands from your bsfs source directory::
+
+ python setup.py develop
+
+For development, you also need to install some additional dependencies::
+
+ # code style discipline
+ pip install mypy coverage pylint
+
+ # documentation
+ pip install sphinx sphinx-copybutton furo
+
+ # packaging
+ pip install build
+