AgregoreWeb / agregore-browser

A minimal browser for the distributed web (Desktop version)
https://www.youtube.com/watch?v=TnYKvOQB0ts&list=PL7sG5SCUNyeYx8wnfMOUpsh7rM_g0w_cu&index=14
GNU Affero General Public License v3.0
715 stars 66 forks source link

Experimental Reticulum Support #180

Open 4c3e opened 2 years ago

4c3e commented 2 years ago

Hello! I'm a contributor over at the Reticulum Network Stack, and I just stumbled upon this project and I thought the two would work really well together.

Why?

How?

RNS already has a text-based browser/server, in NomadNet. With this browser we are working on a Gemini-based protocol called Reticulum Resource Transfer Protocol. I haven't dug too deep into this project's codebase, but I believe supporting RNS will require a javascript implementation of this resource transfer API. RNS is entirely written in python right now, but I am currently working on a system to allow outside processes to send and receive data from a Reticulum daemon.

Generally I'm imagining that to use RNS as an experimental feature with Agregore, the user would need to first start a RNS daemon on their machine, before making rrtp:// requests. Maybe a full node.js implementation of RNS could be written down the line.

If there is interest, I'd be happy to start spending some of my free time towards making this happen. Also, if there are any questions about RNS feel free to ask here or over at the RNS Discussion page.

RNS Manual: https://markqvist.github.io/Reticulum/manual/

Quick comment

RNS has no real path forward for creating some kind of decentralizing naming system, and links take the form of a 20-character string that represents a hash of the destination's public key, some sort of local "address book" system might need to be implemented. Additionally, users are able to "hear" announcements of new or existing sites on their mesh network, which is a really cool way of discovering new content, but different from many other network protocols. Not sure how these features would fit in to the UI/UX of a possible Agregore-with-RNS browser.

RangerMauve commented 2 years ago

Thank you for reaching out! This sounds like a super exciting project and I'd love to help get a PR for something like rrtp into Agregore.

The best way to get it in would be to look at how other protocols are implemented in "fetch" interfaces like gemini-fetch or hypercore-fetch.

Do you think you could link me to examples of rrtp URLs and what they can do? If it's close to gemini, it might be straightforward to adapt gemini-fetch.

Regarding addressing, a bunch of other protocols in Agregore like bittorrent and IPFS mostly uses hashes for URL hostnams, so it should fit right in. An address book system might be cool to figure out in an extension (once those are fixed up next month).

Regarding automatically discovering content, it seems like Reticulum has a way to subscribe to and publish data, in which case I've had a lot of luck abstracting that sort of thing behind and EventSource driven API.

If you'd like I'd be down to have a call to talk about details / give you a rundown of how the other protocols have been integrated. Feel free to email me: agregore@mauve.moe

4c3e commented 2 years ago

Awesome that you're interested!

Thanks for the reference fetch implementations, there's a good chance that the fetch implementation will resemble the gemini-fetch interface.

Do you think you could link me to examples of rrtp URLs and what they can do?

Currently the best way to test out requests and responses on reticulum is to use NomadNet. Nomadnet is not currently up to the full RRTP spec (for example the link format is going to change to the RFC url standard), but it's fairly close right now.

One you install it you can follow these steps:

  1. In your favorite text editor, open up .reticulum/config and paste this at the bottom:
    [[RNS Testnet Frankfurt]]
    type = TCPClientInterface
    interface_enabled = yes
    outgoing = True
    target_host = frankfurt.rns.unsigned.io
    target_port = 4965

    If you want to obscure your IP address for some added privacy, you can connect via I2P by running i2prouter or i2pd and pasting the following node information instead:

    [[RNS Testnet I2P Node A]]
    type = I2PInterface
    interface_enabled = yes
    peers = ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha.b32.i2p
  2. Run NomadNet
  3. Click anywhere in the "Known Nodes" section to focus the UI, then press Ctrl+u to bring up the URL bar. You can directly connect to my test node: 99621623b50f046a7fdc:/page/weather.py. I have it set to announce every 15min so you can just wait if you don't want to type that manually. To view the announcements of all peers and nodes on the testnet you can do the following:
  4. Click on the [Network] tab, then click anywhere in the "Known Nodes" section, then press Ctrl + l
  5. Now you are viewing the Announcement stream, you'll start seeing nodes and peers start showing up.
  6. You can click on announcements to connect to nodes to view their static content.

Another node you can try is 94bcadf1c024735ea796:/page/index.mu

An address book system might be cool to figure out in an extension

Agreed, an address book sounds like a great extension idea.

Are you reachable on Matrix? I just joined the Agregore matrix group.