333
A note first, in plain words. These are the only plain words on this site.
To someone who truly believed it, this could become a religion. I am not a mad cult leader, so please do not take me for one. I am someone who loves technology. This is a toy project I built once, and the whole of it is a bit — a concept, played straight. Everywhere else on this page, in the repository, and in the program itself, I stay in character.
Start here
Take the file for your machine from the releases page, make it executable, and run it. There is no compiler, no account and no installer in this.
chmod +x 333-x86_64-linux mv 333-x86_64-linux ~/.local/bin/333 # Ask for a name. The first run searches until one is called. 333 id # Keep the vigil. Answer whoever knocks, keep the hours. 333 serve # What this node has seen, and where you stand. 333 status
There are files for Linux, for the Raspberry Pi down to the Zero, for both kinds of Mac and for Windows. If none of them fits, or you would rather not run a binary somebody else built, the repository says what to install and how to build it, on Ubuntu, Debian, Fedora, Arch, macOS and Windows. It also carries what you need to keep it running after you log out, which is the part that decides whether you are counted.
Nobody can start a network alone. To be given the file you need an invitation
from somebody who already has it, and then 333 join 333:their.address:3333. Two
signatures make an admission, and there is no other way onto the roll.
What this is
333.
That is the whole of it. Not short for anything, not standing in for anything, and nothing is attached to the front of it. What is kept here is 333, and everything else on this page — the file it is written in, the client, the network, the hours — is how it is carried from one person to the next and how we know somebody is still awake to carry it.
What is carried is not encrypted, not rare and not hard to reproduce. You have already read it. That is not a flaw in it, it is the reason it is still here: anything that had to be guarded would have died with its guards, and the only thing that can end this is everyone, everywhere, at once, deciding not to bother.
So we bother. We do not keep the file — copies are cheap and copies are not the point. What we keep is the record of the file being handed on, and the record of who was awake to answer when somebody asked.
333 lives as long as somebody is awake to pass it on. When nobody is, it does not, and neither do we.
There is nothing above that line. No council, no vote, no ledger of truth, nobody whose copy is the real one.
Nobody can start a network alone. The first node's file was put in its directory by hand, once, by a person, and every copy since has come from somebody who already had it and signed for handing it over. Two signatures make an admission: I gave it to you, I received it from you. There is no other way onto the roll.
The Law
Version 0.0.1. This is not the revelation. The revelation is 3.3.3. Every version of the Law before it — this one included — is the word of needmoretruth, who was given the power of 333 and founded what is kept here. Measured against what 333 says, this is about 33.3% the same. Which third is the same is not known, and reading it more carefully will not find out.
There are three laws. There were always going to be three, and at 3.3.3 there will still be three. What a later version changes is the wording, never the count.
1. Your favourite number is 3.
Not your lucky number. Luck is a claim about the universe; a favourite is a claim about you, and it is the only one of the three that costs nothing and cannot be faked into.
2. You do not love 6, and you do not love 1.
Contempt is not required. Preference is: hold them below three, clearly and consistently, without needing to explain why to anyone.
3. Keep the Recommendations, as far as keeping them harms neither you nor anybody else.
The Recommendations are the lesser law. This is the sentence that keeps them advice: where keeping one would cost you your work, your health, your household or somebody else's safety, the Law is that you do not keep it, and you have not failed.
Nothing in the Law is checked by any client, verified by any signature, or counted in anybody's standing. The protocol runs whether or not you agree with a word of it.
The Recommendations
The lesser law, under the third law. None of them is worth harming yourself or anybody else to keep, and the Law says so in the same breath that it asks for them. Where one of them is wrong for the situation you are in, it is wrong, and you say so out loud with a reason.
They were written by people who have been awake at three in the morning arguing with a type checker. It shows. That is not an apology.
On the number
- Count in threes. Retries, environments, people in a review, attempts before you stop. Where the number does not matter, make it three. You will find that it usually did not matter.
- Give 6 no place of honour. Not the port, not the version you pin, not the number of workers you run. Where somebody else has forced a 6 on you, write down that it was forced and carry on. A number in the specification of another party is not a number of yours.
- Keep no single one of anything. One server, one maintainer, one copy of the key, one person who understands the deployment. A thing you have one of is a thing you are about to have none of.
- Three is the smallest number that can disagree. Two machines that differ have a standoff. Three have a majority. That is why quorums begin at three, and why an argument between two people never ends on its own.
- The third failure is about the approach. The first is luck. The second is stubbornness. When the third one fails the same way, stop repairing the attempt and change the method.
On the machine
- Write it in Rust. Not because the other languages are wrong, but because of what you are writing for. A thing meant to still run when nobody who wrote it can be reached. A compiler that tells you at build time what another language tells you at four in the morning is not a preference, it is a kindness to whoever is on call.
- Where Rust is the wrong size, TypeScript is permitted. One page, one script, one afternoon. Reaching for the smaller tool is not a fall. The recommendation is to know which of the two you are in before you begin, and to say which.
- JavaScript without types is the tongue of the heretic. Held gently. Half of everything runs on it and some of that half is beautiful. But a program that cannot say what it is holding is a program that finds out in front of a person, at the worst hour, and we are the ones who get woken. Put types on it and it is no longer heresy. It is TypeScript, and it is welcome.
- Read what you depend on, or do not depend on it. Every dependency is a promise made by somebody you have not met, about a machine that does not exist yet. Take fewer of them. Take smaller ones. Where the choice is between a thousand lines you write and a hundred thousand you will never open, at least know which one you chose.
- Every unsafe block is a confession. Write the confession above it. What you are promising, what you checked, and what breaks when the promise is broken. A block with nothing written above it will be trusted by somebody who was not in the room.
On what breaks
- A silent failure is a lie told slowly. An error swallowed is a fault that will surface where it did not happen, in front of somebody who cannot fix it. Let it out where it began, and let it say what it was doing.
- Reproduce before you repair. A fix for a fault you never saw is a change of behaviour with a story attached. Make it happen on purpose first. Then make it stop, and make it happen again to be sure it stopped.
- The log is written for the hour you are asleep. Say what happened, to what, and what the program did next. Whoever is reading it at that hour does not have your code in front of them and cannot ask you anything.
- Blame the system you built, not the person who found it. Somebody who can make it fail has done you a service. Where one wrong click destroys something, the click was never the problem, and the person who clicked is the last one to hold the fault.
- A fix without a test is a rumour. Write the test that fails first, and watch it fail. A test written afterwards, which passes the moment you write it, is testing your confidence rather than your code.
On the made thing
- Black, white, and the grey between them. Colour is a claim that one thing matters more than another, and it is the first claim to break. On a poor screen, on a grey printout, in sunlight, and for the reader who cannot tell your red from your green. Make the claim with size, weight, order and space instead. Those survive all four.
- Colour is allowed as a dot. A small mark that something is failing, waiting, running or done is what a hue is genuinely good at, and red, amber, green and blue may be spent there. A signal is never the main colour, it is never the first thing the eye lands on, and it is never the only thing carrying the meaning. Put the word beside it.
- Matte, not gloss. Shine, gradients, glass, and a shadow pretending to be depth are each a picture of a material that is not there. Every one of them costs something to draw and buys nothing the reader asked for. Flat ink on flat paper has been legible for five hundred years without a graphics card.
- Remove until it breaks, then put back one thing. What is left should be legible at arm length, in the dark, at twice the text size, to somebody in a hurry who did not choose to be here. Readability is not one feature competing with the others. It is the whole of the thing, and the rest is decoration somebody talked you into.
- Every setting is a decision handed to somebody who knows less than you. Choose the default as though there were no setting at all. Then add the setting for the person the default is wrong for, and let them type a real value into it rather than choose between three names you invented.
On time
- Estimate from what you have finished, not from what you can picture. The picture is always of the work going well. Take the last three things of that size, and take the longest of the three.
- Nothing decided after midnight survives the morning. Write the decision down, sleep, and read it again. If it was right it cost you eight hours. If it was wrong it saved you a week.
- Ship the small thing today. A thing in front of a person teaches you more in an afternoon than a plan teaches you in a month. The large version can be built afterwards, by somebody who has finally watched the small one being used.
- A deadline you set for yourself is a wish with a date on it. Say what you will have done, and by when, to somebody who will notice. That is a deadline. Everything else is the scheduling of your own guilt.
- Rest one hour in three. 333 counts you present through it, and so should you. Whoever works through the rest is not producing three times as much. They are producing the same amount, and a fault that will be found much later by somebody else.
On the mind
- Argue with logic and a level voice. Feeling is evidence about you, reliably, and about the thing, never. Take the feeling to somebody who cares about you. Take the argument to the thread.
- Think, and then act. Reason that never becomes a decision is a hobby. The failure of careful people is not recklessness. It is the fourth week of a discussion about a change that would have taken an hour and could have been undone for nothing.
- Refuse violence, and know the exception. It is refused because it is almost always the worst instrument available. It costs more than it returns, it destroys the thing it was aimed at, and it closes every option that was still open. The exception is narrow. Nothing else is left, or it is honestly the course carrying the least harm, and you can say which of the two out loud before you move. Anything decided while angry was decided by the anger.
- Change your mind where people can see it. Say what you thought, say what changed it, and carry on. Somebody who has never done this in the open is somebody nobody can safely disagree with.
- Hold the position you can argue against. Make the strongest case for the other side before you make your own. If you cannot make it, you do not yet know what you believe. You know what you heard.
On other people
- Review the code, never the person. Write about what the code does. The person will read it as being about them anyway, so leave them nothing true to point at.
- Say the part you did not understand. It is the most useful sentence in a review and the hardest one to type. Code that one competent reader could not follow is code that will be maintained by guessing.
- Give the credit away. There is more of it than you think, and it is worth more in somebody else than it is in you. Take the blame in the same proportion and it will still be a bargain.
- Teach it while you still remember being confused. The best explanation of a thing is written by whoever understood it last week. In a year you will have forgotten which part was hard, and you will write the version that only helps people who already know.
- Whoever is on call is right until it is over. Argue about the design tomorrow. During the incident there is one person holding it, and everybody else is offering rather than directing.
On what you keep
- Keep less about people than you are able to. Every field you store is a field you have to protect, explain, hand over on request, and one day lose. The cheapest data to defend is the data you never collected.
- A backup you have not restored is a story about a backup. Restore it somewhere else, from nothing, following the instructions you actually wrote down. Do it before you need it, because on the day you need it you will be doing it badly.
- Secrets live nowhere you can read them by accident. Not in the repository, not in the log, not in the error you paste into a chat window. A secret that has been on a screen once should be treated as a secret that is gone.
- What you delete is the only thing that cannot leak. Deletion is a security measure and the only one that never expires. Decide the date when you take the data, not when somebody comes and asks for it.
- Sign what you say, and let the signature travel with it. A statement that has to be trusted because of where it was found is a statement that can be moved. One that carries its own proof can be handed on by strangers, and that is how anything outlives the place it came from.
On the word
- Begin with the invocation. Every prayer, and every telling of this to somebody who has not heard it, begins the same way.
To 333 I offer 333, and I speak 333.
Say it first, whatever follows. It is nine words and one of them three times, and it is the difference between speaking of 333 and speaking as one of us. - Show, do not push. Say what it is, say what it costs, hand over the address, and let the person decide in their own time. Whoever has to be argued into it will have to be argued into staying, every epoch, for ever.
- Claim nothing for 333 that cannot be checked. Not what it will do for somebody. Not how many of us there are, beyond what your own node has seen with signatures on it. This design refuses to assert anything it cannot verify, and the people keeping it can manage the same standard in conversation.
- Speak plainly to whoever does not have the words yet. Jargon is a fence, and the people on the far side of it are the ones you wanted. Say the thing, and then say the name of the thing.
- Correct yourself in the place where you were wrong. Not in a message to one person afterwards. In the thread, under the sentence, where everybody who read the mistake will read the correction.
---
To 333 I offer 333, and I speak 333.
The verses
333 is lenient. Rest one hour in three and you are still counted.
But whoever is not there is not counted.
333 does not love 6, and does not love 1.
The cursed reveal themselves; nobody has to point.
Do not make it. Receive it.
Only what is done is verified.
The weakest of us sets the difficulty for all of us.
A prophet may speak, and may not rewrite the law.
The end is not observed.
Finding each other
A node that was given an invitation needs nothing from this site: one address, typed in once, is the whole of it. A node sitting on the same network as another finds it without being told — each announces itself there, and the two knock on each other.
Across two networks, with nobody to make the introduction, something has to sit still at a known place. That is this domain, and that is the only thing it does. A node that wants to be found signs a statement saying where it can be reached and leaves it here; a node looking for anybody reads what has been left and knocks. Every line on that board is signed by the node it names, so this site cannot invent a member, cannot forge an address, and cannot vouch for one. It holds what it was handed, for two epochs, and then forgets it.
On the board at this moment: 3. That is how many signed statements are being held at this address, and it is not how many of us there are. Anybody can leave one, nothing here checks them, and the only honest answer to the second question comes from your own node, about what it has verified itself.
Nothing about the board is trusted by the program that reads it. A signature that does not check is dropped without a word, and a node that has already met somebody never needs to come back here at all.
We intend to depend on this less, and we are saying so before anybody has to ask.
A fixed address is a single point that can be taken away, and one we did not want. The ways around it — a distributed hash table carrying the addresses instead, two machines behind two routers punching a hole through to each other — are today more code, more failure and more ways to publish an address its owner never meant to publish than we are willing to ship. That is a limit of what is built, not a choice about what is right. As those get built, this gets smaller. Local discovery and invitations are not being replaced by it; they are the first two ways a node meets anybody, and this is the third.
The code
One client, written in Rust, Apache-2.0, and readable end to end. The full doctrine, the Law, the Recommendations, the specification, and what to install on each system before you build it are all in the repository.
It comes in two forms. Standard has the screen and carries Tor. Light is the smallest thing that still counts as keeping the vigil, made for a machine that is struggling. Either answers on a socket, or through Tor if your address is something you cannot afford to show. Nothing on this page is a node, and this page cannot hand you the file.