From 97d9678bca27c2727686a7e2f8622b5f16805820 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 1 Jul 2022 15:47:15 +0200 Subject: [PATCH] Added website --- .gitignore | 2 +- Makefile | 24 + assets/css/water.css | 1689 +++++++++++++++++++++++++++++ assets/gfx/reticulum_logo_512.png | Bin 0 -> 86758 bytes build.py | 55 + source/connect.md | 27 + source/credits.md | 27 + source/crypto.md | 26 + source/docs.md | 6 + source/donate.md | 17 + source/hardware.md | 21 + source/index.md | 26 + source/license.md | 23 + source/start.md | 53 + 14 files changed, 1995 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100644 assets/css/water.css create mode 100644 assets/gfx/reticulum_logo_512.png create mode 100644 build.py create mode 100644 source/connect.md create mode 100644 source/credits.md create mode 100644 source/crypto.md create mode 100644 source/docs.md create mode 100644 source/donate.md create mode 100644 source/hardware.md create mode 100644 source/index.md create mode 100644 source/license.md create mode 100644 source/start.md diff --git a/.gitignore b/.gitignore index 8b322d0..779a69e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -.buildenv +build.env build/* \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d86ddf2 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +clean: + @echo Cleaning... + @-rm -rf ./build + +website: + @mkdir -p ./build + @mkdir -p ./build/css + @mkdir -p ./build/gfx + @mkdir -p ./build/manual + python ./build.py + cp assets/css/* build/css/ + cp assets/gfx/* build/gfx/ + cp -rv ../../Reticulum/docs/manual/* build/manual/ + cp -rv ../../Reticulum/docs/Reticulum\ Manual.pdf build/manual/ + +upload: + . ./build.env; \ + rsync -rv build/ "$$DEPLOY_TARGET" --delete + +pt: + . ./build.env; \ + echo "$$DEPLOY_TARGET" + +deploy: clean website upload diff --git a/assets/css/water.css b/assets/css/water.css new file mode 100644 index 0000000..d5c741d --- /dev/null +++ b/assets/css/water.css @@ -0,0 +1,1689 @@ +/** + * Automatic version: + * Uses light theme by default but switches to dark theme + * if a system-wide theme preference is set on the user's device. + */ + +:root { + --background-body: #fff; + --background: #efefef; + --background-alt: #f7f7f7; + --selection: #9e9e9e; + --text-main: #363636; + --text-bright: #000; + --text-muted: #70777f; + --links: #0076d1; + --focus: #0096bfab; + --border: #dbdbdb; + --code: #000; + --animation-duration: 0.1s; + --button-base: #d0cfcf; + --button-hover: #9b9b9b; + --scrollbar-thumb: rgb(170, 170, 170); + --scrollbar-thumb-hover: var(--button-hover); + --form-placeholder: #949494; + --form-text: #1d1d1d; + --variable: #39a33c; + --highlight: #ff0; + --select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23161f27'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); +} + +@media (prefers-color-scheme: dark) { +:root { + --background-body: #202b38; + --background: #161f27; + --background-alt: #1a242f; + --selection: #1c76c5; + --text-main: #dbdbdb; + --text-bright: #fff; + --text-muted: #a9b1ba; + --links: #41adff; + --focus: #0096bfab; + --border: #526980; + --code: #ffbe85; + --animation-duration: 0.1s; + --button-base: #0c151c; + --button-hover: #040a0f; + --scrollbar-thumb: var(--button-hover); + --scrollbar-thumb-hover: rgb(0, 0, 0); + --form-placeholder: #a9a9a9; + --form-text: #fff; + --variable: #d941e2; + --highlight: #efdb43; + --select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); +} +} + +html { + scrollbar-color: rgb(170, 170, 170) #fff; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + scrollbar-width: thin; +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #040a0f #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +body { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif; + line-height: 1.4; + max-width: 800px; + margin: 20px auto; + padding: 0 10px; + word-wrap: break-word; + color: #363636; + color: var(--text-main); + background: #fff; + background: var(--background-body); + text-rendering: optimizeLegibility; +} + +@media (prefers-color-scheme: dark) { + + body { + background: #202b38; + background: var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + body { + color: #dbdbdb; + color: var(--text-main); + } +} + +button { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + button { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +input { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + input { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +textarea { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + textarea { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +h1 { + font-size: 2.2em; + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: 12px; + margin-top: 24px; +} + +h1 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h1 { + color: #fff; + color: var(--text-bright); + } +} + +h2 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h2 { + color: #fff; + color: var(--text-bright); + } +} + +h3 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h3 { + color: #fff; + color: var(--text-bright); + } +} + +h4 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h4 { + color: #fff; + color: var(--text-bright); + } +} + +h5 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h5 { + color: #fff; + color: var(--text-bright); + } +} + +h6 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h6 { + color: #fff; + color: var(--text-bright); + } +} + +strong { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + strong { + color: #fff; + color: var(--text-bright); + } +} + +h1, +h2, +h3, +h4, +h5, +h6, +b, +strong, +th { + font-weight: 600; +} + +q::before { + content: none; +} + +q::after { + content: none; +} + +blockquote { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + margin: 1.5em 0; + padding: 0.5em 1em; + font-style: italic; +} + +@media (prefers-color-scheme: dark) { + + blockquote { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + } +} + +q { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + margin: 1.5em 0; + padding: 0.5em 1em; + font-style: italic; +} + +@media (prefers-color-scheme: dark) { + + q { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + } +} + +blockquote > footer { + font-style: normal; + border: 0; +} + +blockquote cite { + font-style: normal; +} + +address { + font-style: normal; +} + +a[href^='mailto\:']::before { + content: '📧 '; +} + +a[href^='tel\:']::before { + content: '📞 '; +} + +a[href^='sms\:']::before { + content: '💬 '; +} + +mark { + background-color: #ff0; + background-color: var(--highlight); + border-radius: 2px; + padding: 0 2px 0 2px; + color: #000; +} + +@media (prefers-color-scheme: dark) { + + mark { + background-color: #efdb43; + background-color: var(--highlight); + } +} + +a > code, +a > strong { + color: inherit; +} + +button, +select, +input[type='submit'], +input[type='reset'], +input[type='button'], +input[type='checkbox'], +input[type='range'], +input[type='radio'] { + cursor: pointer; +} + +input, +select { + display: block; +} + +[type='checkbox'], +[type='radio'] { + display: initial; +} + +input { + color: #1d1d1d; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + input { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + input { + color: #fff; + color: var(--form-text); + } +} + +button { + color: #1d1d1d; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + button { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + button { + color: #fff; + color: var(--form-text); + } +} + +textarea { + color: #1d1d1d; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + textarea { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + textarea { + color: #fff; + color: var(--form-text); + } +} + +select { + color: #1d1d1d; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + select { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + select { + color: #fff; + color: var(--form-text); + } +} + +button { + background-color: #d0cfcf; + background-color: var(--button-base); + padding-right: 30px; + padding-left: 30px; +} + +@media (prefers-color-scheme: dark) { + + button { + background-color: #0c151c; + background-color: var(--button-base); + } +} + +input[type='submit'] { + background-color: #d0cfcf; + background-color: var(--button-base); + padding-right: 30px; + padding-left: 30px; +} + +@media (prefers-color-scheme: dark) { + + input[type='submit'] { + background-color: #0c151c; + background-color: var(--button-base); + } +} + +input[type='reset'] { + background-color: #d0cfcf; + background-color: var(--button-base); + padding-right: 30px; + padding-left: 30px; +} + +@media (prefers-color-scheme: dark) { + + input[type='reset'] { + background-color: #0c151c; + background-color: var(--button-base); + } +} + +input[type='button'] { + background-color: #d0cfcf; + background-color: var(--button-base); + padding-right: 30px; + padding-left: 30px; +} + +@media (prefers-color-scheme: dark) { + + input[type='button'] { + background-color: #0c151c; + background-color: var(--button-base); + } +} + +button:hover { + background: #9b9b9b; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + button:hover { + background: #040a0f; + background: var(--button-hover); + } +} + +input[type='submit']:hover { + background: #9b9b9b; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + input[type='submit']:hover { + background: #040a0f; + background: var(--button-hover); + } +} + +input[type='reset']:hover { + background: #9b9b9b; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + input[type='reset']:hover { + background: #040a0f; + background: var(--button-hover); + } +} + +input[type='button']:hover { + background: #9b9b9b; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + input[type='button']:hover { + background: #040a0f; + background: var(--button-hover); + } +} + +input[type='color'] { + min-height: 2rem; + padding: 8px; + cursor: pointer; +} + +input[type='checkbox'], +input[type='radio'] { + height: 1em; + width: 1em; +} + +input[type='radio'] { + border-radius: 100%; +} + +input { + vertical-align: top; +} + +label { + vertical-align: middle; + margin-bottom: 4px; + display: inline-block; +} + +input:not([type='checkbox']):not([type='radio']), +input[type='range'], +select, +button, +textarea { + -webkit-appearance: none; +} + +textarea { + display: block; + margin-right: 0; + box-sizing: border-box; + resize: vertical; +} + +textarea:not([cols]) { + width: 100%; +} + +textarea:not([rows]) { + min-height: 40px; + height: 140px; +} + +select { + background: #efefef url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23161f27'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + padding-right: 35px; +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +select::-ms-expand { + display: none; +} + +select[multiple] { + padding-right: 10px; + background-image: none; + overflow-y: auto; +} + +input:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + input:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +select:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + select:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +button:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + button:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +textarea:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + textarea:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +input[type='checkbox']:active, +input[type='radio']:active, +input[type='submit']:active, +input[type='reset']:active, +input[type='button']:active, +input[type='range']:active, +button:active { + transform: translateY(2px); +} + +input:disabled, +select:disabled, +button:disabled, +textarea:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +::-moz-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +:-ms-input-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +::-ms-input-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +::placeholder { + color: #949494; + color: var(--form-placeholder); +} + +@media (prefers-color-scheme: dark) { + + ::-moz-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + :-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + ::-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + ::placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } +} + +fieldset { + border: 1px #0096bfab solid; + border: 1px var(--focus) solid; + border-radius: 6px; + margin: 0; + margin-bottom: 12px; + padding: 10px; +} + +@media (prefers-color-scheme: dark) { + + fieldset { + border: 1px #0096bfab solid; + border: 1px var(--focus) solid; + } +} + +legend { + font-size: 0.9em; + font-weight: 600; +} + +input[type='range'] { + margin: 10px 0; + padding: 10px 0; + background: transparent; +} + +input[type='range']:focus { + outline: none; +} + +input[type='range']::-webkit-slider-runnable-track { + width: 100%; + height: 9.5px; + -webkit-transition: 0.2s; + transition: 0.2s; + background: #efefef; + background: var(--background); + border-radius: 3px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-webkit-slider-runnable-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-webkit-slider-thumb { + box-shadow: 0 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); + -webkit-appearance: none; + margin-top: -7px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-webkit-slider-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']:focus::-webkit-slider-runnable-track { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-webkit-slider-runnable-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-moz-range-track { + width: 100%; + height: 9.5px; + -moz-transition: 0.2s; + transition: 0.2s; + background: #efefef; + background: var(--background); + border-radius: 3px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-moz-range-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-moz-range-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-moz-range-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']::-ms-track { + width: 100%; + height: 9.5px; + background: transparent; + border-color: transparent; + border-width: 16px 0; + color: transparent; +} + +input[type='range']::-ms-fill-lower { + background: #efefef; + background: var(--background); + border: 0.2px solid #010101; + border-radius: 3px; + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-fill-lower { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-ms-fill-upper { + background: #efefef; + background: var(--background); + border: 0.2px solid #010101; + border-radius: 3px; + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-fill-upper { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-ms-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + border: 1px solid #000; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']:focus::-ms-fill-lower { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-ms-fill-lower { + background: #161f27; + background: var(--background); + } +} + +input[type='range']:focus::-ms-fill-upper { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-ms-fill-upper { + background: #161f27; + background: var(--background); + } +} + +a { + text-decoration: none; + color: #0076d1; + color: var(--links); +} + +@media (prefers-color-scheme: dark) { + + a { + color: #41adff; + color: var(--links); + } +} + +a:hover { + text-decoration: underline; +} + +code { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + code { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + code { + background: #161f27; + background: var(--background); + } +} + +samp { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + samp { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + samp { + background: #161f27; + background: var(--background); + } +} + +time { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + time { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + time { + background: #161f27; + background: var(--background); + } +} + +pre > code { + padding: 10px; + display: block; + overflow-x: auto; +} + +var { + color: #39a33c; + color: var(--variable); + font-style: normal; + font-family: monospace; +} + +@media (prefers-color-scheme: dark) { + + var { + color: #d941e2; + color: var(--variable); + } +} + +kbd { + background: #efefef; + background: var(--background); + border: 1px solid #dbdbdb; + border: 1px solid var(--border); + border-radius: 2px; + color: #363636; + color: var(--text-main); + padding: 2px 4px 2px 4px; +} + +@media (prefers-color-scheme: dark) { + + kbd { + color: #dbdbdb; + color: var(--text-main); + } +} + +@media (prefers-color-scheme: dark) { + + kbd { + border: 1px solid #526980; + border: 1px solid var(--border); + } +} + +@media (prefers-color-scheme: dark) { + + kbd { + background: #161f27; + background: var(--background); + } +} + +img, +video { + max-width: 100%; + height: auto; +} + +hr { + border: none; + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + hr { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +table { + border-collapse: collapse; + margin-bottom: 10px; + width: 100%; + table-layout: fixed; +} + +table caption { + text-align: left; +} + +td, +th { + padding: 6px; + text-align: left; + vertical-align: top; + word-wrap: break-word; +} + +thead { + border-bottom: 1px solid #dbdbdb; + border-bottom: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + thead { + border-bottom: 1px solid #526980; + border-bottom: 1px solid var(--border); + } +} + +tfoot { + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + tfoot { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +tbody tr:nth-child(even) { + background-color: #efefef; + background-color: var(--background); +} + +@media (prefers-color-scheme: dark) { + + tbody tr:nth-child(even) { + background-color: #161f27; + background-color: var(--background); + } +} + +tbody tr:nth-child(even) button { + background-color: #f7f7f7; + background-color: var(--background-alt); +} + +@media (prefers-color-scheme: dark) { + + tbody tr:nth-child(even) button { + background-color: #1a242f; + background-color: var(--background-alt); + } +} + +tbody tr:nth-child(even) button:hover { + background-color: #fff; + background-color: var(--background-body); +} + +@media (prefers-color-scheme: dark) { + + tbody tr:nth-child(even) button:hover { + background-color: #202b38; + background-color: var(--background-body); + } +} + +::-webkit-scrollbar { + height: 10px; + width: 10px; +} + +::-webkit-scrollbar-track { + background: #efefef; + background: var(--background); + border-radius: 6px; +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-track { + background: #161f27; + background: var(--background); + } +} + +::-webkit-scrollbar-thumb { + background: rgb(170, 170, 170); + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb { + background: #040a0f; + background: var(--scrollbar-thumb); + } +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb { + background: #040a0f; + background: var(--scrollbar-thumb); + } +} + +::-webkit-scrollbar-thumb:hover { + background: #9b9b9b; + background: var(--scrollbar-thumb-hover); +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb:hover { + background: rgb(0, 0, 0); + background: var(--scrollbar-thumb-hover); + } +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb:hover { + background: rgb(0, 0, 0); + background: var(--scrollbar-thumb-hover); + } +} + +::-moz-selection { + background-color: #9e9e9e; + background-color: var(--selection); + color: #000; + color: var(--text-bright); +} + +::selection { + background-color: #9e9e9e; + background-color: var(--selection); + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + ::-moz-selection { + color: #fff; + color: var(--text-bright); + } + + ::selection { + color: #fff; + color: var(--text-bright); + } +} + +@media (prefers-color-scheme: dark) { + + ::-moz-selection { + background-color: #1c76c5; + background-color: var(--selection); + } + + ::selection { + background-color: #1c76c5; + background-color: var(--selection); + } +} + +details { + display: flex; + flex-direction: column; + align-items: flex-start; + background-color: #f7f7f7; + background-color: var(--background-alt); + padding: 10px 10px 0; + margin: 1em 0; + border-radius: 6px; + overflow: hidden; +} + +@media (prefers-color-scheme: dark) { + + details { + background-color: #1a242f; + background-color: var(--background-alt); + } +} + +details[open] { + padding: 10px; +} + +details > :last-child { + margin-bottom: 0; +} + +details[open] summary { + margin-bottom: 10px; +} + +summary { + display: list-item; + background-color: #efefef; + background-color: var(--background); + padding: 10px; + margin: -10px -10px 0; + cursor: pointer; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + summary { + background-color: #161f27; + background-color: var(--background); + } +} + +summary:hover, +summary:focus { + text-decoration: underline; +} + +details > :not(summary) { + margin-top: 0; +} + +summary::-webkit-details-marker { + color: #363636; + color: var(--text-main); +} + +@media (prefers-color-scheme: dark) { + + summary::-webkit-details-marker { + color: #dbdbdb; + color: var(--text-main); + } +} + +dialog { + background-color: #f7f7f7; + background-color: var(--background-alt); + color: #363636; + color: var(--text-main); + border: none; + border-radius: 6px; + border-color: #dbdbdb; + border-color: var(--border); + padding: 10px 30px; +} + +@media (prefers-color-scheme: dark) { + + dialog { + border-color: #526980; + border-color: var(--border); + } +} + +@media (prefers-color-scheme: dark) { + + dialog { + color: #dbdbdb; + color: var(--text-main); + } +} + +@media (prefers-color-scheme: dark) { + + dialog { + background-color: #1a242f; + background-color: var(--background-alt); + } +} + +dialog > header:first-child { + background-color: #efefef; + background-color: var(--background); + border-radius: 6px 6px 0 0; + margin: -10px -30px 10px; + padding: 10px; + text-align: center; +} + +@media (prefers-color-scheme: dark) { + + dialog > header:first-child { + background-color: #161f27; + background-color: var(--background); + } +} + +dialog::-webkit-backdrop { + background: #0000009c; + -webkit-backdrop-filter: blur(4px); + backdrop-filter: blur(4px); +} + +dialog::backdrop { + background: #0000009c; + -webkit-backdrop-filter: blur(4px); + backdrop-filter: blur(4px); +} + +footer { + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); + padding-top: 10px; + color: #70777f; + color: var(--text-muted); +} + +@media (prefers-color-scheme: dark) { + + footer { + color: #a9b1ba; + color: var(--text-muted); + } +} + +@media (prefers-color-scheme: dark) { + + footer { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +body > footer { + margin-top: 40px; +} + +@media print { + body, + pre, + code, + summary, + details, + button, + input, + textarea { + background-color: #fff; + } + + button, + input, + textarea { + border: 1px solid #000; + } + + body, + h1, + h2, + h3, + h4, + h5, + h6, + pre, + code, + button, + input, + textarea, + footer, + summary, + strong { + color: #000; + } + + summary::marker { + color: #000; + } + + summary::-webkit-details-marker { + color: #000; + } + + tbody tr:nth-child(even) { + background-color: #f2f2f2; + } + + a { + color: #00f; + text-decoration: underline; + } +} diff --git a/assets/gfx/reticulum_logo_512.png b/assets/gfx/reticulum_logo_512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3940a753a5925e1fa80b15401709321fab5b25 GIT binary patch literal 86758 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 + + + + +Reticulum Network + + + +""" + +document_end = """ + + +""" + +menu_md = """ +
[Reticulum](index.html) | [Start](start.html) | [Hardware](hardware.html) | [Testnet](connect.html) | [Manual](docs.html) | [Crypto](crypto.html) | [Credits](credits.html) | [Source](https://github.com/markqvist/reticulum) | [Donate](donate.html)
+""" + +def scan_pages(base_path): + files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "."] + directories = [file for file in os.listdir(base_path) if os.path.isdir(os.path.join(base_path, file)) and file[:1] != "."] + + page_sources = [] + + for file in files: + if file.endswith(".md"): + page_sources.append(base_path+"/"+file) + + for directory in directories: + page_sources.append(scan_pages(base_path+"/"+directory)) + + return page_sources + +source_files = scan_pages(SOURCES_PATH) + +for mdf in source_files: + with open(mdf, "rb") as f: + md = f.read().decode(INPUT_ENCODING) + html = markdown.markdown(menu_md + md, extensions=["markdown.extensions.fenced_code"]) + html = document_start + html + document_end + + of = BUILD_PATH+mdf.replace(SOURCES_PATH, "").replace(".md", ".html") + with open(of, "wb") as wf: + wf.write(html.encode(OUTPUT_ENCODING)) diff --git a/source/connect.md b/source/connect.md new file mode 100644 index 0000000..5940d21 --- /dev/null +++ b/source/connect.md @@ -0,0 +1,27 @@ +# Public Testnet +If you just want to get started experimenting without building any physical networks, you are welcome to join the Public Reticulum Testnet. The testnet is just that, an informal network for testing and experimenting. It will be up most of the time, and anyone can join, but it also means that there's no guarantees for service availability. + +The testnet runs the very latest version of Reticulum (often even a short while before it is publicly released). Sometimes experimental versions of Reticulum might be deployed to nodes on the testnet, which means strange behaviour can occur. If none of that scares you, you can join the testnet via eihter TCP or I2P. Just add one of the following interfaces to your Reticulum configuration file: + +``` +# For connecting over TCP/IP: + + [[RNS Testnet Frankfurt]] + type = TCPClientInterface + interface_enabled = yes + outgoing = True + target_host = frankfurt.rns.unsigned.io + target_port = 4965 + + +# For connecting over I2P: + + [[RNS Testnet I2P Node A]] + type = I2PInterface + interface_enabled = yes + peers = ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha.b32.i2p +``` + +The testnet also contains a number of [Nomad Network](https://github.com/markqvist/nomadnet) nodes, and [LXMF](https://github.com/markqvist/lxmf) propagation nodes. + +

Next Topic: Read The Manual

diff --git a/source/credits.md b/source/credits.md new file mode 100644 index 0000000..a545670 --- /dev/null +++ b/source/credits.md @@ -0,0 +1,27 @@ +# Acknowledgements & Credits +Reticulum can only exist because of the mountain of Open Source work it was built on top of, the contributions of everyone involved, and everyone that has supported the project through the years. To everyone who has helped, thank you so much. + +A number of other modules and projects are either part of, or used by Reticulum. Sincere thanks to the authors and contributors of the following projects: + +- [PyCA/cryptography](https://github.com/pyca/cryptography), *BSD License* +- [Pure-25519](https://github.com/warner/python-pure25519) by [Brian Warner](https://github.com/warner), *MIT License* +- [Pysha2](https://github.com/thomdixon/pysha2) by [Thom Dixon](https://github.com/thomdixon), *MIT License* +- [Python-AES](https://github.com/orgurar/python-aes) by [Or Gur Arie](https://github.com/orgurar), *MIT License* +- [Curve25519.py](https://gist.github.com/nickovs/cc3c22d15f239a2640c185035c06f8a3#file-curve25519-py) by [Nicko van Someren](https://gist.github.com/nickovs), *Public Domain* +- [I2Plib](https://github.com/l-n-s/i2plib) by [Viktor Villainov](https://github.com/l-n-s) +- [PySerial](https://github.com/pyserial/pyserial) by Chris Liechti, *BSD License* +- [Netifaces](https://github.com/al45tair/netifaces) by [Alastair Houghton](https://github.com/al45tair), *MIT License* +- [Configobj](https://github.com/DiffSK/configobj) by Michael Foord, Nicola Larosa, Rob Dennis & Eli Courtwright, *BSD License* +- [Six](https://github.com/benjaminp/six) by [Benjamin Peterson](https://github.com/benjaminp), *MIT License* +- [Umsgpack.py](https://github.com/vsergeev/u-msgpack-python) by [Ivan A. Sergeev](https://github.com/vsergeev) +- [Python](https://www.python.org) + +The protocol design and reference implementation for Reticulum was carried out between 2014 and 2022 by Mark Qvist. + +The [Python reference implementation of Reticulum](https://github.com/markqvist/reticulum) and this website is licensed under the [MIT License](license.html). Please donate to support the continued development. + +---------------- + +
The Reticulum Protocol is the shared property of all people,
I contribute it to the public domain.

Dedicated with hope and belief in the future
freedom and prosperity of all,
on Earth and beyond.

Thank You
+ +---------------- diff --git a/source/crypto.md b/source/crypto.md new file mode 100644 index 0000000..23d5ba0 --- /dev/null +++ b/source/crypto.md @@ -0,0 +1,26 @@ +# Cryptographic Primitives +Reticulum has been uses a simple suite of efficient, strong and modern cryptographic primitives, with widely available implementations that can be used both on general-purpose CPUs and on microcontrollers. The necessary primitives are: + +- Ed25519 for signatures +- X22519 for ECDH key exchanges +- HKDF for key derivation +- AES-128 in CBC mode +- HMAC-SHA256 for message authentication +- SHA-256 +- SHA-512 + +In the default installation configuration, the `X25519`, `Ed25519` and `AES-128-CBC` primitives are provided by [OpenSSL](https://www.openssl.org/) (via the [PyCA/cryptography](https://github.com/pyca/cryptography) package). The hashing functions `SHA-256` and `SHA-512` are provided by the standard Python [hashlib](https://docs.python.org/3/library/hashlib.html). The `HKDF`, `HMAC`, `Fernet` primitives, and the `PKCS7` padding function are always provided by the following internal implementations: + +- [HKDF.py](https://github.com/markqvist/Reticulum/blob/master/RNS/Cryptography/HKDF.py) +- [HMAC.py](https://github.com/markqvist/Reticulum/blob/master/RNS/Cryptography/HMAC.py) +- [Fernet.py](https://github.com/markqvist/Reticulum/blob/master/RNS/Cryptography/Fernet.py) +- [PKCS7.py](https://github.com/markqvist/Reticulum/blob/master/RNS/Cryptography/PKCS7.py) + + +Reticulum also includes a complete implementation of all necessary primitives in pure Python. If OpenSSL & PyCA are not available on the system when Reticulum is started, Reticulum will instead use the internal pure-python primitives. A trivial consequence of this is performance, with the OpenSSL backend being *much* faster. The most important consequence however, is the potential loss of security by using primitives that has not seen the same amount of scrutiny, testing and review as those from OpenSSL. + +If you want to use the internal pure-python primitives, it is **highly advisable** that you have a good understanding of the risks that this pose, and make an informed decision on whether those risks are acceptable to you. + +Reticulum is relatively young software, and should be considered as such. While it has been built with cryptography best-practices very foremost in mind, it _has not_ been externally security audited, and there could very well be privacy or security breaking bugs. If you want to help out, or help sponsor an audit, please do get in touch. + +

Next Topic: Acknowledgements & Credits

diff --git a/source/docs.md b/source/docs.md new file mode 100644 index 0000000..65ac44f --- /dev/null +++ b/source/docs.md @@ -0,0 +1,6 @@ +# Read The Manual +You can browse full documentation for Reticulum [on this site](manual/index.html) or [on GitHub Pages](https://markqvist.github.io/Reticulum/manual/). + +You can also [download the Reticulum manual as a PDF](manual/Reticulum%20Manual.pdf) + +

Next Topic: Cryptographic Primitives

diff --git a/source/donate.md b/source/donate.md new file mode 100644 index 0000000..bf5258a --- /dev/null +++ b/source/donate.md @@ -0,0 +1,17 @@ +## Support Reticulum +You can help support the continued development of open, free and private communications systems by donating via one of the following channels: + +**Monero** +``` +84FpY1QbxHcgdseePYNmhTHcrgMX4nFf +BYtz2GKYToqHVVhJp8Eaw1Z1EedRnKD1 +9b3B8NiLCGVxzKV17UMmmeEsCrPyA5w +``` +**Ethereum** +``` +0x81F7B979fEa6134bA9FD5c701b3501A2e61E897a +``` +**Bitcoin** +``` +3CPmacGm34qYvR6XWLVEJmi2aNe3PZqUuq +``` diff --git a/source/hardware.md b/source/hardware.md new file mode 100644 index 0000000..280c93e --- /dev/null +++ b/source/hardware.md @@ -0,0 +1,21 @@ +# Supported Hardware +Reticulum can be used over practically any medium that can support at least a half-duplex channel with 500 bits per second throughput, and an MTU of 500 bytes. Data radios, modems, LoRa radios, serial lines, AX.25 TNCs, amateur radio digital modes, WiFi and Ethernet devices, free-space optical links, and similar systems are all examples of the types of physical devices Reticulum can use. The supported interface types include: + +- Any ethernet device +- Almost all WiFi-based hardware +- LoRa using [RNode](https://unsigned.io/projects/rnode/) +- Packet Radio TNCs (with or without AX.25) +- KISS-compatible hardware and software modems +- Any device with a serial port +- TCP over IP networks +- UDP over IP networks +- External programs via stdio or pipes +- Custom hardware via stdio or pipes + +For a more detailed info, and a full list of supported interface types, please read the [Communications Hardware](manual/hardware.html) and [Supported Interfaces](manual/interfaces.html) chapters of the manual. + +Reticulum can also be encapsulated over existing IP networks, so there's nothing stopping you from using it over wired ethernet, your local WiFi network or the Internet, where it'll work just as well. In fact, one of the strengths of Reticulum is how easily it allows you to connect different mediums into a self-configuring, resilient and encrypted mesh, using any available mixture of available infrastructure. + +As an example, it's possible to set up a Raspberry Pi connected to both a LoRa radio, a packet radio TNC and a WiFi network. Once the interfaces are configured, Reticulum will take care of the rest, and any device on the WiFi network can communicate with nodes on the LoRa and packet radio sides of the network, and vice versa. + +

Next Topic: Public Testnet

diff --git a/source/index.md b/source/index.md new file mode 100644 index 0000000..6e89d97 --- /dev/null +++ b/source/index.md @@ -0,0 +1,26 @@ + +# Reticulum +Reticulum is the cryptography-based networking protocol for both local and wide-area networks built on readily available hardware. Reticulum can operate even with very high latency and extremely low bandwidth. + +The vision of Reticulum is to allow anyone to operate their own sovereign communication networks, and to make it cheap and easy to cover vast areas with a myriad of independent, interconnectable and autonomous networks. + +

+ +Reticulum **is not** *one* network. It is **a tool** for building *thousands of networks*. Networks without kill-switches, surveillance, censorship and control. Networks that can freely interoperate, associate and disassociate with each other. Reticulum is Networks for Human Beings. Reticulum is Unstoppable Networks for The People. + + +## Notable Characteristics +While Reticulum solves the same problem that any network stack does, namely to get data reliably from one point to another over a number of intermediaries, it does so in a way that is very different from other networking technologies. + +- Reticulum does not use source addresses. No packets transmitted include information about the address, place, machine or person they originated from. +- There is no central control over the address space in Reticulum. Anyone can allocate as many addresses as they need, when they need them. +- Reticulum ensures end-to-end connectivity. Newly generated addresses become globally reachable in a matter of seconds to a few minutes. +- Addresses are *self-sovereign* and *portable*. Once an address has been created, it can be moved physically to another place in the network, and continue to be reachable. +- All communication is secured with [strong, modern encryption](crypto.html) by default. +- All encryption keys are ephemeral, and all communication offers forward secrecy. +- It is not possible to establish unencrypted links in Reticulum networks. +- It is not possible to send unencrypted packets to any destinations in the network. +- Destinations receiving unencrypted packets will reject them as invalid. +- The routing layer is not able to route unencrypted packets, and such packets will be dropped. + +

Next Topic: Get Started

diff --git a/source/license.md b/source/license.md new file mode 100644 index 0000000..13c2388 --- /dev/null +++ b/source/license.md @@ -0,0 +1,23 @@ +``` +MIT License + +Copyright (c) 2016-2022 Mark Qvist / unsigned.io + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` \ No newline at end of file diff --git a/source/start.md b/source/start.md new file mode 100644 index 0000000..5d728e6 --- /dev/null +++ b/source/start.md @@ -0,0 +1,53 @@ +# Get Started +The best way to get started with the Reticulum Network Stack depends on what +you want to do. For full details and examples, have a look at the [Getting Started Fast](manual/gettingstartedfast.html) section of the [Reticulum Manual](manual/index.html). + +## Experimental Software +*Please Know!* Reticulum is still in beta. This means, that while it already works very well, and is very stable, there could very well still be critical bugs or flaws in the behaviour, privacy or security of the system as a whole. Use Reticulum if you are comfortable with this, and understand the implications. + + +## Installation +To simply install Reticulum and related utilities on your system, the easiest way is via pip: + +```bash +pip3 install rns +``` + +You can then start any program that uses Reticulum, or start Reticulum as a system service with [the rnsd utility](manual/using.html#the-rnsd-utility). + +When first started, Reticulum will create a default configuration file, providing basic connectivity to other Reticulum peers that might be locally reachable. The default config file contains a few examples, and references for creating a more complex configuration. + +For more detailed examples on how to expand communication over many mediums such as packet radio or LoRa, serial ports, or over fast IP links and the Internet using the UDP and TCP interfaces, take a look at the [Supported Interfaces](manual/interfaces.html) section of the [Reticulum Manual](manual/index.html). + + +## Included Utilities +Reticulum includes a range of useful utilities for managing your networks, viewing status and information, and other tasks. You can read more about these programs in the [Included Utility Programs](manual/using.html#included-utility-programs) section of the [Reticulum Manual](manual/index.html). + +- The system daemon `rnsd` for running Reticulum as an always-available service +- An interface status utility called `rnstatus`, that displays information about interfaces +- The path lookup and and management tool `rnpath` letting you view and modify path tables +- A diagnostics tool called `rnprobe` for checking connectivity to destinations +- A simple file transfer program called `rncp` making easy to copy files to remote systems +- The remote command execution program `rnx` that let's you run commands and programs and retrieve output from remote systems + +All tools, including `rnx` and `rncp`, work reliably and well even over very low-bandwidth links like LoRa or Packet Radio. + +## Dependencies +The installation of the default `rns` package requires the dependencies listed below. Almost all systems and distributions have readily available packages for these dependencies, and when the `rns` package is installed with `pip`, they will be downloaded and installed as well. + +- [PyCA/cryptography](https://github.com/pyca/cryptography) +- [netifaces](https://github.com/al45tair/netifaces) +- [pyserial](https://github.com/pyserial/pyserial) + +On more unusual systems, and in some rare cases, it might not be possible to install or even compile one or more of the above modules. In such situations, you can use the `rnspure` package instead, which require no external dependencies for installation. Please note that the contents of the `rns` and `rnspure` packages are *identical*. The only difference is that the `rnspure` package lists no dependencies required for installation. + +No matter how Reticulum is installed and started, it will load external dependencies only if they are *needed* and *available*. If for example you want to use Reticulum on a system that cannot support [pyserial](https://github.com/pyserial/pyserial), it is perfectly possible to do so using the `rnspure` package, but Reticulum will not be able to use serial-based interfaces. All other available modules will still be loaded when needed. + +**Please Note!** If you use the `rnspure` package to run Reticulum on systems that do not support [PyCA/cryptography](https://github.com/pyca/cryptography), it is important that you read and understand the [Cryptographic Primitives](crypto.html) section of this site. + +## Performance +Reticulum targets a *very* wide usable performance envelope, but prioritises functionality and performance over low-bandwidth mediums. The goal is to provide a dynamic performance envelope from 250 bits per second, to 1 gigabit per second on normal hardware. + +Currently, the usable performance envelope is approximately 500 bits per second to 20 megabits per second, with physical mediums faster than that not being saturated. Performance beyond the current level is intended for future upgrades, but not highly prioritised until the wire format and API has been locked in. + +

Next Topic: Supported Hardware

\ No newline at end of file