diff --git a/build.py b/build.py
index 2e1bc0d..6d72966 100755
--- a/build.py
+++ b/build.py
@@ -14,13 +14,18 @@ if __name__ == "__main__":
make_directory(out)
run("dot", str(gv), "-Tsvg", "-o", str(svg))
text = read_file_text(svg)
+ write(out / "index.css", """\
+html {
+background-color: #202020;
+}
+""")
write(out / "index.html", f"""\
-
-to.rwx.work
+
+todo.rwx.work
diff --git a/index.gv b/index.gv
index c019cbf..ae07b8f 100644
--- a/index.gv
+++ b/index.gv
@@ -1,17 +1,192 @@
digraph "index" {
+bgcolor="transparent"
+color="#C0C000"
+fontcolor="#FF8000"
+fontname="DejaVu Sans"
+penwidth="2"
+rankdir="RL"
+
+edge [
+fontcolor="#FF4040"
+fontname="DejaVu Sans"
+style="filled"
+]
+
+node [
+color="#C0C0C0"
+fontcolor="#FFFFFF"
+fontname="DejaVu Sans"
+penwidth="2"
+style="filled"
+]
+
+{ rank="max"
+"" [style="invis"]
+}
+
+edge [color="#008000"]
+node [fillcolor="#408040"]
subgraph "cluster/dev" { label="Dev"
- "plan" [label="Plan"]
- "code" [label="Code"]
- "build" [label="Build"]
- "test" [label="Test"]
+"plan" [label="Plan"]
+"code" [label="Code"]
+"build" [label="Build"]
+"test" [label="Test"]
+}
+
+"plan" -> "code" -> "build" -> "test" -> {
+"plan"
+"release"
}
subgraph "cluster/ops" { label="Ops"
- "release" [label="Release"]
- "deploy" [label="Deploy"]
- "operate" [label="Operate"]
- "monitor" [label="Monitor"]
+"release" [label="Release"]
+"deploy" [label="Deploy"]
+"operate" [label="Operate"]
+"monitor" [label="Monitor"]
+}
+
+"release" -> "deploy" -> "operate" -> "monitor" -> {
+"deploy"
+"plan"
+}
+
+edge [color="#FF0000"]
+node [fillcolor="#303030"]
+
+subgraph "cluster/beninca.link" {
+label="beninca.link"
+URL="https://beninca.link"
+
+"beninca.link/marc" [
+fontcolor="#8080FF"
+label="Marc"
+URL="https://marc.beninca.link"
+]
+
+}
+
+subgraph "cluster/rwx.work" {
+label="rwx.work"
+URL="https://rwx.work"
+
+"rwx.work/blog" [
+fontcolor="#8080FF"
+label="Blog"
+URL="https://blog.rwx.work"
+]
+
+"rwx.work/forge" [
+fontcolor="#8080FF"
+label="Forge"
+URL="https://forge.rwx.work"
+]
+
+"rwx.work/ilos" [
+fontcolor="#8080FF"
+label="ILOS"
+URL="https://ilos.rwx.work"
+]
+
+"rwx.work/lsgm" [
+fontcolor="#8080FF"
+label="LSGM"
+URL="https://lsgm.rwx.work"
+]
+
+"rwx.work/ofsp" [
+fontcolor="#8080FF"
+label="OFSP"
+URL="https://ofsp.rwx.work"
+]
+
+"rwx.work/prj" [
+fontcolor="#8080FF"
+label="PRJ"
+URL="https://prj.rwx.work"
+]
+
+"rwx.work/rtfd" [
+fontcolor="#8080FF"
+label="RTFD"
+URL="https://rtfd.rwx.work"
+]
+
+"rwx.work/rwx" [
+fontcolor="#8080FF"
+label="RWX"
+URL="https://rwx.rwx.work"
+]
+
+"rwx.work/spcd" [
+fontcolor="#8080FF"
+label="SPCD"
+URL="https://spcd.rwx.work"
+]
+
+"rwx.work/srmp" [
+fontcolor="#8080FF"
+label="SRMP"
+URL="https://srmp.rwx.work"
+]
+
+"rwx.work/todo" [
+fontcolor="#8080FF"
+label="TODO"
+URL="https://todo.rwx.work"
+]
+
+}
+
+"rwx.work/forge/marc" [
+fontcolor="#8080FF"
+label="Marc"
+URL="https://forge.rwx.work/marc.beninca"
+]
+"rwx.work/forge/marc" -> "rwx.work/forge"
+
+{
+"ofsp/python" [label="Python"]
+"ofsp/shell" [label="Shell"]
+} -> "rwx.work/ofsp"
+
+{
+"rwx/ffmpeg" [label="FFMPEG"]
+"rwx/freetube" [label="FreeTube"]
+"rwx/gource" [label="Gource"]
+"rwx/logo" [label="Logo"]
+"rwx/python" [label="Python"]
+"rwx/shell" [label="Shell"]
+} -> "rwx.work/rwx"
+
+{
+"rwx/shell/cs" [label="CryptSetup"]
+} -> "rwx/shell"
+
+{
+"srmp/alma" [label="Alma"]
+"srmp/debian" [label="Debian"]
+"srmp/docker" [label="Docker"]
+"srmp/msys" [label="MSys"]
+"srmp/pypi" [label="PyPI"]
+"srmp/python" [label="Python"]
+} -> "rwx.work/srmp"
+
+{
+"srmp/debian/codium" [label="Codium"]
+"srmp/debian/incus" [label="Incus"]
+} -> "srmp/debian"
+
+subgraph "cluster/tilde.link" {
+label="tilde.link"
+URL="https://tilde.link"
+
+"tilde.link/tm" [
+fontcolor="#8080FF"
+label="TrackMania"
+URL="https://tm.tilde.link"
+]
+
}
}