Skip to the main content
mkfifo.com

Links like symlinks, fairer sign-in codes, and plain words

planned changed fixed

I made a set of decisions about links, the sign-in and the words on the site. Each one fixes something that surprised people.

A link is a symbolic link

A FIFO in your home can link to a public FIFO with Bcc: my-shop. Until now, the loop check at save time counted that link as part of the graph. So the owner of my-shop could get "This To makes a loop of FIFOs" because of a link they could not even see.

Unix solved this long ago. A symbolic link only points to a file, and takes no part in what the file does. A loop of symlinks is not refused when you create it: it fails when you follow it, with ELOOP. Links now work the same way:

  • A link is not an edge of the graph, so a save never fails because of someone else's link.
  • A Request that goes through a link remembers the FIFOs it passed. If it comes back to one of them, through an egress, a pipe, tee, a redirection, Reply-To or Errors-To, it stops there, and the report says why.
  • A link to a free name keeps the name free. A Request to that name still gets 404, and anyone can still take the name. Before, a link quietly made the name look used.

Fairer sign-in codes

The sign-in allowed 5 wrong codes for each email address in 15 minutes. That stops guessing, but it also let anyone who knew your address lock you out with 5 wrong codes. Now 5 wrong codes from one network address only block that network address. A second limit, 50 wrong codes for your email address from everywhere, keeps guessing slow: 50 tries in 15 minutes, against 100,000,000 possible codes.

Sign in with the link only

The sign-in email had a link and a code to type. A code that you type can be typed in the wrong place: any page can show a form that asks "Enter the code we just sent you". So now there is nothing to type. The email has only the link, and the sign-in form has only Email. The link opens a page with your address and one Sign in button, and that button sends the code. Opening the link alone does nothing, so a mail scanner that opens links does not use up your code. The email also says it plainly: mkfifo.com never asks you to type a code.

Email to yourself

mkfifo.com sends email only for its own FIFOs, so nobody can use it to send spam. But one wish comes up again and again: "send each message of my contact form to my inbox". A FIFO in your home can now email the address that you sign in with, at most 10 emails an hour: the sign-in already proved that the address is yours. Put To: you@example.com in an egress envelope of ~/inbox, add Bcc: my-contact to its ingress envelope, and each message to the public FIFO my-contact reaches you. To email anyone else, you still use your own email provider.

A warning for pipe names

In $body | rev, rev is not a builtin, so the body goes to the public FIFO named rev, and anyone can create that FIFO. A typo can send your data to a stranger. I thought about a separate syntax for a pipe to a FIFO, but a typo there still goes to a FIFO. So the editor now warns after a save when a pipe or a tee goes to a public FIFO that has no envelopes yet.

ls ~

ls ~ in the terminal showed nothing: rclone ls lists files, and the FIFOs of a home were not files. Now a listing of your home shows the FIFOs in it with their paths, as rclone ls does: club, work and work/2026.

Dates on the blog, and a security page

Each post now keeps the day it was first written in Date, and the time of its last change in Last-Modified. The page, the list and the Atom feed show both. Before, each addition to a post moved its date.

The security model is now a section of the docs, not a blog post: it is reference text, and it changes with the product.

One time for each Request

A check found a bug that was not about any of this. The FIFO s3 signs each request to R2: the time goes in the header X-Amz-Date, and again into the signature. Each $(date) read the clock on its own, so when a second ended between the two, R2 refused the signature. Now a Request has one time, from when it comes in: every command, every egress and every Request it causes see the same time.

Plain words

The code and its docs use Simplified Technical English, a controlled language with a small vocabulary. On the pages for visitors, it read stiffly: a Request "agreed" with an envelope, a form was a "letter", and the buttons said "Push". These pages now use plain English: match, people, message, Click. The specification and the code stay in the controlled language, where one word for one meaning still helps.