Mycelium Network: State Report after Stage One Bootstrap
Khleedril, October 2025
Table of Contents
1. Executive Summary
This first state-of-the-project report explains why the Mycelium network is needed, how it works from first principles, and describes the recently concluded first-stage bootstrap step which demonstrated how it can be used for simple yes/no voting. There has been some uptake by third parties, and we see that, going forwards, we need to generalize the voting to accommodate more sophisticated decision making, and move towards a more user-friendly interface so that non-programming projects, such as real-world activism, can use it to organize online.
1.1. Audience
This document is intended for a general, lay, audience, though preferably with some awareness of PGP keys and their use. The Mycelium network itself currently is only suitable for software developers with their own Internet servers, and this document contains some detailed, though simple, technicalities for completeness, but the reader can safely skip over these without loss of understanding of the rest of the document.
1.2. Distribution
Wide dissemination of this document is strongly encouraged, but modifications are not permitted. The document should be referred to by the title and date shown above. Legally the work should be considered to be copyrighted by the author with terms according to the Creative Commons (CC) BY-ND1 license. The document is being discussed on Mastodon under the hash-tag #mycelium
.
1.3. Provenance
The source text for this document and all of the referenced source code exist as commits in a GIT repository — at this moment in time residing at https://khleedril.org/forge/mycelium/mycelium — signed by khleedril@a.b, the PGP public key available at https://khleedril.org/gpg-key, the same key that I’m using in the Mycelium network; it will hopefully develop reputation as the network evolves!
If you have access to the Guix command, you can run
guix git authenticate \ d92072679363b63576862ca206add26f8039114c \ E23C21ED864FF4F3A7114CDFCA471FD501618A49
to assert the authenticity of the entire repository after you have cloned it to your own machine2, 3; note that the last clause is the fingerprint of the aforementioned key.
2. Concepts
2.1. Who Can You Trust on the Internet?
The empathetic Internet is erring towards peer-2-peer (or even peer-4-peer) distributed systems. This is great when you are part of a posse of trusted peers, but what if a stranger turns up and asks to join? Unfortunately Byzantine interlopers, AI-powered robots and information scrapers, are always in eminence and you really don’t want any of those in your network.
Another use case, for which the Mycelium network is specifically designed, is where a project needs a vote of its users on some proposed change. In this case, one would want anybody to feel free to have a say, just as long as they are a bona fide, honest person. You would also like to offer them the opportunity to vote anonymously.
2.2. Party Invitation
Suppose, in real life, you are invited to a party, and turn up at a big house with a hundred guests milling around. You are going along with two friends, but otherwise will be a stranger amidst the crowd.
The first thing you might do is say, “Hello,” to some random stranger who looks to be equally at sea. You might strike up a conversation aiming to find out something about the person, and whether they know any of the crowd here. At this stage you don’t know if they are trustable or not; whether any information they give can be taken as truth.
After a time you notice a person who seems to be of great interest to lots of other people. You ask either your new friend or your companions who that person is. Nobody knows, but one of your own friends turns around and nudges a friend of his, who your posse is lingering close to. They don’t know either, but turn to their own group to find out if anyone there knows. Eventually they turn back round and tells your friend, who tells you, that the person is a scallywag and that you may safely be entertained by their tall tales but don’t believe a word they say.
2.3. Mycelium Network
The Mycelium network is designed to work similarly to the social situation above. If a stranger turns up online and you want to find out if they are actually a person, and a reputable one at that, you ask a friend you trust, and they may in turn ask their own friends, until a positive ID maybe turns up. The trust between friends is mutual; you can only ask them for help if they have already given you the means to do so. In this way members of the Mycelium network can feel safe that they won’t be inundated with pointless requests from random people, or data-reaping bots.
In fact, the whole network is non-discoverable. You have to know that a person exists in the first place to make an enquiry about them, and then you can only make the enquiry to the few friends who have trusted you with their assessor end-point: a hidden address on the World Wide Web which Mycelium participants only disclose to their friends.
2.4. PGP Keys
The original design of the PGP (Pretty Good Privacy) system had the intention that keys of unknown people could be fetched from a trusted server, and can even be discovered there. The keys were associated with e-mail addresses, which were effectively the keys’ handles. The trust in a key involved participants putting trust labels on the keys they knew something about, and then one trusts the trust assigned by those trusted by them.
Within the Mycelium system, keys are deliberately not discoverable. They are not assumed to be attached to any e-mail address or other name tag; they are known only by their own cryptographic fingerprint.
However, this does not preclude the possibility that they are associated, and this will, in fact, help to strengthen the provenance of the person. Also, these keys might have been used to sign commits in a GIT repository, adding reputation to a person as a software developer.
2.5. Contexts
In the first instance, there are two immediate questions you want to know about a key fingerprint: does it belong to a real, actual, person, and is that person reliable as a member of the Mycelium network? Thus there are two immediate ‘contexts’ we are interested in. Within the protocol, contexts are referred to by unique identifiers, and Universally Unique Identifiers, UUIDs, are specifically used.
Moving on from this, contexts can be created to address many other types of issues, such as preferred one-of-many choices, multiple choices, ballots, and general governance decisions which have to be acceptable to a suitable majority of interested parties; questions of membership, or level of association with a foreign project, might also be asked. Furthermore, projects can use different algorithms for assessing the vote, such as first-past-the-post versus Condorcet, for example, or weighting of votes according the degree of separation of a person from a project.
The first bootstrap phase of the Mycelium project, which has just concluded, demonstrated how a simple ballot could be run by a project. The ballot is deemed to be owned by some person, and a new context is created. Then anyone can express their opinion by providing an assessment of that person in that context, and the project could simply ask them for their opinion. But the network is non-discoverable so voters can’t be just found; they have to come forward. We would also like to offer voters a degree of anonymity if they wish to exercise that. And so the methodology which is used consists of the following steps.
- People come forward to the projectʼs polling web site and register themselves, via their public PGP key, as voters, using their secret key to encrypt the end-point address they want to use for the vote (this should be different from the one they tell their friends about). The encryption ensures that the person really does own the secret key behind the fingerprint, hence they are who they say they are.
- The project then reaches out to its trusted members, probably governors, to attempt to verify, via the fingerprint of the public key, that they are a known, real, person, with dependable agency in making choices.
- If the voter is discovered to be real and reliable, the project then reaches out to the voterʼs given end-point, and gets their opinion on the vote directly from them.
- The project must then summarise, according to project policy, all the votes, and draw a final decision based on the outcome.
3. Details
3.1. A Mycelium Participant
Participation requires three things: a secret PGP key, an assessor end-point, and a small number of friends you trust who are also either erstwhile participants or wishing to become one.
- Your identity on the network is the fingerprint of the public part of the PGP key. It goes without saying that you must keep the full secret key to yourself.
- You must supply an assessor end-point: a difficult to guess HTTPS address (i.e. a secure web address), which reads JSON (Java Object Notation) payloads and returns a JSON response. The payload will ask for your opinion of some PGP key fingerprint over some context, and you reply by giving a number between 0 and 100 accordingly (or you can give a “no-basis” response to indicate that you have no basis on which to make a judgement about this person).
- You work with your friends to set your end-point up so that it knows all your friends’ end-points, and provides the opinion that each of your friends is a person with a weight of 100 and some assessor (reliability) value. Your friends should return the same favour to you (though they don’t have to).
3.2. The Protocol
This section is a short summary of the details of the Stage-0 Bootstrap step white paper4, which forms the formal introduction to the protocol.
3.2.1. Well-Known Contexts
The contexts which must be known to everybody are
- Person, 7097bd0d-9bfa-4b5c-8594-615d1a9bfcbd
- Is this an actual person, yes or no?
- Assessor, b5cd757f-54fa-4ec3-a1e3-bd5544533c1b
- How do we rate this person as an intelligent, fair assessor of other people?
The measure of the first one would almost always be 100 (out of 100) because we should either be very sure they are a person or else not be listing them among our friends.
3.2.2. Request
The following JSON object is sent in the payload of a HTTP message sent to a TLS-secured assessor end-point.
{ "request-id": "<UUID: string>", "request-depth": <positive integer>, "key": "<GPG fingerprint: string>", "context": "<UUID: string>" }
The request-id
is necessary to prevent loops: these would be quite common occurrences where a request spreading through the network actually comes back to the original requestor. In this circumstance they should give the "no-basis"
response. In practice, all participants run a 60 second timer on all request-ids
and if the same one is seen in this time "no-basis"
is given.
The request-depth
is a small number which is decreased each time a request is relayed to another friend, unless its value would become zero in which case "no-basis"
is returned. This prevents excessive escalation of the request over the network, and allows a requestor to limit the degree of separation from which answers may come.
3.2.3. Response
There are various strategies you may employ to form your response. If you have an immediate opinion on the matter at hand, you can return this directly. Otherwise, you may go around your friends in turn, and return the first response you get back. Or you could ask all your friends, or a subset of them, and return the average of the results.
The final, JSON, return will be either
"no-basis"
or
{"trust": <integer 0-100>}
where the former is for the situations described above, and the latter is where an assessment is returned as a number. (The "trust"
label is a little unfortunate as the assessment is not necessarily about trust but of opinions generally; we regard this as an unfortunate historical accident.)
3.3. Taking Part in a Vote
The voting process is formally defined in the Bootstrap Stage 1 white paper5.
A vote is identified by some context under some person. To take part in the vote you need to
- Be a participant in a Mycelium network, preferably connected by some degree to the project.
- Modify your assessor end-point to give a measure to the vote person/context pair, according to your opinion on the matter.
- Modify your front web server to access the end-point through a new, undiscoverable, URL (Uniform Resource Locator, a.k.a. web address), so that you don’t reveal the end-point you use to communicate with your friends, (if you are paranoid you can put your voting end-point on a completely different, unrelated, host).
- You then go to the voting web-site, and register your new end-point.
The project will, over a period of time, verify you through the Mycelium network starting with its own trusted friends, and then will contact your end-point directly for your vote.
You should close down the temporary end-point after the vote finishes as it will not be accessed again.
3.4. A Project Running a Vote
A project which wants to run a vote must first have some parameters in place, such as when registration ends and counting begins, how the votes will be combined, and how the result determines the ultimate resolution of the issue at hand.
The next step is setting up the vote itself, which, at the moment, involves some programming and system management. The code developed for the Mycelium stage one bootstrap, described below, can be taken as a starting point. It is, of course, anticipated that this will become a general-purpose tool which laypeople can use. Publicly, the vote is given a context UUID and is considered to be against the person who would be the beneficiary of the vote; these parameters and the vote itself, the URI of the web service at which registration may be made, are advertised widely. Once the deadline passes for registrations, the results are almost immediate as it involves simply visiting all the votersʼ end-points and totting up the results. The final result is left at the web service for all to see.
4. The Stage One Bootstrap
4.1. Description
In the case of the Stage-1 bootstrap which has just completed, voters were asked whether or not they accepted the idea of the bootstrap. The votes given in the range 0-100 were taken to indicate favour on a scale 0-100, and the arithmetic mean was used to summarise all the votes. The motion was carried if the result was anything above zero. This is all of course very pathological (the self-referentiality is the reason this is termed a bootstrap of the Mycelium project), but forms the prototype of how project governance bodies need to think about the nature of votes they want to run.
The bootstrap was implemented as a front-end web server called polling-booth
where voters register and which provides the current status of the voting process, a middleware daemon called adjudicator
which sees the registrations, verifies them, and collects their votes. The two programs communicate through the medium of a back-end Mysql
database. The full source code for these programs, written in Rust, are available and are intended to be adapted by other projects.
The bootstrap opened on 14th September 2025, and the registration deadline was end-of-day 28th September, 2025. It was advertised on Mastodon, and there was an interim advertisement there on 21st September, halfway through the registration period, to drum up more interest.
The registration point was https://khleedril.org/mycelium-vote. This is still live at the time of writing, but will disappear or become re-purposed at some point in the near future.
There were two faults that showed up with the software (these have been retrospectively corrected in the code repository).
- After the counting finished an indicator was moved to Phase 5 of 4(!), but the software was not prepared for this and had no HTML to present, resulting in a HTTP 505 error.
- Internally, the code put key fingerprints into the back-end database in a non-normal form (lowercase instead of uppercase) leading to incorrect final reckoning.
Further, it proved rather painful to set up the software, including a special internal end-point to represent the project and its associated governors (just the sole developer at this time). This is due to the minimalism which had been adopted to leave the code malleable for onwards developments in light of the experience gained from running this bootstrap stage: all vote parameters were hard-wired in the source and the programs had to be re-compiled and re-deployed when changes were needed.
4.2. Participation
There were 13 registrations, which all took part in the first week of the registration period, plus the developer. Of the 13, one group of seven referred to each other, and a group of 5. These people did not make themselves known to the project, but were presumably rings of contributors to two different projects. The final registrant, who also did not make themselves known, was not associated with anybody in the network.
The voters accepted the proposal with a unanimous 100/100 rating. The proposal was duly passed and the updated code is considered the official head of the project development repository.
4.3. Finalized Software
The GIT6 repository contains the definitive mycelium.rs
, found on branch boot-0
, at version 1.0.2, and a more user-friendly version plus polling_booth.rs
and adjudicator.rs
, on branch main
at tag v1.1.2
, at version 1.1.2. The current HEAD
of the main
branch is at version 1.2.0 and contains versions of the three programs which are further refined for user-friendliness (but still only really accessible to programmers at this point).
5. Conclusions
The Mycelium project has undergone two bootstrap steps so far: introducing the Mycelium concept, and exercising its use in a simple voting system. 14 people are known to have engaged, believed to be formed of two connected rings and some singletons. None of these have come forward to establish contact with the author.
The software has been modified in light of experience, and the repository consists now of two live branches, named boot-0
and main
. People who simply want to participate in the network may choose the simplest possible implementation from boot-0
, or a more refined but also more convenient version found on the main
branch. Projects wishing to organize a vote may take main:rust/src/bin/bootstrap-1
as a starting point, but will then have to indulge in some development and adaptation of the above code to make the vote actually happen.
Now that this bootstrap stage is out of the way, the door becomes open for anybody to make a development on the project. They publicise their new code as an increment on the existing GIT repository, ask the project to organize a yes/no vote along the same lines as the Stage-1 bootstrap, and if it is accepted the new contributorʼs key will be added to the GIT authorizersʼ file so they can formally sign off their work, and it then becomes the new head of the evolution of the project.
There are two immediate directions we want to take this: allow for different styles of voting (multiple choice, variable weights, first past the post, …), and to make things more user-friendly for non-technical people to use, by using web forms to add and manipulate the data we keep on friends. On the technical front, proper Rust documentation needs to be provided for efficient utilization of the emerging tool-set.
The next bootstrapping stage will take the refined versions of the tools so far developed, and utilize them to effect a highly multi-purpose, multi-format vote. This should make the system amenable to application to all sorts of governance decisions which might need to be made. It should be possible to do this without any change to the formal protocol, which remains simple and undeniable.
Footnotes:
Creative Commons license with author attribution and no derivatives. https://creativecommons.org/licenses/by-nd/4.0/
Introduction to Guix GIT authentication https://openworld.news/gnu-guix-authenticate-your-git-checkouts/
The guix git authenticate command https://guix.gnu.org/manual/devel/en/html_node/Invoking-guix-git-authenticate.html
The Bootstrap Stage-0 white paper https://khleedril.org/mycelium-bootstrap-0.html
The Bootstrap Stage-1 white paper https://khleedril.org/mycelium-bootstrap-1.html
The currently active repository holding all the white papers, reports, and source codes is at https://khleedril.org/forge/mycelium/mycelium