aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Touhey <thomas@touhey.fr>2021-11-28 15:43:59 +0100
committerThomas Touhey <thomas@touhey.fr>2021-11-28 15:43:59 +0100
commitbb97c9cc9b98b3922df38f6b137c77ffc7d000b7 (patch)
tree0f96092b21eb3c05f98369f896933b51733bf056
parent521519f5c76065794b7eba67d60a28a86a2e4353 (diff)
some more thingsHEADmaster
-rw-r--r--docs/Makefile2
-rw-r--r--docs/Pipfile1
-rw-r--r--docs/Pipfile.lock128
-rw-r--r--docs/_static/custom.css54
-rw-r--r--docs/_static/logo.svg65
-rw-r--r--docs/_static/logo_wide.pngbin12293 -> 0 bytes
-rw-r--r--docs/conf.py12
-rw-r--r--docs/explain/bus.rst2
-rw-r--r--docs/explain/modem.rst6
-rw-r--r--docs/explain/modem/gps-trilaterate.lua110
-rw-r--r--docs/explain/video.svg1
-rw-r--r--docs/favicon.icobin16958 -> 10074 bytes
-rw-r--r--docs/favicon.pngbin2014 -> 7875 bytes
-rw-r--r--docs/system.rst2
-rw-r--r--docs/system/initd.rst34
-rw-r--r--docs/system/process.rst57
-rw-r--r--docs/system/process/concepts.rst19
-rw-r--r--docs/system/process/native-contexts-apis.rst29
-rw-r--r--docs/system/startup.rst14
-rw-r--r--docs/system/startup/api.rst213
-rw-r--r--docs/system/startup/computercraft.rst (renamed from docs/system/startup/startup-impl.rst)24
-rw-r--r--docs/system/startup/concepts.rst36
-rw-r--r--docs/system/startup/opencomputers.rst12
-rw-r--r--docs/system/startup/startup-api.rst215
-rw-r--r--docs/system/startup/startup-comp.rst6
-rw-r--r--docs/system/systemd.rst67
26 files changed, 723 insertions, 386 deletions
diff --git a/docs/Makefile b/docs/Makefile
index f0e89c6..33affbb 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -32,7 +32,7 @@ prepare:
# Livehtml build.
livehtml:
$(SPHINXWATCH) -b html $(SPHINXOPTS) . $(BUILDDIR)/html \
- --ignore "**/.*.kate-swp"
+ --ignore "**/.*.kate-swp" --watch _static
.PHONY: livehtml
diff --git a/docs/Pipfile b/docs/Pipfile
index b8dcdd7..331670b 100644
--- a/docs/Pipfile
+++ b/docs/Pipfile
@@ -9,6 +9,7 @@ verify_ssl = true
sphinx = "*"
sphinx-autobuild = "*"
sphinxcontrib-luadomain = "*"
+alabaster = "*"
[requires]
python_version = "3.8"
diff --git a/docs/Pipfile.lock b/docs/Pipfile.lock
index 5f0e211..979bf0b 100644
--- a/docs/Pipfile.lock
+++ b/docs/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "6696d9708abf0fe11c8a35d26b22c09f8c5b0f9890a2e148e36d576f1b79e270"
+ "sha256": "be8e76de78d42953d43a5638db90c49dc576ad9673a8822d15ce3a2f30ee607b"
},
"pipfile-spec": 6,
"requires": {
@@ -21,6 +21,7 @@
"sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
"sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"
],
+ "index": "pypi",
"version": "==0.7.12"
},
"babel": {
@@ -33,18 +34,18 @@
},
"certifi": {
"hashes": [
- "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee",
- "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"
+ "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
+ "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
],
- "version": "==2021.5.30"
+ "version": "==2021.10.8"
},
- "chardet": {
+ "charset-normalizer": {
"hashes": [
- "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa",
- "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
+ "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0",
+ "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==4.0.0"
+ "markers": "python_version >= '3'",
+ "version": "==2.0.8"
},
"colorama": {
"hashes": [
@@ -64,27 +65,27 @@
},
"idna": {
"hashes": [
- "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
- "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+ "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
+ "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.10"
+ "markers": "python_version >= '3'",
+ "version": "==3.3"
},
"imagesize": {
"hashes": [
- "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
- "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
+ "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c",
+ "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.2.0"
+ "version": "==1.3.0"
},
"jinja2": {
"hashes": [
- "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4",
- "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"
+ "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8",
+ "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"
],
"markers": "python_version >= '3.6'",
- "version": "==3.0.1"
+ "version": "==3.0.3"
},
"livereload": {
"hashes": [
@@ -97,32 +98,67 @@
"sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298",
"sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64",
"sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b",
+ "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194",
"sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567",
"sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff",
+ "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724",
"sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74",
+ "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646",
"sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35",
+ "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6",
+ "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a",
+ "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6",
+ "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad",
"sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26",
+ "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38",
+ "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac",
"sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7",
+ "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6",
+ "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047",
"sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75",
"sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f",
+ "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b",
"sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135",
"sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8",
+ "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a",
"sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a",
+ "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1",
+ "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9",
+ "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864",
"sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914",
+ "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee",
+ "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f",
"sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18",
"sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8",
"sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2",
"sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d",
+ "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b",
"sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b",
+ "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86",
+ "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6",
"sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f",
"sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb",
"sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833",
+ "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28",
+ "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e",
"sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415",
"sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902",
+ "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f",
+ "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d",
"sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9",
"sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d",
+ "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145",
"sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066",
+ "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c",
+ "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1",
+ "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a",
+ "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207",
"sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f",
+ "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53",
+ "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd",
+ "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134",
+ "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85",
+ "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9",
"sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5",
"sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94",
"sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509",
@@ -134,42 +170,42 @@
},
"packaging": {
"hashes": [
- "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5",
- "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"
+ "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
+ "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==20.9"
+ "markers": "python_version >= '3.6'",
+ "version": "==21.3"
},
"pygments": {
"hashes": [
- "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f",
- "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"
+ "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
+ "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
],
"markers": "python_version >= '3.5'",
- "version": "==2.9.0"
+ "version": "==2.10.0"
},
"pyparsing": {
"hashes": [
- "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
- "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
+ "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4",
+ "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"
],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.4.7"
+ "markers": "python_version >= '3.6'",
+ "version": "==3.0.6"
},
"pytz": {
"hashes": [
- "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da",
- "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"
+ "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c",
+ "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"
],
- "version": "==2021.1"
+ "version": "==2021.3"
},
"requests": {
"hashes": [
- "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804",
- "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"
+ "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
+ "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==2.25.1"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+ "version": "==2.26.0"
},
"six": {
"hashes": [
@@ -181,18 +217,18 @@
},
"snowballstemmer": {
"hashes": [
- "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2",
- "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"
+ "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
+ "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
],
- "version": "==2.1.0"
+ "version": "==2.2.0"
},
"sphinx": {
"hashes": [
- "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c",
- "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"
+ "sha256:6d051ab6e0d06cba786c4656b0fe67ba259fe058410f49e95bee6e49c4052cbf",
+ "sha256:7e2b30da5f39170efcd95c6270f07669d623c276521fee27ad6c380f49d2bf5b"
],
"index": "pypi",
- "version": "==4.0.2"
+ "version": "==4.3.0"
},
"sphinx-autobuild": {
"hashes": [
@@ -306,11 +342,11 @@
},
"urllib3": {
"hashes": [
- "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c",
- "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"
+ "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece",
+ "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
- "version": "==1.26.5"
+ "version": "==1.26.7"
}
},
"develop": {}
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
new file mode 100644
index 0000000..a9b63ab
--- /dev/null
+++ b/docs/_static/custom.css
@@ -0,0 +1,54 @@
+body {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
+ Oxygen, Ubuntu, Cantarell, "Fira Sans",
+ "Droid Sans", "Helvetica Neue", Arial, sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}
+
+@media screen and (min-width: 1080px) {
+ div.document {
+ width: 1040px;
+ }
+}
+
+code.descname {
+ color: #4885ed;
+}
+
+th.field-name {
+ min-width: 100px;
+ color: #3cba54;
+}
+
+.toctree-wrapper ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ border: 1px solid #606060;
+ border-left: none; }
+.toctree-wrapper li > ul {
+ padding-left: 1em;
+ border: 1px solid #606060;
+ border-right: none;
+ border-left: 1px dashed #606060;
+ border-bottom: none;
+ background-color: #FAFAFA; }
+.toctree-wrapper li {
+ border: none;
+ border-bottom: 1px solid #606060; }
+.toctree-wrapper li:last-child {
+ border-bottom: none; }
+.toctree-wrapper li > a,
+.toctree-wrapper li > a:visited,
+.toctree-wrapper li > a:hover,
+.toctree-wrapper li > a:active {
+ display: block;
+ border: none;
+ border-left: 1px solid #606060;
+ padding: .5em 1em;
+ color: #3e4349;
+ background-color: #eeeeee; }
+.toctree-wrapper li > a:hover {
+ background-color: #dddddd; }
+.toctree-wrapper li > a:active {
+ background-color: #cccccc; }
diff --git a/docs/_static/logo.svg b/docs/_static/logo.svg
new file mode 100644
index 0000000..60f2548
--- /dev/null
+++ b/docs/_static/logo.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="397.35mm" height="100mm" version="1.1" viewBox="0 0 397.35 100" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(.26458 0 0 .26458 1.3976 .97012)" style="shape-inside:url(#rect3354);white-space:pre" aria-label="thox">
+ <path d="m464.71 62.145h-12.48v-23.2h-22.4v23.2h-11.04v14.88h11.04v53.12c0 13.6 7.2 20.32 21.92 20.32 5.12 0 8.8-0.48 12.96-1.76v-15.68c-2.24 0.32-3.36 0.48-5.12 0.48-5.92 0-7.36-1.76-7.36-9.44v-47.04h12.48z"/>
+ <path d="m480.23 30.145v116.64h22.4v-51.84c0-9.92 7.2-16.96 17.28-16.96 4.96 0 8.64 1.76 11.2 5.28 2.08 2.88 2.56 5.28 2.56 10.72v52.8h22.4v-57.92c0-10.72-2.88-18.4-8.8-23.36-4.96-4.16-12.16-6.56-19.36-6.56-11.04 0-19.04 4.32-25.28 13.92v-42.72z"/>
+ <path d="m615.43 58.945c-26.4 0-42.56 17.44-42.56 45.76 0 28.48 16.16 45.76 42.72 45.76 26.4 0 42.72-17.28 42.72-45.12 0-29.28-15.84-46.4-42.88-46.4zm0.16 18.08c12.32 0 20.32 11.04 20.32 28 0 16.16-8.32 27.36-20.32 27.36-12.16 0-20.32-11.04-20.32-27.68 0-16.64 8.16-27.68 20.32-27.68z"/>
+ <path d="m717.83 103.26 28.16-42.88h-26.88l-13.92 26.08-14.08-26.08h-26.88l28.16 42.88-28.8 43.52h26.88l14.72-26.88 14.56 26.88h26.88z"/>
+ </g>
+ <g transform="matrix(.26458 0 0 .26458 -1.7051 -7.8514)" style="shape-inside:url(#rect6736);white-space:pre" aria-label="a modular multitasking system for ComputerCraft">
+ <path d="m474.33 271.53c-0.72 0.16-1.04 0.16-1.44 0.16-2.32 0-3.6-1.2-3.6-3.28v-24.64c0-7.44-5.44-11.44-15.76-11.44-6.16 0-11.04 1.76-13.92 4.88-1.92 2.16-2.72 4.56-2.88 8.72h6.72c0.56-5.12 3.6-7.44 9.84-7.44 6.08 0 9.36 2.24 9.36 6.24v1.76c-0.08 2.88-1.52 3.92-6.96 4.64-9.44 1.2-10.88 1.52-13.44 2.56-4.88 2.08-7.36 5.76-7.36 11.2 0 7.6 5.28 12.4 13.76 12.4 5.28 0 9.52-1.84 14.24-6.16 0.48 4.32 2.56 6.16 6.88 6.16 1.44 0 2.32-0.16 4.56-0.72zm-11.68-9.28c0 2.24-0.64 3.6-2.64 5.44-2.72 2.48-6 3.76-9.92 3.76-5.2 0-8.24-2.48-8.24-6.72 0-4.4 2.88-6.64 10.08-7.68 7.12-0.96 8.48-1.28 10.72-2.32z"/>
+ <path d="m503.85 233.53v41.92h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.96 0 7.76 3.04 7.76 8.4v28.88h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.88 0 7.76 3.12 7.76 8.4v28.88h6.72v-31.44c0-7.52-4.32-11.68-12.16-11.68-5.6 0-8.96 1.68-12.88 6.4-2.48-4.48-5.84-6.4-11.28-6.4-5.6 0-9.36 2.08-12.88 7.12v-5.92z"/>
+ <path d="m586.65 232.33c-11.84 0-18.88 8.4-18.88 22.48 0 14.16 7.04 22.48 18.96 22.48 11.84 0 18.96-8.4 18.96-22.16 0-14.56-6.88-22.8-19.04-22.8zm0.08 6.16c7.52 0 12 6.16 12 16.56 0 9.92-4.64 16.08-12 16.08-7.44 0-12-6.16-12-16.32s4.56-16.32 12-16.32z"/>
+ <path d="m648.97 217.13h-6.64v21.68c-2.8-4.24-7.28-6.48-12.88-6.48-10.88 0-18 8.72-18 22.08 0 14.16 6.88 22.88 18.24 22.88 5.76 0 9.76-2.16 13.36-7.36v5.52h5.92zm-18.4 21.44c7.2 0 11.76 6.32 11.76 16.4 0 9.68-4.64 16.08-11.68 16.08-7.36 0-12.24-6.48-12.24-16.24s4.88-16.24 12.16-16.24z"/>
+ <path d="m692.41 275.45v-41.92h-6.64v23.76c0 8.56-4.48 14.16-11.44 14.16-5.28 0-8.64-3.2-8.64-8.24v-29.68h-6.64v32.32c0 6.96 5.2 11.44 13.36 11.44 6.16 0 10.08-2.16 14-7.68v5.84z"/>
+ <path d="m710.49 217.13h-6.72v58.32h6.72z"/>
+ <path d="m758.89 271.53c-0.72 0.16-1.04 0.16-1.44 0.16-2.32 0-3.6-1.2-3.6-3.28v-24.64c0-7.44-5.44-11.44-15.76-11.44-6.16 0-11.04 1.76-13.92 4.88-1.92 2.16-2.72 4.56-2.88 8.72h6.72c0.56-5.12 3.6-7.44 9.84-7.44 6.08 0 9.36 2.24 9.36 6.24v1.76c-0.08 2.88-1.52 3.92-6.96 4.64-9.44 1.2-10.88 1.52-13.44 2.56-4.88 2.08-7.36 5.76-7.36 11.2 0 7.6 5.28 12.4 13.76 12.4 5.28 0 9.52-1.84 14.24-6.16 0.48 4.32 2.56 6.16 6.88 6.16 1.44 0 2.32-0.16 4.56-0.72zm-11.68-9.28c0 2.24-0.64 3.6-2.64 5.44-2.72 2.48-6 3.76-9.92 3.76-5.2 0-8.24-2.48-8.24-6.72 0-4.4 2.88-6.64 10.08-7.68 7.12-0.96 8.48-1.28 10.72-2.32z"/>
+ <path d="m766.09 233.53v41.92h6.72v-21.76c0.08-10.08 4.24-14.56 13.44-14.32v-6.8c-1.12-0.16-1.76-0.24-2.56-0.24-4.32 0-7.6 2.56-11.44 8.8v-7.6z"/>
+ <path d="m815.05 233.53v41.92h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.96 0 7.76 3.04 7.76 8.4v28.88h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.88 0 7.76 3.12 7.76 8.4v28.88h6.72v-31.44c0-7.52-4.32-11.68-12.16-11.68-5.6 0-8.96 1.68-12.88 6.4-2.48-4.48-5.84-6.4-11.28-6.4-5.6 0-9.36 2.08-12.88 7.12v-5.92z"/>
+ <path d="m914.65 275.45v-41.92h-6.64v23.76c0 8.56-4.48 14.16-11.44 14.16-5.28 0-8.64-3.2-8.64-8.24v-29.68h-6.64v32.32c0 6.96 5.2 11.44 13.36 11.44 6.16 0 10.08-2.16 14-7.68v5.84z"/>
+ <path d="m932.73 217.13h-6.72v58.32h6.72z"/>
+ <path d="m958.65 233.53h-6.88v-11.52h-6.64v11.52h-5.68v5.44h5.68v31.68c0 4.32 2.88 6.64 8.08 6.64 1.76 0 3.2-0.16 5.44-0.56v-5.6c-0.96 0.24-1.84 0.32-3.2 0.32-2.88 0-3.68-0.8-3.68-3.76v-28.72h6.88z"/>
+ <path d="m972.17 233.53h-6.64v41.92h6.64zm0-16.4h-6.72v8.4h6.72z"/>
+ <path d="m998.25 233.53h-6.88v-11.52h-6.64v11.52h-5.68v5.44h5.68v31.68c0 4.32 2.88 6.64 8.08 6.64 1.76 0 3.2-0.16 5.44-0.56v-5.6c-0.96 0.24-1.84 0.32-3.2 0.32-2.88 0-3.68-0.8-3.68-3.76v-28.72h6.88z"/>
+ <path d="m1042.8 271.53c-0.72 0.16-1.04 0.16-1.44 0.16-2.32 0-3.6-1.2-3.6-3.28v-24.64c0-7.44-5.44-11.44-15.76-11.44-6.16 0-11.04 1.76-13.92 4.88-1.92 2.16-2.72 4.56-2.88 8.72h6.72c0.56-5.12 3.6-7.44 9.84-7.44 6.08 0 9.36 2.24 9.36 6.24v1.76c-0.08 2.88-1.52 3.92-6.96 4.64-9.44 1.2-10.88 1.52-13.44 2.56-4.88 2.08-7.36 5.76-7.36 11.2 0 7.6 5.28 12.4 13.76 12.4 5.28 0 9.52-1.84 14.24-6.16 0.48 4.32 2.56 6.16 6.88 6.16 1.44 0 2.32-0.16 4.56-0.72zm-11.68-9.28c0 2.24-0.64 3.6-2.64 5.44-2.72 2.48-6 3.76-9.92 3.76-5.2 0-8.24-2.48-8.24-6.72 0-4.4 2.88-6.64 10.08-7.68 7.12-0.96 8.48-1.28 10.72-2.32z"/>
+ <path d="m1079.5 245.21c-0.08-8.24-5.52-12.88-15.2-12.88-9.76 0-16.08 5.04-16.08 12.8 0 6.56 3.36 9.68 13.28 12.08l6.24 1.52c4.64 1.12 6.48 2.8 6.48 5.76 0 4-3.92 6.64-9.76 6.64-3.6 0-6.64-1.04-8.32-2.8-1.04-1.2-1.52-2.4-1.92-5.36h-7.04c0.32 9.68 5.76 14.32 16.72 14.32 10.56 0 17.28-5.2 17.28-13.28 0-6.24-3.52-9.68-11.84-11.68l-6.4-1.52c-5.44-1.28-7.76-3.04-7.76-6 0-3.92 3.44-6.32 8.88-6.32 5.36 0 8.24 2.32 8.4 6.72z"/>
+ <path d="m1095.6 217.13h-6.64v58.32h6.64v-16.32l6.48-6.4 14.16 22.72h8.24l-17.12-27.44 14.56-14.48h-8.56l-17.76 17.76z"/>
+ <path d="m1136.8 233.53h-6.64v41.92h6.64zm0-16.4h-6.72v8.4h6.72z"/>
+ <path d="m1148.2 233.53v41.92h6.72v-23.12c0-8.56 4.48-14.16 11.36-14.16 5.28 0 8.64 3.2 8.64 8.24v29.04h6.64v-31.68c0-6.96-5.2-11.44-13.28-11.44-6.24 0-10.24 2.4-13.92 8.24v-7.04z"/>
+ <path d="m1219.4 233.53v6.08c-3.36-5.04-7.04-7.28-12.32-7.28-10.16 0-17.2 9.44-17.2 22.88 0 7.04 1.68 12.16 5.28 16.4 3.12 3.68 7.12 5.68 11.44 5.68 5.04 0 8.64-2.24 12.16-7.52v2.16c0 11.2-3.12 15.36-11.44 15.36-5.68 0-8.64-2.24-9.28-7.04h-6.8c0.64 7.76 6.8 12.64 15.92 12.64 6.16 0 11.28-2 14-5.36 3.2-3.92 4.4-9.12 4.4-18.96v-35.04zm-11.68 4.96c7.04 0 11.04 5.92 11.04 16.56 0 10.16-4.08 16.08-11.04 16.08-6.88 0-10.88-6-10.88-16.32 0-10.24 4-16.32 10.88-16.32z"/>
+ <path d="m1288.8 245.21c-0.08-8.24-5.52-12.88-15.2-12.88-9.76 0-16.08 5.04-16.08 12.8 0 6.56 3.36 9.68 13.28 12.08l6.24 1.52c4.64 1.12 6.48 2.8 6.48 5.76 0 4-3.92 6.64-9.76 6.64-3.6 0-6.64-1.04-8.32-2.8-1.04-1.2-1.52-2.4-1.92-5.36h-7.04c0.32 9.68 5.76 14.32 16.72 14.32 10.56 0 17.28-5.2 17.28-13.28 0-6.24-3.52-9.68-11.84-11.68l-6.4-1.52c-5.44-1.28-7.76-3.04-7.76-6 0-3.92 3.44-6.32 8.88-6.32 5.36 0 8.24 2.32 8.4 6.72z"/>
+ <path d="m1323.4 233.53-11.6 32.64-10.72-32.64h-7.12l14.16 42.08-2.56 6.64c-1.12 2.96-2.56 4.08-5.36 4.08-1.12 0-2.08-0.16-3.52-0.48v6c1.36 0.72 2.72 1.04 4.48 1.04 2.16 0 4.48-0.72 6.24-2 2.08-1.52 3.28-3.28 4.56-6.64l18.64-50.72z"/>
+ <path d="m1366.3 245.21c-0.08-8.24-5.52-12.88-15.2-12.88-9.76 0-16.08 5.04-16.08 12.8 0 6.56 3.36 9.68 13.28 12.08l6.24 1.52c4.64 1.12 6.48 2.8 6.48 5.76 0 4-3.92 6.64-9.76 6.64-3.6 0-6.64-1.04-8.32-2.8-1.04-1.2-1.52-2.4-1.92-5.36h-7.04c0.32 9.68 5.76 14.32 16.72 14.32 10.56 0 17.28-5.2 17.28-13.28 0-6.24-3.52-9.68-11.84-11.68l-6.4-1.52c-5.44-1.28-7.76-3.04-7.76-6 0-3.92 3.44-6.32 8.88-6.32 5.36 0 8.24 2.32 8.4 6.72z"/>
+ <path d="m1391.4 233.53h-6.88v-11.52h-6.64v11.52h-5.68v5.44h5.68v31.68c0 4.32 2.88 6.64 8.08 6.64 1.76 0 3.2-0.16 5.44-0.56v-5.6c-0.96 0.24-1.84 0.32-3.2 0.32-2.88 0-3.68-0.8-3.68-3.76v-28.72h6.88z"/>
+ <path d="m1433.2 256.73c0-6.4-0.48-10.24-1.68-13.36-2.72-6.88-9.12-11.04-16.96-11.04-11.68 0-19.2 8.88-19.2 22.72s7.2 22.24 19.04 22.24c9.6 0 16.24-5.44 17.92-14.56h-6.72c-1.84 5.52-5.6 8.4-10.96 8.4-4.24 0-7.84-1.92-10.08-5.44-1.6-2.4-2.16-4.8-2.24-8.96zm-30.72-5.44c0.56-7.76 5.28-12.8 12-12.8 6.8 0 11.52 5.28 11.52 12.8z"/>
+ <path d="m1442.2 233.53v41.92h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.96 0 7.76 3.04 7.76 8.4v28.88h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.88 0 7.76 3.12 7.76 8.4v28.88h6.72v-31.44c0-7.52-4.32-11.68-12.16-11.68-5.6 0-8.96 1.68-12.88 6.4-2.48-4.48-5.84-6.4-11.28-6.4-5.6 0-9.36 2.08-12.88 7.12v-5.92z"/>
+ <path d="m452.17 333.53h-6.96v-6.56c0-2.8 1.52-4.24 4.64-4.24 0.56 0 0.8 0 2.32 0.08v-5.52c-1.52-0.32-2.4-0.4-3.76-0.4-6.16 0-9.84 3.52-9.84 9.52v7.12h-5.6v5.44h5.6v36.48h6.64v-36.48h6.96z"/>
+ <path d="m474.73 332.33c-11.84 0-18.88 8.4-18.88 22.48 0 14.16 7.04 22.48 18.96 22.48 11.84 0 18.96-8.4 18.96-22.16 0-14.56-6.88-22.8-19.04-22.8zm0.08 6.16c7.52 0 12 6.16 12 16.56 0 9.92-4.64 16.08-12 16.08-7.44 0-12-6.16-12-16.32s4.56-16.32 12-16.32z"/>
+ <path d="m502.97 333.53v41.92h6.72v-21.76c0.08-10.08 4.24-14.56 13.44-14.32v-6.8c-1.12-0.16-1.76-0.24-2.56-0.24-4.32 0-7.6 2.56-11.44 8.8v-7.6z"/>
+ <path d="m599.29 335.21c-2.32-12.8-9.68-19.04-22.48-19.04-7.84 0-14.16 2.48-18.48 7.28-5.28 5.76-8.16 14.08-8.16 23.52 0 9.6 2.96 17.84 8.4 23.52 4.56 4.64 10.32 6.8 17.92 6.8 14.24 0 22.24-7.68 24-23.12h-7.68c-0.64 4-1.44 6.72-2.64 9.04-2.4 4.8-7.36 7.52-13.6 7.52-11.6 0-18.96-9.28-18.96-23.84 0-14.96 6.96-24.16 18.32-24.16 4.72 0 9.12 1.36 11.52 3.68 2.16 2 3.36 4.4 4.24 8.8z"/>
+ <path d="m625.69 332.33c-11.84 0-18.88 8.4-18.88 22.48 0 14.16 7.04 22.48 18.96 22.48 11.84 0 18.96-8.4 18.96-22.16 0-14.56-6.88-22.8-19.04-22.8zm0.08 6.16c7.52 0 12 6.16 12 16.56 0 9.92-4.64 16.08-12 16.08-7.44 0-12-6.16-12-16.32s4.56-16.32 12-16.32z"/>
+ <path d="m654.01 333.53v41.92h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.96 0 7.76 3.04 7.76 8.4v28.88h6.72v-26.32c0-6.08 4.4-10.96 9.84-10.96 4.88 0 7.76 3.12 7.76 8.4v28.88h6.72v-31.44c0-7.52-4.32-11.68-12.16-11.68-5.6 0-8.96 1.68-12.88 6.4-2.48-4.48-5.84-6.4-11.28-6.4-5.6 0-9.36 2.08-12.88 7.12v-5.92z"/>
+ <path d="m719.45 392.89h6.72v-21.84c3.52 4.32 7.44 6.24 12.88 6.24 10.88 0 17.92-8.72 17.92-22.08 0-14.08-6.88-22.88-18-22.88-5.68 0-10.24 2.56-13.36 7.52v-6.32h-6.16zm18.4-54.32c7.36 0 12.16 6.48 12.16 16.48 0 9.52-4.88 16-12.16 16-7.12 0-11.68-6.4-11.68-16.24s4.56-16.24 11.68-16.24z"/>
+ <path d="m798.17 375.45v-41.92h-6.64v23.76c0 8.56-4.48 14.16-11.44 14.16-5.28 0-8.64-3.2-8.64-8.24v-29.68h-6.64v32.32c0 6.96 5.2 11.44 13.36 11.44 6.16 0 10.08-2.16 14-7.68v5.84z"/>
+ <path d="m824.41 333.53h-6.88v-11.52h-6.64v11.52h-5.68v5.44h5.68v31.68c0 4.32 2.88 6.64 8.08 6.64 1.76 0 3.2-0.16 5.44-0.56v-5.6c-0.96 0.24-1.84 0.32-3.2 0.32-2.88 0-3.68-0.8-3.68-3.76v-28.72h6.88z"/>
+ <path d="m866.25 356.73c0-6.4-0.48-10.24-1.68-13.36-2.72-6.88-9.12-11.04-16.96-11.04-11.68 0-19.2 8.88-19.2 22.72s7.2 22.24 19.04 22.24c9.6 0 16.24-5.44 17.92-14.56h-6.72c-1.84 5.52-5.6 8.4-10.96 8.4-4.24 0-7.84-1.92-10.08-5.44-1.6-2.4-2.16-4.8-2.24-8.96zm-30.72-5.44c0.56-7.76 5.28-12.8 12-12.8 6.8 0 11.52 5.28 11.52 12.8z"/>
+ <path d="m875.21 333.53v41.92h6.72v-21.76c0.08-10.08 4.24-14.56 13.44-14.32v-6.8c-1.12-0.16-1.76-0.24-2.56-0.24-4.32 0-7.6 2.56-11.44 8.8v-7.6z"/>
+ <path d="m949.29 335.21c-2.32-12.8-9.68-19.04-22.48-19.04-7.84 0-14.16 2.48-18.48 7.28-5.28 5.76-8.16 14.08-8.16 23.52 0 9.6 2.96 17.84 8.4 23.52 4.56 4.64 10.32 6.8 17.92 6.8 14.24 0 22.24-7.68 24-23.12h-7.68c-0.64 4-1.44 6.72-2.64 9.04-2.4 4.8-7.36 7.52-13.6 7.52-11.6 0-18.96-9.28-18.96-23.84 0-14.96 6.96-24.16 18.32-24.16 4.72 0 9.12 1.36 11.52 3.68 2.16 2 3.36 4.4 4.24 8.8z"/>
+ <path d="m959.61 333.53v41.92h6.72v-21.76c0.08-10.08 4.24-14.56 13.44-14.32v-6.8c-1.12-0.16-1.76-0.24-2.56-0.24-4.32 0-7.6 2.56-11.44 8.8v-7.6z"/>
+ <path d="m1023.2 371.53c-0.72 0.16-1.04 0.16-1.44 0.16-2.32 0-3.6-1.2-3.6-3.28v-24.64c0-7.44-5.44-11.44-15.76-11.44-6.16 0-11.04 1.76-13.92 4.88-1.92 2.16-2.72 4.56-2.88 8.72h6.72c0.56-5.12 3.6-7.44 9.84-7.44 6.08 0 9.36 2.24 9.36 6.24v1.76c-0.08 2.88-1.52 3.92-6.96 4.64-9.44 1.2-10.88 1.52-13.44 2.56-4.88 2.08-7.36 5.76-7.36 11.2 0 7.6 5.28 12.4 13.76 12.4 5.28 0 9.52-1.84 14.24-6.16 0.48 4.32 2.56 6.16 6.88 6.16 1.44 0 2.32-0.16 4.56-0.72zm-11.68-9.28c0 2.24-0.64 3.6-2.64 5.44-2.72 2.48-6 3.76-9.92 3.76-5.2 0-8.24-2.48-8.24-6.72 0-4.4 2.88-6.64 10.08-7.68 7.12-0.96 8.48-1.28 10.72-2.32z"/>
+ <path d="m1045.5 333.53h-6.96v-6.56c0-2.8 1.52-4.24 4.64-4.24 0.56 0 0.8 0 2.32 0.08v-5.52c-1.52-0.32-2.4-0.4-3.76-0.4-6.16 0-9.84 3.52-9.84 9.52v7.12h-5.6v5.44h5.6v36.48h6.64v-36.48h6.96z"/>
+ <path d="m1069.3 333.53h-6.88v-11.52h-6.64v11.52h-5.68v5.44h5.68v31.68c0 4.32 2.88 6.64 8.08 6.64 1.76 0 3.2-0.16 5.44-0.56v-5.6c-0.96 0.24-1.84 0.32-3.2 0.32-2.88 0-3.68-0.8-3.68-3.76v-28.72h6.88z"/>
+ </g>
+ <circle id="circle" cx="50" cy="50" r="48.193" fill="#adadad" stroke="#000" stroke-width="3.6145"/>
+ <g id="fox">
+ <g id="shape">
+ <path d="m93.842 69.543-31.479-44.584-6.1563 7.7553-9.6584-0.27548-4.6493-7.2219-7.2088 8.7577-6.4785 16.087 1.0553 33.605 6.3492 1.2788 28.333-16.297 17.176 17.325c4.5983-2.7202 8.7688-7.9706 12.716-16.43z" color="#000000" fill="#7a7a7a" stroke-width="3.6145" style="-inkscape-stroke:none"/>
+ <path d="m62.447 21.947-7.0938 8.9355-7.8008-0.22266-5.4746-8.5039-8.9609 10.885-6.7227 16.699 1.1113 35.416 8.4219 1.6953 27.717-15.943 17.189 17.338 1.2129-0.7168c5.0632-2.9952 9.4014-8.5805 13.434-17.223l0.44336-0.94922-0.60547-0.85547zm-0.16797 6.0273 29.451 41.711c-3.3693 6.9645-6.8469 11.386-10.422 13.904l-17.055-17.201-28.949 16.65-4.2754-0.86133-1-31.793 6.2344-15.477 5.457-6.6289 3.8242 5.9395 11.516 0.32812z" color="#000000" style="-inkscape-stroke:none"/>
+ </g>
+ <g>
+ <path id="muzzle" d="m29.021 75.332 0.24627 8.3352 6.3492 1.2788 9.0848-5.5342z" fill="#616161" stroke="#000" stroke-width="2.4096"/>
+ <path id="xl" d="m36.149 43.263 1.7037-1.7037 2.1602 2.1584 2.1602-2.1584 1.7037 1.7037-2.1601 2.1596 2.1601 2.1608-1.7037 1.7037-2.1567-2.1535-2.1637 2.1535-1.7037-1.7037 2.1606-2.1556z"/>
+ <path id="xr" d="m52.044 43.894 1.7037-1.7037 2.161 2.161 2.1594-2.161 1.7037 1.7037-2.1587 2.1597 2.1587 2.1608-1.7037 1.7037-2.1588-2.1592-2.1616 2.1592-1.7037-1.7037 2.1599-2.1599z"/>
+ </g>
+ </g>
+</svg>
diff --git a/docs/_static/logo_wide.png b/docs/_static/logo_wide.png
deleted file mode 100644
index bf0ab14..0000000
--- a/docs/_static/logo_wide.png
+++ /dev/null
Binary files differ
diff --git a/docs/conf.py b/docs/conf.py
index 9a23deb..7355e70 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -9,7 +9,10 @@ release = 'latest'
# General configuration.
primary_domain = 'lua'
-extensions = ['sphinxcontrib.luadomain', 'sphinx.ext.imgmath', 'sphinx.ext.todo']
+extensions = [
+ 'sphinxcontrib.luadomain',
+ 'sphinx.ext.imgmath',
+ 'sphinx.ext.todo']
templates_path = ['_templates']
exclude_patterns = ['_build', '**/Thumbs.db', '**/.DS_Store', '**/.*.kate-swp']
@@ -18,12 +21,13 @@ todo_include_todos = True
# HTML output options.
html_baseurl = "/docs"
+html_theme = 'alabaster'
html_favicon = "favicon.png"
+html_static_path = ['_static/custom.css', '_static/logo.svg']
html_extra_path = ["robots.txt", "favicon.ico"]
html_math_renderer = 'imgmath'
-html_theme = 'haiku'
-html_logo = '_static/logo_wide.png'
html_theme_options = {
- 'full_logo': True,
+ 'logo': 'logo.svg',
+ 'show_relbar_bottom': True,
}
diff --git a/docs/explain/bus.rst b/docs/explain/bus.rst
index 3d999a0..cf32e5b 100644
--- a/docs/explain/bus.rst
+++ b/docs/explain/bus.rst
@@ -139,6 +139,8 @@ the monitor twice:
:alt: A computer connected through two wired modems to the same wired
network.
+.. _bus-oc:
+
OpenComputers bus
-----------------
diff --git a/docs/explain/modem.rst b/docs/explain/modem.rst
index 24ee8d4..d13ae98 100644
--- a/docs/explain/modem.rst
+++ b/docs/explain/modem.rst
@@ -329,8 +329,9 @@ rednoot modems
* - msg_fmt
- any string, number, boolean or table
-`rednoot`_ is a virtual modem running on top of websockets. The project was
-started in 2017 by :ref:`player-justync7`; it is no longer maintained, and the
+`rednoot`_ (`thread <rednoot on ComputerCraft forums_>`_) is a virtual modem
+running on top of websockets. The project was started in 2017 by
+:ref:`player-justync7`; it is no longer maintained, and the
public instance recommended by the repo is no longer available, although
the source code for both the client and the server are published under MIT,
along with its `protocol specification <rednoot specification_>`_.
@@ -380,4 +381,5 @@ function`_ for reference.
.. _rednoot specification: https://github.com/Lustyn/rednoot/blob/master/SPECIFICATION.md
.. _rednoot message callback function: https://github.com/Lustyn/rednoot/blob/e29b30546d59ddda475509f5d272ed8eaa0b3396/app.js#L158
.. _rednoot client script: https://github.com/Lustyn/rednoot/blob/e29b30546d59ddda475509f5d272ed8eaa0b3396/client.lua
+.. _rednoot on ComputerCraft forums: http://www.computercraft.info/forums2/index.php?/topic/28595-rednoot-a-global-rednetmodem-bridge/
.. _OpenComputers modem API: https://ocdoc.cil.li/component:modem
diff --git a/docs/explain/modem/gps-trilaterate.lua b/docs/explain/modem/gps-trilaterate.lua
index 4db4d40..dae0477 100644
--- a/docs/explain/modem/gps-trilaterate.lua
+++ b/docs/explain/modem/gps-trilaterate.lua
@@ -4,17 +4,21 @@
-- Copyright (C) 2021 Thomas Touhey <thomas@touhey.fr>
-- This file is part of the thox project, which is MIT-licensed.
--
+-- Updated on 2021-09-18 for using tables less.
+--
-- For more information, consult the following page:
-- <https://thox.madefor.cc/explain/modem/gps.html#trilateration>_
-local function trilaterate(ax, ay, az, bx, by, bz, cx, cy, cz, da, db, dc)
- local dab2, dab, ex, ey
+local function trilaterate(a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z,
+ d_a, d_b, d_c)
+ local ex_x, ex_y, ex_z
+ local ey_x, ey_y, ey_z
local u, vx, vy
- -- ax, ay, az are expected to be real numbers (coordinates of A)
- -- bx, by, bz are expected to be real numbers (coordinates of B)
- -- cx, cy, cz are expected to be real numbers (coordinates of C)
- -- da, db, dc are expected to be positive real numbers (distances).
+ -- a_x, a_y, a_z are expected to be real numbers (coordinates of A)
+ -- b_x, b_y, b_z are expected to be real numbers (coordinates of B)
+ -- c_x, c_y, c_z are expected to be real numbers (coordinates of C)
+ -- d_a, d_b, dc are expected to be positive real numbers (distances).
-- All numbers must be non-NaN.
--
-- This function returns a number of positions as tables defining
@@ -33,68 +37,92 @@ local function trilaterate(ax, ay, az, bx, by, bz, cx, cy, cz, da, db, dc)
-- https://thox.madefor.cc/explain/modem/gps.html#trilateration
do
- local x = bx - ax, y = by - ay, z = bz - az
+ local x = b_x - a_x
+ local y = b_y - a_y
+ local z = b_z - a_z
+ local d
+
+ d = math.sqrt(x * x + y * y + z * z)
- dab2 = x * x + y * y + z * z
- dab = math.sqrt(dab2)
+ ex_x = x / d
+ ex_y = y / d
+ ex_z = z / d
- ex = {x = x / dab, y = y / dab, z = z / dab}
- u = dab
+ u = d
end
-- Calculate the components of Ey.
do
- local x = cx - ax, y = cy - ay, z = cz - az
- local dot, n
+ local x = c_x - a_x
+ local y = c_y - a_y
+ local z = c_z - a_z
+ local dot, d
+
+ dot = ex_x * x + ex_y * y + ex_z * z
- dot = ex.x * x + ex.y * y + ex.z * z
+ ey_x = x - ex_x * dot
+ ey_y = y - ex_y * dot
+ ey_z = z - ex_z * dot
- ey = {x = x - ex.x * dot, y = y - ex.y * dot, z = z - ex.z * dot}
- n = math.sqrt(ey.x * ey.x + ey.y * ey.y + ey.z * ey.z)
- ey = {x = ey.x / n, y = ey.y / n, z = ey.z / n}
+ d = math.sqrt(ey_x * ey_x + ey_y * ey_y + ey_z * ey_z)
- vx = ex.x * x + ex.y * y + ex.z * z
- vy = ey.x * x + ey.y * y + ey.z * z
+ ey_x = ey_x / d
+ ey_y = ey_y / d
+ ey_z = ey_z / d
+
+ vx = ex_x * x + ex_y * y + ex_z * z
+ vy = ey_x * x + ey_y * y + ey_z * z
end
-- Calculate projected coordinates.
- x = (da * da - db * db + u * u) / (2 * u)
- y = (da * da - dc * dc + v * v - 2 * vx * x) / (2 * vy)
- z = da - x * x - y * y
+ x = (d_a * d_a - d_b * d_b + u * u) / (2 * u)
+ y = (d_a * d_a - d_c * d_c + v * v - 2 * vx * x) / (2 * vy)
+ z = d_a - x * x - y * y
if z < 0 then
-- No solution.
return nil
else
- local result = {
- x = ax + x * ex.x + y * ey.x,
- y = ay + x * ex.y + y * ey.y,
- z = az + x * ex.z + y * ey.z}
+ local r_x, r_y, r_z
+
+ r_x = a_x + x * ex_x + y * ey_x
+ r_y = a_y + x * ex_y + y * ey_y
+ r_z = a_z + x * ex_z + y * ey_z
-- Check for the z coordinate.
-- Ez is calculated using cross product.
if z > 0 then
local z = math.sqrt(zs)
- local ez = {
- x = ex.y * ey.z - ex.z * ey.y,
- y = ex.z * ey.x - ex.x * ey.z,
- z = ex.x * ey.y - ex.y * ey.x}
-
- local result1 = {
- x = result.x + z * ez.x,
- y = result.y + z * ez.y,
- z = result.z + z * ez.z}
- local result2 = {
- x = result.x - z * ez.x,
- y = result.y - z * ez.y,
- z = result.z - z * ez.z}
- return result1, result2
+ local ez_x, ez_y, ez_z
+ local r1_x, r1_y, r1_z
+ local r2_x, r2_y, r2_z
+
+ ez_x = ex_y * ey_z - ex_z * ey_y
+ ez_y = ex_z * ey_x - ex_x * ey_z
+ ez_z = ex_x * ey_y - ex_y * ey_x
+
+ r1_x = r_x + z * ez_x
+ r1_y = r_y + z * ez_y
+ r1_z = r_z + z * ez_z
+
+ r2_x = r_x - z * ez_x
+ r2_y = r_y - z * ez_y
+ r2_z = r_z - z * ez_z
+
+ do
+ local r1 = {x = r1_x, y = r1_y, z = r1_z}
+ local r2 = {x = r2_x, y = r2_y, z = r2_z}
+
+ return r1, r2
+ end
else
- return result
+ local r = {x = r_x, y = r_y, z = r_z}
+
+ return r
end
end
end
diff --git a/docs/explain/video.svg b/docs/explain/video.svg
new file mode 100644
index 0000000..ab2baaa
--- /dev/null
+++ b/docs/explain/video.svg
@@ -0,0 +1 @@
+<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.41421" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path clip-rule="evenodd" d="m0 0h32v32h-32z"/></clipPath><metadata/><path d="m0 0h32v32h-32z" fill="none"/><g clip-path="url(#a)"><path d="m0 0h32v32h-32z"/><path d="m30 2h-28v22l1 .5-1 .5v5h28v-5l-1-.5 1-.5z" fill="#4d4d4d"/><path d="m2 24h28v1h-28z" fill="#333"/><g fill="#808080"><path d="m4 26h2v1h-2z"/><path d="m4 28h2v1h-2z"/><path d="m7 26h2v1h-2z"/><path d="m7 28h2v1h-2z"/><path d="m10 26h2v1h-2z"/><path d="m10 28h2v1h-2z"/></g><path d="m25 26h3v3h-3z" fill="#219555"/><circle cx="14.5" cy="27.5" fill="#333" r="1.5"/><circle cx="18.5" cy="27.5" fill="#333" r="1.5"/><circle cx="22.5" cy="27.5" fill="#333" r="1.5"/><path d="m28 6c0-.53-.211-1.039-.586-1.414s-.884-.586-1.414-.586c-4.52 0-15.48 0-20 0-.53 0-1.039.211-1.414.586s-.586.884-.586 1.414v14c0 .53.211 1.039.586 1.414s.884.586 1.414.586h20c.53 0 1.039-.211 1.414-.586s.586-.884.586-1.414c0-3.463 0-10.537 0-14z"/><path d="m6 7h6v1h-6z" fill="#0f0"/><path d="m13 7h3v1h-3z" fill="#0f0"/><path d="m17 7h2v1h-2z" fill="#0f0"/></g></svg> \ No newline at end of file
diff --git a/docs/favicon.ico b/docs/favicon.ico
index 1505f4e..0a21e57 100644
--- a/docs/favicon.ico
+++ b/docs/favicon.ico
Binary files differ
diff --git a/docs/favicon.png b/docs/favicon.png
index d44a3bf..bcb20ae 100644
--- a/docs/favicon.png
+++ b/docs/favicon.png
Binary files differ
diff --git a/docs/system.rst b/docs/system.rst
index 2779793..5c1664c 100644
--- a/docs/system.rst
+++ b/docs/system.rst
@@ -15,7 +15,7 @@ components.
system/startup
system/process
- system/initd
+ system/systemd
system/fsd
system/gpsd
system/netd
diff --git a/docs/system/initd.rst b/docs/system/initd.rst
deleted file mode 100644
index 195645a..0000000
--- a/docs/system/initd.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-.. _system-initd:
-
-initd: the thox init daemon
-===========================
-
-.. todo::
-
- initd is the main multiplexer with binding support.
-
-.. todo::
-
- What happens if a name is already bound? Should we add the process
- as an alternative (like ``/etc/alternatives`` in Debian), as a fallback
- if the first call has a problem, or should the binding process fail?
-
-initd RPC bindings
-------------------
-
-.. lua:module:: os.rpc
- :noindex:
-
-.. lua:function:: bind(name)
-
- Ask for binding the name to the current process.
-
- :param name: A valid procedure name.
- :type name: str
-
-.. lua:function:: unbind(name)
-
- Ask for unbinding the name to the current process.
-
- :param name: A valid procedure name.
- :type name: str
diff --git a/docs/system/process.rst b/docs/system/process.rst
index 5f7e501..c24f69d 100644
--- a/docs/system/process.rst
+++ b/docs/system/process.rst
@@ -1,11 +1,12 @@
-thox processes and interactions
-===============================
+thox program, process and service manager
+=========================================
.. todo::
- Introduce the concept of runtimes, i.e. Lua files e.g. in ``/lib/runtimes``
- that run before the program main code to initialize the environment to
- a standardized environment using the thox native process API.
+ Introduce the concept of runtimes that run before the program main code
+ to initialize the environment to a standardized environment using the
+ thox native process API.
+
Runtimes could include:
* Native thox process runtime (nothing).
@@ -24,6 +25,52 @@ thox processes and interactions
:lua:func:`os.run`, :lua:func:`os.run_file` and :lua:func:`os.run_code`
functions.
+.. todo::
+
+ Introduce a very simplistic method of storage for system management,
+ with no need for a hierarchical filesystem. Is required for the current
+ system design to work:
+
+ * A single-level program store, where each program is represented
+ as a name.
+ * A single-level library store, where each library is represented
+ as a name and can be used with ``require()`` (although must be
+ single-file).
+ * A single-level runtime store, where each runtime is represented
+ as a name; although this might not be required? But would be
+ appreciated so that no "program wrapper" has to be done and
+ runtimes could be used directly on ``os.run`` and command-line
+ (e.g. ``cc#program_name``).
+ * A per-program single rewritable stream for storing
+ application-specific data, e.g.:
+
+ - Service configuration and state in ``systemd``.
+ - Modem configuration in ``netd``.
+ - Packages database and system state in ``pkgd``.
+ - etc.
+
+ Could also be interesting to have locks; maybe a Redis-like (although
+ simpler, obviously) memory?
+
+ Although let's say ``os.run_program`` uses
+ ``os.run_code(load(os.get_program(...)))``. How does thox
+ know which persistent storage space to give the process since it
+ doesn't have the program's name? Should we let highly privileged
+ processes decide of that, and not make it something thox manages,
+ so have say a rewritable block device provided by the startup script
+ and ``initd`` (or a process underneath it, e.g. ``storaged``)
+ could provide RPC calls to get a context on which stream-like or
+ key-value database operations could occur?
+
+ This would change the thox program API as ``os.run_file`` would have
+ to be replaced with ``os.run_program`` and/or ``os.get_program``,
+ with the addition of ``os.set_program``, ``os.get_library``,
+ ``os.set_library``, ``os.get_runtime``, ``os.set_runtime``.
+
+ Although who can run ``os.set_program``, ``os.set_library`` and
+ ``os.set_runtime``? Shouldn't we just make these RPC calls managed
+ by thox itself? Chicken and egg problem, that is.
+
thox provides multitasking_, which means that processor time is shared
between multiple tasks, grouped in processes, automatically.
diff --git a/docs/system/process/concepts.rst b/docs/system/process/concepts.rst
index 77df9cd..41d00b8 100644
--- a/docs/system/process/concepts.rst
+++ b/docs/system/process/concepts.rst
@@ -97,6 +97,25 @@ Remote Procedure Call (RPC)
thos processes communicate mainly in a one-to-one fashion using a
`remote procedure call`_ protocol.
+.. todo::
+
+ Since RPC in thox is asynchronous, what about cancelling calls?
+ Some calls might never end, and this might clog up the process'
+ call space, there should be a timeout mechanism, or we could let
+ the process manage its timeouts using alarms but let it cancel the
+ call. But what about what happens for the process at the other end
+ of the RPC call? This would be a hang up, but wouldn't it be simpler
+ to just let the RPC call open for it and simply not transmit the
+ answer? But then should we alert it of the hang up?
+
+ Also, what if cancelling is used to DOS another process making
+ complex operations or lots of I/O behind to make it work?
+ e.g. instead of being limited to the max. number of calls I can emit,
+ I make a lot of calls, cancel all of them, then do it again in a loop.
+ The process scheduler might see this as time-sharing friendly, so it
+ might give it more time to make more system calls compared to how it
+ is managed on the other end.
+
Calling procedure
~~~~~~~~~~~~~~~~~
diff --git a/docs/system/process/native-contexts-apis.rst b/docs/system/process/native-contexts-apis.rst
index 21559f6..8f5a641 100644
--- a/docs/system/process/native-contexts-apis.rst
+++ b/docs/system/process/native-contexts-apis.rst
@@ -25,3 +25,32 @@ default context:
-- Sleep for five seconds and a half.
rpc.alarm(5.5)
+
+RPC bindings
+------------
+
+.. todo::
+
+ What happens if a name is already bound? Should we add the process
+ as an alternative (like ``/etc/alternatives`` in Debian), as a fallback
+ if the first call has a problem, or should the binding process fail?
+
+ When launched as a service, a program can be limited in terms of what
+ it can bind and run.
+
+.. lua:module:: os.rpc
+ :noindex:
+
+.. lua:function:: bind(name)
+
+ Ask for binding the name to the current process.
+
+ :param name: A valid procedure name.
+ :type name: str
+
+.. lua:function:: unbind(name)
+
+ Ask for unbinding the name to the current process.
+
+ :param name: A valid procedure name.
+ :type name: str
diff --git a/docs/system/startup.rst b/docs/system/startup.rst
index bde3baa..44c1ace 100644
--- a/docs/system/startup.rst
+++ b/docs/system/startup.rst
@@ -12,11 +12,6 @@ On thox, this is accomplished using the startup script, which unifies the
environment and available resources in a single canonical form while
preserving most if not all of the capabilities.
-The obtained environment is composed of the following:
-
- * A standard Lua environment, suited for the current Lua version.
- * The unified startup component and events system.
-
While the provided environment is uniform, the startup script is not.
There is one startup script for each main platform thox can run on;
see :ref:`startup-impl` for more information.
@@ -29,12 +24,13 @@ the thox design.
.. todo::
- This component could also check system integrity.
+ This component could also check system integrity, like a boostrapper?
.. toctree::
- startup/startup-comp
- startup/startup-impl
- startup/startup-api
+ startup/concepts
+ startup/computercraft
+ startup/opencomputers
+ startup/api
.. _Multiboot: https://wiki.osdev.org/Multiboot
diff --git a/docs/system/startup/api.rst b/docs/system/startup/api.rst
new file mode 100644
index 0000000..ab7f71c
--- /dev/null
+++ b/docs/system/startup/api.rst
@@ -0,0 +1,213 @@
+startup API
+===========
+
+For understanding the structure of these APIs, please consult
+:ref:`startup-concepts`.
+
+Standard APIs
+-------------
+
+.. todo::
+
+ Should we put into place a complete cross-version environment,
+ or instead setup the appropriate environment for the current Lua version?
+
+The following utilities are available as described in the `Lua 5.3 manual`_:
+
+::
+
+ _G
+ _VERSION
+
+ assert
+ error
+ getmetatable
+ ipairs
+ load
+ next
+ pairs
+ pcall
+ rawequal
+ rawget
+ rawlen
+ rawset
+ select
+ setmetatable
+ tonumber
+ tostring
+ type
+ xpcall
+
+ coroutine.create
+ coroutine.resume
+ coroutine.running
+ coroutine.status
+ coroutine.wrap
+ coroutine.yield
+
+ math.abs
+ math.acos
+ math.asin
+ math.atan
+ math.ceil
+ math.cos
+ math.deg
+ math.exp
+ math.floor
+ math.fmod
+ math.huge
+ math.log
+ math.max
+ math.min
+ math.modf
+ math.pi
+ math.rad
+ math.random
+ math.randomseed
+ math.sin
+ math.sqrt
+ math.tan
+
+ os.clock
+ os.date
+ os.difftime
+ os.time
+
+ string.byte
+ string.char
+ string.dump
+ string.find
+ string.format
+ string.gmatch
+ string.gsub
+ string.len
+ string.lower
+ string.match
+ string.rep
+ string.reverse
+ string.sub
+ string.upper
+
+ table.concat
+ table.insert
+ table.pack
+ table.remove
+ table.sort
+ table.unpack
+
+On certain conditions, the debug utilities might be available:
+
+::
+
+ debug.gethook
+ debug.getinfo
+ debug.getlocal
+ debug.getmetatable
+ debug.getupvalue
+ debug.getuservalue
+ debug.sethook
+ debug.setlocal
+ debug.setmetatable
+ debug.setupvalue
+ debug.setuservalue
+ debug.traceback
+ debug.upvalueid
+ debug.upvaluejoin
+
+On Lua 5.3 if available, the following utilities are also available:
+
+::
+
+ coroutine.isyieldable
+
+ string.pack
+ string.unpack
+ string.packsize
+
+ table.move
+
+ math.maxinteger
+ math.mininteger
+ math.tointeger
+ math.type
+ math.ult
+
+ utf8.char
+ utf8.charpattern
+ utf8.codes
+ utf8.codepoint
+ utf8.len
+ utf8.offset
+
+.. todo::
+
+ Check if we have access to debug, in what circumstances, and so on.
+
+Event-based component abstraction API
+-------------------------------------
+
+.. lua:module:: startup
+
+.. lua:function:: pull(timeout_sec)
+
+ Pull the next event out of the queue, while waiting for ``timeout_sec``
+ seconds at a maximum (fractional seconds are allowed and will be
+ fulfilled within the underlying platform's capabilities).
+
+ If ``timeout_sec`` is lesser or equal to 0, the function will return
+ immediately with an event if available, or with ``nil`` otherwise.
+
+ If a timeout has occurred, the returned event will be ``nil``.
+
+ :param timeout_sec: Timeout in seconds.
+ :type timeout_sec: number
+ :return: The next event in the queue or ``nil``.
+ :rtype: Event
+
+.. lua:function:: call(id, name, ...)
+
+ Call the method identified by its name ``name`` on the component
+ which the identifier is ``id`` with the given arguments.
+
+ Returns the raw return value of the method, or ``nil`` if the method
+ doesn't exist on the given peripheral.
+
+ :param id: Identifier of the component of which to call the method.
+ :type id: number
+ :param name: The name of the method to call.
+ :type name: string
+
+.. lua:class:: Event
+
+ An event on the component abstraction, as returned by :lua:func:`pull`.
+ Note that attributes include, but **are not limited** to the list
+ given below.
+
+ .. lua:attribute:: type: string
+
+ The event type:
+
+ * ``"attach"`` if a new component is attached to a given bus.
+ * ``"detach"`` if a component is detached from a given bus.
+ * ``"other"`` if the component has emitted an event.
+
+ .. lua:attribute:: id: number
+
+ The numeric identifier of the component that has been attached,
+ detached, or which has emitted the event.
+
+ .. lua:attribute:: parent: number
+
+ **Only for attach and detach events.**
+
+ The numeric identifier of the bus on which the component has been
+ attached, or from which the component has been detached.
+
+ .. lua:attribute:: methods: sequence
+
+ **Only for attach events.**
+
+ The sequence containing the method names as declared by the bus
+ or the component itself.
+
+.. _Lua 5.3 manual: https://www.lua.org/manual/5.3/manual.html
diff --git a/docs/system/startup/startup-impl.rst b/docs/system/startup/computercraft.rst
index 6bad857..c107c37 100644
--- a/docs/system/startup/startup-impl.rst
+++ b/docs/system/startup/computercraft.rst
@@ -1,12 +1,5 @@
-.. _startup-impl:
-
-startup implementations
-=======================
-
-There are multiple startup implementations in thox.
-
-ComputerCraft and derivatives
------------------------------
+startup implementation details for ComputerCraft and derivatives
+================================================================
The ``startup-cc`` package provides the startup environment for ComputerCraft,
ComputerCraft:Tweaked and CC:T emulators such as `CCEmuX`_ and `CraftOS-PC`_.
@@ -26,19 +19,6 @@ ComputerCraft:Tweaked and CC:T emulators such as `CCEmuX`_ and `CraftOS-PC`_.
Maybe quote the `unbios.lua`_ script which could be useful.
-OpenComputers and derivatives
------------------------------
-
-In the future, the ``startup-oc`` package will provide the startup environment
-for OpenComputers and derivatives.
-
-.. todo::
-
- The primitive for such a system is the components, with signals as
- events.
-
- See <https://ocdoc.cil.li/component:signals>_ for signals.
-
.. _CCEmuX: https://emux.cc/
.. _CraftOS-PC: https://www.craftos-pc.cc/
.. _Issue #710: https://github.com/SquidDev-CC/CC-Tweaked/issues/710
diff --git a/docs/system/startup/concepts.rst b/docs/system/startup/concepts.rst
new file mode 100644
index 0000000..1156a94
--- /dev/null
+++ b/docs/system/startup/concepts.rst
@@ -0,0 +1,36 @@
+.. _startup-concepts:
+
+startup concepts
+================
+
+The startup structure is designed for being lightweight and easier to implement
+on the platforms thox is designed for.
+
+The environment provided by the startup script is composed of two main
+components:
+
+ * A standard Lua environment, suited for the current Lua version.
+ * An event-based component cross-platform abstraction.
+
+The startup script boots the system in a component-less state, where no
+components seem loaded. From there, the system has access to two main
+functions:
+
+ * :lua:func:`startup.pull` for sleeping and pulling events.
+ * :lua:func:`startup.call` for calling components in a synchronous fashion.
+
+The initial few pulls get attach events for abstract and cold-plug devices,
+mostly the core bus (see :ref:`bus-builtin`) which is usually (but not
+guaranteed to be) device number 0 and its devices including hot-plug buses
+such as the side bus on ComputerCraft (see :ref:`bus-side`) and the universal
+bus on OpenComputers (see :ref:`bus-oc`).
+
+It is required for systems started up using these sets of scripts to pull
+events regularly; if the number of awaiting events exceeds an
+implementation-specific limit (depending on available memory and eventual DOS
+countermeasures such as a watchdog), the system might crash.
+
+For power-saving purposes, it is recommended for the system to sleep as much
+as possible; the startup API design allows this while still being interrupted
+as soon as an event occurs, within the limits of the current platform's
+capabilities.
diff --git a/docs/system/startup/opencomputers.rst b/docs/system/startup/opencomputers.rst
new file mode 100644
index 0000000..1f94347
--- /dev/null
+++ b/docs/system/startup/opencomputers.rst
@@ -0,0 +1,12 @@
+startup implementation details for OpenComputers and derivatives
+================================================================
+
+In the future, the ``startup-oc`` package will provide the startup environment
+for OpenComputers and derivatives.
+
+.. todo::
+
+ The primitive for such a system is the components, with signals as
+ events.
+
+ See <https://ocdoc.cil.li/component:signals>_ for signals.
diff --git a/docs/system/startup/startup-api.rst b/docs/system/startup/startup-api.rst
deleted file mode 100644
index 2d30dbd..0000000
--- a/docs/system/startup/startup-api.rst
+++ /dev/null
@@ -1,215 +0,0 @@
-thox startup API
-================
-
-Startup standard APIs
----------------------
-
-.. todo::
-
- Should we put into place a complete cross-version environment,
- or instead setup the appropriate environment for the current Lua version?
-
-The following utilities are available as described in the `Lua 5.3 manual`_:
-
-::
-
- _G
- _VERSION
-
- assert
- error
- getmetatable
- ipairs
- load
- next
- pairs
- pcall
- rawequal
- rawget
- rawlen
- rawset
- select
- setmetatable
- tonumber
- tostring
- type
- xpcall
-
- coroutine.create
- coroutine.resume
- coroutine.running
- coroutine.status
- coroutine.wrap
- coroutine.yield
-
- math.abs
- math.acos
- math.asin
- math.atan
- math.ceil
- math.cos
- math.deg
- math.exp
- math.floor
- math.fmod
- math.huge
- math.log
- math.max
- math.min
- math.modf
- math.pi
- math.rad
- math.random
- math.randomseed
- math.sin
- math.sqrt
- math.tan
-
- os.clock
- os.date
- os.difftime
- os.time
-
- string.byte
- string.char
- string.dump
- string.find
- string.format
- string.gmatch
- string.gsub
- string.len
- string.lower
- string.match
- string.rep
- string.reverse
- string.sub
- string.upper
-
- table.concat
- table.insert
- table.pack
- table.remove
- table.sort
- table.unpack
-
-On certain conditions, the debug utilities might be available:
-
-::
-
- debug.gethook
- debug.getinfo
- debug.getlocal
- debug.getmetatable
- debug.getupvalue
- debug.getuservalue
- debug.sethook
- debug.setlocal
- debug.setmetatable
- debug.setupvalue
- debug.setuservalue
- debug.traceback
- debug.upvalueid
- debug.upvaluejoin
-
-On Lua 5.3 if available, the following utilities are also available:
-
-::
-
- coroutine.isyieldable
-
- string.pack
- string.unpack
- string.packsize
-
- table.move
-
- math.maxinteger
- math.mininteger
- math.tointeger
- math.type
- math.ult
-
- utf8.char
- utf8.charpattern
- utf8.codes
- utf8.codepoint
- utf8.len
- utf8.offset
-
-.. todo::
-
- Check if we have access to debug, in what circumstances, and so on.
-
-Startup components API
-----------------------
-
-Tha main abstract bus is available through the ``bus`` global variable,
-which corresponds to the core bus. Every component, including the core bus,
-is of the following type:
-
-.. lua:module:: startup
-
-.. lua:class:: Component
-
- A component representation.
-
- .. lua:attribute:: parent: Component
-
- The reference to the parent bus as a component. The main abstract
- bus sets this to ``nil``.
-
- .. lua:attribute:: address: string or number
-
- The address of the component on the parent bus, which format depends
- on the bus type.
-
- .. lua:attribute:: type: string
-
- The string representing the device type, e.g.
- ``core-bus.thox.madefor.cc`` or ``modem.tweaked.cc``.
-
- .. lua:attribute:: available: boolean
-
- A boolean indicating if the component is still available for calling.
- When attached, this attribute is set to ``true``. If the component
- gets disconnected, this attribute is set to ``false`` and does not
- evolve from here; references to this component object should be lost,
- as a new object will be created if the component is reattached.
-
- .. lua:attribute:: interfaces: table<string>
-
- The name of the interfaces a given device implements, in order to
- recognize devices through their functions (and therefore the methods
- we can use on them) rather than by their name.
-
- .. lua:attribute:: methods: ComponentMethods
-
- The methods of the given object. The content of this table can
- be guaranteed by the interfaces provided above.
-
-.. lua:class:: ComponentMethods: table<string, function>
-
- A set of component methods. This class is to be overloaded for every
- interface that a component implements.
-
-.. lua:class:: BusComponentMethods
-
- Methods for when a component implements the ``"bus"`` interface.
-
- .. lua:method:: listComponents()
-
- Get the list of all components on this bus.
-
- :return: a list of all components on this bus.
- :rtype: table<Component>
-
- .. lua:method:: getComponent(address)
-
- Get the reference to a component.
-
- :param address: the address of the component to get a reference of
- :type address: string or number
- :return: the reference to the component object or ``nil``
- :rtype: Component
-
-.. _Lua 5.3 manual: https://www.lua.org/manual/5.3/manual.html
diff --git a/docs/system/startup/startup-comp.rst b/docs/system/startup/startup-comp.rst
deleted file mode 100644
index b650eea..0000000
--- a/docs/system/startup/startup-comp.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-startup components
-==================
-
-While there are multiple primitives for hardware components (see
-:ref:`startup-impl`), thox startup scripts should abstract them in a single
-components API.
diff --git a/docs/system/systemd.rst b/docs/system/systemd.rst
new file mode 100644
index 0000000..5543341
--- /dev/null
+++ b/docs/system/systemd.rst
@@ -0,0 +1,67 @@
+systemd
+=======
+
+.. todo::
+
+ systemd is:
+
+ * The main multiplexer with binding support.
+ * The programs and services manager, providing each program with its
+ own isolated space within the filesystem.
+
+Program management
+------------------
+
+.. lua:module:: os.rpc.system.program
+ :noindex:
+
+.. lua:function:: set(name, contents)
+
+ Add a program with a given name.
+
+ :param name: Name of the program. Limited to LDH (?).
+ :type name: str
+ :param contents: Content of the program, as text.
+ :type contents: str
+
+.. lua:function:: get(name)
+
+ Get a program's contents as a string.
+
+.. lua:function:: remove(name)
+
+ Delete a program with a name.
+
+Service management
+------------------
+
+.. lua:module:: os.rpc.system.service
+ :noindex:
+
+.. lua:function:: set(name, contents)
+
+ Add a service.
+
+.. lua:function:: get(name)
+
+ Get a service.
+
+.. lua:function:: remove(name)
+
+ Delete a service.
+
+.. lua:function:: start(name)
+
+ Start a service.
+
+.. lua:function:: stop(name)
+
+ Stop a service.
+
+.. lua:function:: enable(name)
+
+ Enable a service.
+
+.. lua:function:: disable(name)
+
+ Disable a service.