f-line
privacy

What this site stores

One form, one table, one row per address. This page says what is in that row, where each part of it came from, what it is for, and how to have it removed.

Nothing is collected until you submit the form

Reading this page stores nothing. The waitlist form is the only thing on the site that writes anything down, and it writes one row. These are its columns, by their real names.

ColumnWhat it holds
emailThe address you typed, lowercased. The only answer the form requires
agentWhich coding agent you picked from the five the form lists, or empty if you did not say
shipsYour answer to what you would deploy first, as you wrote it. Free text, and the form refuses anything over 2000 bytes rather than trimming it
referrerThe page your browser said it came from, when it says. It answers whether a post somewhere worked
user_agentThe browser string your browser sent with the submission
ip_hashA salted SHA-256 of your address, truncated to 128 bits. Never the address
created_atWhen the row was written. The list is a queue and this is its order

The address is hashed before it is stored, not after

Your IP never reaches the table. It is hashed with a salt that lives in the server's environment rather than in the database, and the result is cut to 128 bits. A copy of the table on its own does not let whoever holds it confirm that a given address is in it. An unsalted hash of an IP would: there are four billion of them and that is minutes of work on a laptop.

The hash has one use. It tells one submitter apart from a thousand, which is what makes a rate limit possible. That limit is eight submissions an hour from one address. The limiter holds those hashes in memory and loses them when the process restarts. Nothing else is derived from an address, ever: no location, no network, no lookup.

No analytics, and nothing loaded from anywhere else

No analytics, no pixel, no tag manager, no cookie and no third-party script. Nothing on this page is fetched from another host at all. The stylesheet, the script and the fonts are served by the same binary that served the document. That is enforced rather than intended: every response carries a Content-Security-Policy of default-src 'none' with connect-src 'self', so a script that tried to send something to somebody else would be stopped by your browser and not by our good manners.

The form does carry one hidden field that a person never sees. If something fills it in, the submission is answered as a success and no row is written. A bot that is told it was spotted only comes back better.

What the row is for

To send you an email when there is room, and the write-up of what went wrong the first time we ran this on something real. That is the whole of it. There is no newsletter. The list is not shared with an advertising network or a marketing tool, and it is not rented or sold. It is exported as a CSV and read by the person doing approvals, oldest first, because that is what a waitlist is.

The two optional answers are read in aggregate to decide what gets fixed first, which is why they are asked at all.

One mailbox is one row

Capitalisation is not identity. A unique index on the lowercased address means Pavel@x.com and pavel@x.com are the same row, so submitting twice cannot produce two emails. A repeat submission is accepted, changes nothing, and is told the same thing as a first one.

Having it removed

Write to privacy@fline.sh from the address you signed up with and the row is deleted. This site has no login and sets no session, so there is no account to close. There is nothing to unsubscribe from either, beyond the mail you are owed, and asking for deletion cancels that.

What this page is

A description of what the code does, checked against it. It cites no regulation, claims no certification and is not a lawyer's work. If the code and this page ever disagree, the code is the fact and this page is the bug. Write to the same address and it gets fixed.

Last changed 29 August 2026 · dev preview