----------------------------------------
PicoGopher - Introduction
October 22, 2022
----------------------------------------
Written on my laptop
----------------------------------------
When I first heard about Gopher, I wondered how small its
footprint was. Can you run a Gopher server on a very old
computer? Well, of course yes, given the protocol's been
around for 30 years... Can you run it on a very small one?
Again, yes: gopher.3564020356.org runs on a RasPi 2, and if
you wander enough around the gopherspace you will easily
end up in a gopherhole served by a Raspberry Pi Zero.
Now the question is: how much can we shrink our resources
while still having a working Gopher server? In this post
(actually series of posts, if I want anything to be shared in
a reasonable time) I show how to run your own gopherhole from
a Raspberry Pi Pico W. And given the platform it runs on, the
service it provides, and above everything my utter lack of
imagination, I have given this project the quite obvious name
of PicoGopher :-)
The reasons why I am doing this are various, and probably the
most honest answer I could give is that I am trying to keep
myself distracted while everything around me is in turmoil.
There are, however, more serious ones too: on the one hand,
I would like to somehow give back to the small internet
community, by enabling more people to self-host and share
their own content in a less expensive way; on the other hand,
in a moment where all the main Internet services are becoming
more and more centralised, I would like to plant a few ideas
for an even more distributed Internet instead, one where
servers themselves can physically be displaced and even move
with their owners.
Physically move? Yes, one of the advantages of a very small,
low-power server is that you just need a few small batteries
to bring it along with you... And if you want your server to
be always on, you can keep the batteries charged with a
relatively small solar panel. This is actually something I
have always dreamed about doing: leaving some digital traces
hidden around in the physical world. Think e.g. geolocalised
riddles, something similar to what Cory Doctorow describes
as part of the Harajuky Fun Madness challenges in his novel
called "Little Brother"[0] which by the way I suggest you to
read if you haven't done already.
Thinking about other possible applications of a cheap,
self-contained server that can be brought around (or left
somewhere) is left as an exercise to the reader ;-). Just
do not let your imagination be restricted by the specific
application of a Gopher server: a Pico has enough to run
Gemini or HTTP too, to act as a proxy or as a gateway, to
periodically download stuff for you and serve it in anther
format. Have fun with it and let me know what you did :-)
==== The Raspberry Pi Pico W ====
For all the details about the Raspi Pico W, I will leave you
to the official datasheet [1] and the "Everything about the
Raspberry Pi Pico" page [2]. To summarise:
- it is tiny (as in thumb-sized)
- it is cheap (as in ~7GBP/EUR/USD)
- it has onboard WiFi (that's what the "w" stands for)
- it has 2MB of flash memory (enough to hold quite some text)
- it is based on the RP2040 microcontroller, which is super
common now and available on a plethora of devices (for
instance, I think the Arduino Nano 33 BLE [3] could be used
for this project instead of the Pico with similar results)
==== Steps to build PicoGopher ====
After getting very basic information about how to program a
Pico (you'll find plenty of good material about it both on
the official website and in the links I shared previously),
the following step was to get an idea about what I could do
in terms of networking (both WiFi and TCP). RasPi's datasheet
website provides a document [4] which has everything one
needs to get started, including code examples on how to
connect to the WiFi and how to build a simple HTTP server.
Following this documentation I managed to run my first mockup
Gopher server, which serves one single working gophermap
after loading it from flash memory. This is of course a super
simplified example, but enough for us to know that we can now
power this little thingie, let it connect to a WiFi, and then
open our favorite Gopher browser and point to it to see some
contents. This is 80% of what we expect our project to do,
done in (less than) 20% of the time!
You can find the mockup code in the PicoGopher GitHub repo
[5]. Again it is not a lot, but if I want to be able to share
something without disappearing for too long I need to keep
these posts short (yeah I could also write more concisely,
but you'd miss all the fun ;-P).
In my next PicoGopher posts I will try to apply the 80/20
rule again while following these steps (the crossed ones are
completed already), so you know what to expect each time.
- [x] connect to the WiFi
- [x] run a simple HTTP server
- [x] run a mockup Gopher server
- [x] load/save files
- [ ] make the Gopher server not a mockup anymore:
- [ ] translate gophermaps following gopher protocol
- [ ] load any file from disk
-> at this point, you have a running Gopher server!
- [ ] make the server a bit more resilient
- [ ] enable async
- [ ] better understand power saving
- [ ] set up the pico as an access point for geolocalised
access
- [ ] powering PicoGopher
==== References ====
[0] https://www.gutenberg.org/files/30142/30142-h/30142-h.htm
(look for "wifi" to find the HFM riddle)
[1] https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf
[2] https://picockpit.com/raspberry-pi/everything-about-the-raspberry-pi-pico/
[3] https://store-usa.arduino.cc/products/arduino-nano-33-ble
[4] https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
[5] https://github.com/aittalam/PicoGopher