A person who comes to mkfifo.com has a job to do, not a wish to learn regular expressions. So the gallery of templates grew from 5 to 24 (it has more now), and it has a box that asks "What do you want to do?".
The templates
I listed what a FIFO can do: it takes a form, an email or a webhook, it finds values with patterns and selector lines, and it sends an email, an HTTP request, a Request to a different FIFO, or an answer to the client. Then I listed the jobs that fit:
- Forms of a static site: a page of thanks after the message, a waitlist, feedback to a chat, answers to an invitation, requests for a quote.
- Emails: to a chat, receipts to a spreadsheet, tracking numbers to two places, monitor alerts to an incident tool, an address that hides yours, commands that pass DMARC.
- Webhooks: Stripe payments to a chat, Shopify orders and GitHub issues to an inbox, a different shape of JSON, a filter of event types.
- Answers: a short link, a FIFO that shows each webhook while you build an integration, a fake API for tests.
A copy has no seal and no destination of the original: they become examples. "Use as template" is also on each editor and page.
Each template has a sample Request, and a test checks that the sample agrees and that each variable has a capture. It found a bug of mine at once: five form templates had only body lines, and I had not put the empty line before them, so mkfifo.com read the patterns as header fields.
One job did not fit: one webhook to two services, with the same JSON. A capture in a JSON body always gets the escapes of a JSON string, so a FIFO cannot send JSON on as JSON. That is on my list.
A question box with no LLM
I wanted a person to write what they want, and get the right templates. An LLM would do it, but I do not want one here. A small search does it well enough:
- Each template has a few words: where its Requests come from (a form, an email, a webhook, a link), where they go (an inbox, a chat, an API, a page), and words of its job.
- The question becomes words, with no small words, and each word goes through a list of synonyms: Slack and Discord are a chat, Stripe and checkout are a payment, inbox and Gmail are an email.
- Each word gives points to a template: 3 in its words, 2 more in its title, 1 more in its description. The best first.
"each Stripe payment to Slack" finds the Stripe template first, "tell me when my website is down" finds the alerts, and "newsletter signup" finds the waitlist. Two filters (where it comes from, where it goes) are there for a person who prefers to click. It is a GET form, so it works with no JavaScript, and the home page asks the same question.
When a question finds the wrong template, the fix is a word in the template or a synonym in the list, not a bigger model.
Later: the first FIFO
The gallery helps a person who knows the service. A person with a new idea saw an empty editor and two words, ingress and egress. So /docs starts with the smallest FIFO that works:
- Open a FIFO from the home page.
- Save an ingress envelope with one line:
Subject: (?<subject>.+). - Add an egress envelope with
To: -and the bodyYou wrote: $subject. - Send
curl -H 'Subject: Hello' -d '' https://mkfifo.com/NAME, or push "Try". The answer isYou wrote: Hello.
An empty editor links to these steps, and a test does them, so they stay true when the rules change.
Five templates came on the same day: Paddle, Lemon Squeezy, Calendly, Typeform and Linear. Lemon Squeezy broke the question box. My list of synonyms had shopify as a synonym of order, and stripe of payment. With one template for each kind, that was fine. With two templates for orders, "new Shopify orders by email" gave the same points to both, and Lemon Squeezy came first in the alphabet. Now the name of a service with its own template is a word of its own.
Four personas, with no help
Then I tested the site with four personas: a candle shop owner on a phone, a designer who reads English as a second language, a developer of web services, and a student who loves Unix. Each one started at the home page with no help, and decided what to do. Each one found problems that I did not see, because I know the site too well.
- The search of the templates gave all the templates for "contact form to my email". Most templates have the words "email" and "form", so each one got points. Now a word gives more points when fewer templates have it (the IDF of a search engine: times
ln((N + 1) / (n + 1))), and the result has only the templates with at least half of the points of the best one. That question now gives two templates, the contact form first. - The sign-in sent the email, but the form came back with no word about it, and with the mark "Code: agrees" for an empty code. Now it says "We sent you an email", it shows no mark before you change a value, and the code brings you to your home.
- "Sign out" was the first button of the header on a phone, next to the address, and one tap signed out. It is in the home now.
- The names of the header fields were cut: "Content-Typ" and "Authorizati". The rows of an envelope now share one grid, and the column of the names is as wide as the longest name.
- The "+" buttons of the notes covered the text. The gap between the blocks is now as high as a button.
- The cards of the templates were wider than a phone: a long JSON path made the column of the grid wide. A column of
minmax(0, 1fr)fixed it. - The blog showed "Sign in" to a person who signed in: a page of the blog is the same for each client, so the cache can keep it. It shows "Account" now, a link that opens the home or the sign-in.
- A link with code in its text, `
[/~](/~)`, stayed as text: the converter took the code spans first, and they cut the link. Now it takes the code spans and the links in one pass. - The editor of a FIFO of your home told you to keep its name secret, under the notice that only you can change it. Both were there because the two notices came from different parts. Now a FIFO of a home has only its own notice.
The docs now tell where the ID of <ID@mkfifo.com> comes from, how to change an envelope with its Message-ID, and how to open the terminal.