2022-09-30 10:43:04 -06:00
<!doctype html>
< html class = "no-js" lang = "en" >
< head > < meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width,initial-scale=1" / >
< meta name = "color-scheme" content = "light dark" > < meta name = "generator" content = "Docutils 0.17.1: http://docutils.sourceforge.net/" / >
< link rel = "index" title = "Index" href = "genindex.html" / > < link rel = "search" title = "Search" href = "search.html" / > < link rel = "next" title = "Using Reticulum on Your System" href = "using.html" / > < link rel = "prev" title = "What is Reticulum?" href = "whatis.html" / >
2021-05-16 15:40:49 -06:00
2022-09-30 10:43:04 -06:00
< meta name = "generator" content = "sphinx-5.2.2, furo 2022.09.29" / >
< title > Getting Started Fast - Reticulum Network Stack 0.3.12 beta documentation< / title >
< link rel = "stylesheet" type = "text/css" href = "_static/pygments.css" / >
< link rel = "stylesheet" type = "text/css" href = "_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" / >
< link rel = "stylesheet" type = "text/css" href = "_static/copybutton.css" / >
< link rel = "stylesheet" type = "text/css" href = "_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" / >
< link rel = "stylesheet" type = "text/css" href = "_static/custom.css" / >
2021-05-16 15:40:49 -06:00
2022-09-29 16:02:15 -06:00
2022-09-30 10:43:04 -06:00
< style >
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
--color-background-primary: #202b38;
--color-background-secondary: #161f27;
--color-foreground-primary: #dbdbdb;
--color-foreground-secondary: #a9b1ba;
--color-brand-primary: #41adff;
--color-background-hover: #161f27;
--color-api-name: #ffbe85;
--color-api-pre-name: #efae75;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
--color-background-primary: #202b38;
--color-background-secondary: #161f27;
--color-foreground-primary: #dbdbdb;
--color-foreground-secondary: #a9b1ba;
--color-brand-primary: #41adff;
--color-background-hover: #161f27;
--color-api-name: #ffbe85;
--color-api-pre-name: #efae75;
}
}
}
< / style > < / head >
< body >
2021-05-16 15:40:49 -06:00
2022-09-30 10:43:04 -06:00
< script >
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
< / script >
2021-05-16 15:40:49 -06:00
2022-09-30 10:43:04 -06:00
< svg xmlns = "http://www.w3.org/2000/svg" style = "display: none;" >
< symbol id = "svg-toc" viewBox = "0 0 24 24" >
< title > Contents< / title >
< svg stroke = "currentColor" fill = "currentColor" stroke-width = "0" viewBox = "0 0 1024 1024" >
< path d = "M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z" / >
< / svg >
< / symbol >
< symbol id = "svg-menu" viewBox = "0 0 24 24" >
< title > Menu< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
< line x1 = "3" y1 = "12" x2 = "21" y2 = "12" > < / line >
< line x1 = "3" y1 = "6" x2 = "21" y2 = "6" > < / line >
< line x1 = "3" y1 = "18" x2 = "21" y2 = "18" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-arrow-right" viewBox = "0 0 24 24" >
< title > Expand< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
< polyline points = "9 18 15 12 9 6" > < / polyline >
< / svg >
< / symbol >
< symbol id = "svg-sun" viewBox = "0 0 24 24" >
< title > Light mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
< circle cx = "12" cy = "12" r = "5" > < / circle >
< line x1 = "12" y1 = "1" x2 = "12" y2 = "3" > < / line >
< line x1 = "12" y1 = "21" x2 = "12" y2 = "23" > < / line >
< line x1 = "4.22" y1 = "4.22" x2 = "5.64" y2 = "5.64" > < / line >
< line x1 = "18.36" y1 = "18.36" x2 = "19.78" y2 = "19.78" > < / line >
< line x1 = "1" y1 = "12" x2 = "3" y2 = "12" > < / line >
< line x1 = "21" y1 = "12" x2 = "23" y2 = "12" > < / line >
< line x1 = "4.22" y1 = "19.78" x2 = "5.64" y2 = "18.36" > < / line >
< line x1 = "18.36" y1 = "5.64" x2 = "19.78" y2 = "4.22" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-moon" viewBox = "0 0 24 24" >
< title > Dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< path d = "M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" / >
< / svg >
< / symbol >
< symbol id = "svg-sun-half" viewBox = "0 0 24 24" >
< title > Auto light/dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< circle cx = "12" cy = "12" r = "9" / >
< path d = "M13 12h5" / >
< path d = "M13 15h4" / >
< path d = "M13 18h1" / >
< path d = "M13 9h4" / >
< path d = "M13 6h1" / >
< / svg >
< / symbol >
< / svg >
< input type = "checkbox" class = "sidebar-toggle" name = "__navigation" id = "__navigation" >
< input type = "checkbox" class = "sidebar-toggle" name = "__toc" id = "__toc" >
< label class = "overlay sidebar-overlay" for = "__navigation" >
< div class = "visually-hidden" > Hide navigation sidebar< / div >
< / label >
< label class = "overlay toc-overlay" for = "__toc" >
< div class = "visually-hidden" > Hide table of contents sidebar< / div >
< / label >
< div class = "page" >
< header class = "mobile-header" >
< div class = "header-left" >
< label class = "nav-overlay-icon" for = "__navigation" >
< div class = "visually-hidden" > Toggle site navigation sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-menu" > < / use > < / svg > < / i >
< / label >
< / div >
< div class = "header-center" >
< a href = "index.html" > < div class = "brand" > Reticulum Network Stack 0.3.12 beta documentation< / div > < / a >
< / div >
< div class = "header-right" >
< div class = "theme-toggle-container theme-toggle-header" >
< button class = "theme-toggle" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" > < use href = "#svg-sun-half" > < / use > < / svg >
< svg class = "theme-icon-when-dark" > < use href = "#svg-moon" > < / use > < / svg >
< svg class = "theme-icon-when-light" > < use href = "#svg-sun" > < / use > < / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-header-icon" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-toc" > < / use > < / svg > < / i >
< / label >
< / div >
< / header >
< aside class = "sidebar-drawer" >
< div class = "sidebar-container" >
< div class = "sidebar-sticky" > < a class = "sidebar-brand centered" href = "index.html" >
< div class = "sidebar-logo-container" >
< img class = "sidebar-logo" src = "_static/rns_logo_512.png" alt = "Logo" / >
< / div >
< span class = "sidebar-brand-text" > Reticulum Network Stack 0.3.12 beta documentation< / span >
< / a > < form class = "sidebar-search-container" method = "get" action = "search.html" role = "search" >
< input class = "sidebar-search" placeholder = Search name = "q" aria-label = "Search" >
< input type = "hidden" name = "check_keywords" value = "yes" >
< input type = "hidden" name = "area" value = "default" >
< / form >
< div id = "searchbox" > < / div > < div class = "sidebar-scroll" > < div class = "sidebar-tree" >
< ul class = "current" >
< li class = "toctree-l1" > < a class = "reference internal" href = "whatis.html" > What is Reticulum?< / a > < / li >
< li class = "toctree-l1 current current-page" > < a class = "current reference internal" href = "#" > Getting Started Fast< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "using.html" > Using Reticulum on Your System< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "understanding.html" > Understanding Reticulum< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "hardware.html" > Communications Hardware< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "interfaces.html" > Supported Interfaces< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "networks.html" > Building Networks< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "examples.html" > Code Examples< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "support.html" > Support Reticulum< / a > < / li >
< / ul >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "reference.html" > API Reference< / a > < / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
< / aside >
< div class = "main" >
< div class = "content" >
< div class = "article-container" >
< a href = "#" class = "back-to-top muted-link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" >
< path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z" > < / path >
< / svg >
< span > Back to top< / span >
< / a >
< div class = "content-icon-container" >
< div class = "theme-toggle-container theme-toggle-content" >
< button class = "theme-toggle" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" > < use href = "#svg-sun-half" > < / use > < / svg >
< svg class = "theme-icon-when-dark" > < use href = "#svg-moon" > < / use > < / svg >
< svg class = "theme-icon-when-light" > < use href = "#svg-sun" > < / use > < / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-content-icon" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-toc" > < / use > < / svg > < / i >
< / label >
< / div >
< article role = "main" >
< section id = "getting-started-fast" >
< h1 > Getting Started Fast< a class = "headerlink" href = "#getting-started-fast" title = "Permalink to this heading" > #< / a > < / h1 >
2021-05-16 15:40:49 -06:00
< p > The best way to get started with the Reticulum Network Stack depends on what
you want to do. This guide will outline sensible starting paths for different
scenarios.< / p >
2022-09-29 16:02:15 -06:00
< section id = "try-using-a-reticulum-based-program" >
2022-09-30 10:43:04 -06:00
< h2 > Try Using a Reticulum-based Program< a class = "headerlink" href = "#try-using-a-reticulum-based-program" title = "Permalink to this heading" > #< / a > < / h2 >
2022-04-28 02:19:43 -06:00
< p > If you simply want to try using a program built with Reticulum, a few different
programs exist that allow basic communication and a range of other useful functions
over even extremely low-bandwidth Reticulum networks.< / p >
< p > These programs will let you get a feel for how Reticulum works. They have been designed
to run well over networks based on LoRa or packet radio, but can also be used completely
2022-08-25 03:00:30 -06:00
over local WiFi, wired Ethernet, the Internet, or any combination.< / p >
2022-04-28 02:19:43 -06:00
< p > As such, it is easy to get started experimenting, without having to set up any radio
transceivers or infrastructure just to try it out. Launching the programs on separate
devices connected to the same WiFi network is enough to get started, and physical
radio interfaces can then be added later.< / p >
2022-09-29 16:02:15 -06:00
< section id = "nomad-network" >
2022-09-30 10:43:04 -06:00
< h3 > Nomad Network< a class = "headerlink" href = "#nomad-network" title = "Permalink to this heading" > #< / a > < / h3 >
2022-04-28 02:19:43 -06:00
< p > The terminal-based program < a class = "reference external" href = "https://github.com/markqvist/nomadnet" > Nomad Network< / a >
provides a complete encrypted communications suite built with Reticulum. It features
encrypted messaging (both direct and delayed-delivery for offline users), file sharing,
and has a built-in text-browser and page server with support for dynamically rendered pages,
user authentication and more.< / p >
2021-09-18 08:29:47 -06:00
< a class = "reference external image-reference" href = "_images/nomadnet_3.png" > < img alt = "_images/nomadnet_3.png" src = "_images/nomadnet_3.png" / > < / a >
2021-05-17 12:01:53 -06:00
< p > < a class = "reference external" href = "https://github.com/markqvist/nomadnet" > Nomad Network< / a > is a user-facing client
2021-12-06 06:10:22 -07:00
for the messaging and information-sharing protocol
2021-05-17 12:01:53 -06:00
< a class = "reference external" href = "https://github.com/markqvist/lxmf" > LXMF< / a > , another project built with Reticulum.< / p >
2021-09-18 08:29:47 -06:00
< p > You can install Nomad Network via pip:< / p >
2021-09-25 13:39:31 -06:00
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # Install ...< / span >
2021-09-18 08:29:47 -06:00
< span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > nomadnet< / span >
2021-09-25 13:39:31 -06:00
< span class = "c1" > # ... and run< / span >
2021-09-18 08:29:47 -06:00
< span class = "n" > nomadnet< / span >
< / pre > < / div >
< / div >
2022-02-22 13:39:16 -07:00
< p > < strong > Please Note< / strong > : If this is the very first time you use pip to install a program
on your system, you might need to reboot your system for your program to become
available. If you get a “command not found” error or similar when running the
program, reboot your system and try again.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "sideband" >
2022-09-30 10:43:04 -06:00
< h3 > Sideband< a class = "headerlink" href = "#sideband" title = "Permalink to this heading" > #< / a > < / h3 >
2022-04-07 10:59:42 -06:00
< p > If you would rather use a program with a graphical user interface, you can take
a look at < a class = "reference external" href = "https://unsigned.io/sideband" > Sideband< / a > , which is available for Android,
Linux and macOS.< / p >
2022-07-07 16:32:03 -06:00
< a class = "reference external image-reference" href = "_images/sideband_1.png" > < img alt = "_images/sideband_1.png" class = "align-center" src = "_images/sideband_1.png" / > < / a >
2022-04-28 02:19:43 -06:00
< p > Sideband is currently in the early stages of development, but already provides basic
communication features, and interoperates with Nomad Network, or any other LXMF client.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< / section >
< section id = "using-the-included-utilities" >
2022-09-30 10:43:04 -06:00
< h2 > Using the Included Utilities< a class = "headerlink" href = "#using-the-included-utilities" title = "Permalink to this heading" > #< / a > < / h2 >
2021-10-08 10:30:17 -06:00
< p > Reticulum comes with a range of included utilities that make it easier to
manage your network, check connectivity and make Reticulum available to other
programs on your system.< / p >
< p > You can use < code class = "docutils literal notranslate" > < span class = "pre" > rnsd< / span > < / code > to run Reticulum as a background or foreground service,
and the < code class = "docutils literal notranslate" > < span class = "pre" > rnstatus< / span > < / code > , < code class = "docutils literal notranslate" > < span class = "pre" > rnpath< / span > < / code > and < code class = "docutils literal notranslate" > < span class = "pre" > rnprobe< / span > < / code > utilities to view and query
network status and connectivity.< / p >
< p > To learn more about these utility programs, have a look at the
< a class = "reference internal" href = "using.html#using-main" > < span class = "std std-ref" > Using Reticulum on Your System< / span > < / a > chapter of this manual.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "creating-a-network-with-reticulum" >
2022-09-30 10:43:04 -06:00
< h2 > Creating a Network With Reticulum< a class = "headerlink" href = "#creating-a-network-with-reticulum" title = "Permalink to this heading" > #< / a > < / h2 >
2021-09-25 13:39:31 -06:00
< p > To create a network, you will need to specify one or more < em > interfaces< / em > for
Reticulum to use. This is done in the Reticulum configuration file, which by
2022-09-14 10:39:39 -06:00
default is located at < code class = "docutils literal notranslate" > < span class = "pre" > ~/.config/reticulum/config< / span > < / code > . You can edit this file by hand,
2021-12-06 06:10:22 -07:00
or use the interactive < code class = "docutils literal notranslate" > < span class = "pre" > rnsconfig< / span > < / code > utility.< / p >
2021-09-25 13:39:31 -06:00
< p > When Reticulum is started for the first time, it will create a default
configuration file, with one active interface. This default interface uses
2022-08-25 03:00:30 -06:00
your existing Ethernet and WiFi networks (if any), and only allows you to
2022-04-07 10:59:42 -06:00
communicate with other Reticulum peers within your local broadcast domains.< / p >
2021-09-25 13:39:31 -06:00
< p > To communicate further, you will have to add one or more interfaces. The default
configuration includes a number of examples, ranging from using TCP over the
internet, to LoRa and Packet Radio interfaces.< / p >
2022-04-07 10:59:42 -06:00
< p > With Reticulum, you only need to configure what interfaces you want to communicate
over. There is no need to configure address spaces, subnets, routing tables,
or other things you might be used to from other network types.< / p >
2022-06-22 07:19:18 -06:00
< p > Once Reticulum knows which interfaces it should use, it will automatically
2022-04-07 10:59:42 -06:00
discover topography and configure transport of data to any destinations it
knows about.< / p >
2022-08-25 03:00:30 -06:00
< p > In situations where you already have an established WiFi or Ethernet network, and
2022-06-22 07:19:18 -06:00
many devices that want to utilise the same external Reticulum network paths (for example over
2022-04-28 02:19:43 -06:00
LoRa), it will often be sufficient to let one system act as a Reticulum gateway, by
2022-06-22 07:19:18 -06:00
adding any external interfaces to the configuration of this system, and then enabling transport on it. Any
2022-04-28 02:19:43 -06:00
other device on your local WiFi will then be able to connect to this wider Reticulum
2022-06-22 07:19:18 -06:00
network just using the default (< a class = "reference internal" href = "interfaces.html#interfaces-auto" > < span class = "std std-ref" > AutoInterface< / span > < / a > ) configuration.< / p >
2021-09-25 15:22:33 -06:00
< p > Possibly, the examples in the config file are enough to get you started. If
you want more information, you can read the < a class = "reference internal" href = "networks.html#networks-main" > < span class = "std std-ref" > Building Networks< / span > < / a >
and < a class = "reference internal" href = "interfaces.html#interfaces-main" > < span class = "std std-ref" > Interfaces< / span > < / a > chapters of this manual.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "connecting-reticulum-instances-over-the-internet" >
2022-09-30 10:43:04 -06:00
< h2 > Connecting Reticulum Instances Over the Internet< a class = "headerlink" href = "#connecting-reticulum-instances-over-the-internet" title = "Permalink to this heading" > #< / a > < / h2 >
2022-04-28 02:19:43 -06:00
< p > Reticulum currently offers two interfaces suitable for connecting instances over the Internet: < a class = "reference internal" href = "interfaces.html#interfaces-tcps" > < span class = "std std-ref" > TCP< / span > < / a >
2022-04-07 10:59:42 -06:00
and < a class = "reference internal" href = "interfaces.html#interfaces-i2p" > < span class = "std std-ref" > I2P< / span > < / a > . Each interface offers a different set of features, and Reticulum
2022-04-02 02:05:46 -06:00
users should carefully choose the interface which best suites their needs.< / p >
2022-04-07 10:59:42 -06:00
< p > The < code class = "docutils literal notranslate" > < span class = "pre" > TCPServerInterface< / span > < / code > allows users to host an instance accessible over TCP/IP. This
2022-04-02 02:05:46 -06:00
method is generally faster, lower latency, and more energy efficient than using < code class = "docutils literal notranslate" > < span class = "pre" > I2PInterface< / span > < / code > ,
2022-04-28 02:19:43 -06:00
however it also leaks more data about the server host.< / p >
< p > TCP connections reveal the IP address of both your instance and the server to anyone who can
inspect the connection. Someone could use this information to determine your location or identity. Adversaries
2022-04-07 12:15:35 -06:00
inspecting your packets may be able to record packet metadata like time of transmission and packet size.
Even though Reticulum encrypts traffic, TCP does not, so an adversary may be able to use
2022-08-25 03:00:30 -06:00
packet inspection to learn that a system is running Reticulum, and what other IP addresses connect to it.
2022-04-07 12:15:35 -06:00
Hosting a publicly reachable instance over TCP also requires a publicly reachable IP address,
which most Internet connections don’ t offer anymore.< / p >
2022-04-02 02:05:46 -06:00
< p > The < code class = "docutils literal notranslate" > < span class = "pre" > I2PInterface< / span > < / code > routes messages through the < a class = "reference external" href = "https://geti2p.net/en/" > Invisible Internet Protocol
2022-06-22 07:19:18 -06:00
(I2P)< / a > . To use this interface, users must also run an I2P daemon in
2022-04-28 02:19:43 -06:00
parallel to < code class = "docutils literal notranslate" > < span class = "pre" > rnsd< / span > < / code > . For always-on I2P nodes it is recommended to use < a class = "reference external" href = "https://i2pd.website/" > i2pd< / a > .< / p >
< p > By default, I2P will encrypt and mix all traffic sent over the Internet, and
2022-04-07 12:15:35 -06:00
hide both the sender and receiver Reticulum instance IP addresses. Running an I2P node
2022-04-02 02:05:46 -06:00
will also relay other I2P user’ s encrypted packets, which will use extra
bandwidth and compute power, but also makes timing attacks and other forms of
2022-04-07 12:15:35 -06:00
deep-packet-inspection much more difficult.< / p >
2022-08-25 03:00:30 -06:00
< p > I2P also allows users to host globally available Reticulum instances from non-public IP’ s and behind firewalls and NAT.< / p >
< p > In general it is recommended to use an I2P node if you want to host a publicly accessible
2022-04-07 10:59:42 -06:00
instance, while preserving anonymity. If you care more about performance, and a slightly
easier setup, use TCP.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "connect-to-the-public-testnet" >
2022-09-30 10:43:04 -06:00
< h2 > Connect to the Public Testnet< a class = "headerlink" href = "#connect-to-the-public-testnet" title = "Permalink to this heading" > #< / a > < / h2 >
2022-04-07 12:15:35 -06:00
< p > An experimental public testnet has been made accessible over both I2P and TCP. You can join it
by adding one of the following interfaces to your < code class = "docutils literal notranslate" > < span class = "pre" > .reticulum/config< / span > < / code > file:< / p >
2022-07-01 15:34:02 -06:00
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # TCP/IP interface to the Dublin hub< / span >
< span class = "p" > [[< / span > < span class = "n" > RNS< / span > < span class = "n" > Testnet< / span > < span class = "n" > Dublin< / span > < span class = "p" > ]]< / span >
2022-04-02 02:05:46 -06:00
< span class = "nb" > type< / span > < span class = "o" > =< / span > < span class = "n" > TCPClientInterface< / span >
2022-07-01 15:34:02 -06:00
< span class = "n" > enabled< / span > < span class = "o" > =< / span > < span class = "n" > yes< / span >
< span class = "n" > target_host< / span > < span class = "o" > =< / span > < span class = "n" > dublin< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "o" > .< / span > < span class = "n" > reticulum< / span > < span class = "o" > .< / span > < span class = "n" > network< / span >
2022-04-02 02:05:46 -06:00
< span class = "n" > target_port< / span > < span class = "o" > =< / span > < span class = "mi" > 4965< / span >
2022-07-01 15:34:02 -06:00
< span class = "c1" > # TCP/IP interface to the Frankfurt hub< / span >
< span class = "p" > [[< / span > < span class = "n" > RNS< / span > < span class = "n" > Testnet< / span > < span class = "n" > Dublin< / span > < span class = "p" > ]]< / span >
< span class = "nb" > type< / span > < span class = "o" > =< / span > < span class = "n" > TCPClientInterface< / span >
< span class = "n" > enabled< / span > < span class = "o" > =< / span > < span class = "n" > yes< / span >
< span class = "n" > target_host< / span > < span class = "o" > =< / span > < span class = "n" > frankfurt< / span > < span class = "o" > .< / span > < span class = "n" > connect< / span > < span class = "o" > .< / span > < span class = "n" > reticulum< / span > < span class = "o" > .< / span > < span class = "n" > network< / span >
< span class = "n" > target_port< / span > < span class = "o" > =< / span > < span class = "mi" > 5377< / span >
2022-04-02 02:05:46 -06:00
2022-07-01 15:34:02 -06:00
< span class = "c1" > # Interface to I2P hub A< / span >
< span class = "p" > [[< / span > < span class = "n" > RNS< / span > < span class = "n" > Testnet< / span > < span class = "n" > I2P< / span > < span class = "n" > Hub< / span > < span class = "n" > A< / span > < span class = "p" > ]]< / span >
2022-04-02 02:05:46 -06:00
< span class = "nb" > type< / span > < span class = "o" > =< / span > < span class = "n" > I2PInterface< / span >
2022-07-01 15:34:02 -06:00
< span class = "n" > enabled< / span > < span class = "o" > =< / span > < span class = "n" > yes< / span >
< span class = "n" > peers< / span > < span class = "o" > =< / span > < span class = "n" > uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua< / span > < span class = "o" > .< / span > < span class = "n" > b32< / span > < span class = "o" > .< / span > < span class = "n" > i2p< / span >
2022-04-02 02:05:46 -06:00
< / pre > < / div >
< / div >
2022-04-07 12:15:35 -06:00
< p > Many other Reticulum instances are connecting to this testnet, and you can also join it
via other entry points if you know them. There is absolutely no control over the network
topography, usage or what types of instances connect. It will also occasionally be used
to test various failure scenarios, and there are no availability or service guarantees.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "adding-radio-interfaces" >
2022-09-30 10:43:04 -06:00
< h2 > Adding Radio Interfaces< a class = "headerlink" href = "#adding-radio-interfaces" title = "Permalink to this heading" > #< / a > < / h2 >
2022-06-22 07:19:18 -06:00
< p > Once you have Reticulum installed and working, you can add radio interfaces with
any compatible hardware you have available. Reticulum supports a wide range of radio
hardware, and if you already have any available, it is very likely that it will
work with Reticulum. For information on how to configure this, see the
< a class = "reference internal" href = "interfaces.html#interfaces-main" > < span class = "std std-ref" > Interfaces< / span > < / a > section of this manual.< / p >
< p > If you do not already have transceiver hardware available, you can easily and
cheaply build an < a class = "reference internal" href = "hardware.html#rnode-main" > < span class = "std std-ref" > RNode< / span > < / a > , which is a general-purpose long-range
digital radio transceiver, that integrates easily with Reticulum.< / p >
< p > To build one yourself requires installing a custom firmware on a supported LoRa
development board with an auto-install script. Please see the < a class = "reference internal" href = "hardware.html#hardware-main" > < span class = "std std-ref" > Communications Hardware< / span > < / a >
chapter for a guide. If you prefer purchasing a ready-made unit, you can refer to the
< a class = "reference internal" href = "hardware.html#rnode-suppliers" > < span class = "std std-ref" > list of suppliers< / span > < / a > . For more information on RNode, you can also
refer to these additional external resources:< / p >
< ul class = "simple" >
< li > < p > < a class = "reference external" href = "https://unsigned.io/how-to-make-your-own-rnodes/" > How To Make Your Own RNodes< / a > < / p > < / li >
< li > < p > < a class = "reference external" href = "https://unsigned.io/installing-rnode-firmware-on-t-beam-and-lora32-devices/" > Installing RNode Firmware on Compatible LoRa Devices< / a > < / p > < / li >
< li > < p > < a class = "reference external" href = "https://unsigned.io/private-messaging-over-lora/" > Private, Secure and Uncensorable Messaging Over a LoRa Mesh< / a > < / p > < / li >
< li > < p > < a class = "reference external" href = "https://github.com/markqvist/RNode_Firmware/" > RNode Firmware< / a > < / p > < / li >
< / ul >
< p > If you have communications hardware that is not already supported by any of the
< a class = "reference internal" href = "interfaces.html#interfaces-main" > < span class = "std std-ref" > existing interface types< / span > < / a > , but you think would be suitable for use with Reticulum,
you are welcome to head over to the < a class = "reference external" href = "https://github.com/markqvist/Reticulum/discussions" > GitHub discussion pages< / a >
and propose adding an interface for the hardware.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "develop-a-program-with-reticulum" >
2022-09-30 10:43:04 -06:00
< h2 > Develop a Program with Reticulum< a class = "headerlink" href = "#develop-a-program-with-reticulum" title = "Permalink to this heading" > #< / a > < / h2 >
2021-05-16 15:40:49 -06:00
< p > If you want to develop programs that use Reticulum, the easiest way to get
2021-05-20 08:06:12 -06:00
started is to install the latest release of Reticulum via pip:< / p >
2021-05-16 15:40:49 -06:00
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > rns< / span >
< / pre > < / div >
< / div >
< p > The above command will install Reticulum and dependencies, and you will be
ready to import and use RNS in your own programs. The next step will most
likely be to look at some < a class = "reference internal" href = "examples.html#examples-main" > < span class = "std std-ref" > Example Programs< / span > < / a > .< / p >
2021-12-02 10:33:00 -07:00
< p > For extended functionality, you can install optional dependencies:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > pyserial< / span > < span class = "n" > netifaces< / span >
< / pre > < / div >
< / div >
2021-05-16 15:40:49 -06:00
< p > Further information can be found in the < a class = "reference internal" href = "reference.html#api-main" > < span class = "std std-ref" > API Reference< / span > < / a > .< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "participate-in-reticulum-development" >
2022-09-30 10:43:04 -06:00
< h2 > Participate in Reticulum Development< a class = "headerlink" href = "#participate-in-reticulum-development" title = "Permalink to this heading" > #< / a > < / h2 >
2021-05-16 15:40:49 -06:00
< p > If you want to participate in the development of Reticulum and associated
utilities, you’ ll want to get the latest source from GitHub. In that case,
don’ t use pip, but try this recipe:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # Install dependencies< / span >
2021-09-25 13:39:31 -06:00
< span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > cryptography< / span > < span class = "n" > pyserial< / span > < span class = "n" > netifaces< / span >
2021-05-16 15:40:49 -06:00
< span class = "c1" > # Clone repository< / span >
< span class = "n" > git< / span > < span class = "n" > clone< / span > < span class = "n" > https< / span > < span class = "p" > :< / span > < span class = "o" > //< / span > < span class = "n" > github< / span > < span class = "o" > .< / span > < span class = "n" > com< / span > < span class = "o" > /< / span > < span class = "n" > markqvist< / span > < span class = "o" > /< / span > < span class = "n" > Reticulum< / span > < span class = "o" > .< / span > < span class = "n" > git< / span >
< span class = "c1" > # Move into Reticulum folder and symlink library to examples folder< / span >
< span class = "n" > cd< / span > < span class = "n" > Reticulum< / span >
< span class = "n" > ln< / span > < span class = "o" > -< / span > < span class = "n" > s< / span > < span class = "o" > ../< / span > < span class = "n" > RNS< / span > < span class = "o" > ./< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span >
< span class = "c1" > # Run an example< / span >
< span class = "n" > python3< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span > < span class = "n" > Echo< / span > < span class = "o" > .< / span > < span class = "n" > py< / span > < span class = "o" > -< / span > < span class = "n" > s< / span >
< span class = "c1" > # Unless you' ve manually created a config file, Reticulum will do so now,< / span >
< span class = "c1" > # and immediately exit. Make any necessary changes to the file:< / span >
2022-09-14 10:39:39 -06:00
< span class = "n" > nano< / span > < span class = "o" > ~/.< / span > < span class = "n" > config< / span > < span class = "o" > /< / span > < span class = "n" > reticulum< / span > < span class = "o" > /< / span > < span class = "n" > config< / span >
2021-05-16 15:40:49 -06:00
< span class = "c1" > # ... and launch the example again.< / span >
< span class = "n" > python3< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span > < span class = "n" > Echo< / span > < span class = "o" > .< / span > < span class = "n" > py< / span > < span class = "o" > -< / span > < span class = "n" > s< / span >
< span class = "c1" > # You can now repeat the process on another computer,< / span >
< span class = "c1" > # and run the same example with -h to get command line options.< / span >
< span class = "n" > python3< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span > < span class = "n" > Echo< / span > < span class = "o" > .< / span > < span class = "n" > py< / span > < span class = "o" > -< / span > < span class = "n" > h< / span >
< span class = "c1" > # Run the example in client mode to " ping" the server.< / span >
< span class = "c1" > # Replace the hash below with the actual destination hash of your server.< / span >
< span class = "n" > python3< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span > < span class = "n" > Echo< / span > < span class = "o" > .< / span > < span class = "n" > py< / span > < span class = "mf" > 3e12< / span > < span class = "n" > fc71692f8ec47bc5< / span >
< span class = "c1" > # Have a look at another example< / span >
< span class = "n" > python3< / span > < span class = "n" > Examples< / span > < span class = "o" > /< / span > < span class = "n" > Filetransfer< / span > < span class = "o" > .< / span > < span class = "n" > py< / span > < span class = "o" > -< / span > < span class = "n" > h< / span >
< / pre > < / div >
< / div >
< p > When you have experimented with the basic examples, it’ s time to go read the
< a class = "reference internal" href = "understanding.html#understanding-main" > < span class = "std std-ref" > Understanding Reticulum< / span > < / a > chapter.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "reticulum-on-arm64" >
2022-09-30 10:43:04 -06:00
< h2 > Reticulum on ARM64< a class = "headerlink" href = "#reticulum-on-arm64" title = "Permalink to this heading" > #< / a > < / h2 >
2021-12-09 10:12:18 -07:00
< p > On some architectures, including ARM64, not all dependencies have precompiled
binaries. On such systems, you will need to install < code class = "docutils literal notranslate" > < span class = "pre" > python3-dev< / span > < / code > before
installing Reticulum or programs that depend on Reticulum.< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # Install Python and development packages< / span >
< span class = "n" > sudo< / span > < span class = "n" > apt< / span > < span class = "n" > update< / span >
< span class = "n" > sudo< / span > < span class = "n" > apt< / span > < span class = "n" > install< / span > < span class = "n" > python3< / span > < span class = "n" > python3< / span > < span class = "o" > -< / span > < span class = "n" > pip< / span > < span class = "n" > python3< / span > < span class = "o" > -< / span > < span class = "n" > dev< / span >
< span class = "c1" > # Install Reticulum< / span >
< span class = "n" > python3< / span > < span class = "o" > -< / span > < span class = "n" > m< / span > < span class = "n" > pip< / span > < span class = "n" > install< / span > < span class = "n" > rns< / span >
< / pre > < / div >
< / div >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "reticulum-on-android" >
2022-09-30 10:43:04 -06:00
< h2 > Reticulum on Android< a class = "headerlink" href = "#reticulum-on-android" title = "Permalink to this heading" > #< / a > < / h2 >
2021-12-05 15:24:30 -07:00
< p > Reticulum can be used on Android in different ways. The easiest way to get
2022-04-07 10:59:42 -06:00
started is using an app like < a class = "reference external" href = "https://unsigned.io/sideband" > Sideband< / a > .< / p >
< p > For more control and features, you can use Reticulum and related programs via
the < a class = "reference external" href = "https://termux.com/" > Termux app< / a > , at the time of writing available on
< a class = "reference external" href = "https://f-droid.org" > F-droid< / a > .< / p >
2021-12-05 15:31:01 -07:00
< p > Termux is a terminal emulator and Linux environment for Android based devices,
which includes the ability to use many different programs and libraries,
including Reticulum.< / p >
2021-12-05 15:24:30 -07:00
< p > Since the Python cryptography.io module does not offer pre-built wheels for
Android, the standard one-line install of Reticulum does not work on Android,
and a few extra commands are required.< / p >
< p > From within Termux, execute the following:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # First, make sure indexes and packages are up to date.< / span >
< span class = "n" > pkg< / span > < span class = "n" > update< / span >
< span class = "n" > pkg< / span > < span class = "n" > upgrade< / span >
2021-12-06 06:10:22 -07:00
< span class = "c1" > # Then install dependencies for the cryptography library.< / span >
2021-12-05 15:24:30 -07:00
< span class = "n" > pkg< / span > < span class = "n" > install< / span > < span class = "n" > python< / span > < span class = "n" > build< / span > < span class = "o" > -< / span > < span class = "n" > essential< / span > < span class = "n" > openssl< / span > < span class = "n" > libffi< / span > < span class = "n" > rust< / span >
2021-12-05 15:31:01 -07:00
< span class = "c1" > # Make sure pip is up to date, and install the wheel module.< / span >
2021-12-05 15:24:30 -07:00
< span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > wheel< / span > < span class = "n" > pip< / span > < span class = "o" > --< / span > < span class = "n" > upgrade< / span >
2021-12-09 10:53:28 -07:00
< span class = "c1" > # To allow the installer to build the cryptography module,< / span >
< span class = "c1" > # we need to let it know what platform we are compiling for:< / span >
< span class = "n" > export< / span > < span class = "n" > CARGO_BUILD_TARGET< / span > < span class = "o" > =< / span > < span class = "s2" > " aarch64-linux-android" < / span >
2021-12-05 15:24:30 -07:00
< span class = "c1" > # Start the install process for the cryptography module.< / span >
< span class = "c1" > # Depending on your device, this can take several minutes,< / span >
< span class = "c1" > # since the module must be compiled locally on your device.< / span >
< span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > cryptography< / span >
< span class = "c1" > # If the above installation succeeds, you can now install< / span >
< span class = "c1" > # Reticulum and any related software< / span >
< span class = "n" > pip3< / span > < span class = "n" > install< / span > < span class = "n" > rns< / span >
< / pre > < / div >
< / div >
< p > It is also possible to include Reticulum in apps compiled and distributed as
Android APKs. A detailed tutorial and example source code will be included
here at a later point.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< section id = "pure-python-reticulum" >
2022-09-30 10:43:04 -06:00
< h2 > Pure-Python Reticulum< a class = "headerlink" href = "#pure-python-reticulum" title = "Permalink to this heading" > #< / a > < / h2 >
2022-06-22 07:19:18 -06:00
< p > In some rare cases, and on more obscure system types, it is not possible to
install one or more dependencies< / p >
< p > 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 < code class = "docutils literal notranslate" > < span class = "pre" > rnspure< / span > < / code > package instead of the < code class = "docutils literal notranslate" > < span class = "pre" > rns< / span > < / code > package. The < code class = "docutils literal notranslate" > < span class = "pre" > rnspure< / span > < / code >
package requires no external dependencies for installation. Please note that the
actual contents of the < code class = "docutils literal notranslate" > < span class = "pre" > rns< / span > < / code > and < code class = "docutils literal notranslate" > < span class = "pre" > rnspure< / span > < / code > packages are < em > completely identical< / em > .
The only difference is that the < code class = "docutils literal notranslate" > < span class = "pre" > rnspure< / span > < / code > package lists no dependencies required
for installation.< / p >
< p > No matter how Reticulum is installed and started, it will load external dependencies
only if they are < em > needed< / em > and < em > available< / em > . If for example you want to use Reticulum
on a system that cannot support < code class = "docutils literal notranslate" > < span class = "pre" > pyserial< / span > < / code > , it is perfectly possible to do so using
the < cite > rnspure< / cite > package, but Reticulum will not be able to use serial-based interfaces.
All other available modules will still be loaded when needed.< / p >
< p > < strong > Please Note!< / strong > If you use the < cite > rnspure< / cite > package to run Reticulum on systems that
do not support < a class = "reference external" href = "https://github.com/pyca/cryptography" > PyCA/cryptography< / a > , it is
important that you read and understand the < a class = "reference internal" href = "understanding.html#understanding-primitives" > < span class = "std std-ref" > Cryptographic Primitives< / span > < / a >
section of this manual.< / p >
2022-09-29 16:02:15 -06:00
< / section >
< / section >
2021-05-16 15:40:49 -06:00
2022-09-30 10:43:04 -06:00
< / article >
< / div >
< footer >
< div class = "related-pages" >
< a class = "next-page" href = "using.html" >
< div class = "page-info" >
< div class = "context" >
< span > Next< / span >
< / div >
< div class = "title" > Using Reticulum on Your System< / div >
< / div >
< svg class = "furo-related-icon" > < use href = "#svg-arrow-right" > < / use > < / svg >
< / a >
< a class = "prev-page" href = "whatis.html" >
< svg class = "furo-related-icon" > < use href = "#svg-arrow-right" > < / use > < / svg >
< div class = "page-info" >
< div class = "context" >
< span > Previous< / span >
< / div >
< div class = "title" > What is Reticulum?< / div >
< / div >
< / a >
< / div >
< div class = "bottom-of-page" >
< div class = "left-details" >
< div class = "copyright" >
Copyright © 2022, Mark Qvist
< / div >
Generated with < a href = "https://www.sphinx-doc.org/" > Sphinx< / a > and
< a href = "https://github.com/pradyunsg/furo" > Furo< / a >
< / div >
< div class = "right-details" >
< div class = "icons" >
< / div >
2021-05-16 15:40:49 -06:00
< / div >
< / div >
2022-09-30 10:43:04 -06:00
< / footer >
< / div >
< aside class = "toc-drawer" >
< div class = "toc-sticky toc-scroll" >
< div class = "toc-title-container" >
< span class = "toc-title" >
On this page
< / span >
< / div >
< div class = "toc-tree-container" >
< div class = "toc-tree" >
< ul >
2021-05-16 15:40:49 -06:00
< li > < a class = "reference internal" href = "#" > Getting Started Fast< / a > < ul >
2022-04-28 02:19:43 -06:00
< li > < a class = "reference internal" href = "#try-using-a-reticulum-based-program" > Try Using a Reticulum-based Program< / a > < ul >
< li > < a class = "reference internal" href = "#nomad-network" > Nomad Network< / a > < / li >
< li > < a class = "reference internal" href = "#sideband" > Sideband< / a > < / li >
< / ul >
< / li >
2021-10-08 10:30:17 -06:00
< li > < a class = "reference internal" href = "#using-the-included-utilities" > Using the Included Utilities< / a > < / li >
2021-09-25 13:39:31 -06:00
< li > < a class = "reference internal" href = "#creating-a-network-with-reticulum" > Creating a Network With Reticulum< / a > < / li >
2022-04-07 10:59:42 -06:00
< li > < a class = "reference internal" href = "#connecting-reticulum-instances-over-the-internet" > Connecting Reticulum Instances Over the Internet< / a > < / li >
2022-04-07 12:15:35 -06:00
< li > < a class = "reference internal" href = "#connect-to-the-public-testnet" > Connect to the Public Testnet< / a > < / li >
2022-06-22 07:19:18 -06:00
< li > < a class = "reference internal" href = "#adding-radio-interfaces" > Adding Radio Interfaces< / a > < / li >
2021-05-16 15:40:49 -06:00
< li > < a class = "reference internal" href = "#develop-a-program-with-reticulum" > Develop a Program with Reticulum< / a > < / li >
< li > < a class = "reference internal" href = "#participate-in-reticulum-development" > Participate in Reticulum Development< / a > < / li >
2021-12-09 10:12:18 -07:00
< li > < a class = "reference internal" href = "#reticulum-on-arm64" > Reticulum on ARM64< / a > < / li >
2021-12-05 15:24:30 -07:00
< li > < a class = "reference internal" href = "#reticulum-on-android" > Reticulum on Android< / a > < / li >
2022-06-22 07:19:18 -06:00
< li > < a class = "reference internal" href = "#pure-python-reticulum" > Pure-Python Reticulum< / a > < / li >
2021-05-16 15:40:49 -06:00
< / ul >
< / li >
< / ul >
2022-09-30 10:43:04 -06:00
< / div >
2021-05-16 15:40:49 -06:00
< / div >
< / div >
2022-09-30 10:43:04 -06:00
< / aside >
< / div >
< / div > < script data-url_root = "./" id = "documentation_options" src = "_static/documentation_options.js" > < / script >
< script src = "_static/jquery.js" > < / script >
< script src = "_static/underscore.js" > < / script >
< script src = "_static/_sphinx_javascript_frameworks_compat.js" > < / script >
< script src = "_static/doctools.js" > < / script >
< script src = "_static/sphinx_highlight.js" > < / script >
< script src = "_static/scripts/furo.js" > < / script >
< script src = "_static/clipboard.min.js" > < / script >
< script src = "_static/copybutton.js" > < / script >
< / body >
2021-05-16 15:40:49 -06:00
< / html >