From 6e03084c1b6da7772b5b704f93e3f5b9baa63d20 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 13 Jan 2023 01:12:20 +0100 Subject: [PATCH] Updated console site --- Console/Makefile | 16 +- Console/assets/css/water.css | 14 +- Console/assets/images/g1p.jpeg | Bin 0 -> 27947 bytes Console/build.py | 108 +++++++- Console/source/contribute.md | 4 +- Console/source/guides.md | 0 .../2022_03_26_private-messaging-over-lora.md | 237 ++++++++++++++++++ Console/source/help.md | 8 +- Console/source/index.md | 9 +- Console/source/learn.md | 11 + Console/source/replicate.md | 2 +- Console/source/s_lxmf.md | 24 ++ Console/source/s_nn.md | 28 +++ Console/source/s_rns.md | 19 ++ Console/source/s_sideband.md | 13 + Console/source/software.md | 96 +------ 16 files changed, 483 insertions(+), 106 deletions(-) create mode 100644 Console/assets/images/g1p.jpeg delete mode 100644 Console/source/guides.md create mode 100644 Console/source/guides/2022_03_26_private-messaging-over-lora.md create mode 100644 Console/source/learn.md create mode 100644 Console/source/s_lxmf.md create mode 100644 Console/source/s_nn.md create mode 100644 Console/source/s_rns.md create mode 100644 Console/source/s_sideband.md diff --git a/Console/Makefile b/Console/Makefile index 3d74588..21b31ec 100644 --- a/Console/Makefile +++ b/Console/Makefile @@ -1,3 +1,6 @@ +PATH_RETICULUM_WEBSITE=../../sites/reticulum.network +PATH_PACKAGES=../../dist_archive + clean: @echo Cleaning... @-rm -rf ./build @@ -12,20 +15,25 @@ pages: python ./build.py pages-debug: - python ./build.py --no-gz + python ./build.py --no-gz --no-remap data: @echo Including assets... @cp assets/css/* build/css/ @cp assets/gfx/* build/gfx/ - # @cp assets/images/* build/images/ + @cp assets/images/* build/images/ # @cp assets/scripts/* build/scripts/ # @cp -r ../../Reticulum/docs/manual/* build/reticulum_manual/ # @cp -r ../../Reticulum/docs/Reticulum\ Manual.pdf build/reticulum_manual/ -site: dirs data pages +external: + make -C $(PATH_RETICULUM_WEBSITE) clean website + rm -r $(PATH_PACKAGES)/reticulum.network + cp -r $(PATH_RETICULUM_WEBSITE)/build $(PATH_PACKAGES)/reticulum.network -local: dirs data pages-debug +site: clean external dirs data pages + +local: clean external dirs data pages-debug serve: python -m http.server 7777 --bind 127.0.0.1 --directory ./build diff --git a/Console/assets/css/water.css b/Console/assets/css/water.css index 8c411fd..c7469a5 100644 --- a/Console/assets/css/water.css +++ b/Console/assets/css/water.css @@ -28,6 +28,17 @@ src: url(yond.woff2); } +html { + text-size-adjust: none; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + -ms-text-size-adjust: none; +} + +body { + font-size: 1.1em; +} + body button { margin-bottom: 0.8em; margin-left: 0.2em; @@ -196,7 +207,7 @@ textarea { } h1 { - font-size: 2.2em; + font-size: 1.7em; margin-top: 0; } @@ -216,6 +227,7 @@ h1 { } h2 { + font-size: 1.4em; color: #fff; color: var(--text-bright); } diff --git a/Console/assets/images/g1p.jpeg b/Console/assets/images/g1p.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..24c28ef070658e3e9f48ff42d6beca502c38f8bf GIT binary patch literal 27947 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 literal 0 HcmV?d00001 diff --git a/Console/build.py b/Console/build.py index 91b8dfa..107bf77 100644 --- a/Console/build.py +++ b/Console/build.py @@ -13,16 +13,17 @@ DEFAULT_TITLE = "RNode Bootstrap Console" SOURCES_PATH="./source" BUILD_PATH="./build" PACKAGES_PATH = "../../dist_archive" +RNS_SOURCE_PATH = "../../Reticulum" INPUT_ENCODING="utf-8" OUTPUT_ENCODING="utf-8" LXMF_ADDRESS = "8dd57a738226809646089335a6b03695" document_start = """ - + - + {PAGE_TITLE} @@ -35,7 +36,24 @@ document_start = """ document_end = """""" -menu_md = """
[Start]({CONTENT_PATH}index.html) | [Replicate]({CONTENT_PATH}replicate.html) | [Software]({CONTENT_PATH}software.html) | [Guides]({CONTENT_PATH}guides.html) | [Help](help.html) | [Contribute]({CONTENT_PATH}contribute.html)
""" +menu_md = """
[Start]({CONTENT_PATH}index.html) | [Replicate]({CONTENT_PATH}replicate.html) | [Software]({CONTENT_PATH}software.html) | [Learn]({CONTENT_PATH}learn.html) | [Help](help.html) | [Contribute]({CONTENT_PATH}contribute.html)
""" + +manual_redirect = """ + + + + + + +""" +help_redirect = """ + + + + + + +""" url_maps = [ # { "path": "", "target": "/.md"}, @@ -146,12 +164,91 @@ def generate_html(f, root_path): source_files = scan_pages(SOURCES_PATH) +mf = open(BUILD_PATH+"/m.html", "w") +mf.write(manual_redirect) +mf.close() +mf = open(BUILD_PATH+"/h.html", "w") +mf.write(help_redirect) +mf.close() + +def optimise_manual(path): + scale_imgs = [ + ("_images/board_rnodev2.png", 256), + ("_images/board_rnode.png", 256), + ("_images/board_heltec32.png", 256), + ("_images/board_t3v21.png", 256), + ("_images/board_t3v20.png", 256), + ("_images/sideband_devices.webp", 380), + ("_images/board_tbeam.png", 256), + ("_images/nomadnet_3.png", 380), + ("_images/radio_is5ac.png", 256), + ("_images/radio_rblhg5.png", 256), + ("_static/rns_logo_512.png", 256), + ] + + import subprocess + import shlex + for i,s in scale_imgs: + fp = path+"/"+i + resize = "convert "+fp+" -resize "+str(s)+" "+fp + print(resize) + subprocess.call(shlex.split(resize), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + remove_files = [ + "objects.inv", + "Reticulum Manual.pdf", + "_static/styles/furo.css.map", + "_static/scripts/furo.js.map", + "_static/jquery-3.6.0.js", + "_static/jquery.js", + "_images/sideband_1.png", + + # Too long + # "_static/sphinx_highlight.js", + # "_static/copybutton_funcs.js", + "_static/_sphinx_javascript_frameworks_compat.js", + # "_static/underscore-1.13.1.js", + # "_static/documentation_options.js", + # "_static/scripts/furo-extensions.js", + "_static/scripts/furo.js.LICENSE.txt", + # "_static/styles/furo-extensions.css", + "_static/styles/furo-extensions.css.map", + + ] + for file in remove_files: + fp = path+"/"+file + print("Removing file: "+str(fp)) + os.unlink(fp) + + remove_dirs = [ + "_sources", + ] + for d in remove_dirs: + fp = path+"/"+d + print("Removing dir: "+str(fp)) + shutil.rmtree(fp) + + shutil.move(path, BUILD_PATH+"/m") + def fetch_reticulum_site(): r_site_path = BUILD_PATH+"/r" if not os.path.isdir(r_site_path): shutil.copytree(PACKAGES_PATH+"/reticulum.network", r_site_path) if os.path.isdir(r_site_path+"/manual"): - shutil.rmtree(r_site_path+"/manual") + optimise_manual(r_site_path+"/manual") + +def remap_names(): + for root, dirs, files in os.walk(BUILD_PATH): + for file in files: + fpath = root+"/"+file + spath = fpath.replace(BUILD_PATH, "") + if len(spath) > 31: + print("Path "+spath+" is too long, remapping...") + if not os.path.isdir(BUILD_PATH+"/d"): + os.makedirs(BUILD_PATH+"/d") + shutil.move(fpath, BUILD_PATH+"/d/") + + def gz_all(): import gzip @@ -212,3 +309,6 @@ for mdf in source_files: fetch_reticulum_site() if not "--no-gz" in sys.argv: gz_all() + +if not "--no-remap" in sys.argv: + remap_names() \ No newline at end of file diff --git a/Console/source/contribute.md b/Console/source/contribute.md index 1045cb6..d6410d3 100644 --- a/Console/source/contribute.md +++ b/Console/source/contribute.md @@ -29,8 +29,8 @@ Another great way to contribute, is to spread awareness about the RNode project. - Teach others to build and use RNodes, and how to set up resilient and private communications systems - Learn about using Reticulum to set up resilient communications networks, and teach these skills to people in your area that need them -## Contribute Code & Ideas -If you like to build and design, there is plenty of oppertunities to take part in the community around RNode, and the wider Reticulum community as well. There's always plenty of work to do, from writing code, to translating guides and information, to designing parts, devices and integrations. You can find us the following places: +## Contribute Code & Material +If you like to write, build and design, there is plenty of oppertunities to take part in the community around RNode, and the wider Reticulum community as well. There's always plenty of work to do, from writing code, tutorials and guides, to designing parts, devices and integrations, and translating material to other languages. You can find us the following places: - The [Reticulum Matrix Channel](element://room/!TRaVWNnQhAbvuiSnEK%3Amatrix.org?via=matrix.org) at `#reticulum:matrix.org` - The [discussion forum](https://github.com/markqvist/Reticulum/discussions) on GitHub diff --git a/Console/source/guides.md b/Console/source/guides.md deleted file mode 100644 index e69de29..0000000 diff --git a/Console/source/guides/2022_03_26_private-messaging-over-lora.md b/Console/source/guides/2022_03_26_private-messaging-over-lora.md new file mode 100644 index 0000000..06b6d16 --- /dev/null +++ b/Console/source/guides/2022_03_26_private-messaging-over-lora.md @@ -0,0 +1,237 @@ +[date]: <> (2022-03-26) +[title]: <> (Private, Secure and Uncensorable Messaging Over a LoRa Mesh) +[image]: <> (images/g1p.jpeg) +[excerpt]: <> (Or: How to set up a completely private, independent and encrypted communication system in half an hour, using stuff you can buy for under $100.) + +# Private, Secure and Uncensorable Messaging Over a LoRa Mesh +*Or: How to set up a completely private, independent and encrypted communication system in half an hour, using stuff you can buy for under $100.* + +![]({ASSET_PATH}images/g1p.jpeg) + +In this post, we will explore how two people, Alice and Bob, can set up a LoRa mesh communication system for their use that has the following characteristics: + +- Allows both real-time and asynchronous text message communication between Alice and Bob. +- Works *completely* indpendently of any infrastructure outside the control of Alice and Bob. Even if the Internet, cellular networks and the power grid fails, Alice and Bob must still be able to communicate. +- Is completely private and outside the reach of automated surveillance, and does not reveal any identifying information about Alice or Bob, nor any contents of or information about their conversations. + +In later parts of this series, we will expand the system to provide these oppertunities to an entire community, and add other mediums like Packet Radio, but for now we will focus on learning the basics by just establishing a Free Communications System between Alice and Bob. + +To accomplish this, we will be building a small and simple system based on freely available and Open Source software. To realise our system we will need the following components: + +- A networking system that can function reliably and efficiently even without any functional Internet infrastructure available. This will be provided by [Reticulum](https://reticulum.network). +- Software that Alice and Bob can interact with on their computers and mobile devices to actually communicate with each other. This will be provided by the programs [Nomad Network](https://unsigned.io/nomadnet) and [Sideband](https://unsigned.io/sideband). +- Radio hardware that Reticulum can use to cover the 7 kilometer distance between Bobs apartment and Alices house. This will be provided by installing the [RNode Firmware](https://unsigned.io/rnode_firmware) on a couple of small LoRa radio modules that can be purchased cheaply off Amazon or similar online vendors. + +As you might have already guessed, the "magic glue" that acutally makes this entire system possible is [Reticulum](https://reticulum.network/). + +Reticulum is a complete networking stack that was designed to handle challenging situations and requirements like this. Reticulum is an incredibly flexible networking platform, that can use almost anything as a carrier for digital information transfer, and it can automatically form secure mesh networks with very minimal resources, infrastructure and setup. + +Please do keep in mind though, that at the time of writing this, Reticulum is still in beta. There might be bugs and security issues that have not yet been discovered. You can keep up with such things, and get updates on the general development and releases, over on the [Reticulum GitHub page](https://github.com/markqvist/reticulum). + +The user-facing software that Alice and Bob will be installing already includes Reticulum, so there is no complicated installation and configuration setups, and getting everything up and running will be quite simple. The requirements are also very minimal, and everything can run on hardware they already have available, be that an old computer, a Raspberry Pi, or an Android phone. + +Let's get started. + +# LoRa Radio Setup +The first step is to get the LoRa radios prepared and installed. I have written in more length and details about these subjects in other posts on this site ([Installing RNode Firmware on Supported Devices](https://unsigned.io/installing-rnode-firmware-on-supported-devices/) and [How To Make Your Own RNodes](https://unsigned.io/how-to-make-your-own-rnodes/)), so this article will just quickly guide you through the basics required to get up and running. For much more information, read the above articles. + +First of all, Alice and Bob need to get a compatible piece of radio hardware to use. Had they been living closer to each other, they might have just been able to use WiFi, but they need to cover a distance of more than 7 kilometers, so they decide to go with a couple of LoRa radios. + +They take a look at the RNode Firmware [Supported Devices List](https://unsigned.io/rnode_firmware/#supported-hardware) , and decide to go with a couple of LilyGO T-Beam devices. They could have also used others, and they don't need to choose the same device, as long as they are within the same frequency range, all compatible devices work with Reticulum and can communicate with each other, as soon as the RNode Firmware has been installed on them. + +![]({ASSET_PATH}images/lora_rnodes.jpeg) + +Once the devices arrive, it is time to get the firmware installed. For this they will need a computer running some sort of Linux. Alice has a computer with Ubuntu installed, so they decide to use that. Since Python3 came installed as standard with the OS, Alice can go ahead and install the RNode configuration program by simply opening a terminal and typing: + +``` +pip install rnodeconf +``` + +The above command installs the program they need to flash the LoRa radios with the right firmware. If for some reason Python3 had not already been installed on Alices computer, she would have had to install it first with the command `sudo apt install python3 python3-pip`. + +Now that the firmware installer is ready, it is time to actually get the firmware on to the devices. Alice launches the installer with the following command: + +``` +rnodeconf --autoinstall +``` + +After this she is greated with an interactive guide that asks a few questions about the device type, grabs the latest firmware files, and installs them onto the device. After repeating with the second device, that is all there is to it, and the LoRa radios are now ready for use with Reticulum. + +# Installation at Alices House +To get a better signal, Alice mounts her LoRa radio in the attic of her house. She then runs a USB cable from the mounting location to the computer she wants to use for messaging, and plugs the cable into the computer. The LoRa radio is now directly connected to her computer via USB, and receives power from it when the computer is on. + +At her computer (running Ubuntu Linux), she installs the Nomad Network program by entering the following command in a terminal: + +``` +pip install nomadnet +``` + +After a few seconds, Nomad Network and Reticulum is installed and ready to use. She can now run the Nomad Network client by entering the following command: + +``` +nomadnet +``` + +All required directories and configuration files will now be created, and the client will start up. After a few seconds, Alice will be greeted with a screen like this: + +![]({ASSET_PATH}images/nomadnet_init-1024x640.jpg) + +Confirming that everything is installed and working, it is time to add the LoRa radio as an interface that Reticulum can use. To do this, she opens up the Reticulum configuration file (located at `˜/.reticulum/config`) in a text editor. + +By referring to the [RNode LoRa Interface](https://markqvist.github.io/Reticulum/manual/interfaces.html#rnode-lora-interface) section of the [Reticulum Manual](https://markqvist.github.io/Reticulum/manual/), she can just copy-and-paste in a new configuration section for the interface, and edit the radio parameters to her requirements. She ends up with a configuration file that looks like this in it's entirity: + +``` +[reticulum] + enable_transport = False + share_instance = Yes + + shared_instance_port = 37428 + instance_control_port = 37429 + + panic_on_interface_error = No + +[logging] + loglevel = 4 + +[interfaces] + [[Default Interface]] + type = AutoInterface + interface_enabled = True + + [[RNode LoRa Interface]] + type = RNodeInterface + interface_enabled = True + port = /dev/ttyUSB0 + frequency = 867200000 + bandwidth = 125000 + txpower = 7 + spreadingfactor = 8 + codingrate = 5 +``` + +*Please note that the assignment and use of radio frequency spectrum is completely outside the scope of this exploratory post. Laws and regulations about spectrum use vary greatly around the world, and you will have to do your own research for what frequencies and modes you can use in your location, and what licenses, if any, are required for any given use case.* + +Alice can now start the Nomad Network client again, and this time around it will initialise and use the LoRa radio installed in her attic. Having completed Alices part of the setup, lets move on to Bobs apartment. + +# Installation at Bobs Apartment +Bob likes his messaging to happen on a handy device like a phone, so he decides to go with the [Sideband](https://unsigned.io/sideband) app instead of Nomad Network. He goes to the [download page](https://github.com/markqvist/Sideband/releases/latest) and installs the APK on his Android phone. He now needs a way to connect to the LoRa radio already running at Alices house to establish communication. + +Since he doesn't want to walk around with the LoRa radio constantly dangling by a USB cable from his phone, he decides to set up a Reticulum gateway in his apartment using a Raspberry Pi he had lying around. The RNode LoRa radio will connect via USB to the Raspberry Pi, and the Raspberry Pi will be connected to the WiFi network in his apartment. + +This way, any device on his WiFi network (including his Android phone) will be able to route information through the LoRa radio as well. Reticulum takes care of everything automatically, and there is no need to configure addresses, subnet, routing rules or anything. + +Both his WiFi router and the Rasperry Pi is powered by a small battery system, so even if the power goes out, the system will be able to stay on for several days on the battery, and indefinitely if he props up a solar panel on his balcony. + +Bob installs a fresh copy of Raspberry Pi OS on the small computer, and in the terminal issues the following command to install Reticulum: + +``` +pip install rns +``` + +In this case, Bob will not be running any user-facing software on the Raspberry Pi itself, so instead he starts Reticulum as a service, by running the `rnsd` program, to check that everything installed correctly: + +``` +rnsd +``` + +After a moment, the following output is shown from the `rnsd` program, signalling that everything is working properly, but that a new, default configuration file has just been created: + +``` +[2022-03-26 17:14:05] [Notice] Could not load config file, creating default configuration file... +[2022-03-26 17:14:05] [Notice] Default config file created. Make any necessary changes in /home/bob/.reticulum/config and restart Reticulum if needed. +[2022-03-26 17:14:09] [Notice] Started rnsd version 0.3.3 +``` + +Bob terminates the `rnsd` program, and then connects the LoRa radio to the Raspberry Pi with a USB cable. Since he doesn't have any particular access to the roof or attic of the building, he just sticky-tapes the LoRa radio to a window facing in the general direction of Alices house. + +He then proceeds to add the same interface configuration to his Reticulum configuration file as Alice did, so that the radio parameters of their respective LoRa radios match each other. + +To allow other devices on his network to route through his new Reticulum gateway, he also adds the line `enable_transport = yes` to his Reticulum config file, so the file in it's entirity looks like this: + +``` +[reticulum] + enable_transport = Yes + share_instance = Yes + + shared_instance_port = 37428 + instance_control_port = 37429 + + panic_on_interface_error = No + +[logging] + loglevel = 4 + +[interfaces] + [[Default Interface]] + type = AutoInterface + interface_enabled = True + + [[RNode LoRa Interface]] + type = RNodeInterface + interface_enabled = True + port = /dev/ttyUSB0 + frequency = 867200000 + bandwidth = 125000 + txpower = 7 + spreadingfactor = 8 + codingrate = 5 +``` + + After starting the program again, this time using `rnsd -vvv` to get more verbose output, he can now see that the LoRa radio is correctly configured and used by Reticulum: + +``` +[2022-03-26 18:17:43] [Debug] Bringing up system interfaces... +[2022-03-26 18:17:43] [Verbose] AutoInterface[Default Interface] discovering peers for 1.8 seconds... +[2022-03-26 18:17:45] [Notice] Opening serial port /dev/ttyUSB0... +[2022-03-26 18:17:47] [Notice] Serial port /dev/ttyUSB0 is now open +[2022-03-26 18:17:47] [Verbose] Configuring RNode interface... +[2022-03-26 18:17:47] [Verbose] Wating for radio configuration validation for RNodeInterface[RNode LoRa Interface]... +[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting frequency is 867.2 MHz +[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting bandwidth is 125 KHz +[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting TX power is 7 dBm +[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting spreading factor is 8 +[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting coding rate is 5 +[2022-03-26 18:17:47] [Verbose] RNodeInterface[RNode LoRa Interface] On-air bitrate is now 3.1 kbps +[2022-03-26 18:17:47] [Notice] RNodeInterface[RNode LoRa Interface] is configured and powered up +[2022-03-26 18:17:48] [Debug] System interfaces are ready +[2022-03-26 18:17:48] [Verbose] Configuration loaded from /home/bob/.reticulum/config +[2022-03-26 18:17:50] [Verbose] Loaded 0 path table entries from storage +[2022-03-26 18:17:50] [Verbose] Loaded 0 tunnel table entries from storage +[2022-03-26 18:17:50] [Verbose] Transport instance started +[2022-03-26 18:17:50] [Notice] Started rnsd version 0.3.3 +``` + +Everything is ready, and when Bob launches the Sideband appplication on his phone, Alice and him will now be able to communicate securely and independently of any other infrastructure. + +# Communication +Both the [Nomad Network](https://unsigned.io/nomadnet) program and the [Sideband](https://unsigned.io/sideband) application use a cryptographic message delivery system named [LXMF](https://unsigned.io/lxmf), that in turn uses Reticulum for encryption and privacy guarantees. Both Nomad Network and Sideband are *LXMF clients*. + +Much like many different e-mail clients exist, so can many different LXMF clients, and they can all communicate with each other, which is why Alice and Bob can message each other even though they prefer to use very different kinds of user-facing software. + +An LXMF addresses consist of 32 hexadecimal characters, and are usually encapsulated in single angle quotation marks like this: `<9824f6367015b30f2d7b8a24bc6205d7>`. + +Nobody controls the allocation of addresses, and since the address space is so huge, and governed by cryptographic principles, you can create as many or as few adresses as you need. + +Since you can just create them with freely avaible software, and without any sort of permission from anyone, they are never linked to any personally identifiable information either. They are completely and truly anonymous from the beginning, and you control how much or how little of your identity you associate with them. + +For an LXMF address to be reachable for direct-delivery instant messaging on a Reticulum network, it must announce it's public keys on the network. Both Sideband and Nomad Network allows you to send an announce on the network, and both programs can be configured to do so automatically when they start. If you only want to use the system for "email-style" communication (via LXMF propagation nodes), you don't *need* to send any announces on the network, but to learn how it all works, it is a good idea to just set the programs to automatically announce at start up. + +To make sure his public cryptographic key is known by the network, Bob taps the **Announce** button in the Sideband app: + +

+ +After a few seconds, Bobs announce shows up in the **Announce Stream** section of the Nomad Network program on Alices computer: + +

+ +Using the received announce, Alice starts a conversation with Bob. Either one of them could also have started the conversation by manually typing in the others LXMF address in their program, but in many cases it can be convenient to use the announces. Now that everything is ready, they exchange a few messages to test the system. On Bobs Android phone, this looks like this: + +

+ +And on Alices computer running Nomad Network, it looks like this: + +

+ +Although pretty useful, what we have explored here does not even begin to scratch the surface of what is possible with Reticulum and associated software. I hope you will find yourself inspired to explore and read deeper into the documentation and available software. + +In the next parts of this series, we will explore how to add more features to the system, such as offline message delivery, expanding the system to allow communication for a larger number of people, bridging isolated networks over both the Internet and the Invisible Internet (I2P), using Reticulum over Packet Radio, and using LoRa interfaces diretcly on Android devices. \ No newline at end of file diff --git a/Console/source/help.md b/Console/source/help.md index 037b8a9..e8bc520 100644 --- a/Console/source/help.md +++ b/Console/source/help.md @@ -1,10 +1,10 @@ [title]: <> (Get Help) ## Get Help -If you are having trouble, or if something is not working, these resources may be useful: +If you are having trouble, or if something is not working, this RNode contains a number of useful resources. -- The [Questions & Answers](qa.html) section -- The [No-Grid Communications Handbook](nghb.html) -- The [Reticulum Manual](manual/index.html) +- Read [Questions & Answers](qa.html) section +- Read the [Reticulum Manual](m/index.html) stored on this RNode +- Browse a copy of the [Reticulum Website](r/index.html) stored on this RNode ## Community & Support If things still aren't working as expected here are some great places to ask for help: diff --git a/Console/source/index.md b/Console/source/index.md index 680ebb9..ddab22c 100644 --- a/Console/source/index.md +++ b/Console/source/index.md @@ -1,14 +1,15 @@ - +## Hello! +
- - @@ -19,7 +20,7 @@ This repository also contains tools, software and information necessary to boots
You can browse this repository freely, or jump straight into a task-oriented workflow by selecting one of the starting points below.
- + diff --git a/Console/source/learn.md b/Console/source/learn.md new file mode 100644 index 0000000..d161830 --- /dev/null +++ b/Console/source/learn.md @@ -0,0 +1,11 @@ +[title]: <> (Learn More) +## Learn More +This RNode contains a selection of tutorials and guides on setting up communications, creating RNodes, building networks and using Reticulum. You can find additional information in the following sections: + +- The [Questions & Answers](qa.html) section +- The [Reticulum Manual](m/index.html) stored on this RNode +- A copy of the [Reticulum Website](r/index.html) stored on this RNode + +## Guides + +{TOPIC:guides} diff --git a/Console/source/replicate.md b/Console/source/replicate.md index 119d550..e133d72 100644 --- a/Console/source/replicate.md +++ b/Console/source/replicate.md @@ -1,3 +1,3 @@ [title]: <> (Replicate) -# Create RNodes +## Create RNodes This section contains the tools and guides necessary to create more RNodes. \ No newline at end of file diff --git a/Console/source/s_lxmf.md b/Console/source/s_lxmf.md new file mode 100644 index 0000000..0138cca --- /dev/null +++ b/Console/source/s_lxmf.md @@ -0,0 +1,24 @@ +[title]: <> (LXMF) +## LXMF +LXMF is a simple and flexible messaging format and delivery protocol that allows a wide variety of implementations, while using as little bandwidth as possible. It is built on top of [Reticulum](https://reticulum.network) and offers zero-conf message routing, end-to-end encryption and Forward Secrecy, and can be transported over any kind of medium that Reticulum supports. + +LXMF is efficient enough that it can deliver messages over extremely low-bandwidth systems such as packet radio or LoRa. Encrypted LXMF messages can also be encoded as QR-codes or text-based URIs, allowing completely analog *paper message* transport. + +Installing this LXMF library allows other programs on your system, like Nomad Network, to use the LXMF messaging system. It also includes the `lxmd` program that you can use to run LXMF propagation nodes on your network. + +**Local Installation** + +If you do not have access to the Internet, or would prefer to install LXMF directly from this RNode, you can use the following instructions. + +- Download the [{PKG_lxmf}]({ASSET_PATH}{PKG_lxmf}) package from this RNode and unzip it +- Install it with the command `pip install {PKG_NAME_lxmf}` +- Verify the installed Reticulum version by running `lxmd --version` + +If you do not have an Internet connection while installing make sure to install the [Reticulum](./s_rns.html) package first. + +**Online Installation** + +If you are connected to the Internet, you can try to install the latest version of LXMF via the `pip` package manager. + +- Install Nomad Network by running the command `pip install lxmf` +- Verify the installed Reticulum version by running `lxmd --version` \ No newline at end of file diff --git a/Console/source/s_nn.md b/Console/source/s_nn.md new file mode 100644 index 0000000..040d01e --- /dev/null +++ b/Console/source/s_nn.md @@ -0,0 +1,28 @@ +[title]: <> (Nomad Network) +## Nomad Network +Off-grid, resilient mesh communication with strong encryption, forward secrecy and extreme privacy. + +Nomad Network Allows you to build private and resilient communications platforms that are in complete control and ownership of the people that use them. No signups, no agreements, no handover of any data, no permissions and gatekeepers. + +![Screenshot]({ASSET_PATH}gfx/nn.webp) + +Nomad Network is build on [LXMF](lxmf.html) and [Reticulum]({ASSET_PATH}r/), which together provides the cryptographic mesh functionality and peer-to-peer message routing that Nomad Network relies on. This foundation also makes it possible to use the program over a very wide variety of communication mediums, from packet radio to fiber optics. + +Nomad Network does not need any connections to the public internet to work. In fact, it doesn't even need an IP or Ethernet network. You can use it entirely over packet radio, LoRa or even serial lines. But if you wish, you can bridge islanded networks over the Internet or private ethernet networks, or you can build networks running completely over the Internet. The choice is yours. + +### Local Installation + +If you do not have access to the Internet, or would prefer to install Nomad Network directly from this RNode, you can use the following instructions. + +- Download the [{PKG_nomadnet}]({ASSET_PATH}{PKG_nomadnet}) package from this RNode and unzip it +- Install it with the command `pip install {PKG_NAME_nomadnet}` +- Verify the installed Reticulum version by running `nomadnet --version` + +If you do not have an Internet connection while installing make sure to install the [Reticulum](./s_rns.html) and [LXMF](./s_lxmf.html) packages first. + +### Online Installation + +If you are connected to the Internet, you can try to install the latest version of Nomad Network via the `pip` package manager. + +- Install Nomad Network by running the command `pip install nomadnet` +- Verify the installed Reticulum version by running `nomadnet --version` \ No newline at end of file diff --git a/Console/source/s_rns.md b/Console/source/s_rns.md new file mode 100644 index 0000000..0eb6aa3 --- /dev/null +++ b/Console/source/s_rns.md @@ -0,0 +1,19 @@ +[title]: <> (Reticulum) +## Reticulum +The cryptographic networking stack for building resilient networks anywhere. This packages requires you have `python` and `pip` installed on your computer. This should come as standard on most operating systems released since 2020. + +### Local Installation +If you do not have access to the Internet, or would prefer to install Reticulum directly from this RNode, you can use the following instructions. + +- Download the [{PKG_rns}]({ASSET_PATH}{PKG_rns}) package from this RNode and unzip it +- Install it with the command `pip install {PKG_NAME_rns}` +- Verify the installed Reticulum version by running `rnstatus --version` + +### Online Installation +If you are connected to the Internet, you can try to install the latest version of Reticulum via the `pip` package manager. + +- Install Reticulum by running the command `pip install rns` +- Verify the installed Reticulum version by running `rnstatus --version` + +### Dependencies +If the installation has problems resolving dependencies, you can try to install the `python-cryptography`, `python-netifaces` and `python-pyserial` packages from your systems package manager, if they are locally available. If this is not possible, you please read the [Getting Started section of the Reticulum Manual]({ASSET_PATH}m/gettingstartedfast.html) for more detailed information. Specifically the [Pure-Python Reticulum]({ASSET_PATH}m/gettingstartedfast.html#pure-python-reticulum) section may be of use. \ No newline at end of file diff --git a/Console/source/s_sideband.md b/Console/source/s_sideband.md new file mode 100644 index 0000000..7b57c6e --- /dev/null +++ b/Console/source/s_sideband.md @@ -0,0 +1,13 @@ +[title]: <> (Nomad Network) +## Sideband +Sideband is an LXMF client for Android, Linux and macOS. It has built-in support for communicating over RNodes, and many other mediums, such as Packet Radio, WiFi, I2P, or anything else Reticulum supports. + +Sideband also supports exchanging messages through encrypted QR-codes on paper, or through messages embedded directly in lxm:// links. + +![Screenshot]({ASSET_PATH}gfx/sideband.webp) + +The installation files for the Sideband program is too large to be included on this RNode, but downloads for Linux, Android and macOS can be obtained from following sources: + +- The [Sideband page](https://unsigned.io/sideband/) on [unsigned.io](https://unsigned.io/) +- The [GitHub release page for Sideband](https://github.com/markqvist/Sideband/releases/latest) +- The [IzzyOnDroid repository for F-Droid](https://android.izzysoft.de/repo/apk/io.unsigned.sideband) diff --git a/Console/source/software.md b/Console/source/software.md index ff0adb6..8dfaf27 100644 --- a/Console/source/software.md +++ b/Console/source/software.md @@ -1,5 +1,5 @@ [title]: <> (Software) -# Software +## Software This RNode contains a repository of downloadable software and utilities, that are useful for bootstrapping communications networks, and for replicating RNodes. **Please Note!** Whenever you install software onto your computer, there is a risk that someone modified this software to include malicious code. Be extra careful installing anything from this RNode, if you did not get it from a source you trust, or if there is a risk it was modified in transit. @@ -7,88 +7,12 @@ This RNode contains a repository of downloadable software and utilities, that ar If possible, you can check that the `SHA-256` hashes of any downloaded files correspond to the list of release hashes published on the [Reticulum Release page](https://github.com/markqvist/Reticulum/releases). **You Have The Source!** Due to the size limitations of shipping all this software within an RNode, we don't include separate source-code archives for the below programs, but *all the source code is included within the Python .whl files*! You can simply unzip any of them with any program that understands `zip` files, and you will find the source code inside the unzipped directory (for some zip programs, you may need to change the file ending to `.zip`). - -## Reticulum -------------- -The cryptographic networking stack for building resilient networks anywhere. This packages requires you have `python` and `pip` installed on your computer. This should come as standard on most operating systems released since 2020. - -**Local Installation** - -If you do not have access to the Internet, or would prefer to install Reticulum directly from this RNode, you can use the following instructions. - -- Download the [{PKG_rns}]({ASSET_PATH}{PKG_rns}) package from this RNode and unzip it -- Install it with the command `pip install {PKG_NAME_rns}` -- Verify the installed Reticulum version by running `rnstatus --version` - -**Online Installation** - -If you are connected to the Internet, you can try to install the latest version of Reticulum via the `pip` package manager. - -- Install Reticulum by running the command `pip install rns` -- Verify the installed Reticulum version by running `rnstatus --version` - -If the installation has problems resolving dependencies, you can try to install the `python-cryptography`, `python-netifaces` and `python-pyserial` packages from your systems package manager, if they are locally available. If this is not possible, you please read the [Getting Started section of the Reticulum Manual]({ASSET_PATH}manual/gettingstartedfast.html) for more detailed information. - -## LXMF -------------- -LXMF is a simple and flexible messaging format and delivery protocol that allows a wide variety of implementations, while using as little bandwidth as possible. It is built on top of [Reticulum](https://reticulum.network) and offers zero-conf message routing, end-to-end encryption and Forward Secrecy, and can be transported over any kind of medium that Reticulum supports. - -LXMF is efficient enough that it can deliver messages over extremely low-bandwidth systems such as packet radio or LoRa. Encrypted LXMF messages can also be encoded as QR-codes or text-based URIs, allowing completely analog *paper message* transport. - -Installing this LXMF library allows other programs on your system, like Nomad Network, to use the LXMF messaging system. It also includes the `lxmd` program that you can use to run LXMF propagation nodes on your network. - -**Local Installation** - -If you do not have access to the Internet, or would prefer to install LXMF directly from this RNode, you can use the following instructions. - -- Download the [{PKG_lxmf}]({ASSET_PATH}{PKG_lxmf}) package from this RNode and unzip it -- Install it with the command `pip install {PKG_NAME_lxmf}` -- Verify the installed Reticulum version by running `lxmd --version` - -**Online Installation** - -If you are connected to the Internet, you can try to install the latest version of LXMF via the `pip` package manager. - -- Install Nomad Network by running the command `pip install lxmf` -- Verify the installed Reticulum version by running `lxmd --version` - -## Nomad Network -------------- -Off-grid, resilient mesh communication with strong encryption, forward secrecy and extreme privacy. - -Nomad Network Allows you to build private and resilient communications platforms that are in complete control and ownership of the people that use them. No signups, no agreements, no handover of any data, no permissions and gatekeepers. - -![Screenshot]({ASSET_PATH}gfx/nn.webp) - -Nomad Network is build on [LXMF](lxmf.html) and [Reticulum]({ASSET_PATH}r/), which together provides the cryptographic mesh functionality and peer-to-peer message routing that Nomad Network relies on. This foundation also makes it possible to use the program over a very wide variety of communication mediums, from packet radio to fiber optics. - -Nomad Network does not need any connections to the public internet to work. In fact, it doesn't even need an IP or Ethernet network. You can use it entirely over packet radio, LoRa or even serial lines. But if you wish, you can bridge islanded networks over the Internet or private ethernet networks, or you can build networks running completely over the Internet. The choice is yours. - -**Local Installation** - -If you do not have access to the Internet, or would prefer to install Nomad Network directly from this RNode, you can use the following instructions. - -- Download the [{PKG_nomadnet}]({ASSET_PATH}{PKG_nomadnet}) package from this RNode and unzip it -- Install it with the command `pip install {PKG_NAME_nomadnet}` -- Verify the installed Reticulum version by running `nomadnet --version` - -**Online Installation** - -If you are connected to the Internet, you can try to install the latest version of Nomad Network via the `pip` package manager. - -- Install Nomad Network by running the command `pip install nomadnet` -- Verify the installed Reticulum version by running `nomadnet --version` - -## Sideband -------------- -Sideband is an LXMF client for Android, Linux and macOS. It has built-in support for communicating over RNodes, and many other mediums, such as Packet Radio, WiFi, I2P, or anything else Reticulum supports. - -Sideband also supports exchanging messages through encrypted QR-codes on paper, or through messages embedded directly in lxm:// links. - -![Screenshot]({ASSET_PATH}gfx/sideband.webp) - -The installation files for the Sideband program is too large to be included on this RNode, but downloads for Linux, Android and macOS can be obtained from following sources: - -- The [Sideband page](https://unsigned.io/sideband/) on [unsigned.io](https://unsigned.io/) -- The [GitHub release page for Sideband](https://github.com/markqvist/Sideband/releases/latest) -- The [IzzyOnDroid repository for F-Droid](https://android.izzysoft.de/repo/apk/io.unsigned.sideband) +

+
+

Choose a software package to get started

+
+ + + + +
\ No newline at end of file
Hello!
+
You have connected to the RNode Bootstrap Console.

The tools and information contained in this RNode will allow you to replicate the design, build more RNodes and grow your communications ecosystems.

This repository also contains tools, software and information necessary to bootstrap networks and communications systems based on Reticulum and RNodes.
+