Radish alpha
r
rad:z371PVmDHdjJucejRoRYJcDEvD5pp
Radicle website including documentation and guides
Radicle
Git
Add architecture diagrams
Open liw opened 1 year ago

building these required the pikchr-cli and plantuml programs. To avoid forcing them on every machine where the site is built, they’re built using the new Makefile target “arch-svgs” and the resulting SVG files are stored in Git.

14 files changed +418 -0 f8963795 c6810660
modified Makefile
@@ -10,6 +10,13 @@ dependencies:
svgs:
	scripts/cleanup-svgs.sh assets/images/*.svg

+
# These require somewhat unusual tools to build and we store the
+
# generated SVGs in Git to avoid having to rebuild them on all
+
# systems.
+
arch-svgs:
+
	scripts/build-pik.sh assets/images/*.pik
+
	scripts/build-plantuml.sh assets/images/*.uml
+

publish:
	bundle exec jekyll build
	vercel --prod
added _pages/arch.md
@@ -0,0 +1,88 @@
+
---
+
title: Radicle Architecture
+
subtitle: An overview of Radicle components
+
layout: page
+
variant: wide
+
---
+
These are simple architecture diagrams of Radicle. They're meant to
+
explain what the major components are and how they interact, at a very
+
high level of abstraction. The goal is to enable you to learn details
+
from other documentation, not to explain details here.
+

+
# Component diagrams
+

+
## Level 0: Radicle network
+

+
This diagram shows the very topmost level of abstraction showing the
+
Radicle network of nodes.
+

+
* The core component of Radicle is the node. Each Radicle user runs at
+
  least one node. Nodes connect to each other to synchronize changes
+
  and other information, to form the Radicle network.
+
* Each Radicle user uses the `rad` command line tool, or other tools, to
+
  administer and interact with their local node. They use the local node
+
  as a Git server, so they push and pull to it from their local working
+
  tree.
+
* A Radicle node can also be used as a read-only Git server using a
+
  normal Git implementation.
+
* Public repositories on Radicle nodes can be browsed via the Radicle
+
  explorer application, using a web browser.
+

+
<figure class="diagram">
+
  <object type="image/svg+xml" data="/assets/images/arch-level-0.svg"></object>
+
  <figcaption>Level 0 architecture.</figcaption>
+
</figure>
+

+

+
## Level 1
+

+
This diagram shows how parts of Radicle running on a node interact.
+

+
* Node storage (typically in `~/.radicle/storege`) is where the Git
+
  repositories the node stores are located. This also stores copies of
+
  the repositories as they exist on other nodes.
+
* The `radicle-node` process synchronizes storage with other nodes.
+
* The `radicle-httpd` process provides read-only access to the public
+
  repositories in the node storage, for the Radicle explorer. For
+
  external explorers, the node must have a public IP address.
+
* The Git helper for Radicle, `git-helper-rad`, allows the Git client
+
  to interact with node storage via the file system. It also notifies
+
  the `radicle-node` process when it has made changes to storage.
+
* The user uses the `rad` command line tool, or another Radicle
+
  client, to interact with the node and its contents, e.g, to open or
+
  manage issues and patches.
+

+
<figure class="diagram">
+
  <object type="image/svg+xml" data="/assets/images/arch-level-1.svg"></object>
+
  <figcaption>Level 1 architecture</figcaption>
+
</figure>
+

+

+
# Sequence diagrams
+

+
This chapter contains some simplistic sequence diagrams for various
+
operations involving Radicle.
+

+
## Add repository to node storage
+

+
In other words, seeding a repository by first retrieving it from
+
another node.
+

+
<figure class="diagram">
+
  <object type="image/svg+xml" data="/assets/images/arch-seq-repo-to-storage.svg"></object>
+
  <figcaption>Seeding a remote repository</figcaption>
+
</figure>
+

+
## Check out repository from node storage
+

+
<figure class="diagram">
+
  <object type="image/svg+xml" data="/assets/images/arch-seq-checkout-repo.svg"></object>
+
  <figcaption>Checking out a  repository</figcaption>
+
</figure>
+

+
## Push to node storage
+

+
<figure class="diagram">
+
  <object type="image/svg+xml" data="/assets/images/arch-seq-push-to-storage.svg"></object>
+
  <figcaption>Push to node storage</figcaption>
+
</figure>
added assets/images/arch-level-0.pik
@@ -0,0 +1,28 @@
+
right
+
Node1: cylinder "Radicle node"
+
move
+
move
+
Node2: cylinder "Radicle node"
+
move right from Node1.e
+
move down
+
Exp: box "Radicle" "explorer"
+
line from Node2.w to Node1.e <-> "sync" above thin
+
line from Exp.nw to Node1.se -> "http" below aligned thin
+
line from Exp.ne to Node2.sw -> "http" below aligned thin
+

+
move down from Exp.s
+
Web: ellipse "Web browser"
+
line from Web.n to Exp.s -> "http" below aligned thin
+

+
move down from Node1.s
+
move
+
Rad: box "Radicle user"
+
line from Rad.n to Node1.s <-> "git" below aligned
+

+
move down from Node2.s
+
move
+
Git: box "Git user"
+
line from Git.n to Node2.s <- "git fetch" below aligned thin
+

+
arc from Rad.s to Web.sw -> 
+
arc from  Web.se to Git.s <-
added assets/images/arch-level-0.svg
@@ -0,0 +1,39 @@
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox="0 0 365.184 328.32">
+
<path d="M2.592,12.96L2.592,63.36A54 10.8 0 0 0 110.592 63.36L110.592,12.96A54 10.8 0 0 0 2.592 12.96A54 10.8 0 0 0 110.592 12.96"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="56.592" y="46.26" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Radicle node</text>
+
<path d="M254.592,12.96L254.592,63.36A54 10.8 0 0 0 362.592 63.36L362.592,12.96A54 10.8 0 0 0 254.592 12.96A54 10.8 0 0 0 362.592 12.96"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="308.592" y="46.26" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Radicle node</text>
+
<path d="M128.592,182.16L236.592,182.16L236.592,110.16L128.592,110.16Z"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="182.592" y="136.08" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Radicle</text>
+
<text x="182.592" y="156.24" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">explorer</text>
+
<polygon points="254.592,38.16 246.874,41.0544 246.874,35.2656" style="fill:rgb(0,0,0)"/>
+
<polygon points="110.592,38.16 118.31,35.2656 118.31,41.0544" style="fill:rgb(0,0,0)"/>
+
<path d="M250.733,38.16L114.451,38.16"  style="fill:none;stroke-width:1.4472;stroke:rgb(0,0,0);" />
+
<text x="182.592" y="26.9946" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">sync</text>
+
<polygon points="110.592,63.36 116.064,69.5249 110.661,71.603" style="fill:rgb(0,0,0)"/>
+
<path d="M128.592,110.16L111.977,66.962"  style="fill:none;stroke-width:1.4472;stroke:rgb(0,0,0);" />
+
<text x="119.592" y="97.9254" text-anchor="middle" fill="rgb(0,0,0)" transform="rotate(-111.037511 119.592,86.76)" dominant-baseline="central">http</text>
+
<polygon points="254.592,63.36 254.523,71.603 249.12,69.5249" style="fill:rgb(0,0,0)"/>
+
<path d="M236.592,110.16L253.207,66.962"  style="fill:none;stroke-width:1.4472;stroke:rgb(0,0,0);" />
+
<text x="245.592" y="97.9254" text-anchor="middle" fill="rgb(0,0,0)" transform="rotate(-68.96248897 245.592,86.76)" dominant-baseline="central">http</text>
+
<ellipse cx="182.592" cy="290.16" rx="54" ry="36"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="182.592" y="290.16" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Web browser</text>
+
<polygon points="182.592,182.16 185.486,189.878 179.698,189.878" style="fill:rgb(0,0,0)"/>
+
<path d="M182.592,254.16L182.592,186.019"  style="fill:none;stroke-width:1.4472;stroke:rgb(0,0,0);" />
+
<text x="182.592" y="229.325" text-anchor="middle" fill="rgb(0,0,0)" transform="rotate(-90 182.592,218.16)" dominant-baseline="central">http</text>
+
<path d="M2.592,290.16L110.592,290.16L110.592,218.16L2.592,218.16Z"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="56.592" y="254.16" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Radicle user</text>
+
<polygon points="56.592,218.16 52.272,206.64 60.912,206.64" style="fill:rgb(0,0,0)"/>
+
<polygon points="56.592,74.16 60.912,85.68 52.272,85.68" style="fill:rgb(0,0,0)"/>
+
<path d="M56.592,212.4L56.592,79.92"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="56.592" y="157.86" text-anchor="middle" fill="rgb(0,0,0)" transform="rotate(-90 56.592,146.16)" dominant-baseline="central">git</text>
+
<path d="M254.592,290.16L362.592,290.16L362.592,218.16L254.592,218.16Z"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="308.592" y="254.16" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Git user</text>
+
<polygon points="308.592,218.16 305.698,210.442 311.486,210.442" style="fill:rgb(0,0,0)"/>
+
<path d="M308.592,214.301L308.592,74.16"  style="fill:none;stroke-width:1.4472;stroke:rgb(0,0,0);" />
+
<text x="308.592" y="157.325" text-anchor="middle" fill="rgb(0,0,0)" transform="rotate(-90 308.592,146.16)" dominant-baseline="central">git fetch</text>
+
<polygon points="144.408,315.616 136.4,324.956 132.233,317.387" style="fill:rgb(0,0,0)"/>
+
<path d="M56.592,290.16Q87.7722,346.796 139.362,318.394"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<polygon points="220.776,315.616 232.951,317.387 228.784,324.956" style="fill:rgb(0,0,0)"/>
+
<path d="M225.822,318.394Q277.412,346.796 308.592,290.16"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
</svg>
added assets/images/arch-level-1.pik
@@ -0,0 +1,31 @@
+
down
+
Node: ellipse "radicle-node" mono "process" width 120%
+
line <->
+
Storage: cylinder "Node storage" "~/.radicle/storage" mono small width 140%
+
line <->
+
Helper: ellipse "git-helper-rad" mono width 140%
+
line <->
+
Working: cylinder "working" "tree"
+

+
arc from Node.w to Helper.w <-
+

+
move right from Node.e
+
move right
+
move down
+
Httpd: ellipse "radicle-httpd" mono "process" width 140%
+
line <-> from Node.se to Httpd.nw
+
line <-> from Httpd.sw to Storage.e
+

+
move right from Node.e
+
move
+
move
+
move
+
Other: ellipse "Other node" dashed
+

+
down
+
move
+
move
+
Exp: box "Radicle" "explorer" dashed
+

+
line from Other.w to Node.e -> dashed
+
line from Exp.nw to Httpd.se -> dashed
added assets/images/arch-level-1.svg
@@ -0,0 +1,42 @@
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox="0 0 607.32 508.32">
+
<ellipse cx="144.36" cy="38.16" rx="64.8" ry="36"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="144.36" y="28.08" text-anchor="middle" font-family="monospace" fill="rgb(0,0,0)" dominant-baseline="central">radicle-node</text>
+
<text x="144.36" y="48.24" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">process</text>
+
<polygon points="144.36,74.16 148.68,85.68 140.04,85.68" style="fill:rgb(0,0,0)"/>
+
<polygon points="144.36,146.16 140.04,134.64 148.68,134.64" style="fill:rgb(0,0,0)"/>
+
<path d="M144.36,79.92L144.36,140.4"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<path d="M68.76,156.96L68.76,207.36A75.6 10.8 0 0 0 219.96 207.36L219.96,156.96A75.6 10.8 0 0 0 68.76 156.96A75.6 10.8 0 0 0 219.96 156.96"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="144.36" y="180.18" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Node storage</text>
+
<text x="144.36" y="198.324" text-anchor="middle" font-family="monospace" fill="rgb(0,0,0)" font-size="80%" dominant-baseline="central">~/.radicle/storage</text>
+
<polygon points="144.36,218.16 148.68,229.68 140.04,229.68" style="fill:rgb(0,0,0)"/>
+
<polygon points="144.36,290.16 140.04,278.64 148.68,278.64" style="fill:rgb(0,0,0)"/>
+
<path d="M144.36,223.92L144.36,284.4"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<ellipse cx="144.36" cy="326.16" rx="75.6" ry="36"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="144.36" y="326.16" text-anchor="middle" font-family="monospace" fill="rgb(0,0,0)" dominant-baseline="central">git-helper-rad</text>
+
<polygon points="144.36,362.16 148.68,373.68 140.04,373.68" style="fill:rgb(0,0,0)"/>
+
<polygon points="144.36,434.16 140.04,422.64 148.68,422.64" style="fill:rgb(0,0,0)"/>
+
<path d="M144.36,367.92L144.36,428.4"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<path d="M90.36,444.96L90.36,495.36A54 10.8 0 0 0 198.36 495.36L198.36,444.96A54 10.8 0 0 0 90.36 444.96A54 10.8 0 0 0 198.36 444.96"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="144.36" y="468.18" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">working</text>
+
<text x="144.36" y="488.34" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">tree</text>
+
<polygon points="79.56,38.16 74.0527,49.1619 68.1765,42.8279" style="fill:rgb(0,0,0)"/>
+
<path d="M75.3373,42.0774Q-69.84,176.76 68.76,326.16"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<ellipse cx="353.16" cy="146.16" rx="75.6" ry="36"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<text x="353.16" y="136.08" text-anchor="middle" font-family="monospace" fill="rgb(0,0,0)" dominant-baseline="central">radicle-httpd</text>
+
<text x="353.16" y="156.24" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">process</text>
+
<polygon points="190.181,63.6158 202.393,65.1098 198.399,72.7715" style="fill:rgb(0,0,0)"/>
+
<polygon points="299.703,120.704 287.49,119.21 291.484,111.549" style="fill:rgb(0,0,0)"/>
+
<path d="M195.288,66.2783L294.595,118.042"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<polygon points="299.703,171.616 288.848,177.409 287.716,168.843" style="fill:rgb(0,0,0)"/>
+
<polygon points="219.96,182.16 230.814,176.367 231.947,184.933" style="fill:rgb(0,0,0)"/>
+
<path d="M293.992,172.371L225.67,181.405"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" />
+
<ellipse cx="551.16" cy="38.16" rx="54" ry="36"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);stroke-dasharray:7.2,7.2;" />
+
<text x="551.16" y="38.16" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Other node</text>
+
<path d="M497.16,290.16L605.16,290.16L605.16,218.16L497.16,218.16Z"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);stroke-dasharray:7.2,7.2;" />
+
<text x="551.16" y="244.08" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">Radicle</text>
+
<text x="551.16" y="264.24" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">explorer</text>
+
<polygon points="209.16,38.16 220.68,33.84 220.68,42.48" style="fill:rgb(0,0,0)"/>
+
<path d="M497.16,38.16L214.92,38.16"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);stroke-dasharray:7.2,7.2;" />
+
<polygon points="406.617,171.616 418.838,173.041 414.888,180.725" style="fill:rgb(0,0,0)"/>
+
<path d="M497.16,218.16L411.74,174.249"  style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);stroke-dasharray:7.2,7.2;" />
+
</svg>
added assets/images/arch-seq-checkout-repo.svg
@@ -0,0 +1,27 @@
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="421px" preserveAspectRatio="none" style="width:560px;height:421px;" version="1.1" viewBox="0 0 560 421" width="560px" zoomAndPan="magnify"><defs><filter height="300%" id="fwmwc1paex2g6" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="26" x2="26" y1="89.0679" y2="331.01"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="162" x2="162" y1="89.0679" y2="331.01"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="275" x2="275" y1="89.0679" y2="331.01"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="344" x2="344" y1="89.0679" y2="331.01"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="410" x2="410" y1="89.0679" y2="331.01"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="501" x2="501" y1="89.0679" y2="331.01"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="84.9659">User</text><ellipse cx="26.5" cy="13" fill="#FEFECE" filter="url(#fwmwc1paex2g6)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,21 L26.5,48 M13.5,29 L39.5,29 M26.5,48 L13.5,63 M26.5,48 L39.5,63 " fill="none" filter="url(#fwmwc1paex2g6)" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="344.976">User</text><ellipse cx="26.5" cy="359.0779" fill="#FEFECE" filter="url(#fwmwc1paex2g6)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,367.0779 L26.5,394.0779 M13.5,375.0779 L39.5,375.0779 M26.5,394.0779 L13.5,409.0779 M26.5,394.0779 L39.5,409.0779 " fill="none" filter="url(#fwmwc1paex2g6)" style="stroke: #A80036; stroke-width: 2.0;"/><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="144" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="151" y="72.9659">Git</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="144" y="330.01"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="151" y="351.976">Git</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="59" x="244" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="45" x="251" y="72.9659">Helper</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="59" x="244" y="330.01"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="45" x="251" y="351.976">Helper</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="317" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="324" y="72.9659">Node</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="317" y="330.01"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="324" y="351.976">Node</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="381" y="84.9659">Storage</text><path d="M392,34 C392,24 410,24 410,24 C410,24 428,24 428,34 L428,60 C428,70 410,70 410,70 C410,70 392,70 392,60 L392,34 " fill="#FEFECE" filter="url(#fwmwc1paex2g6)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M392,34 C392,44 410,44 410,44 C410,44 428,44 428,34 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="381" y="344.976">Storage</text><path d="M392,359.0779 C392,349.0779 410,349.0779 410,349.0779 C410,349.0779 428,349.0779 428,359.0779 L428,385.0779 C428,395.0779 410,395.0779 410,395.0779 C410,395.0779 392,395.0779 392,385.0779 L392,359.0779 " fill="#FEFECE" filter="url(#fwmwc1paex2g6)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M392,359.0779 C392,369.0779 410,369.0779 410,369.0779 C410,369.0779 428,369.0779 428,359.0779 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="100" x="449" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="86" x="456" y="72.9659">WorkingTree</text><rect fill="#FEFECE" filter="url(#fwmwc1paex2g6)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="100" x="449" y="330.01"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="86" x="456" y="351.976">WorkingTree</text><polygon fill="#A80036" points="150.5,118.7739,160.5,122.7739,150.5,126.7739,154.5,122.7739" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="26.5" x2="156.5" y1="122.7739" y2="122.7739"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="33.5" y="116.9649">"rad checkout RID"</text><polygon fill="#A80036" points="263.5,150.4799,273.5,154.4799,263.5,158.4799,267.5,154.4799" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="162.5" x2="269.5" y1="154.4799" y2="154.4799"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="89" x="169.5" y="148.6709">"where is RID?"</text><polygon fill="#A80036" points="173.5,182.186,163.5,186.186,173.5,190.186,169.5,186.186" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="167.5" x2="274.5" y1="186.186" y2="186.186"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="179.5" y="180.377">"path to RID"</text><polygon fill="#A80036" points="398,213.892,408,217.892,398,221.892,402,217.892" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="162.5" x2="404" y1="217.892" y2="217.892"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="95" x="169.5" y="212.083">"get repository"</text><polygon fill="#A80036" points="173.5,245.598,163.5,249.598,173.5,253.598,169.5,249.598" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="167.5" x2="409" y1="249.598" y2="249.598"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="118" x="179.5" y="243.789">"repository objects"</text><polygon fill="#A80036" points="489,277.304,499,281.304,489,285.304,493,281.304" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="162.5" x2="495" y1="281.304" y2="281.304"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="84" x="169.5" y="275.495">"git checkout"</text><polygon fill="#A80036" points="37.5,309.01,27.5,313.01,37.5,317.01,33.5,313.01" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="31.5" x2="161.5" y1="313.01" y2="313.01"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="28" x="43.5" y="307.201">"OK"</text><!--MD5=[97f1acecc33ed8d85eadf81b9ea85e63]
+
@startuml
+
actor User
+
participant Git
+
participant Helper
+
participant Node
+
database Storage
+

+
User -> Git: "rad checkout RID"
+
Git -> Helper: "where is RID?"
+
Helper -> Git: "path to RID"
+
Git -> Storage: "get repository"
+
Storage -> Git: "repository objects"
+
Git -> WorkingTree: "git checkout"
+
Git -> User: "OK"
+
@enduml
+

+
PlantUML version 1.2020.02(Sun Mar 01 10:22:07 UTC 2020)
+
(GPL source distribution)
+
Java Runtime: OpenJDK Runtime Environment
+
JVM: OpenJDK 64-Bit Server VM
+
Java Version: 21.0.5-ea+8-Debian-1
+
Operating System: Linux
+
Default Encoding: UTF-8
+
Language: en
+
Country: US
+
--></g></svg>

\ No newline at end of file
added assets/images/arch-seq-checkout-repo.uml
@@ -0,0 +1,15 @@
+
@startuml
+
actor User
+
participant Git
+
participant Helper
+
participant Node
+
database Storage
+

+
User -> Git: "rad checkout RID"
+
Git -> Helper: "where is RID?"
+
Helper -> Git: "path to RID"
+
Git -> Storage: "get repository"
+
Storage -> Git: "repository objects"
+
Git -> WorkingTree: "git checkout"
+
Git -> User: "OK"
+
@enduml
added assets/images/arch-seq-push-to-storage.svg
@@ -0,0 +1,26 @@
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="389px" preserveAspectRatio="none" style="width:511px;height:389px;" version="1.1" viewBox="0 0 511 389" width="511px" zoomAndPan="magnify"><defs><filter height="300%" id="ffdwaiyedg4rq" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="26" x2="26" y1="89.0679" y2="299.304"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="169" x2="169" y1="89.0679" y2="299.304"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="273" x2="273" y1="89.0679" y2="299.304"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="410.5" x2="410.5" y1="89.0679" y2="299.304"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="476.5" x2="476.5" y1="89.0679" y2="299.304"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="84.9659">User</text><ellipse cx="26.5" cy="13" fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,21 L26.5,48 M13.5,29 L39.5,29 M26.5,48 L13.5,63 M26.5,48 L39.5,63 " fill="none" filter="url(#ffdwaiyedg4rq)" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="313.27">User</text><ellipse cx="26.5" cy="327.3719" fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,335.3719 L26.5,362.3719 M13.5,343.3719 L39.5,343.3719 M26.5,362.3719 L13.5,377.3719 M26.5,362.3719 L39.5,377.3719 " fill="none" filter="url(#ffdwaiyedg4rq)" style="stroke: #A80036; stroke-width: 2.0;"/><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="151" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="158" y="72.9659">Git</text><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="151" y="298.304"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="158" y="320.27">Git</text><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="59" x="242" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="45" x="249" y="72.9659">Helper</text><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="59" x="242" y="298.304"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="45" x="249" y="320.27">Helper</text><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="383.5" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="390.5" y="72.9659">Node</text><rect fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="383.5" y="298.304"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="390.5" y="320.27">Node</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="447.5" y="84.9659">Storage</text><path d="M458.5,34 C458.5,24 476.5,24 476.5,24 C476.5,24 494.5,24 494.5,34 L494.5,60 C494.5,70 476.5,70 476.5,70 C476.5,70 458.5,70 458.5,60 L458.5,34 " fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M458.5,34 C458.5,44 476.5,44 476.5,44 C476.5,44 494.5,44 494.5,34 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="447.5" y="313.27">Storage</text><path d="M458.5,327.3719 C458.5,317.3719 476.5,317.3719 476.5,317.3719 C476.5,317.3719 494.5,317.3719 494.5,327.3719 L494.5,353.3719 C494.5,363.3719 476.5,363.3719 476.5,363.3719 C476.5,363.3719 458.5,363.3719 458.5,353.3719 L458.5,327.3719 " fill="#FEFECE" filter="url(#ffdwaiyedg4rq)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M458.5,327.3719 C458.5,337.3719 476.5,337.3719 476.5,337.3719 C476.5,337.3719 494.5,337.3719 494.5,327.3719 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><polygon fill="#A80036" points="157.5,118.7739,167.5,122.7739,157.5,126.7739,161.5,122.7739" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="26.5" x2="163.5" y1="122.7739" y2="122.7739"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="119" x="33.5" y="116.9649">"git push rad HEAD"</text><polygon fill="#A80036" points="261.5,150.4799,271.5,154.4799,261.5,158.4799,265.5,154.4799" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="169.5" x2="267.5" y1="154.4799" y2="154.4799"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="80" x="176.5" y="148.6709">"push to RID"</text><polygon fill="#A80036" points="464.5,182.186,474.5,186.186,464.5,190.186,468.5,186.186" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="273.5" x2="470.5" y1="186.186" y2="186.186"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="102" x="280.5" y="180.377">"update storage"</text><polygon fill="#A80036" points="398.5,213.892,408.5,217.892,398.5,221.892,402.5,217.892" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="273.5" x2="404.5" y1="217.892" y2="217.892"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="113" x="280.5" y="212.083">"notify of changes"</text><polygon fill="#A80036" points="180.5,245.598,170.5,249.598,180.5,253.598,176.5,249.598" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="174.5" x2="272.5" y1="249.598" y2="249.598"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="28" x="186.5" y="243.789">"OK"</text><polygon fill="#A80036" points="37.5,277.304,27.5,281.304,37.5,285.304,33.5,281.304" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="31.5" x2="168.5" y1="281.304" y2="281.304"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="28" x="43.5" y="275.495">"OK"</text><!--MD5=[f5f5d50a0b75b04305d2540112785c74]
+
@startuml
+
actor User
+
participant Git
+
participant Helper
+
participant Node
+
database Storage
+

+
User -> Git: "git push rad HEAD"
+
Git -> Helper: "push to RID"
+
Helper -> Storage: "update storage"
+
Helper -> Node: "notify of changes"
+
Helper -> Git: "OK"
+
Git -> User: "OK"
+
@enduml
+

+
PlantUML version 1.2020.02(Sun Mar 01 10:22:07 UTC 2020)
+
(GPL source distribution)
+
Java Runtime: OpenJDK Runtime Environment
+
JVM: OpenJDK 64-Bit Server VM
+
Java Version: 21.0.5-ea+8-Debian-1
+
Operating System: Linux
+
Default Encoding: UTF-8
+
Language: en
+
Country: US
+
--></g></svg>

\ No newline at end of file
added assets/images/arch-seq-push-to-storage.uml
@@ -0,0 +1,14 @@
+
@startuml
+
actor User
+
participant Git
+
participant Helper
+
participant Node
+
database Storage
+

+
User -> Git: "git push rad HEAD"
+
Git -> Helper: "push to RID"
+
Helper -> Storage: "update storage"
+
Helper -> Node: "notify of changes"
+
Helper -> Git: "OK"
+
Git -> User: "OK"
+
@enduml
added assets/images/arch-seq-repo-to-storage.svg
@@ -0,0 +1,23 @@
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="357px" preserveAspectRatio="none" style="width:360px;height:357px;" version="1.1" viewBox="0 0 360 357" width="360px" zoomAndPan="magnify"><defs><filter height="300%" id="f195dzxcf9db1i" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="26" x2="26" y1="89.0679" y2="267.598"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="135.5" x2="135.5" y1="89.0679" y2="267.598"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="257.5" x2="257.5" y1="89.0679" y2="267.598"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;" x1="324.5" x2="324.5" y1="89.0679" y2="267.598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="84.9659">User</text><ellipse cx="26.5" cy="13" fill="#FEFECE" filter="url(#f195dzxcf9db1i)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,21 L26.5,48 M13.5,29 L39.5,29 M26.5,48 L13.5,63 M26.5,48 L39.5,63 " fill="none" filter="url(#f195dzxcf9db1i)" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="31" x="8" y="281.5639">User</text><ellipse cx="26.5" cy="295.6659" fill="#FEFECE" filter="url(#f195dzxcf9db1i)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><path d="M26.5,303.6659 L26.5,330.6659 M13.5,311.6659 L39.5,311.6659 M26.5,330.6659 L13.5,345.6659 M26.5,330.6659 L39.5,345.6659 " fill="none" filter="url(#f195dzxcf9db1i)" style="stroke: #A80036; stroke-width: 2.0;"/><rect fill="#FEFECE" filter="url(#f195dzxcf9db1i)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="108.5" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="115.5" y="72.9659">Node</text><rect fill="#FEFECE" filter="url(#f195dzxcf9db1i)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="108.5" y="266.598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="36" x="115.5" y="288.5639">Node</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="228.5" y="84.9659">Storage</text><path d="M239.5,34 C239.5,24 257.5,24 257.5,24 C257.5,24 275.5,24 275.5,34 L275.5,60 C275.5,70 257.5,70 257.5,70 C257.5,70 239.5,70 239.5,60 L239.5,34 " fill="#FEFECE" filter="url(#f195dzxcf9db1i)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M239.5,34 C239.5,44 257.5,44 257.5,44 C257.5,44 275.5,44 275.5,34 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="52" x="228.5" y="281.5639">Storage</text><path d="M239.5,295.6659 C239.5,285.6659 257.5,285.6659 257.5,285.6659 C257.5,285.6659 275.5,285.6659 275.5,295.6659 L275.5,321.6659 C275.5,331.6659 257.5,331.6659 257.5,331.6659 C257.5,331.6659 239.5,331.6659 239.5,321.6659 L239.5,295.6659 " fill="#FEFECE" filter="url(#f195dzxcf9db1i)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M239.5,295.6659 C239.5,305.6659 257.5,305.6659 257.5,305.6659 C257.5,305.6659 275.5,305.6659 275.5,295.6659 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f195dzxcf9db1i)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="53" x="296.5" y="51"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="39" x="303.5" y="72.9659">Other</text><rect fill="#FEFECE" filter="url(#f195dzxcf9db1i)" height="33.0679" style="stroke: #A80036; stroke-width: 1.5;" width="53" x="296.5" y="266.598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="39" x="303.5" y="288.5639">Other</text><polygon fill="#A80036" points="123.5,118.7739,133.5,122.7739,123.5,126.7739,127.5,122.7739" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="26.5" x2="129.5" y1="122.7739" y2="122.7739"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="85" x="33.5" y="116.9649">"rad seed RID"</text><polygon fill="#A80036" points="313,150.4799,323,154.4799,313,158.4799,317,154.4799" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="135.5" x2="319" y1="154.4799" y2="154.4799"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="83" x="142.5" y="148.6709">"git fetch RID"</text><polygon fill="#A80036" points="146.5,182.186,136.5,186.186,146.5,190.186,142.5,186.186" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="140.5" x2="324" y1="186.186" y2="186.186"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="152.5" y="180.377">"Git pack file"</text><polygon fill="#A80036" points="245.5,213.892,255.5,217.892,245.5,221.892,249.5,217.892" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="135.5" x2="251.5" y1="217.892" y2="217.892"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="98" x="142.5" y="212.083">"add repository"</text><polygon fill="#A80036" points="37.5,245.598,27.5,249.598,37.5,253.598,33.5,249.598" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="31.5" x2="134.5" y1="249.598" y2="249.598"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="28" x="43.5" y="243.789">"OK"</text><!--MD5=[74dcec0b4e931ede0d8d23a1c0ebbe0c]
+
@startuml
+
actor User
+
participant Node
+
database Storage
+

+
User -> Node: "rad seed RID"
+
Node -> Other: "git fetch RID"
+
Other -> Node: "Git pack file"
+
Node -> Storage: "add repository"
+
Node -> User: "OK"
+
@enduml
+

+
PlantUML version 1.2020.02(Sun Mar 01 10:22:07 UTC 2020)
+
(GPL source distribution)
+
Java Runtime: OpenJDK Runtime Environment
+
JVM: OpenJDK 64-Bit Server VM
+
Java Version: 21.0.5-ea+8-Debian-1
+
Operating System: Linux
+
Default Encoding: UTF-8
+
Language: en
+
Country: US
+
--></g></svg>

\ No newline at end of file
added assets/images/arch-seq-repo-to-storage.uml
@@ -0,0 +1,11 @@
+
@startuml
+
actor User
+
participant Node
+
database Storage
+

+
User -> Node: "rad seed RID"
+
Node -> Other: "git fetch RID"
+
Other -> Node: "Git pack file"
+
Node -> Storage: "add repository"
+
Node -> User: "OK"
+
@enduml
added scripts/build-pik.sh
@@ -0,0 +1,34 @@
+
#!/bin/bash
+
set -euo pipefail
+

+
if [ $# -lt 1 ]; then
+
  echo "usage: $0 <path>..."
+
  exit 1
+
fi
+

+
if ! command -v pikchr-cli 2>&1; then
+
  echo "error: the 'pikchr-cli' executable is required for formatting"
+
  exit 1
+
fi
+

+
# Function to process a single file
+
process() {
+
    FILE="$1"
+
    SVG="$2"
+

+
    # Ensure the file exists
+
    if [ ! -f "$FILE" ]; then
+
      echo "error: '$FILE' does not exist."
+
      return
+
    fi
+

+
    # Format SVG.
+
    pikchr-cli "$FILE" > "$SVG"
+

+
    echo "Processed $FILE to $SVG"
+
  }
+

+
# Iterate over each file provided as an argument
+
for file in "$@"; do
+
  process "$file" "${file%.pik}.svg"
+
done
added scripts/build-plantuml.sh
@@ -0,0 +1,33 @@
+
#!/bin/bash
+
set -euo pipefail
+

+
if [ $# -lt 1 ]; then
+
  echo "usage: $0 <path>..."
+
  exit 1
+
fi
+

+
if ! command -v plantuml 2>&1; then
+
  echo "error: the 'plantuml' executable is required for formatting"
+
  exit 1
+
fi
+

+
# Function to process a single file
+
process() {
+
    FILE="$1"
+

+
    # Ensure the file exists
+
    if [ ! -f "$FILE" ]; then
+
      echo "error: '$FILE' does not exist."
+
      return
+
    fi
+

+
    # Format SVG.
+
    plantuml -tsvg "$FILE"
+

+
    echo "Processed $FILE"
+
  }
+

+
# Iterate over each file provided as an argument
+
for file in "$@"; do
+
  process "$file"
+
done